store_helper.js 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. /**
  2. * DevExtreme (data/store_helper.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 grep = require("../core/utils/common").grep;
  11. var extend = require("../core/utils/extend").extend;
  12. var each = require("../core/utils/iterator").each;
  13. var arrayQuery = require("./array_query");
  14. var normalizeSortingInfo = require("./utils").normalizeSortingInfo;
  15. function multiLevelGroup(query, groupInfo) {
  16. query = query.groupBy(groupInfo[0].selector);
  17. if (groupInfo.length > 1) {
  18. query = query.select(function(g) {
  19. return extend({}, g, {
  20. items: multiLevelGroup(arrayQuery(g.items), groupInfo.slice(1)).toArray()
  21. })
  22. })
  23. }
  24. return query
  25. }
  26. function arrangeSortingInfo(groupInfo, sortInfo) {
  27. var filteredGroup = [];
  28. each(groupInfo, function(_, group) {
  29. var collision = grep(sortInfo, function(sort) {
  30. return group.selector === sort.selector
  31. });
  32. if (collision.length < 1) {
  33. filteredGroup.push(group)
  34. }
  35. });
  36. return filteredGroup.concat(sortInfo)
  37. }
  38. function queryByOptions(query, options, isCountQuery) {
  39. options = options || {};
  40. var filter = options.filter;
  41. if (filter) {
  42. query = query.filter(filter)
  43. }
  44. if (isCountQuery) {
  45. return query
  46. }
  47. var sort = options.sort;
  48. var select = options.select;
  49. var group = options.group;
  50. var skip = options.skip;
  51. var take = options.take;
  52. if (group) {
  53. group = normalizeSortingInfo(group);
  54. group.keepInitialKeyOrder = !!options.group.keepInitialKeyOrder
  55. }
  56. if (sort || group) {
  57. sort = normalizeSortingInfo(sort || []);
  58. if (group && !group.keepInitialKeyOrder) {
  59. sort = arrangeSortingInfo(group, sort)
  60. }
  61. each(sort, function(index) {
  62. query = query[index ? "thenBy" : "sortBy"](this.selector, this.desc, this.compare)
  63. })
  64. }
  65. if (select) {
  66. query = query.select(select)
  67. }
  68. if (group) {
  69. query = multiLevelGroup(query, group)
  70. }
  71. if (take || skip) {
  72. query = query.slice(skip || 0, take)
  73. }
  74. return query
  75. }
  76. module.exports = {
  77. multiLevelGroup: multiLevelGroup,
  78. arrangeSortingInfo: arrangeSortingInfo,
  79. queryByOptions: queryByOptions
  80. };