Skip to content

Commit 0865484

Browse files
authored
LDS: Improve pinning unsaved objects (#795)
* LDS: Improve pinning unsaved objects Closes: #792 Saves _localId into the LocalDatastore to keep consistency when querying. * add missing commit * more tests * remove console.log * updateFromServer ignore unsaved objects * Update package-lock.json * Revert "Update package-lock.json" This reverts commit 379935a.
1 parent 8cead2c commit 0865484

File tree

6 files changed

+216
-54
lines changed

6 files changed

+216
-54
lines changed

integration/server.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ const api = new ParseServer({
2222
facebook: {
2323
appIds: "test"
2424
}
25-
}
25+
},
26+
verbose: false,
27+
silent: true,
2628
});
2729

2830
app.use('/parse', api);

integration/test/ParseLocalDatastoreTest.js

Lines changed: 124 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,13 @@ const PIN_PREFIX = LocalDatastoreUtils.PIN_PREFIX;
1616
function LDS_KEY(object) {
1717
return Parse.LocalDatastore.getKeyForObject(object);
1818
}
19-
19+
function LDS_FULL_JSON(object) {
20+
const json = object._toFullJSON();
21+
if (object._localId) {
22+
json._localId = object._localId;
23+
}
24+
return json;
25+
}
2026
function runTest(controller) {
2127
describe(`Parse Object Pinning (${controller.name})`, () => {
2228
beforeEach(async () => {
@@ -75,7 +81,7 @@ function runTest(controller) {
7581
let localDatastore = await Parse.LocalDatastore._getAllContents();
7682
assert.equal(Object.keys(localDatastore).length, 2);
7783
assert.deepEqual(localDatastore[DEFAULT_PIN], [LDS_KEY(object)]);
78-
assert.deepEqual(localDatastore[LDS_KEY(object)], [object._toFullJSON()]);
84+
assert.deepEqual(localDatastore[LDS_KEY(object)], [LDS_FULL_JSON(object)]);
7985
await object.save();
8086
// Check if localDatastore updated localId to objectId
8187
localDatastore = await Parse.LocalDatastore._getAllContents();
@@ -84,6 +90,55 @@ function runTest(controller) {
8490
assert.deepEqual(localDatastore[LDS_KEY(object)], [object._toFullJSON()]);
8591
});
8692

93+
it(`${controller.name} can store data to pin (unsaved)`, async () => {
94+
const object = new TestObject();
95+
object.set('foo', 'bar');
96+
await object.pin();
97+
98+
const query = new Parse.Query(TestObject);
99+
query.fromLocalDatastore();
100+
let results = await query.find();
101+
assert.equal(results.length, 1);
102+
103+
let pinnedObject = results[0];
104+
assert.equal(pinnedObject.get('foo'), 'bar');
105+
pinnedObject.set('foo', 'baz');
106+
await pinnedObject.pin();
107+
108+
results = await query.find();
109+
assert.equal(results.length, 1);
110+
pinnedObject = results[0];
111+
assert.equal(pinnedObject.get('foo'), 'baz');
112+
});
113+
114+
it(`${controller.name} can query unsaved pin and save`, async () => {
115+
const object = new TestObject();
116+
object.set('foo', 'bar');
117+
await object.pin();
118+
119+
const query = new Parse.Query(TestObject);
120+
query.fromLocalDatastore();
121+
let results = await query.find();
122+
123+
assert.equal(results.length, 1);
124+
125+
let pinnedObject = results[0];
126+
assert.equal(pinnedObject.get('foo'), 'bar');
127+
128+
pinnedObject.set('foo', 'baz');
129+
await pinnedObject.save();
130+
131+
assert(pinnedObject.id);
132+
assert.equal(pinnedObject._localId, undefined);
133+
134+
results = await query.find();
135+
pinnedObject = results[0];
136+
137+
assert.equal(pinnedObject.get('foo'), 'baz');
138+
assert(pinnedObject.id);
139+
assert.equal(pinnedObject._localId, undefined);
140+
});
141+
87142
it(`${controller.name} cannot pin unsaved pointer`, async () => {
88143
try {
89144
const object = new TestObject();
@@ -174,9 +229,9 @@ function runTest(controller) {
174229
let localDatastore = await Parse.LocalDatastore._getAllContents();
175230
assert.equal(Object.keys(localDatastore).length, 4);
176231
assert.deepEqual(localDatastore[DEFAULT_PIN], [LDS_KEY(obj1), LDS_KEY(obj2), LDS_KEY(obj3)]);
177-
assert.deepEqual(localDatastore[LDS_KEY(obj1)], [obj1._toFullJSON()]);
178-
assert.deepEqual(localDatastore[LDS_KEY(obj2)], [obj2._toFullJSON()]);
179-
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [obj3._toFullJSON()]);
232+
assert.deepEqual(localDatastore[LDS_KEY(obj1)], [LDS_FULL_JSON(obj1)]);
233+
assert.deepEqual(localDatastore[LDS_KEY(obj2)], [LDS_FULL_JSON(obj2)]);
234+
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [LDS_FULL_JSON(obj3)]);
180235

181236
await Parse.Object.saveAll(objects);
182237

@@ -216,9 +271,9 @@ function runTest(controller) {
216271
let localDatastore = await Parse.LocalDatastore._getAllContents();
217272
assert.equal(Object.keys(localDatastore).length, 4);
218273
assert.deepEqual(localDatastore[PIN_PREFIX + 'test_pin'], [LDS_KEY(obj1), LDS_KEY(obj2), LDS_KEY(obj3)]);
219-
assert.deepEqual(localDatastore[LDS_KEY(obj1)], [obj1._toFullJSON()]);
220-
assert.deepEqual(localDatastore[LDS_KEY(obj2)], [obj2._toFullJSON()]);
221-
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [obj3._toFullJSON()]);
274+
assert.deepEqual(localDatastore[LDS_KEY(obj1)], [LDS_FULL_JSON(obj1)]);
275+
assert.deepEqual(localDatastore[LDS_KEY(obj2)], [LDS_FULL_JSON(obj2)]);
276+
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [LDS_FULL_JSON(obj3)]);
222277

223278
await Parse.Object.saveAll(objects);
224279

@@ -315,17 +370,17 @@ function runTest(controller) {
315370
let localDatastore = await Parse.LocalDatastore._getAllContents();
316371
assert.equal(Object.keys(localDatastore).length, 4);
317372
assert.deepEqual(localDatastore[DEFAULT_PIN], [LDS_KEY(obj1), LDS_KEY(obj2), LDS_KEY(obj3)]);
318-
assert.deepEqual(localDatastore[LDS_KEY(obj1)], [obj1._toFullJSON()]);
319-
assert.deepEqual(localDatastore[LDS_KEY(obj2)], [obj2._toFullJSON()]);
320-
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [obj3._toFullJSON()]);
373+
assert.deepEqual(localDatastore[LDS_KEY(obj1)], [LDS_FULL_JSON(obj1)]);
374+
assert.deepEqual(localDatastore[LDS_KEY(obj2)], [LDS_FULL_JSON(obj2)]);
375+
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [LDS_FULL_JSON(obj3)]);
321376

322377
await obj2.unPin();
323378

324379
localDatastore = await Parse.LocalDatastore._getAllContents();
325380
assert.equal(Object.keys(localDatastore).length, 3);
326381
assert.deepEqual(localDatastore[DEFAULT_PIN], [LDS_KEY(obj1), LDS_KEY(obj3)]);
327-
assert.deepEqual(localDatastore[LDS_KEY(obj1)], [obj1._toFullJSON()]);
328-
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [obj3._toFullJSON()]);
382+
assert.deepEqual(localDatastore[LDS_KEY(obj1)], [LDS_FULL_JSON(obj1)]);
383+
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [LDS_FULL_JSON(obj3)]);
329384

330385
await Parse.Object.saveAll(objects);
331386

@@ -347,9 +402,9 @@ function runTest(controller) {
347402
let localDatastore = await Parse.LocalDatastore._getAllContents();
348403
assert.equal(Object.keys(localDatastore).length, 4);
349404
assert.deepEqual(localDatastore[DEFAULT_PIN], [LDS_KEY(obj1), LDS_KEY(obj2), LDS_KEY(obj3)]);
350-
assert.deepEqual(localDatastore[LDS_KEY(obj1)], [obj1._toFullJSON()]);
351-
assert.deepEqual(localDatastore[LDS_KEY(obj2)], [obj2._toFullJSON()]);
352-
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [obj3._toFullJSON()]);
405+
assert.deepEqual(localDatastore[LDS_KEY(obj1)], [LDS_FULL_JSON(obj1)]);
406+
assert.deepEqual(localDatastore[LDS_KEY(obj2)], [LDS_FULL_JSON(obj2)]);
407+
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [LDS_FULL_JSON(obj3)]);
353408

354409
await Parse.Object.saveAll(objects);
355410

@@ -358,8 +413,8 @@ function runTest(controller) {
358413
localDatastore = await Parse.LocalDatastore._getAllContents();
359414
assert.equal(Object.keys(localDatastore).length, 3);
360415
assert.deepEqual(localDatastore[DEFAULT_PIN], [LDS_KEY(obj1), LDS_KEY(obj3)]);
361-
assert.deepEqual(localDatastore[LDS_KEY(obj1)], [obj1._toFullJSON()]);
362-
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [obj3._toFullJSON()]);
416+
assert.deepEqual(localDatastore[LDS_KEY(obj1)], [LDS_FULL_JSON(obj1)]);
417+
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [LDS_FULL_JSON(obj3)]);
363418
});
364419

