ParseQuery.js 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305
  1. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = void 0;
  6. var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
  7. var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
  8. var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
  9. var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
  10. var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
  11. var _CoreManager = _interopRequireDefault(require("./CoreManager"));
  12. var _encode = _interopRequireDefault(require("./encode"));
  13. var _promiseUtils = require("./promiseUtils");
  14. var _ParseError = _interopRequireDefault(require("./ParseError"));
  15. var _ParseGeoPoint = _interopRequireDefault(require("./ParseGeoPoint"));
  16. var _ParseObject = _interopRequireDefault(require("./ParseObject"));
  17. var _OfflineQuery = _interopRequireDefault(require("./OfflineQuery"));
  18. var _LocalDatastoreUtils = require("./LocalDatastoreUtils");
  19. function quote(s) {
  20. return '\\Q' + s.replace('\\E', '\\E\\\\E\\Q') + '\\E';
  21. }
  22. function _getClassNameFromQueries(queries) {
  23. var className = null;
  24. queries.forEach(function (q) {
  25. if (!className) {
  26. className = q.className;
  27. }
  28. if (className !== q.className) {
  29. throw new Error('All queries must be for the same class.');
  30. }
  31. });
  32. return className;
  33. }
  34. function handleSelectResult(data, select) {
  35. var serverDataMask = {};
  36. select.forEach(function (field) {
  37. var hasSubObjectSelect = field.indexOf('.') !== -1;
  38. if (!hasSubObjectSelect && !data.hasOwnProperty(field)) {
  39. data[field] = undefined;
  40. } else if (hasSubObjectSelect) {
  41. var pathComponents = field.split('.');
  42. var _obj = data;
  43. var serverMask = serverDataMask;
  44. pathComponents.forEach(function (component, index, arr) {
  45. if (_obj && !_obj.hasOwnProperty(component)) {
  46. _obj[component] = undefined;
  47. }
  48. if (_obj && typeof _obj === 'object') {
  49. _obj = _obj[component];
  50. }
  51. if (index < arr.length - 1) {
  52. if (!serverMask[component]) {
  53. serverMask[component] = {};
  54. }
  55. serverMask = serverMask[component];
  56. }
  57. });
  58. }
  59. });
  60. if (Object.keys(serverDataMask).length > 0) {
  61. var serverData = _CoreManager.default.getObjectStateController().getServerData({
  62. id: data.objectId,
  63. className: data.className
  64. });
  65. copyMissingDataWithMask(serverData, data, serverDataMask, false);
  66. }
  67. }
  68. function copyMissingDataWithMask(src, dest, mask, copyThisLevel) {
  69. if (copyThisLevel) {
  70. for (var _key in src) {
  71. if (src.hasOwnProperty(_key) && !dest.hasOwnProperty(_key)) {
  72. dest[_key] = src[_key];
  73. }
  74. }
  75. }
  76. for (var _key2 in mask) {
  77. if (dest[_key2] !== undefined && dest[_key2] !== null && src !== undefined && src !== null) {
  78. copyMissingDataWithMask(src[_key2], dest[_key2], mask[_key2], true);
  79. }
  80. }
  81. }
  82. function handleOfflineSort(a, b, sorts) {
  83. var order = sorts[0];
  84. var operator = order.slice(0, 1);
  85. var isDescending = operator === '-';
  86. if (isDescending) {
  87. order = order.substring(1);
  88. }
  89. if (order === '_created_at') {
  90. order = 'createdAt';
  91. }
  92. if (order === '_updated_at') {
  93. order = 'updatedAt';
  94. }
  95. if (!/^[A-Za-z][0-9A-Za-z_]*$/.test(order) || order === 'password') {
  96. throw new _ParseError.default(_ParseError.default.INVALID_KEY_NAME, `Invalid Key: ${order}`);
  97. }
  98. var field1 = a.get(order);
  99. var field2 = b.get(order);
  100. if (field1 < field2) {
  101. return isDescending ? 1 : -1;
  102. }
  103. if (field1 > field2) {
  104. return isDescending ? -1 : 1;
  105. }
  106. if (sorts.length > 1) {
  107. var remainingSorts = sorts.slice(1);
  108. return handleOfflineSort(a, b, remainingSorts);
  109. }
  110. return 0;
  111. }
  112. var ParseQuery = function () {
  113. function ParseQuery(objectClass) {
  114. (0, _classCallCheck2.default)(this, ParseQuery);
  115. if (typeof objectClass === 'string') {
  116. if (objectClass === 'User' && _CoreManager.default.get('PERFORM_USER_REWRITE')) {
  117. this.className = '_User';
  118. } else {
  119. this.className = objectClass;
  120. }
  121. } else if (objectClass instanceof _ParseObject.default) {
  122. this.className = objectClass.className;
  123. } else if (typeof objectClass === 'function') {
  124. if (typeof objectClass.className === 'string') {
  125. this.className = objectClass.className;
  126. } else {
  127. var _obj2 = new objectClass();
  128. this.className = _obj2.className;
  129. }
  130. } else {
  131. throw new TypeError('A ParseQuery must be constructed with a ParseObject or class name.');
  132. }
  133. this._where = {};
  134. this._watch = [];
  135. this._include = [];
  136. this._exclude = [];
  137. this._count = false;
  138. this._limit = -1;
  139. this._skip = 0;
  140. this._readPreference = null;
  141. this._includeReadPreference = null;
  142. this._subqueryReadPreference = null;
  143. this._queriesLocalDatastore = false;
  144. this._localDatastorePinName = null;
  145. this._extraOptions = {};
  146. this._xhrRequest = {
  147. task: null,
  148. onchange: function () {}
  149. };
  150. }
  151. (0, _createClass2.default)(ParseQuery, [{
  152. key: "_orQuery",
  153. value: function (queries) {
  154. var queryJSON = queries.map(function (q) {
  155. return q.toJSON().where;
  156. });
  157. this._where.$or = queryJSON;
  158. return this;
  159. }
  160. }, {
  161. key: "_andQuery",
  162. value: function (queries) {
  163. var queryJSON = queries.map(function (q) {
  164. return q.toJSON().where;
  165. });
  166. this._where.$and = queryJSON;
  167. return this;
  168. }
  169. }, {
  170. key: "_norQuery",
  171. value: function (queries) {
  172. var queryJSON = queries.map(function (q) {
  173. return q.toJSON().where;
  174. });
  175. this._where.$nor = queryJSON;
  176. return this;
  177. }
  178. }, {
  179. key: "_addCondition",
  180. value: function (key, condition, value) {
  181. if (!this._where[key] || typeof this._where[key] === 'string') {
  182. this._where[key] = {};
  183. }
  184. this._where[key][condition] = (0, _encode.default)(value, false, true);
  185. return this;
  186. }
  187. }, {
  188. key: "_regexStartWith",
  189. value: function (string) {
  190. return '^' + quote(string);
  191. }
  192. }, {
  193. key: "_handleOfflineQuery",
  194. value: function () {
  195. var _handleOfflineQuery2 = (0, _asyncToGenerator2.default)(function* (params) {
  196. var _this2 = this;
  197. _OfflineQuery.default.validateQuery(this);
  198. var localDatastore = _CoreManager.default.getLocalDatastore();
  199. var objects = yield localDatastore._serializeObjectsFromPinName(this._localDatastorePinName);
  200. var results = objects.map(function (json, index, arr) {
  201. var object = _ParseObject.default.fromJSON(json, false);
  202. if (json._localId && !json.objectId) {
  203. object._localId = json._localId;
  204. }
  205. if (!_OfflineQuery.default.matchesQuery(_this2.className, object, arr, _this2)) {
  206. return null;
  207. }
  208. return object;
  209. }).filter(function (object) {
  210. return object !== null;
  211. });
  212. if (params.keys) {
  213. var keys = params.keys.split(',');
  214. keys = keys.concat(['className', 'objectId', 'createdAt', 'updatedAt', 'ACL']);
  215. results = results.map(function (object) {
  216. var json = object._toFullJSON();
  217. Object.keys(json).forEach(function (key) {
  218. if (!keys.includes(key)) {
  219. delete json[key];
  220. }
  221. });
  222. return _ParseObject.default.fromJSON(json, false);
  223. });
  224. }
  225. if (params.order) {
  226. var sorts = params.order.split(',');
  227. results.sort(function (a, b) {
  228. return handleOfflineSort(a, b, sorts);
  229. });
  230. }
  231. var count;
  232. if (params.count) {
  233. count = results.length;
  234. }
  235. if (params.skip) {
  236. if (params.skip >= results.length) {
  237. results = [];
  238. } else {
  239. results = results.splice(params.skip, results.length);
  240. }
  241. }
  242. var limit = results.length;
  243. if (params.limit !== 0 && params.limit < results.length) {
  244. limit = params.limit;
  245. }
  246. results = results.splice(0, limit);
  247. if (typeof count === 'number') {
  248. return {
  249. results: results,
  250. count: count
  251. };
  252. }
  253. return results;
  254. });
  255. function _handleOfflineQuery() {
  256. return _handleOfflineQuery2.apply(this, arguments);
  257. }
  258. return _handleOfflineQuery;
  259. }()
  260. }, {
  261. key: "toJSON",
  262. value: function () {
  263. var params = {
  264. where: this._where
  265. };
  266. if (this._watch.length) {
  267. params.watch = this._watch.join(',');
  268. }
  269. if (this._include.length) {
  270. params.include = this._include.join(',');
  271. }
  272. if (this._exclude.length) {
  273. params.excludeKeys = this._exclude.join(',');
  274. }
  275. if (this._select) {
  276. params.keys = this._select.join(',');
  277. }
  278. if (this._count) {
  279. params.count = 1;
  280. }
  281. if (this._limit >= 0) {
  282. params.limit = this._limit;
  283. }
  284. if (this._skip > 0) {
  285. params.skip = this._skip;
  286. }
  287. if (this._order) {
  288. params.order = this._order.join(',');
  289. }
  290. if (this._readPreference) {
  291. params.readPreference = this._readPreference;
  292. }
  293. if (this._includeReadPreference) {
  294. params.includeReadPreference = this._includeReadPreference;
  295. }
  296. if (this._subqueryReadPreference) {
  297. params.subqueryReadPreference = this._subqueryReadPreference;
  298. }
  299. if (this._hint) {
  300. params.hint = this._hint;
  301. }
  302. if (this._explain) {
  303. params.explain = true;
  304. }
  305. for (var _key3 in this._extraOptions) {
  306. params[_key3] = this._extraOptions[_key3];
  307. }
  308. return params;
  309. }
  310. }, {
  311. key: "withJSON",
  312. value: function (json) {
  313. if (json.where) {
  314. this._where = json.where;
  315. }
  316. if (json.watch) {
  317. this._watch = json.watch.split(',');
  318. }
  319. if (json.include) {
  320. this._include = json.include.split(',');
  321. }
  322. if (json.keys) {
  323. this._select = json.keys.split(',');
  324. }
  325. if (json.excludeKeys) {
  326. this._exclude = json.excludeKeys.split(',');
  327. }
  328. if (json.count) {
  329. this._count = json.count === 1;
  330. }
  331. if (json.limit) {
  332. this._limit = json.limit;
  333. }
  334. if (json.skip) {
  335. this._skip = json.skip;
  336. }
  337. if (json.order) {
  338. this._order = json.order.split(',');
  339. }
  340. if (json.readPreference) {
  341. this._readPreference = json.readPreference;
  342. }
  343. if (json.includeReadPreference) {
  344. this._includeReadPreference = json.includeReadPreference;
  345. }
  346. if (json.subqueryReadPreference) {
  347. this._subqueryReadPreference = json.subqueryReadPreference;
  348. }
  349. if (json.hint) {
  350. this._hint = json.hint;
  351. }
  352. if (json.explain) {
  353. this._explain = !!json.explain;
  354. }
  355. for (var _key4 in json) {
  356. if (json.hasOwnProperty(_key4)) {
  357. if (['where', 'include', 'keys', 'count', 'limit', 'skip', 'order', 'readPreference', 'includeReadPreference', 'subqueryReadPreference', 'hint', 'explain'].indexOf(_key4) === -1) {
  358. this._extraOptions[_key4] = json[_key4];
  359. }
  360. }
  361. }
  362. return this;
  363. }
  364. }, {
  365. key: "get",
  366. value: function (objectId, options) {
  367. this.equalTo('objectId', objectId);
  368. var firstOptions = {};
  369. if (options && options.hasOwnProperty('useMasterKey')) {
  370. firstOptions.useMasterKey = options.useMasterKey;
  371. }
  372. if (options && options.hasOwnProperty('sessionToken')) {
  373. firstOptions.sessionToken = options.sessionToken;
  374. }
  375. if (options && options.hasOwnProperty('context') && typeof options.context === 'object') {
  376. firstOptions.context = options.context;
  377. }
  378. if (options && options.hasOwnProperty('json')) {
  379. firstOptions.json = options.json;
  380. }
  381. return this.first(firstOptions).then(function (response) {
  382. if (response) {
  383. return response;
  384. }
  385. var errorObject = new _ParseError.default(_ParseError.default.OBJECT_NOT_FOUND, 'Object not found.');
  386. return Promise.reject(errorObject);
  387. });
  388. }
  389. }, {
  390. key: "find",
  391. value: function (options) {
  392. var _this3 = this;
  393. options = options || {};
  394. var findOptions = {};
  395. if (options.hasOwnProperty('useMasterKey')) {
  396. findOptions.useMasterKey = options.useMasterKey;
  397. }
  398. if (options.hasOwnProperty('sessionToken')) {
  399. findOptions.sessionToken = options.sessionToken;
  400. }
  401. if (options.hasOwnProperty('context') && typeof options.context === 'object') {
  402. findOptions.context = options.context;
  403. }
  404. this._setRequestTask(findOptions);
  405. var controller = _CoreManager.default.getQueryController();
  406. var select = this._select;
  407. if (this._queriesLocalDatastore) {
  408. return this._handleOfflineQuery(this.toJSON());
  409. }
  410. return controller.find(this.className, this.toJSON(), findOptions).then(function (response) {
  411. if (_this3._explain) {
  412. return response.results;
  413. }
  414. var results = response.results.map(function (data) {
  415. var override = response.className || _this3.className;
  416. if (!data.className) {
  417. data.className = override;
  418. }
  419. if (select) {
  420. handleSelectResult(data, select);
  421. }
  422. if (options.json) {
  423. return data;
  424. } else {
  425. return _ParseObject.default.fromJSON(data, !select);
  426. }
  427. });
  428. var count = response.count;
  429. if (typeof count === 'number') {
  430. return {
  431. results: results,
  432. count: count
  433. };
  434. } else {
  435. return results;
  436. }
  437. });
  438. }
  439. }, {
  440. key: "findAll",
  441. value: function () {
  442. var _findAll = (0, _asyncToGenerator2.default)(function* (options) {
  443. var result = [];
  444. yield this.eachBatch(function (objects) {
  445. result = [].concat((0, _toConsumableArray2.default)(result), (0, _toConsumableArray2.default)(objects));
  446. }, options);
  447. return result;
  448. });
  449. function findAll() {
  450. return _findAll.apply(this, arguments);
  451. }
  452. return findAll;
  453. }()
  454. }, {
  455. key: "count",
  456. value: function (options) {
  457. options = options || {};
  458. var findOptions = {};
  459. if (options.hasOwnProperty('useMasterKey')) {
  460. findOptions.useMasterKey = options.useMasterKey;
  461. }
  462. if (options.hasOwnProperty('sessionToken')) {
  463. findOptions.sessionToken = options.sessionToken;
  464. }
  465. this._setRequestTask(findOptions);
  466. var controller = _CoreManager.default.getQueryController();
  467. var params = this.toJSON();
  468. params.limit = 0;
  469. params.count = 1;
  470. return controller.find(this.className, params, findOptions).then(function (result) {
  471. return result.count;
  472. });
  473. }
  474. }, {
  475. key: "distinct",
  476. value: function (key, options) {
  477. options = options || {};
  478. var distinctOptions = {};
  479. distinctOptions.useMasterKey = true;
  480. if (options.hasOwnProperty('sessionToken')) {
  481. distinctOptions.sessionToken = options.sessionToken;
  482. }
  483. this._setRequestTask(distinctOptions);
  484. var controller = _CoreManager.default.getQueryController();
  485. var params = {
  486. distinct: key,
  487. where: this._where,
  488. hint: this._hint
  489. };
  490. return controller.aggregate(this.className, params, distinctOptions).then(function (results) {
  491. return results.results;
  492. });
  493. }
  494. }, {
  495. key: "aggregate",
  496. value: function (pipeline, options) {
  497. options = options || {};
  498. var aggregateOptions = {};
  499. aggregateOptions.useMasterKey = true;
  500. if (options.hasOwnProperty('sessionToken')) {
  501. aggregateOptions.sessionToken = options.sessionToken;
  502. }
  503. this._setRequestTask(aggregateOptions);
  504. var controller = _CoreManager.default.getQueryController();
  505. if (!Array.isArray(pipeline) && typeof pipeline !== 'object') {
  506. throw new Error('Invalid pipeline must be Array or Object');
  507. }
  508. if (Object.keys(this._where || {}).length) {
  509. if (!Array.isArray(pipeline)) {
  510. pipeline = [pipeline];
  511. }
  512. pipeline.unshift({
  513. $match: this._where
  514. });
  515. }
  516. var params = {
  517. pipeline: pipeline,
  518. hint: this._hint,
  519. explain: this._explain,
  520. readPreference: this._readPreference
  521. };
  522. return controller.aggregate(this.className, params, aggregateOptions).then(function (results) {
  523. return results.results;
  524. });
  525. }
  526. }, {
  527. key: "first",
  528. value: function (options) {
  529. var _this4 = this;
  530. options = options || {};
  531. var findOptions = {};
  532. if (options.hasOwnProperty('useMasterKey')) {
  533. findOptions.useMasterKey = options.useMasterKey;
  534. }
  535. if (options.hasOwnProperty('sessionToken')) {
  536. findOptions.sessionToken = options.sessionToken;
  537. }
  538. if (options.hasOwnProperty('context') && typeof options.context === 'object') {
  539. findOptions.context = options.context;
  540. }
  541. this._setRequestTask(findOptions);
  542. var controller = _CoreManager.default.getQueryController();
  543. var params = this.toJSON();
  544. params.limit = 1;
  545. var select = this._select;
  546. if (this._queriesLocalDatastore) {
  547. return this._handleOfflineQuery(params).then(function (objects) {
  548. if (!objects[0]) {
  549. return undefined;
  550. }
  551. return objects[0];
  552. });
  553. }
  554. return controller.find(this.className, params, findOptions).then(function (response) {
  555. var objects = response.results;
  556. if (!objects[0]) {
  557. return undefined;
  558. }
  559. if (!objects[0].className) {
  560. objects[0].className = _this4.className;
  561. }
  562. if (select) {
  563. handleSelectResult(objects[0], select);
  564. }
  565. if (options.json) {
  566. return objects[0];
  567. } else {
  568. return _ParseObject.default.fromJSON(objects[0], !select);
  569. }
  570. });
  571. }
  572. }, {
  573. key: "eachBatch",
  574. value: function (callback, options) {
  575. options = options || {};
  576. if (this._order || this._skip || this._limit >= 0) {
  577. return Promise.reject('Cannot iterate on a query with sort, skip, or limit.');
  578. }
  579. var query = new ParseQuery(this.className);
  580. query._limit = options.batchSize || 100;
  581. query._include = this._include.map(function (i) {
  582. return i;
  583. });
  584. if (this._select) {
  585. query._select = this._select.map(function (s) {
  586. return s;
  587. });
  588. }
  589. query._hint = this._hint;
  590. query._where = {};
  591. for (var _attr in this._where) {
  592. var val = this._where[_attr];
  593. if (Array.isArray(val)) {
  594. query._where[_attr] = val.map(function (v) {
  595. return v;
  596. });
  597. } else if (val && typeof val === 'object') {
  598. var conditionMap = {};
  599. query._where[_attr] = conditionMap;
  600. for (var cond in val) {
  601. conditionMap[cond] = val[cond];
  602. }
  603. } else {
  604. query._where[_attr] = val;
  605. }
  606. }
  607. query.ascending('objectId');
  608. var findOptions = {};
  609. if (options.hasOwnProperty('useMasterKey')) {
  610. findOptions.useMasterKey = options.useMasterKey;
  611. }
  612. if (options.hasOwnProperty('sessionToken')) {
  613. findOptions.sessionToken = options.sessionToken;
  614. }
  615. if (options.hasOwnProperty('context') && typeof options.context === 'object') {
  616. findOptions.context = options.context;
  617. }
  618. if (options.hasOwnProperty('json')) {
  619. findOptions.json = options.json;
  620. }
  621. var finished = false;
  622. var previousResults = [];
  623. return (0, _promiseUtils.continueWhile)(function () {
  624. return !finished;
  625. }, (0, _asyncToGenerator2.default)(function* () {
  626. var _yield$Promise$all = yield Promise.all([query.find(findOptions), Promise.resolve(previousResults.length > 0 && callback(previousResults))]),
  627. _yield$Promise$all2 = (0, _slicedToArray2.default)(_yield$Promise$all, 1),
  628. results = _yield$Promise$all2[0];
  629. if (results.length >= query._limit) {
  630. query.greaterThan('objectId', results[results.length - 1].id);
  631. previousResults = results;
  632. } else if (results.length > 0) {
  633. yield Promise.resolve(callback(results));
  634. finished = true;
  635. } else {
  636. finished = true;
  637. }
  638. }));
  639. }
  640. }, {
  641. key: "each",
  642. value: function (callback, options) {
  643. return this.eachBatch(function (results) {
  644. var callbacksDone = Promise.resolve();
  645. results.forEach(function (result) {
  646. callbacksDone = callbacksDone.then(function () {
  647. return callback(result);
  648. });
  649. });
  650. return callbacksDone;
  651. }, options);
  652. }
  653. }, {
  654. key: "hint",
  655. value: function (value) {
  656. if (typeof value === 'undefined') {
  657. delete this._hint;
  658. }
  659. this._hint = value;
  660. return this;
  661. }
  662. }, {
  663. key: "explain",
  664. value: function () {
  665. var _explain = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
  666. if (typeof _explain !== 'boolean') {
  667. throw new Error('You can only set explain to a boolean value');
  668. }
  669. this._explain = _explain;
  670. return this;
  671. }
  672. }, {
  673. key: "map",
  674. value: function () {
  675. var _map = (0, _asyncToGenerator2.default)(function* (callback, options) {
  676. var _this5 = this;
  677. var array = [];
  678. var index = 0;
  679. yield this.each(function (object) {
  680. return Promise.resolve(callback(object, index, _this5)).then(function (result) {
  681. array.push(result);
  682. index += 1;
  683. });
  684. }, options);
  685. return array;
  686. });
  687. function map() {
  688. return _map.apply(this, arguments);
  689. }
  690. return map;
  691. }()
  692. }, {
  693. key: "reduce",
  694. value: function () {
  695. var _reduce = (0, _asyncToGenerator2.default)(function* (callback, initialValue, options) {
  696. var accumulator = initialValue;
  697. var index = 0;
  698. yield this.each(function (object) {
  699. if (index === 0 && initialValue === undefined) {
  700. accumulator = object;
  701. index += 1;
  702. return;
  703. }
  704. return Promise.resolve(callback(accumulator, object, index)).then(function (result) {
  705. accumulator = result;
  706. index += 1;
  707. });
  708. }, options);
  709. if (index === 0 && initialValue === undefined) {
  710. throw new TypeError('Reducing empty query result set with no initial value');
  711. }
  712. return accumulator;
  713. });
  714. function reduce() {
  715. return _reduce.apply(this, arguments);
  716. }
  717. return reduce;
  718. }()
  719. }, {
  720. key: "filter",
  721. value: function () {
  722. var _filter = (0, _asyncToGenerator2.default)(function* (callback, options) {
  723. var _this6 = this;
  724. var array = [];
  725. var index = 0;
  726. yield this.each(function (object) {
  727. return Promise.resolve(callback(object, index, _this6)).then(function (flag) {
  728. if (flag) {
  729. array.push(object);
  730. }
  731. index += 1;
  732. });
  733. }, options);
  734. return array;
  735. });
  736. function filter() {
  737. return _filter.apply(this, arguments);
  738. }
  739. return filter;
  740. }()
  741. }, {
  742. key: "equalTo",
  743. value: function (key, value) {
  744. var _this7 = this;
  745. if (key && typeof key === 'object') {
  746. Object.entries(key).forEach(function (_ref2) {
  747. var _ref3 = (0, _slicedToArray2.default)(_ref2, 2),
  748. k = _ref3[0],
  749. val = _ref3[1];
  750. return _this7.equalTo(k, val);
  751. });
  752. return this;
  753. }
  754. if (typeof value === 'undefined') {
  755. return this.doesNotExist(key);
  756. }
  757. this._where[key] = (0, _encode.default)(value, false, true);
  758. return this;
  759. }
  760. }, {
  761. key: "notEqualTo",
  762. value: function (key, value) {
  763. var _this8 = this;
  764. if (key && typeof key === 'object') {
  765. Object.entries(key).forEach(function (_ref4) {
  766. var _ref5 = (0, _slicedToArray2.default)(_ref4, 2),
  767. k = _ref5[0],
  768. val = _ref5[1];
  769. return _this8.notEqualTo(k, val);
  770. });
  771. return this;
  772. }
  773. return this._addCondition(key, '$ne', value);
  774. }
  775. }, {
  776. key: "lessThan",
  777. value: function (key, value) {
  778. return this._addCondition(key, '$lt', value);
  779. }
  780. }, {
  781. key: "greaterThan",
  782. value: function (key, value) {
  783. return this._addCondition(key, '$gt', value);
  784. }
  785. }, {
  786. key: "lessThanOrEqualTo",
  787. value: function (key, value) {
  788. return this._addCondition(key, '$lte', value);
  789. }
  790. }, {
  791. key: "greaterThanOrEqualTo",
  792. value: function (key, value) {
  793. return this._addCondition(key, '$gte', value);
  794. }
  795. }, {
  796. key: "containedIn",
  797. value: function (key, value) {
  798. return this._addCondition(key, '$in', value);
  799. }
  800. }, {
  801. key: "notContainedIn",
  802. value: function (key, value) {
  803. return this._addCondition(key, '$nin', value);
  804. }
  805. }, {
  806. key: "containedBy",
  807. value: function (key, values) {
  808. return this._addCondition(key, '$containedBy', values);
  809. }
  810. }, {
  811. key: "containsAll",
  812. value: function (key, values) {
  813. return this._addCondition(key, '$all', values);
  814. }
  815. }, {
  816. key: "containsAllStartingWith",
  817. value: function (key, values) {
  818. var _this = this;
  819. if (!Array.isArray(values)) {
  820. values = [values];
  821. }
  822. var regexObject = values.map(function (value) {
  823. return {
  824. $regex: _this._regexStartWith(value)
  825. };
  826. });
  827. return this.containsAll(key, regexObject);
  828. }
  829. }, {
  830. key: "exists",
  831. value: function (key) {
  832. return this._addCondition(key, '$exists', true);
  833. }
  834. }, {
  835. key: "doesNotExist",
  836. value: function (key) {
  837. return this._addCondition(key, '$exists', false);
  838. }
  839. }, {
  840. key: "matches",
  841. value: function (key, regex, modifiers) {
  842. this._addCondition(key, '$regex', regex);
  843. if (!modifiers) {
  844. modifiers = '';
  845. }
  846. if (regex.ignoreCase) {
  847. modifiers += 'i';
  848. }
  849. if (regex.multiline) {
  850. modifiers += 'm';
  851. }
  852. if (modifiers.length) {
  853. this._addCondition(key, '$options', modifiers);
  854. }
  855. return this;
  856. }
  857. }, {
  858. key: "matchesQuery",
  859. value: function (key, query) {
  860. var queryJSON = query.toJSON();
  861. queryJSON.className = query.className;
  862. return this._addCondition(key, '$inQuery', queryJSON);
  863. }
  864. }, {
  865. key: "doesNotMatchQuery",
  866. value: function (key, query) {
  867. var queryJSON = query.toJSON();
  868. queryJSON.className = query.className;
  869. return this._addCondition(key, '$notInQuery', queryJSON);
  870. }
  871. }, {
  872. key: "matchesKeyInQuery",
  873. value: function (key, queryKey, query) {
  874. var queryJSON = query.toJSON();
  875. queryJSON.className = query.className;
  876. return this._addCondition(key, '$select', {
  877. key: queryKey,
  878. query: queryJSON
  879. });
  880. }
  881. }, {
  882. key: "doesNotMatchKeyInQuery",
  883. value: function (key, queryKey, query) {
  884. var queryJSON = query.toJSON();
  885. queryJSON.className = query.className;
  886. return this._addCondition(key, '$dontSelect', {
  887. key: queryKey,
  888. query: queryJSON
  889. });
  890. }
  891. }, {
  892. key: "contains",
  893. value: function (key, substring) {
  894. if (typeof substring !== 'string') {
  895. throw new Error('The value being searched for must be a string.');
  896. }
  897. return this._addCondition(key, '$regex', quote(substring));
  898. }
  899. }, {
  900. key: "fullText",
  901. value: function (key, value, options) {
  902. options = options || {};
  903. if (!key) {
  904. throw new Error('A key is required.');
  905. }
  906. if (!value) {
  907. throw new Error('A search term is required');
  908. }
  909. if (typeof value !== 'string') {
  910. throw new Error('The value being searched for must be a string.');
  911. }
  912. var fullOptions = {};
  913. fullOptions.$term = value;
  914. for (var option in options) {
  915. switch (option) {
  916. case 'language':
  917. fullOptions.$language = options[option];
  918. break;
  919. case 'caseSensitive':
  920. fullOptions.$caseSensitive = options[option];
  921. break;
  922. case 'diacriticSensitive':
  923. fullOptions.$diacriticSensitive = options[option];
  924. break;
  925. default:
  926. throw new Error(`Unknown option: ${option}`);
  927. }
  928. }
  929. return this._addCondition(key, '$text', {
  930. $search: fullOptions
  931. });
  932. }
  933. }, {
  934. key: "sortByTextScore",
  935. value: function () {
  936. this.ascending('$score');
  937. this.select(['$score']);
  938. return this;
  939. }
  940. }, {
  941. key: "startsWith",
  942. value: function (key, prefix, modifiers) {
  943. if (typeof prefix !== 'string') {
  944. throw new Error('The value being searched for must be a string.');
  945. }
  946. return this.matches(key, this._regexStartWith(prefix), modifiers);
  947. }
  948. }, {
  949. key: "endsWith",
  950. value: function (key, suffix, modifiers) {
  951. if (typeof suffix !== 'string') {
  952. throw new Error('The value being searched for must be a string.');
  953. }
  954. return this.matches(key, quote(suffix) + '$', modifiers);
  955. }
  956. }, {
  957. key: "near",
  958. value: function (key, point) {
  959. if (!(point instanceof _ParseGeoPoint.default)) {
  960. point = new _ParseGeoPoint.default(point);
  961. }
  962. return this._addCondition(key, '$nearSphere', point);
  963. }
  964. }, {
  965. key: "withinRadians",
  966. value: function (key, point, maxDistance, sorted) {
  967. if (sorted || sorted === undefined) {
  968. this.near(key, point);
  969. return this._addCondition(key, '$maxDistance', maxDistance);
  970. } else {
  971. return this._addCondition(key, '$geoWithin', {
  972. $centerSphere: [[point.longitude, point.latitude], maxDistance]
  973. });
  974. }
  975. }
  976. }, {
  977. key: "withinMiles",
  978. value: function (key, point, maxDistance, sorted) {
  979. return this.withinRadians(key, point, maxDistance / 3958.8, sorted);
  980. }
  981. }, {
  982. key: "withinKilometers",
  983. value: function (key, point, maxDistance, sorted) {
  984. return this.withinRadians(key, point, maxDistance / 6371.0, sorted);
  985. }
  986. }, {
  987. key: "withinGeoBox",
  988. value: function (key, southwest, northeast) {
  989. if (!(southwest instanceof _ParseGeoPoint.default)) {
  990. southwest = new _ParseGeoPoint.default(southwest);
  991. }
  992. if (!(northeast instanceof _ParseGeoPoint.default)) {
  993. northeast = new _ParseGeoPoint.default(northeast);
  994. }
  995. this._addCondition(key, '$within', {
  996. $box: [southwest, northeast]
  997. });
  998. return this;
  999. }
  1000. }, {
  1001. key: "withinPolygon",
  1002. value: function (key, points) {
  1003. return this._addCondition(key, '$geoWithin', {
  1004. $polygon: points
  1005. });
  1006. }
  1007. }, {
  1008. key: "polygonContains",
  1009. value: function (key, point) {
  1010. return this._addCondition(key, '$geoIntersects', {
  1011. $point: point
  1012. });
  1013. }
  1014. }, {
  1015. key: "ascending",
  1016. value: function () {
  1017. this._order = [];
  1018. for (var _len = arguments.length, keys = new Array(_len), _key5 = 0; _key5 < _len; _key5++) {
  1019. keys[_key5] = arguments[_key5];
  1020. }
  1021. return this.addAscending.apply(this, keys);
  1022. }
  1023. }, {
  1024. key: "addAscending",
  1025. value: function () {
  1026. var _this9 = this;
  1027. if (!this._order) {
  1028. this._order = [];
  1029. }
  1030. for (var _len2 = arguments.length, keys = new Array(_len2), _key6 = 0; _key6 < _len2; _key6++) {
  1031. keys[_key6] = arguments[_key6];
  1032. }
  1033. keys.forEach(function (key) {
  1034. if (Array.isArray(key)) {
  1035. key = key.join();
  1036. }
  1037. _this9._order = _this9._order.concat(key.replace(/\s/g, '').split(','));
  1038. });
  1039. return this;
  1040. }
  1041. }, {
  1042. key: "descending",
  1043. value: function () {
  1044. this._order = [];
  1045. for (var _len3 = arguments.length, keys = new Array(_len3), _key7 = 0; _key7 < _len3; _key7++) {
  1046. keys[_key7] = arguments[_key7];
  1047. }
  1048. return this.addDescending.apply(this, keys);
  1049. }
  1050. }, {
  1051. key: "addDescending",
  1052. value: function () {
  1053. var _this10 = this;
  1054. if (!this._order) {
  1055. this._order = [];
  1056. }
  1057. for (var _len4 = arguments.length, keys = new Array(_len4), _key8 = 0; _key8 < _len4; _key8++) {
  1058. keys[_key8] = arguments[_key8];
  1059. }
  1060. keys.forEach(function (key) {
  1061. if (Array.isArray(key)) {
  1062. key = key.join();
  1063. }
  1064. _this10._order = _this10._order.concat(key.replace(/\s/g, '').split(',').map(function (k) {
  1065. return '-' + k;
  1066. }));
  1067. });
  1068. return this;
  1069. }
  1070. }, {
  1071. key: "skip",
  1072. value: function (n) {
  1073. if (typeof n !== 'number' || n < 0) {
  1074. throw new Error('You can only skip by a positive number');
  1075. }
  1076. this._skip = n;
  1077. return this;
  1078. }
  1079. }, {
  1080. key: "limit",
  1081. value: function (n) {
  1082. if (typeof n !== 'number') {
  1083. throw new Error('You can only set the limit to a numeric value');
  1084. }
  1085. this._limit = n;
  1086. return this;
  1087. }
  1088. }, {
  1089. key: "withCount",
  1090. value: function () {
  1091. var includeCount = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
  1092. if (typeof includeCount !== 'boolean') {
  1093. throw new Error('You can only set withCount to a boolean value');
  1094. }
  1095. this._count = includeCount;
  1096. return this;
  1097. }
  1098. }, {
  1099. key: "include",
  1100. value: function () {
  1101. var _this11 = this;
  1102. for (var _len5 = arguments.length, keys = new Array(_len5), _key9 = 0; _key9 < _len5; _key9++) {
  1103. keys[_key9] = arguments[_key9];
  1104. }
  1105. keys.forEach(function (key) {
  1106. if (Array.isArray(key)) {
  1107. _this11._include = _this11._include.concat(key);
  1108. } else {
  1109. _this11._include.push(key);
  1110. }
  1111. });
  1112. return this;
  1113. }
  1114. }, {
  1115. key: "includeAll",
  1116. value: function () {
  1117. return this.include('*');
  1118. }
  1119. }, {
  1120. key: "select",
  1121. value: function () {
  1122. var _this12 = this;
  1123. if (!this._select) {
  1124. this._select = [];
  1125. }
  1126. for (var _len6 = arguments.length, keys = new Array(_len6), _key10 = 0; _key10 < _len6; _key10++) {
  1127. keys[_key10] = arguments[_key10];
  1128. }
  1129. keys.forEach(function (key) {
  1130. if (Array.isArray(key)) {
  1131. _this12._select = _this12._select.concat(key);
  1132. } else {
  1133. _this12._select.push(key);
  1134. }
  1135. });
  1136. return this;
  1137. }
  1138. }, {
  1139. key: "exclude",
  1140. value: function () {
  1141. var _this13 = this;
  1142. for (var _len7 = arguments.length, keys = new Array(_len7), _key11 = 0; _key11 < _len7; _key11++) {
  1143. keys[_key11] = arguments[_key11];
  1144. }
  1145. keys.forEach(function (key) {
  1146. if (Array.isArray(key)) {
  1147. _this13._exclude = _this13._exclude.concat(key);
  1148. } else {
  1149. _this13._exclude.push(key);
  1150. }
  1151. });
  1152. return this;
  1153. }
  1154. }, {
  1155. key: "watch",
  1156. value: function () {
  1157. var _this14 = this;
  1158. for (var _len8 = arguments.length, keys = new Array(_len8), _key12 = 0; _key12 < _len8; _key12++) {
  1159. keys[_key12] = arguments[_key12];
  1160. }
  1161. keys.forEach(function (key) {
  1162. if (Array.isArray(key)) {
  1163. _this14._watch = _this14._watch.concat(key);
  1164. } else {
  1165. _this14._watch.push(key);
  1166. }
  1167. });
  1168. return this;
  1169. }
  1170. }, {
  1171. key: "readPreference",
  1172. value: function (_readPreference, includeReadPreference, subqueryReadPreference) {
  1173. this._readPreference = _readPreference;
  1174. this._includeReadPreference = includeReadPreference;
  1175. this._subqueryReadPreference = subqueryReadPreference;
  1176. return this;
  1177. }
  1178. }, {
  1179. key: "subscribe",
  1180. value: function () {
  1181. var _subscribe = (0, _asyncToGenerator2.default)(function* (sessionToken) {
  1182. var currentUser = yield _CoreManager.default.getUserController().currentUserAsync();
  1183. if (!sessionToken) {
  1184. sessionToken = currentUser ? currentUser.getSessionToken() : undefined;
  1185. }
  1186. var liveQueryClient = yield _CoreManager.default.getLiveQueryController().getDefaultLiveQueryClient();
  1187. if (liveQueryClient.shouldOpen()) {
  1188. liveQueryClient.open();
  1189. }
  1190. var subscription = liveQueryClient.subscribe(this, sessionToken);
  1191. return subscription.subscribePromise.then(function () {
  1192. return subscription;
  1193. });
  1194. });
  1195. function subscribe() {
  1196. return _subscribe.apply(this, arguments);
  1197. }
  1198. return subscribe;
  1199. }()
  1200. }, {
  1201. key: "fromNetwork",
  1202. value: function () {
  1203. this._queriesLocalDatastore = false;
  1204. this._localDatastorePinName = null;
  1205. return this;
  1206. }
  1207. }, {
  1208. key: "fromLocalDatastore",
  1209. value: function () {
  1210. return this.fromPinWithName(null);
  1211. }
  1212. }, {
  1213. key: "fromPin",
  1214. value: function () {
  1215. return this.fromPinWithName(_LocalDatastoreUtils.DEFAULT_PIN);
  1216. }
  1217. }, {
  1218. key: "fromPinWithName",
  1219. value: function (name) {
  1220. var localDatastore = _CoreManager.default.getLocalDatastore();
  1221. if (localDatastore.checkIfEnabled()) {
  1222. this._queriesLocalDatastore = true;
  1223. this._localDatastorePinName = name;
  1224. }
  1225. return this;
  1226. }
  1227. }, {
  1228. key: "cancel",
  1229. value: function () {
  1230. var _this15 = this;
  1231. if (this._xhrRequest.task && typeof this._xhrRequest.task.abort === 'function') {
  1232. this._xhrRequest.task._aborted = true;
  1233. this._xhrRequest.task.abort();
  1234. this._xhrRequest.task = null;
  1235. this._xhrRequest.onchange = function () {};
  1236. return this;
  1237. }
  1238. return this._xhrRequest.onchange = function () {
  1239. return _this15.cancel();
  1240. };
  1241. }
  1242. }, {
  1243. key: "_setRequestTask",
  1244. value: function (options) {
  1245. var _this16 = this;
  1246. options.requestTask = function (task) {
  1247. _this16._xhrRequest.task = task;
  1248. _this16._xhrRequest.onchange();
  1249. };
  1250. }
  1251. }], [{
  1252. key: "fromJSON",
  1253. value: function (className, json) {
  1254. var query = new ParseQuery(className);
  1255. return query.withJSON(json);
  1256. }
  1257. }, {
  1258. key: "or",
  1259. value: function () {
  1260. for (var _len9 = arguments.length, queries = new Array(_len9), _key13 = 0; _key13 < _len9; _key13++) {
  1261. queries[_key13] = arguments[_key13];
  1262. }
  1263. var className = _getClassNameFromQueries(queries);
  1264. var query = new ParseQuery(className);
  1265. query._orQuery(queries);
  1266. return query;
  1267. }
  1268. }, {
  1269. key: "and",
  1270. value: function () {
  1271. for (var _len10 = arguments.length, queries = new Array(_len10), _key14 = 0; _key14 < _len10; _key14++) {
  1272. queries[_key14] = arguments[_key14];
  1273. }
  1274. var className = _getClassNameFromQueries(queries);
  1275. var query = new ParseQuery(className);
  1276. query._andQuery(queries);
  1277. return query;
  1278. }
  1279. }, {
  1280. key: "nor",
  1281. value: function () {
  1282. for (var _len11 = arguments.length, queries = new Array(_len11), _key15 = 0; _key15 < _len11; _key15++) {
  1283. queries[_key15] = arguments[_key15];
  1284. }
  1285. var className = _getClassNameFromQueries(queries);
  1286. var query = new ParseQuery(className);
  1287. query._norQuery(queries);
  1288. return query;
  1289. }
  1290. }]);
  1291. return ParseQuery;
  1292. }();
  1293. var DefaultController = {
  1294. find: function (className, params, options) {
  1295. var RESTController = _CoreManager.default.getRESTController();
  1296. return RESTController.request('GET', 'classes/' + className, params, options);
  1297. },
  1298. aggregate: function (className, params, options) {
  1299. var RESTController = _CoreManager.default.getRESTController();
  1300. return RESTController.request('GET', 'aggregate/' + className, params, options);
  1301. }
  1302. };
  1303. _CoreManager.default.setQueryController(DefaultController);
  1304. var _default = ParseQuery;
  1305. exports.default = _default;