| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272 |
- /**
- * DevExtreme (data/odata/query_adapter.js)
- * Version: 19.1.16
- * Build date: Tue Oct 18 2022
- *
- * Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED
- * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
- */
- "use strict";
- var typeUtils = require("../../core/utils/type");
- var iteratorUtils = require("../../core/utils/iterator");
- var config = require("../../core/config");
- var extend = require("../../core/utils/extend").extend;
- var queryAdapters = require("../query_adapters");
- var odataUtils = require("./utils");
- var serializePropName = odataUtils.serializePropName;
- var errors = require("../errors").errors;
- var dataUtils = require("../utils");
- var isFunction = typeUtils.isFunction;
- var DEFAULT_PROTOCOL_VERSION = 2;
- var compileCriteria = function() {
- var protocolVersion;
- var forceLowerCase;
- var fieldTypes;
- var createBinaryOperationFormatter = function(op) {
- return function(prop, val) {
- return prop + " " + op + " " + val
- }
- };
- var createStringFuncFormatter = function(op, reverse) {
- return function(prop, val) {
- var bag = [op, "("];
- if (forceLowerCase) {
- prop = prop.indexOf("tolower(") === -1 ? "tolower(" + prop + ")" : prop;
- val = val.toLowerCase()
- }
- if (reverse) {
- bag.push(val, ",", prop)
- } else {
- bag.push(prop, ",", val)
- }
- bag.push(")");
- return bag.join("")
- }
- };
- var formatters = {
- "=": createBinaryOperationFormatter("eq"),
- "<>": createBinaryOperationFormatter("ne"),
- ">": createBinaryOperationFormatter("gt"),
- ">=": createBinaryOperationFormatter("ge"),
- "<": createBinaryOperationFormatter("lt"),
- "<=": createBinaryOperationFormatter("le"),
- startswith: createStringFuncFormatter("startswith"),
- endswith: createStringFuncFormatter("endswith")
- };
- var formattersV2 = extend({}, formatters, {
- contains: createStringFuncFormatter("substringof", true),
- notcontains: createStringFuncFormatter("not substringof", true)
- });
- var formattersV4 = extend({}, formatters, {
- contains: createStringFuncFormatter("contains"),
- notcontains: createStringFuncFormatter("not contains")
- });
- var compileBinary = function(criteria) {
- criteria = dataUtils.normalizeBinaryCriterion(criteria);
- var op = criteria[1];
- var formatters = 4 === protocolVersion ? formattersV4 : formattersV2;
- var formatter = formatters[op.toLowerCase()];
- if (!formatter) {
- throw errors.Error("E4003", op)
- }
- var fieldName = criteria[0];
- var value = criteria[2];
- if (fieldTypes && fieldTypes[fieldName]) {
- value = odataUtils.convertPrimitiveValue(fieldTypes[fieldName], value)
- }
- return formatter(serializePropName(fieldName), odataUtils.serializeValue(value, protocolVersion))
- };
- var compileUnary = function(criteria) {
- var op = criteria[0];
- var crit = compileCore(criteria[1]);
- if ("!" === op) {
- return "not (" + crit + ")"
- }
- throw errors.Error("E4003", op)
- };
- var compileGroup = function(criteria) {
- var bag = [];
- var groupOperator;
- var nextGroupOperator;
- iteratorUtils.each(criteria, function(index, criterion) {
- if (Array.isArray(criterion)) {
- if (bag.length > 1 && groupOperator !== nextGroupOperator) {
- throw new errors.Error("E4019")
- }
- bag.push("(" + compileCore(criterion) + ")");
- groupOperator = nextGroupOperator;
- nextGroupOperator = "and"
- } else {
- nextGroupOperator = dataUtils.isConjunctiveOperator(this) ? "and" : "or"
- }
- });
- return bag.join(" " + groupOperator + " ")
- };
- var compileCore = function(criteria) {
- if (Array.isArray(criteria[0])) {
- return compileGroup(criteria)
- }
- if (dataUtils.isUnaryOperation(criteria)) {
- return compileUnary(criteria)
- }
- return compileBinary(criteria)
- };
- return function(criteria, version, types, filterToLower) {
- fieldTypes = types;
- forceLowerCase = typeUtils.isDefined(filterToLower) ? filterToLower : config().oDataFilterToLower;
- protocolVersion = version;
- return compileCore(criteria)
- }
- }();
- var createODataQueryAdapter = function(queryOptions) {
- var _sorting = [];
- var _criteria = [];
- var _expand = queryOptions.expand;
- var _select;
- var _skip;
- var _take;
- var _countQuery;
- var _oDataVersion = queryOptions.version || DEFAULT_PROTOCOL_VERSION;
- var hasSlice = function() {
- return _skip || void 0 !== _take
- };
- var hasFunction = function hasFunction(criterion) {
- for (var i = 0; i < criterion.length; i++) {
- if (isFunction(criterion[i])) {
- return true
- }
- if (Array.isArray(criterion[i]) && hasFunction(criterion[i])) {
- return true
- }
- }
- return false
- };
- var requestData = function() {
- var result = {};
- if (!_countQuery) {
- if (_sorting.length) {
- result.$orderby = _sorting.join(",")
- }
- if (_skip) {
- result.$skip = _skip
- }
- if (void 0 !== _take) {
- result.$top = _take
- }
- result.$select = odataUtils.generateSelect(_oDataVersion, _select) || void 0;
- result.$expand = odataUtils.generateExpand(_oDataVersion, _expand, _select) || void 0
- }
- if (_criteria.length) {
- var criteria = _criteria.length < 2 ? _criteria[0] : _criteria;
- var fieldTypes = queryOptions && queryOptions.fieldTypes;
- var filterToLower = queryOptions && queryOptions.filterToLower;
- result.$filter = compileCriteria(criteria, _oDataVersion, fieldTypes, filterToLower)
- }
- if (_countQuery) {
- result.$top = 0
- }
- if (queryOptions.requireTotalCount || _countQuery) {
- if (4 !== _oDataVersion) {
- result.$inlinecount = "allpages"
- } else {
- result.$count = "true"
- }
- }
- return result
- };
- function tryLiftSelect(tasks) {
- var selectIndex = -1;
- for (var i = 0; i < tasks.length; i++) {
- if ("select" === tasks[i].name) {
- selectIndex = i;
- break
- }
- }
- if (selectIndex < 0 || !isFunction(tasks[selectIndex].args[0])) {
- return
- }
- var nextTask = tasks[1 + selectIndex];
- if (!nextTask || "slice" !== nextTask.name) {
- return
- }
- tasks[1 + selectIndex] = tasks[selectIndex];
- tasks[selectIndex] = nextTask
- }
- return {
- optimize: function(tasks) {
- tryLiftSelect(tasks)
- },
- exec: function(url) {
- return odataUtils.sendRequest(_oDataVersion, {
- url: url,
- params: extend(requestData(), queryOptions && queryOptions.params)
- }, {
- beforeSend: queryOptions.beforeSend,
- jsonp: queryOptions.jsonp,
- withCredentials: queryOptions.withCredentials,
- countOnly: _countQuery,
- deserializeDates: queryOptions.deserializeDates,
- fieldTypes: queryOptions.fieldTypes,
- isPaged: isFinite(_take)
- })
- },
- multiSort: function(args) {
- var rules;
- if (hasSlice()) {
- return false
- }
- for (var i = 0; i < args.length; i++) {
- var getter = args[i][0];
- var desc = !!args[i][1];
- var rule;
- if ("string" !== typeof getter) {
- return false
- }
- rule = serializePropName(getter);
- if (desc) {
- rule += " desc"
- }
- rules = rules || [];
- rules.push(rule)
- }
- _sorting = rules
- },
- slice: function(skipCount, takeCount) {
- if (hasSlice()) {
- return false
- }
- _skip = skipCount;
- _take = takeCount
- },
- filter: function(criterion) {
- if (hasSlice()) {
- return false
- }
- if (!Array.isArray(criterion)) {
- criterion = [].slice.call(arguments)
- }
- if (hasFunction(criterion)) {
- return false
- }
- if (_criteria.length) {
- _criteria.push("and")
- }
- _criteria.push(criterion)
- },
- select: function(expr) {
- if (_select || isFunction(expr)) {
- return false
- }
- if (!Array.isArray(expr)) {
- expr = [].slice.call(arguments)
- }
- _select = expr
- },
- count: function() {
- _countQuery = true
- }
- }
- };
- queryAdapters.odata = createODataQueryAdapter;
- exports.odata = createODataQueryAdapter;
|