365420
it(`${controller.name} can unPin / unPinAll without pin (unsaved)`, async () => {
@@ -407,16 +462,16 @@ function runTest(controller) {
407462
let localDatastore = await Parse.LocalDatastore._getAllContents();
408463
assert(Object.keys(localDatastore).length === 4);
409464
assert.deepEqual(localDatastore[DEFAULT_PIN], [LDS_KEY(obj1), LDS_KEY(obj2), LDS_KEY(obj3)]);
410-
assert.deepEqual(localDatastore[LDS_KEY(obj1)], [obj1._toFullJSON()]);
411-
assert.deepEqual(localDatastore[LDS_KEY(obj2)], [obj2._toFullJSON()]);
412-
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [obj3._toFullJSON()]);
465+
assert.deepEqual(localDatastore[LDS_KEY(obj1)], [LDS_FULL_JSON(obj1)]);
466+
assert.deepEqual(localDatastore[LDS_KEY(obj2)], [LDS_FULL_JSON(obj2)]);
467+
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [LDS_FULL_JSON(obj3)]);
413468

414469
await Parse.Object.unPinAll([obj1, obj2]);
415470

416471
localDatastore = await Parse.LocalDatastore._getAllContents();
417472
assert.equal(Object.keys(localDatastore).length, 2);
418473
assert.deepEqual(localDatastore[DEFAULT_PIN], [LDS_KEY(obj3)]);
419-
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [obj3._toFullJSON()]);
474+
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [LDS_FULL_JSON(obj3)]);
420475

