Skip to content

Commit ceb8122

Browse files
datastore: support deferred results. fixes #77.
1 parent 00553cc commit ceb8122

File tree

3 files changed

+48
-5
lines changed

3 files changed

+48
-5
lines changed

lib/datastore/entity.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,10 @@ var SIGN_TO_ORDER = {
9595
*
9696
* @example
9797
* ```js
98-
* var key = new Key('Company', 123);
98+
* var key = new Key({
99+
* namespace: 'ns',
100+
* path: ['Company', 123]
101+
* });
99102
* ```
100103
*/
101104
function Key(options) {

lib/datastore/transaction.js

+20-4
Original file line numberDiff line numberDiff line change
@@ -222,11 +222,27 @@ Transaction.prototype.get = function(keys, callback) {
222222
}
223223
this.makeReq('lookup', req, res, function(err, resp) {
224224
if (err) {
225-
return callback(err);
225+
callback(err);
226+
return;
226227
}
227-
var response = entity.formatArray(resp.found);
228-
callback(null, isMultipleRequest ? response : response[0]);
229-
});
228+
var found = entity.formatArray(resp.found);
229+
if (isMultipleRequest && resp.deferred && resp.deferred.length) {
230+
// There may be more results. Call `.get` again, and append the results.
231+
this.get(
232+
resp.deferred.map(entity.keyFromKeyProto), function (err, entities) {
233+
if (err) {
234+
callback(err);
235+
return;
236+
}
237+
if (resp) {
238+
found = (found || []).concat(entities);
239+
}
240+
callback(null, found);
241+
});
242+
return;
243+
}
244+
callback(null, isMultipleRequest ? found : found[0]);
245+
}.bind(this));
230246
};
231247

232248
/**

test/datastore/dataset.js

+24
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
var assert = require('assert');
2222
var ByteBuffer = require('bytebuffer');
2323
var datastore = require('../../lib').datastore;
24+
var entity = require('../../lib/datastore/entity.js');
2425
var mockRespGet = require('../testdata/response_get.json');
2526
var Transaction = require('../../lib/datastore/transaction.js');
2627

@@ -78,6 +79,29 @@ describe('Dataset', function() {
7879
});
7980
});
8081

82+
it('should continue looking for deferred results', function(done) {
83+
var ds = new datastore.Dataset({ projectId: 'test' });
84+
var key = ds.key('Kind', 5732568548769792);
85+
var key2 = ds.key('Kind', 5732568548769792);
86+
var lookupCount = 0;
87+
ds.transaction.makeReq = function(method, proto, typ, callback) {
88+
lookupCount++;
89+
assert.equal(method, 'lookup');
90+
if (mockRespGet.deferred.length) {
91+
// Revert deferred to original state.
92+
mockRespGet.deferred = [];
93+
} else {
94+
mockRespGet.deferred = [ entity.keyToKeyProto(key2) ];
95+
}
96+
callback(null, mockRespGet);
97+
};
98+
ds.get([key, key2], function(err, entities) {
99+
assert.equal(entities.length, 2);
100+
assert.equal(lookupCount, 2);
101+
done();
102+
});
103+
});
104+
81105
it('should delete by key', function(done) {
82106
var ds = new datastore.Dataset({ projectId: 'test' });
83107
ds.transaction.makeReq = function(method, proto, typ, callback) {

0 commit comments

Comments
 (0)