Skip to content

Commit 5e7c9d2

Browse files
authored
Fixed a bug affecting updates to nested pointers (#7392)
* Fixed a bug affecting updates to nested pointers Also created unit tests * Marked the regression test for #7391 as pending for postgre The issue is not fixed yet Use cont instead of var
1 parent 8099cb0 commit 5e7c9d2

File tree

2 files changed

+35
-4
lines changed

2 files changed

+35
-4
lines changed

spec/ParseAPI.spec.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -646,6 +646,28 @@ describe('miscellaneous', function () {
646646
});
647647
});
648648

649+
it_only_db('mongo')('pointer reassign on nested fields is working properly (#7391)', async () => {
650+
const obj = new Parse.Object('GameScore'); // This object will include nested pointers
651+
const ptr1 = new Parse.Object('GameScore');
652+
await ptr1.save(); // Obtain a unique id
653+
const ptr2 = new Parse.Object('GameScore');
654+
await ptr2.save(); // Obtain a unique id
655+
obj.set('data', { ptr: ptr1 });
656+
await obj.save();
657+
658+
obj.set('data.ptr', ptr2);
659+
await obj.save();
660+
661+
const obj2 = await new Parse.Query('GameScore').get(obj.id);
662+
expect(obj2.get('data').ptr.id).toBe(ptr2.id);
663+
664+
const query = new Parse.Query('GameScore');
665+
query.equalTo('data.ptr', ptr2);
666+
const res = await query.find();
667+
expect(res.length).toBe(1);
668+
expect(res[0].get('data').ptr.id).toBe(ptr2.id);
669+
});
670+
649671
it('test afterSave get full object on create and update', function (done) {
650672
let triggerTime = 0;
651673
// Register a mock beforeSave hook

src/Adapters/Storage/Mongo/MongoTransform.js

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,10 @@ const transformKeyValueForUpdate = (className, restKey, restValue, parseFormatSc
9999

100100
if (
101101
(parseFormatSchema.fields[key] && parseFormatSchema.fields[key].type === 'Pointer') ||
102-
(!parseFormatSchema.fields[key] && restValue && restValue.__type == 'Pointer')
102+
(!key.includes('.') &&
103+
!parseFormatSchema.fields[key] &&
104+
restValue &&
105+
restValue.__type == 'Pointer') // Do not use the _p_ prefix for pointers inside nested documents
103106
) {
104107
key = '_p_' + key;
105108
}
@@ -305,7 +308,10 @@ function transformQueryKeyValue(className, key, value, schema, count = false) {
305308
schema && schema.fields[key] && schema.fields[key].type === 'Pointer';
306309

307310
const field = schema && schema.fields[key];
308-
if (expectedTypeIsPointer || (!schema && value && value.__type === 'Pointer')) {
311+
if (
312+
expectedTypeIsPointer ||
313+
(!schema && !key.includes('.') && value && value.__type === 'Pointer')
314+
) {
309315
key = '_p_' + key;
310316
}
311317

@@ -326,8 +332,11 @@ function transformQueryKeyValue(className, key, value, schema, count = false) {
326332
}
327333

328334
// Handle atomic values
329-
if (transformTopLevelAtom(value) !== CannotTransform) {
330-
return { key, value: transformTopLevelAtom(value) };
335+
const transformRes = key.includes('.')
336+
? transformInteriorAtom(value)
337+
: transformTopLevelAtom(value);
338+
if (transformRes !== CannotTransform) {
339+
return { key, value: transformRes };
331340
} else {
332341
throw new Parse.Error(
333342
Parse.Error.INVALID_JSON,

0 commit comments

Comments
 (0)