421476
await Parse.Object.saveAll(objects);
422477

@@ -437,9 +492,9 @@ function runTest(controller) {
437492
let localDatastore = await Parse.LocalDatastore._getAllContents();
438493
assert.equal(Object.keys(localDatastore).length, 4);
439494
assert.deepEqual(localDatastore[DEFAULT_PIN], [LDS_KEY(obj1), LDS_KEY(obj2), LDS_KEY(obj3)]);
440-
assert.deepEqual(localDatastore[LDS_KEY(obj1)], [obj1._toFullJSON()]);
441-
assert.deepEqual(localDatastore[LDS_KEY(obj2)], [obj2._toFullJSON()]);
442-
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [obj3._toFullJSON()]);
495+
assert.deepEqual(localDatastore[LDS_KEY(obj1)], [LDS_FULL_JSON(obj1)]);
496+
assert.deepEqual(localDatastore[LDS_KEY(obj2)], [LDS_FULL_JSON(obj2)]);
497+
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [LDS_FULL_JSON(obj3)]);
443498

444499
await Parse.Object.saveAll(objects);
445500

@@ -461,17 +516,17 @@ function runTest(controller) {
461516
let localDatastore = await Parse.LocalDatastore._getAllContents();
462517
assert(Object.keys(localDatastore).length === 4);
463518
assert.deepEqual(localDatastore[DEFAULT_PIN], [LDS_KEY(obj1), LDS_KEY(obj2), LDS_KEY(obj3)]);
464-
assert.deepEqual(localDatastore[LDS_KEY(obj1)], [obj1._toFullJSON()]);
465-
assert.deepEqual(localDatastore[LDS_KEY(obj2)], [obj2._toFullJSON()]);
466-
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [obj3._toFullJSON()]);
519+
assert.deepEqual(localDatastore[LDS_KEY(obj1)], [LDS_FULL_JSON(obj1)]);
520+
assert.deepEqual(localDatastore[LDS_KEY(obj2)], [LDS_FULL_JSON(obj2)]);
521+
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [LDS_FULL_JSON(obj3)]);
467522

