Skip to content

Commit 473f55d

Browse files
datastore: support deferred results. fixes #77.
1 parent 8921c73 commit 473f55d

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
@@ -70,7 +70,10 @@ var SIGN_TO_ORDER = {
7070
* @param {string=} options.namespace - Optional namespace.
7171
*
7272
* @example
73-
* var key = new Key('Company', 123);
73+
* var key = new Key({
74+
* namespace: 'ns',
75+
* path: ['Company', 123]
76+
* });
7477
*/
7578
function Key(options) {
7679
this.namespace_ = options.namespace;

lib/datastore/transaction.js

+20-4
Original file line numberDiff line numberDiff line change
@@ -211,11 +211,27 @@ Transaction.prototype.get = function(keys, callback) {
211211
}
212212
this.makeReq('lookup', req, res, function(err, resp) {
213213
if (err) {
214-
return callback(err);
214+
callback(err);
215+
return;
215216
}
216-
var response = entity.formatArray(resp.found);
217-
callback(null, isMultipleRequest ? response : response[0]);
218-
});
217+
var found = entity.formatArray(resp.found);
218+
if (isMultipleRequest && resp.deferred && resp.deferred.length) {
219+
// There may be more results. Call `.get` again, and append the results.
220+
this.get(
221+
resp.deferred.map(entity.keyFromKeyProto), function (err, entities) {
222+
if (err) {
223+
callback(err);
224+
return;
225+
}
226+
if (resp) {
227+
found = (found || []).concat(entities);
228+
}
229+
callback(null, found);
230+
});
231+
return;
232+
}
233+
callback(null, isMultipleRequest ? found : found[0]);
234+
}.bind(this));
219235
};
220236

221237
/**

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)