diff --git a/integration/test/ParseQueryTest.js b/integration/test/ParseQueryTest.js index 27434f920..f2c3c4204 100644 --- a/integration/test/ParseQueryTest.js +++ b/integration/test/ParseQueryTest.js @@ -1493,13 +1493,17 @@ describe('Parse Query', () => { it('can return all objects with findAll', async () => { const objs = [...Array(101)].map(() => new Parse.Object('Container')); - await Parse.Object.saveAll(objs); - const query = new Parse.Query('Container'); - const result = await query.findAll(); + assert.equal(result.length, 101); + }); + it('can return all objects with findAll json option', async () => { + const objs = [...Array(101)].map(() => new Parse.Object('Container')); + await Parse.Object.saveAll(objs); + const query = new Parse.Query('Container'); + const result = await query.findAll({ json: true, batchSize: 100 }); assert.equal(result.length, 101); }); diff --git a/src/ParseQuery.ts b/src/ParseQuery.ts index 0d5c9d855..648060b9b 100644 --- a/src/ParseQuery.ts +++ b/src/ParseQuery.ts @@ -721,6 +721,7 @@ class ParseQuery { * be used for this request. *
  • sessionToken: A valid session token, used for making a request on * behalf of a specific user. + *
  • json: Return raw JSON without converting to Parse.Object. * * @returns {Promise} A promise that is resolved with the results when * the query completes. @@ -924,33 +925,9 @@ class ParseQuery { return Promise.reject(error); } - const query = new ParseQuery(this.className); - query._limit = options.batchSize || 100; - query._include = [...this._include]; - query._exclude = [...this._exclude]; - if (this._select) { - query._select = [...this._select]; - } - query._hint = this._hint; - query._where = {}; - for (const attr in this._where) { - const val = this._where[attr]; - if (Array.isArray(val)) { - query._where[attr] = val.map(v => { - return v; - }); - } else if (val && typeof val === 'object') { - const conditionMap = {}; - query._where[attr] = conditionMap; - for (const cond in val) { - conditionMap[cond] = val[cond]; - } - } else { - query._where[attr] = val; - } - } - + const query = ParseQuery.fromJSON(this.className, this.toJSON()); query.ascending('objectId'); + query._limit = options.batchSize || 100; const findOptions = ParseObject._getRequestOptions(options); let finished = false; @@ -965,7 +942,11 @@ class ParseQuery { Promise.resolve(previousResults.length > 0 && callback(previousResults)), ]); if (results.length >= query._limit) { - query.greaterThan('objectId', results[results.length - 1].id); + if (findOptions.json) { + query.greaterThan('objectId', (results[results.length - 1] as any).objectId); + } else { + query.greaterThan('objectId', results[results.length - 1].id); + } previousResults = results; } else if (results.length > 0) { await Promise.resolve(callback(results)); diff --git a/src/__tests__/ParseQuery-test.js b/src/__tests__/ParseQuery-test.js index 31071e4ee..be0c6646b 100644 --- a/src/__tests__/ParseQuery-test.js +++ b/src/__tests__/ParseQuery-test.js @@ -1842,6 +1842,7 @@ describe('ParseQuery', () => { useMasterKey: true, sessionToken: '1234', batchSize: 50, + json: true, }; const q = new ParseQuery('Item'); await q.findAll(batchOptions); @@ -1855,6 +1856,7 @@ describe('ParseQuery', () => { }); expect(options.useMasterKey).toBe(true); expect(options.sessionToken).toEqual('1234'); + expect(options.json).toEqual(true); }); it('only makes one request when the results fit in one page', async () => { @@ -1874,6 +1876,17 @@ describe('ParseQuery', () => { const results = await q.findAll(); expect(results.map(obj => obj.attributes.size)).toEqual(['medium', 'small']); }); + + it('Returns all objects with json', async () => { + const q = new ParseQuery('Item'); + const results = await q.findAll({ json: true, batchSize: 2 }); + expect(results.length).toEqual(3); + expect(findMock).toHaveBeenCalledTimes(2); + results.map(result => { + expect(result.id).toBeUndefined(); + expect(result.objectId).toBeDefined(); + }); + }); }); it('can iterate over results with each()', done => {