468523
await Parse.Object.unPinAllObjects();
469524

470525
localDatastore = await Parse.LocalDatastore._getAllContents();
471526
assert.equal(Object.keys(localDatastore).length, 3);
472-
assert.deepEqual(localDatastore[LDS_KEY(obj1)], [obj1._toFullJSON()]);
473-
assert.deepEqual(localDatastore[LDS_KEY(obj2)], [obj2._toFullJSON()]);
474-
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [obj3._toFullJSON()]);
527+
assert.deepEqual(localDatastore[LDS_KEY(obj1)], [LDS_FULL_JSON(obj1)]);
528+
assert.deepEqual(localDatastore[LDS_KEY(obj2)], [LDS_FULL_JSON(obj2)]);
529+
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [LDS_FULL_JSON(obj3)]);
475530

476531
await Parse.Object.saveAll(objects);
477532

@@ -493,9 +548,9 @@ function runTest(controller) {
493548
let localDatastore = await Parse.LocalDatastore._getAllContents();
494549
assert.equal(Object.keys(localDatastore).length, 4);
495550
assert.deepEqual(localDatastore[DEFAULT_PIN], [LDS_KEY(obj1), LDS_KEY(obj2), LDS_KEY(obj3)]);
496-
assert.deepEqual(localDatastore[LDS_KEY(obj1)], [obj1._toFullJSON()]);
497-
assert.deepEqual(localDatastore[LDS_KEY(obj2)], [obj2._toFullJSON()]);
498-
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [obj3._toFullJSON()]);
551+
assert.deepEqual(localDatastore[LDS_KEY(obj1)], [LDS_FULL_JSON(obj1)]);
552+
assert.deepEqual(localDatastore[LDS_KEY(obj2)], [LDS_FULL_JSON(obj2)]);
553+
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [LDS_FULL_JSON(obj3)]);
499554

500555
await Parse.Object.saveAll(objects);
501556

