I stumbled across the serialise/stream interface discussion https://github.com/sequelize/sequelize/issues/2454 but i am not concerned about performance over a large set, but i realise that gets messy.
model.trigger('data',record)
Model.createReadStream({where:{...},buffer_size:100}).on('data',function(record){...
module.exports=function (options){
options.model=this;
return Stream(options);
}
var Stream=function(options){
var s=new (require('stream').Readable)(options);
s._read=_read;
s.options=options;
s.model=options.model;
s.offset=0;
return s;
}
function _read(size){
var self=this;
this.options.offset=this.offset;
this.options.limit=size;
return this.model.findAll(this.options)
.then(function(records){
if (!records.length)
self.emit('end');
self.offset+=records.length;
_.each(records,function(r){
self.push(JSON.stringify(r));
});
});
}
module.exports={
createReadableStream:function (options){
options=options||{};
options.model=this;
this.valueField=options.valuefield=options.valueField || (this.options.Options && this.options.Options.valueField);
this.keyField=options.keyField=options.keyField || (this.options.Options && this.options.Options.keyField);
options.where=options.where || this.where;
//console.log("MAKING A STREAM "+JSON.stringify(options));
return Stream(options);
},
get:function(key,options,callback){
var self=this;
var where={};
where[this.keyField||'key']=key;
return this.findOne({
where:where
})
.then(function(record){
if (!record)
return null;
if (self.options.Options && self.options.Options.valueField)
return record.get(self.options.Options.valueField)
else
return JSON.stringify(record);
})
.then(function(result){
if (callback)
callback(result);
});
},
put:function (key,value,options,callback){
var record={};
record[this.options.Options.keyField||'key']=key;
record[this.options.Options.valueField||'value']=value;
return this.upsert(record)
.then(function(result){
if (callback)
callback(result);
return;
})
}
}
var Stream=function(options){
var s=new (require('stream').Readable)(options);
s._read=_read;
s.options=options;
s.model=options.model;
s.offset=0;
return s;
}
function _read(size){
var self=this;
var opts={};
opts.limit=size;
opts.offset=this.offset;
var O=this.options.model.options.Options;
opts.where=O.where;
return this.model.findAll(opts)
.then(function(records){
if (!records.length)
self.push(null);
self.offset+=records.length;
_.each(records,function(r){
if (O && O.valueField)
self.push(r.get(O.valueField));
else
self.push(JSON.stringify(r));
});
});
}