UNPKG

9.37 kBJavaScriptView Raw
1"use strict";
2var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
3 if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
4 if (ar || !(i in from)) {
5 if (!ar) ar = Array.prototype.slice.call(from, 0, i);
6 ar[i] = from[i];
7 }
8 }
9 return to.concat(ar || Array.prototype.slice.call(from));
10};
11var __importDefault = (this && this.__importDefault) || function (mod) {
12 return (mod && mod.__esModule) ? mod : { "default": mod };
13};
14Object.defineProperty(exports, "__esModule", { value: true });
15exports.createGetFilter = void 0;
16var moment_1 = __importDefault(require("moment"));
17var filter_1 = require("../filter");
18var selectable_1 = require("../selectable");
19var filter_lambda_expression_1 = require("../filter/filter-lambda-expression");
20var name_converter_1 = require("../name-converter");
21/**
22 * Creates a getFilter function using the OData v2 or OData v4 URI converter.
23 * The concrete filter getters are initiated in odata/v2/uri-conversion/odata-uri.ts and odata/v4/uri-conversion/odata-uri.ts.
24 * @param uriConverter - Uri converter for v2 or v4.
25 * @returns The filter getter. See interface [[GetFilter]]
26 */
27function createGetFilter(uriConverter) {
28 /**
29 * Get an object containing the given filter as query parameter, or an empty object if none was given.
30 * @typeparam EntityT - Type of the entity to filter on
31 * @param filter - The filter to transform to a query parameter
32 * @param entityConstructor - Constructor type of the entity to filter on
33 * @returns An object containing the query parameter with encoding or an empty object
34 */
35 function getFilter(filter, entityConstructor) {
36 if (typeof filter !== 'undefined') {
37 var filterExpression = getODataFilterExpression(filter, [], entityConstructor);
38 if (filterExpression) {
39 return {
40 filter: encodeURIComponent(filterExpression)
41 };
42 }
43 }
44 return {};
45 }
46 function getODataFilterExpression(filter, parentFieldNames, targetEntityConstructor, lambdaExpressionLevel) {
47 if (parentFieldNames === void 0) { parentFieldNames = []; }
48 if (lambdaExpressionLevel === void 0) { lambdaExpressionLevel = 0; }
49 if ((0, filter_1.isFilterList)(filter)) {
50 return getODataFilterExpressionForFilterList(filter, parentFieldNames, targetEntityConstructor, lambdaExpressionLevel);
51 }
52 if ((0, filter_1.isFilterLink)(filter)) {
53 return getODataFilterExpressionForFilterLink(filter, parentFieldNames, targetEntityConstructor, lambdaExpressionLevel);
54 }
55 if ((0, filter_1.isFilter)(filter)) {
56 return getODataFilterExpressionForFilter(filter, parentFieldNames, targetEntityConstructor);
57 }
58 if ((0, filter_1.isBooleanFilterFunction)(filter)) {
59 return filterFunctionToString(filter, parentFieldNames);
60 }
61 if ((0, filter_1.isUnaryFilter)(filter)) {
62 return getODataFilterExpressionForUnaryFilter(filter, parentFieldNames, targetEntityConstructor);
63 }
64 if ((0, filter_lambda_expression_1.isFilterLambdaExpression)(filter)) {
65 return getODataFilterExpressionForFilterLambdaExpression(filter, parentFieldNames, targetEntityConstructor, lambdaExpressionLevel);
66 }
67 if (filter instanceof selectable_1.OneToManyLink) {
68 return getODataFilterExpressionForFilterLink(filter._filters, parentFieldNames, targetEntityConstructor, lambdaExpressionLevel);
69 }
70 throw new Error("Could not construct query parameters from filter. Filter is not valid: ".concat(JSON.stringify(filter)));
71 }
72 function retrieveField(filterField, targetEntityConstructor, filterEdmType) {
73 // In case of complex types there will be a property name as part of the filter.field
74 var fieldName = filterField.split('/')[0];
75 var field = targetEntityConstructor[(0, name_converter_1.toStaticPropertyFormat)(fieldName)];
76 if (field instanceof selectable_1.ComplexTypeField) {
77 return Object.values(field)
78 .filter(function (pField) { return pField === null || pField === void 0 ? void 0 : pField.fieldPath; }) // Filter for ComplexTypePropertyFields only
79 .find(function (pField) { return pField.fieldPath() === filterField; });
80 }
81 // In case of custom field we infer then the returned field from the filter edmType property
82 return field || { edmType: filterEdmType };
83 }
84 function filterFunctionToString(filterFunction, parentFieldNames) {
85 if (parentFieldNames === void 0) { parentFieldNames = []; }
86 var params = filterFunction.parameters
87 .map(function (param) { return filterFunctionParameterToString(param, parentFieldNames); })
88 .join(',');
89 return "".concat(filterFunction.functionName, "(").concat(params, ")");
90 }
91 function filterFunctionParameterToString(param, parentFieldNames) {
92 if (typeof param === 'number') {
93 return param.toString();
94 }
95 if (typeof param === 'string') {
96 return uriConverter.convertToUriFormat(param, 'Edm.String');
97 }
98 if (param instanceof filter_1.FilterFunction) {
99 return filterFunctionToString(param, parentFieldNames);
100 }
101 if (moment_1.default.isMoment(param)) {
102 return uriConverter.convertToUriFormat(param, 'Edm.DateTimeOffset');
103 }
104 if (Array.isArray(param)) {
105 return "[".concat(param
106 .map(function (p) { return filterFunctionParameterToString(p, parentFieldNames); })
107 .join(','), "]");
108 }
109 return __spreadArray(__spreadArray([], parentFieldNames, true), [param._fieldName], false).join('/');
110 }
111 function convertFilterValue(value, edmType) {
112 return Array.isArray(value)
113 ? "[".concat(value
114 .map(function (v) { return uriConverter.convertToUriFormat(v, edmType); })
115 .join(','), "]")
116 : uriConverter.convertToUriFormat(value, edmType);
117 }
118 function getODataFilterExpressionForUnaryFilter(filter, parentFieldNames, targetEntityConstructor) {
119 return "".concat(filter.operator, " (").concat(getODataFilterExpression(filter.singleOperand, parentFieldNames, targetEntityConstructor), ")");
120 }
121 function getODataFilterExpressionForFilterLambdaExpression(filter, parentFieldNames, targetEntityConstructor, lambdaExpressionLevel) {
122 var alias = "a".concat(lambdaExpressionLevel);
123 var filterExp = getODataFilterExpression(filter.filters, [alias], targetEntityConstructor, lambdaExpressionLevel + 1);
124 return "".concat(parentFieldNames.join('/'), "/").concat(filter.lambdaOperator, "(").concat(alias, ":").concat(filterExp, ")");
125 }
126 function getODataFilterExpressionForFilterList(filter, parentFieldNames, targetEntityConstructor, lambdaExpressionLevel) {
127 var andExp = filter.andFilters
128 .map(function (subFilter) {
129 return getODataFilterExpression(subFilter, parentFieldNames, targetEntityConstructor, lambdaExpressionLevel);
130 })
131 .filter(function (f) { return !!f; })
132 .join(' and ');
133 andExp = andExp ? "(".concat(andExp, ")") : andExp;
134 var orExp = filter.orFilters
135 .map(function (subFilter) {
136 return getODataFilterExpression(subFilter, parentFieldNames, targetEntityConstructor, lambdaExpressionLevel);
137 })
138 .filter(function (f) { return !!f; })
139 .join(' or ');
140 orExp = orExp ? "(".concat(orExp, ")") : orExp;
141 var exp = [];
142 if (andExp) {
143 exp.push(andExp);
144 }
145 if (orExp) {
146 exp.push(orExp);
147 }
148 return exp.join(' and ');
149 }
150 function getODataFilterExpressionForFilterLink(filter, parentFieldNames, targetEntityConstructor, lambdaExpressionLevel) {
151 var linkExp = filter.filters
152 .map(function (subFilter) {
153 return getODataFilterExpression(subFilter, __spreadArray(__spreadArray([], parentFieldNames, true), [filter.link._fieldName], false), filter.link._linkedEntity, lambdaExpressionLevel);
154 })
155 .filter(function (f) { return !!f; })
156 .join(' and ');
157 linkExp = linkExp ? "(".concat(linkExp, ")") : linkExp;
158 return linkExp;
159 }
160 function getODataFilterExpressionForFilter(filter, parentFieldNames, targetEntityConstructor) {
161 if (typeof filter.field === 'string') {
162 var field = retrieveField(filter.field, targetEntityConstructor, filter.edmType);
163 return [
164 __spreadArray(__spreadArray([], parentFieldNames, true), [filter.field], false).join('/'),
165 filter.operator,
166 convertFilterValue(filter.value, field.edmType)
167 ].join(' ');
168 }
169 return [
170 filterFunctionToString(filter.field, parentFieldNames),
171 filter.operator,
172 convertFilterValue(filter.value, filter.edmType)
173 ].join(' ');
174 }
175 return {
176 getFilter: getFilter
177 };
178}
179exports.createGetFilter = createGetFilter;
180//# sourceMappingURL=get-filter.js.map
\No newline at end of file