@@ -518,16 +573,16 @@ function runTest(controller) {
518573
let localDatastore = await Parse.LocalDatastore._getAllContents();
519574
assert(Object.keys(localDatastore).length === 4);
520575
assert.deepEqual(localDatastore[PIN_PREFIX + 'test_unpin'], [LDS_KEY(obj1), LDS_KEY(obj2), LDS_KEY(obj3)]);
521-
assert.deepEqual(localDatastore[LDS_KEY(obj1)], [obj1._toFullJSON()]);
522-
assert.deepEqual(localDatastore[LDS_KEY(obj2)], [obj2._toFullJSON()]);
523-
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [obj3._toFullJSON()]);
576+
assert.deepEqual(localDatastore[LDS_KEY(obj1)], [LDS_FULL_JSON(obj1)]);
577+
assert.deepEqual(localDatastore[LDS_KEY(obj2)], [LDS_FULL_JSON(obj2)]);
578+
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [LDS_FULL_JSON(obj3)]);
524579

525580
await Parse.Object.unPinAllWithName('test_unpin', [obj1, obj2]);
526581

527582
localDatastore = await Parse.LocalDatastore._getAllContents();
528583
assert.equal(Object.keys(localDatastore).length, 2);
529584
assert.deepEqual(localDatastore[PIN_PREFIX + 'test_unpin'], [LDS_KEY(obj3)]);
530-
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [obj3._toFullJSON()]);
585+
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [LDS_FULL_JSON(obj3)]);
531586

532587
await Parse.Object.saveAll(objects);
533588

@@ -548,9 +603,9 @@ function runTest(controller) {
548603
let localDatastore = await Parse.LocalDatastore._getAllContents();
549604
assert.equal(Object.keys(localDatastore).length, 4);
550605
assert.deepEqual(localDatastore[PIN_PREFIX + 'test_unpin'], [LDS_KEY(obj1), LDS_KEY(obj2), LDS_KEY(obj3)]);
551-
assert.deepEqual(localDatastore[LDS_KEY(obj1)], [obj1._toFullJSON()]);
552-
assert.deepEqual(localDatastore[LDS_KEY(obj2)], [obj2._toFullJSON()]);
553-
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [obj3._toFullJSON()]);
606+
assert.deepEqual(localDatastore[LDS_KEY(obj1)], [LDS_FULL_JSON(obj1)]);
607+
assert.deepEqual(localDatastore[LDS_KEY(obj2)], [LDS_FULL_JSON(obj2)]);
608+
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [LDS_FULL_JSON(obj3)]);
554609

555610
await Parse.Object.saveAll(objects);
556611

@@ -572,17 +627,17 @@ function runTest(controller) {
572627
let localDatastore = await Parse.LocalDatastore._getAllContents();
573628
assert(Object.keys(localDatastore).length === 4);
574629
assert.deepEqual(localDatastore[PIN_PREFIX + 'test_unpin'], [LDS_KEY(obj1), LDS_KEY(obj2), LDS_KEY(obj3)]);
575-
assert.deepEqual(localDatastore[LDS_KEY(obj1)], [obj1._toFullJSON()]);
576-
assert.deepEqual(localDatastore[LDS_KEY(obj2)], [obj2._toFullJSON()]);
577-
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [obj3._toFullJSON()]);
630+
assert.deepEqual(localDatastore[LDS_KEY(obj1)], [LDS_FULL_JSON(obj1)]);
631+
assert.deepEqual(localDatastore[LDS_KEY(obj2)], [LDS_FULL_JSON(obj2)]);
632+
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [LDS_FULL_JSON(obj3)]);
578633

579634
await Parse.Object.unPinAllObjectsWithName('test_unpin');
580635

581636
localDatastore = await Parse.LocalDatastore._getAllContents();
582637
assert.equal(Object.keys(localDatastore).length, 3);
583-
assert.deepEqual(localDatastore[LDS_KEY(obj1)], [obj1._toFullJSON()]);
584-
assert.deepEqual(localDatastore[LDS_KEY(obj2)], [obj2._toFullJSON()]);
585-
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [obj3._toFullJSON()]);
638+
assert.deepEqual(localDatastore[LDS_KEY(obj1)], [LDS_FULL_JSON(obj1)]);
639+
assert.deepEqual(localDatastore[LDS_KEY(obj2)], [LDS_FULL_JSON(obj2)]);
640+
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [LDS_FULL_JSON(obj3)]);
586641

