remote_query.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. /**
  2. * DevExtreme (data/remote_query.js)
  3. * Version: 19.1.16
  4. * Build date: Tue Oct 18 2022
  5. *
  6. * Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED
  7. * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
  8. */
  9. "use strict";
  10. var queryAdapters = require("./query_adapters");
  11. var errorsModule = require("./errors");
  12. var each = require("../core/utils/iterator").each;
  13. var isFunction = require("../core/utils/type").isFunction;
  14. var Deferred = require("../core/utils/deferred").Deferred;
  15. var arrayQueryImpl = require("./array_query");
  16. var remoteQueryImpl = function remoteQueryImpl(url, queryOptions, tasks) {
  17. tasks = tasks || [];
  18. queryOptions = queryOptions || {};
  19. var createTask = function(name, args) {
  20. return {
  21. name: name,
  22. args: args
  23. }
  24. };
  25. var exec = function(executorTask) {
  26. var d = new Deferred;
  27. var _adapterFactory;
  28. var _adapter;
  29. var _taskQueue;
  30. var _currentTask;
  31. var _mergedSortArgs;
  32. var rejectWithNotify = function(error) {
  33. var handler = queryOptions.errorHandler;
  34. if (handler) {
  35. handler(error)
  36. }
  37. errorsModule._errorHandler(error);
  38. d.reject(error)
  39. };
  40. function mergeSortTask(task) {
  41. switch (task.name) {
  42. case "sortBy":
  43. _mergedSortArgs = [task.args];
  44. return true;
  45. case "thenBy":
  46. if (!_mergedSortArgs) {
  47. throw errorsModule.errors.Error("E4004")
  48. }
  49. _mergedSortArgs.push(task.args);
  50. return true
  51. }
  52. return false
  53. }
  54. function unmergeSortTasks() {
  55. var head = _taskQueue[0];
  56. var unmergedTasks = [];
  57. if (head && "multiSort" === head.name) {
  58. _taskQueue.shift();
  59. each(head.args[0], function() {
  60. unmergedTasks.push(createTask(unmergedTasks.length ? "thenBy" : "sortBy", this))
  61. })
  62. }
  63. _taskQueue = unmergedTasks.concat(_taskQueue)
  64. }
  65. try {
  66. _adapterFactory = queryOptions.adapter;
  67. if (!isFunction(_adapterFactory)) {
  68. _adapterFactory = queryAdapters[_adapterFactory]
  69. }
  70. _adapter = _adapterFactory(queryOptions);
  71. _taskQueue = [].concat(tasks).concat(executorTask);
  72. var optimize = _adapter.optimize;
  73. if (optimize) {
  74. optimize(_taskQueue)
  75. }
  76. while (_taskQueue.length) {
  77. _currentTask = _taskQueue[0];
  78. if (!mergeSortTask(_currentTask)) {
  79. if (_mergedSortArgs) {
  80. _taskQueue.unshift(createTask("multiSort", [_mergedSortArgs]));
  81. _mergedSortArgs = null;
  82. continue
  83. }
  84. if ("enumerate" !== String(_currentTask.name)) {
  85. if (!_adapter[_currentTask.name] || false === _adapter[_currentTask.name].apply(_adapter, _currentTask.args)) {
  86. break
  87. }
  88. }
  89. }
  90. _taskQueue.shift()
  91. }
  92. unmergeSortTasks();
  93. _adapter.exec(url).done(function(result, extra) {
  94. if (!_taskQueue.length) {
  95. d.resolve(result, extra)
  96. } else {
  97. var clientChain = arrayQueryImpl(result, {
  98. errorHandler: queryOptions.errorHandler
  99. });
  100. each(_taskQueue, function() {
  101. clientChain = clientChain[this.name].apply(clientChain, this.args)
  102. });
  103. clientChain.done(d.resolve).fail(d.reject)
  104. }
  105. }).fail(rejectWithNotify)
  106. } catch (x) {
  107. rejectWithNotify(x)
  108. }
  109. return d.promise()
  110. };
  111. var query = {};
  112. each(["sortBy", "thenBy", "filter", "slice", "select", "groupBy"], function() {
  113. var name = String(this);
  114. query[name] = function() {
  115. return remoteQueryImpl(url, queryOptions, tasks.concat(createTask(name, arguments)))
  116. }
  117. });
  118. each(["count", "min", "max", "sum", "avg", "aggregate", "enumerate"], function() {
  119. var name = String(this);
  120. query[name] = function() {
  121. return exec.call(this, createTask(name, arguments))
  122. }
  123. });
  124. return query
  125. };
  126. module.exports = remoteQueryImpl;