devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
89 lines (85 loc) • 2.53 kB
JavaScript
/**
* DevExtreme (esm/data/store_helper.js)
* Version: 21.1.4
* Build date: Mon Jun 21 2021
*
* Copyright (c) 2012 - 2021 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
import {
grep
} from "../core/utils/common";
import {
extend
} from "../core/utils/extend";
import {
each
} from "../core/utils/iterator";
import arrayQuery from "./array_query";
import dataUtils from "./utils";
function multiLevelGroup(query, groupInfo) {
query = query.groupBy(groupInfo[0].selector);
if (groupInfo.length > 1) {
query = query.select((function(g) {
return extend({}, g, {
items: multiLevelGroup(arrayQuery(g.items), groupInfo.slice(1)).toArray()
})
}))
}
return query
}
function arrangeSortingInfo(groupInfo, sortInfo) {
var filteredGroup = [];
each(groupInfo, (function(_, group) {
var collision = grep(sortInfo, (function(sort) {
return group.selector === sort.selector
}));
if (collision.length < 1) {
filteredGroup.push(group)
}
}));
return filteredGroup.concat(sortInfo)
}
function queryByOptions(query, options, isCountQuery) {
options = options || {};
var filter = options.filter;
if (filter) {
query = query.filter(filter)
}
if (isCountQuery) {
return query
}
var sort = options.sort;
var select = options.select;
var group = options.group;
var skip = options.skip;
var take = options.take;
if (group) {
group = dataUtils.normalizeSortingInfo(group);
group.keepInitialKeyOrder = !!options.group.keepInitialKeyOrder
}
if (sort || group) {
sort = dataUtils.normalizeSortingInfo(sort || []);
if (group && !group.keepInitialKeyOrder) {
sort = arrangeSortingInfo(group, sort)
}
each(sort, (function(index) {
query = query[index ? "thenBy" : "sortBy"](this.selector, this.desc, this.compare)
}))
}
if (select) {
query = query.select(select)
}
if (group) {
query = multiLevelGroup(query, group)
}
if (take || skip) {
query = query.slice(skip || 0, take)
}
return query
}
export default {
multiLevelGroup: multiLevelGroup,
arrangeSortingInfo: arrangeSortingInfo,
queryByOptions: queryByOptions
};