587642
await Parse.Object.saveAll(objects);
588643

@@ -604,9 +659,9 @@ function runTest(controller) {
604659
let localDatastore = await Parse.LocalDatastore._getAllContents();
605660
assert.equal(Object.keys(localDatastore).length, 4);
606661
assert.deepEqual(localDatastore[PIN_PREFIX + 'test_unpin'], [LDS_KEY(obj1), LDS_KEY(obj2), LDS_KEY(obj3)]);
607-
assert.deepEqual(localDatastore[LDS_KEY(obj1)], [obj1._toFullJSON()]);
608-
assert.deepEqual(localDatastore[LDS_KEY(obj2)], [obj2._toFullJSON()]);
609-
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [obj3._toFullJSON()]);
662+
assert.deepEqual(localDatastore[LDS_KEY(obj1)], [LDS_FULL_JSON(obj1)]);
663+
assert.deepEqual(localDatastore[LDS_KEY(obj2)], [LDS_FULL_JSON(obj2)]);
664+
assert.deepEqual(localDatastore[LDS_KEY(obj3)], [LDS_FULL_JSON(obj3)]);
610665

611666
await Parse.Object.saveAll(objects);
612667

@@ -871,6 +926,25 @@ function runTest(controller) {
871926
const childJSON = updatedLDS[LDS_KEY(child)];
872927
assert.equal(childJSON.foo, 'changed');
873928
});
929+
930+
it(`${controller.name} can update Local Datastore from network ignore unsaved`, async () => {
931+
const object = new TestObject();
932+
const item = new Item();
933+
await item.save();
934+
await Parse.Object.pinAll([object, item]);
935+
936+
// Updates item with { foo: 'changed' }
937+
const params = { id: item.id };
938+
await Parse.Cloud.run('TestFetchFromLocalDatastore', params);
939+
940+
Parse.LocalDatastore.isSyncing = false;
941+
942+
await Parse.LocalDatastore.updateFromServer();
943+
944+
const updatedLDS = await Parse.LocalDatastore._getAllContents();
945+
const itemJSON = updatedLDS[LDS_KEY(item)];
946+
assert.equal(itemJSON.foo, 'changed');
947+
});
874948
});
875949

876950
describe(`Parse Query Pinning (${controller.name})`, () => {

src/LocalDatastore.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,11 @@ const LocalDatastore = {
7979
for (const parent of objects) {
8080
const children = this._getChildren(parent);
8181
const parentKey = this.getKeyForObject(parent);
82-
children[parentKey] = parent._toFullJSON();
82+
const json = parent._toFullJSON();
83+
if (parent._localId) {
84+
json._localId = parent._localId;
85+
}
86+
children[parentKey] = json;
8387
for (const objectKey in children) {
8488
objectKeys.push(objectKey);
8589
toPinPromises.push(this.pinWithName(objectKey, [children[objectKey]]));
@@ -338,6 +342,9 @@ const LocalDatastore = {
338342
for (const key of keys) {
339343
// Ignore the OBJECT_PREFIX
340344
const [ , , className, objectId] = key.split('_');
345+
if (objectId.startsWith('local')) {
346+
continue;
347+
}
341348
if (!(className in pointersHash)) {
342349
pointersHash[className] = new Set();
343350
}

src/ParseQuery.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,9 @@ class ParseQuery {
324324
const objects = await localDatastore._serializeObjectsFromPinName(this._localDatastorePinName);
325325
let results = objects.map((json, index, arr) => {
326326
const object = ParseObject.fromJSON(json, false);
327-
327+
if (json._localId && !json.objectId) {
328+
object._localId = json._localId;
329+
}
328330
if (!OfflineQuery.matchesQuery(this.className, object, arr, this)) {
329331
return null;
330332
}

0 commit comments

Comments
 (0)