prostgles-server 4.2.483 → 4.2.484

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/DboBuilder/ViewHandler/ViewHandler.d.ts +1 -0
  2. package/dist/DboBuilder/ViewHandler/ViewHandler.d.ts.map +1 -1
  3. package/dist/DboBuilder/ViewHandler/parseComplexFilter.d.ts.map +1 -1
  4. package/dist/DboBuilder/ViewHandler/parseComplexFilter.js +3 -2
  5. package/dist/DboBuilder/ViewHandler/parseComplexFilter.js.map +1 -1
  6. package/dist/DboBuilder/ViewHandler/prepareWhere.d.ts +1 -0
  7. package/dist/DboBuilder/ViewHandler/prepareWhere.d.ts.map +1 -1
  8. package/dist/DboBuilder/ViewHandler/prepareWhere.js +26 -13
  9. package/dist/DboBuilder/ViewHandler/prepareWhere.js.map +1 -1
  10. package/dist/DboBuilder/getCondition.d.ts +1 -0
  11. package/dist/DboBuilder/getCondition.d.ts.map +1 -1
  12. package/dist/DboBuilder/getCondition.js +10 -8
  13. package/dist/DboBuilder/getCondition.js.map +1 -1
  14. package/dist/DboBuilder/getSubscribeRelatedTables.d.ts.map +1 -1
  15. package/dist/DboBuilder/getSubscribeRelatedTables.js +1 -1
  16. package/dist/DboBuilder/getSubscribeRelatedTables.js.map +1 -1
  17. package/dist/{Filtering.d.ts → Filtering/Filtering.d.ts} +5 -7
  18. package/dist/Filtering/Filtering.d.ts.map +1 -0
  19. package/dist/Filtering/Filtering.js +244 -0
  20. package/dist/Filtering/Filtering.js.map +1 -0
  21. package/dist/Filtering/getFilterItemCondition.d.ts +7 -0
  22. package/dist/Filtering/getFilterItemCondition.d.ts.map +1 -0
  23. package/dist/Filtering/getFilterItemCondition.js +186 -0
  24. package/dist/Filtering/getFilterItemCondition.js.map +1 -0
  25. package/dist/Filtering/parseFilterRightValue.d.ts +8 -0
  26. package/dist/Filtering/parseFilterRightValue.d.ts.map +1 -0
  27. package/dist/Filtering/parseFilterRightValue.js +23 -0
  28. package/dist/Filtering/parseFilterRightValue.js.map +1 -0
  29. package/lib/DboBuilder/ViewHandler/parseComplexFilter.ts +2 -5
  30. package/lib/DboBuilder/ViewHandler/prepareWhere.ts +30 -15
  31. package/lib/DboBuilder/getCondition.ts +15 -13
  32. package/lib/DboBuilder/getSubscribeRelatedTables.ts +3 -1
  33. package/lib/Filtering/Filtering.ts +286 -0
  34. package/lib/Filtering/getFilterItemCondition.ts +205 -0
  35. package/lib/Filtering/parseFilterRightValue.ts +24 -0
  36. package/package.json +1 -1
  37. package/dist/Filtering.d.ts.map +0 -1
  38. package/dist/Filtering.js +0 -418
  39. package/dist/Filtering.js.map +0 -1
  40. package/lib/Filtering.ts +0 -468
package/dist/Filtering.js DELETED
@@ -1,418 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseFilterRightValue = exports.parseFilterItem = exports.FILTER_OPERAND_TO_SQL_OPERAND = exports.FILTER_OPERANDS = void 0;
4
- const prostgles_types_1 = require("prostgles-types");
5
- const DboBuilderTypes_1 = require("./DboBuilder/DboBuilderTypes");
6
- exports.FILTER_OPERANDS = [
7
- ...prostgles_types_1.TextFilterKeys,
8
- ...prostgles_types_1.JsonbFilterKeys,
9
- ...prostgles_types_1.CompareFilterKeys,
10
- ...prostgles_types_1.BetweenFilterKeys,
11
- ...prostgles_types_1.CompareInFilterKeys,
12
- ];
13
- exports.FILTER_OPERAND_TO_SQL_OPERAND = Object.fromEntries(exports.FILTER_OPERANDS.map((filterOperand) => {
14
- let sqlOperand = filterOperand;
15
- if (filterOperand === "$eq")
16
- sqlOperand = "=";
17
- else if (filterOperand === "$gt")
18
- sqlOperand = ">";
19
- else if (filterOperand === "$gte")
20
- sqlOperand = ">=";
21
- else if (filterOperand === "$lt")
22
- sqlOperand = "<";
23
- else if (filterOperand === "$lte")
24
- sqlOperand = "<=";
25
- else if (filterOperand === "$ne")
26
- sqlOperand = "<>";
27
- else if (filterOperand === "$like")
28
- sqlOperand = "LIKE";
29
- else if (filterOperand === "$ilike")
30
- sqlOperand = "ILIKE";
31
- else if (filterOperand === "$nlike")
32
- sqlOperand = "NOT LIKE";
33
- else if (filterOperand === "$nilike")
34
- sqlOperand = "NOT ILIKE";
35
- else if (filterOperand === "$in")
36
- sqlOperand = "IN";
37
- else if (filterOperand === "$nin")
38
- sqlOperand = "NOT IN";
39
- else if (filterOperand === "$between")
40
- sqlOperand = "BETWEEN";
41
- else if (filterOperand === "$notBetween")
42
- sqlOperand = "NOT BETWEEN";
43
- else if (filterOperand === "$isDistinctFrom")
44
- sqlOperand = "IS DISTINCT FROM";
45
- else if (filterOperand === "$isNotDistinctFrom")
46
- sqlOperand = "IS NOT DISTINCT FROM";
47
- return [filterOperand, sqlOperand];
48
- }));
49
- const parseFilterItem = (args) => {
50
- const { filter: filterItem, select, tableAliasRaw, allowedColumnNames } = args;
51
- if (!filterItem || (0, prostgles_types_1.isEmpty)(filterItem))
52
- return "";
53
- const makeError = (msg) => {
54
- throw `${msg}: ${JSON.stringify(filterItem, null, 2)}`;
55
- };
56
- const asValue = (v) => DboBuilderTypes_1.pgp.as.format("$1", [v]);
57
- const filterEntries = Object.entries(filterItem);
58
- const [firstFilterEntry, ...otherFilterEnties] = filterEntries;
59
- if (!firstFilterEntry) {
60
- return "";
61
- /**
62
- * { field1: cond1, field2: cond2 }
63
- */
64
- }
65
- else if (otherFilterEnties.length) {
66
- return filterEntries
67
- .map(([filterKey, filterValue]) => (0, exports.parseFilterItem)({
68
- filter: { [filterKey]: filterValue },
69
- select,
70
- tableAliasRaw,
71
- allowedColumnNames,
72
- }))
73
- .sort() /* sorted to ensure duplicate subscription channels are not created due to different condition order */
74
- .join(" AND ");
75
- }
76
- // const fKey: string = filterKeys[0]!;
77
- const [firstFilterKey, firstFilterValue] = firstFilterEntry;
78
- let selItem;
79
- if (select) {
80
- selItem = select.find((s) => firstFilterKey === s.alias);
81
- }
82
- let rightF = firstFilterValue;
83
- const validateSelectedItemFilter = (selectedItem) => {
84
- const fields = selectedItem?.fields;
85
- if (Array.isArray(fields) && fields.length) {
86
- const dissallowedFields = fields.filter((fname) => !allowedColumnNames.includes(fname));
87
- if (dissallowedFields.length) {
88
- throw new Error(`Invalid/disallowed columns found in filter: ${dissallowedFields.join(", ")}`);
89
- }
90
- }
91
- };
92
- const getLeftQ = (selItm) => {
93
- validateSelectedItemFilter(selItem);
94
- if (selItm.type === "function" || selItm.type === "aggregation")
95
- return selItm.getQuery();
96
- return selItm.getQuery(tableAliasRaw);
97
- };
98
- /**
99
- * Parsed left side of the query
100
- */
101
- let leftQ; // = asName(selItem.alias);
102
- /*
103
- Select item not found.
104
- Check if dot/json notation. Build obj if necessary
105
- */
106
- const dot_notation_delims = ["->", "."];
107
- if (!selItem) {
108
- /* See if dot notation. Pick the best matching starting string */
109
- if (select) {
110
- selItem = select.find((s) => dot_notation_delims.find((delimiter) => firstFilterKey.startsWith(s.alias + delimiter)));
111
- validateSelectedItemFilter(selItem);
112
- }
113
- if (!selItem) {
114
- return makeError("Bad filter. Could not match to a column or alias or dot notation" +
115
- select?.map((s) => s.alias).join(", "));
116
- }
117
- let remainingStr = firstFilterKey.slice(selItem.alias.length);
118
- /* Is json path spec */
119
- if (remainingStr.startsWith("->")) {
120
- /** Has shorthand operand 'col->>key.<>' */
121
- const matchingOperand = prostgles_types_1.CompareFilterKeys.find((operand) => remainingStr.endsWith(`.${operand}`));
122
- if (matchingOperand) {
123
- remainingStr = remainingStr.slice(0, -matchingOperand.length - 1);
124
- rightF = { [matchingOperand]: rightF };
125
- }
126
- leftQ = getLeftQ(selItem);
127
- const getSep = (fromIdx = 0) => {
128
- const strPart = remainingStr.slice(fromIdx);
129
- let idx = strPart.indexOf("->");
130
- const idxx = strPart.indexOf("->>");
131
- if (idx > -1) {
132
- /* if -> matches then check if it's the last separator */
133
- if (idx === idxx)
134
- return { idx: idx + fromIdx, sep: "->>" };
135
- return { idx: idx + fromIdx, sep: "->" };
136
- }
137
- idx = strPart.indexOf("->>");
138
- if (idx > -1) {
139
- return { idx: idx + fromIdx, sep: "->>" };
140
- }
141
- return undefined;
142
- };
143
- let currSep = getSep();
144
- while (currSep) {
145
- let nextSep = getSep(currSep.idx + currSep.sep.length);
146
- let nextIdx = nextSep ? nextSep.idx : remainingStr.length;
147
- /* If ending in set then add set as well into key */
148
- if (nextSep && nextIdx + nextSep.sep.length === remainingStr.length) {
149
- nextIdx = remainingStr.length;
150
- nextSep = undefined;
151
- }
152
- leftQ +=
153
- currSep.sep + asValue(remainingStr.slice(currSep.idx + currSep.sep.length, nextIdx));
154
- currSep = nextSep;
155
- }
156
- /*
157
- Is collapsed filter spec e.g. { "col.$ilike": 'text' }
158
- will transform into { col: { $ilike: ['text'] } }
159
- */
160
- }
161
- else if (remainingStr.startsWith(".")) {
162
- leftQ = getLeftQ(selItem);
163
- const getSep = (fromIdx = 0) => {
164
- const idx = remainingStr.slice(fromIdx).indexOf(".");
165
- if (idx > -1)
166
- return fromIdx + idx;
167
- return idx;
168
- };
169
- let currIdx = getSep();
170
- const res = {};
171
- let curObj = res;
172
- while (currIdx > -1) {
173
- let nextIdx = getSep(currIdx + 1);
174
- let nIdx = nextIdx > -1 ? nextIdx : remainingStr.length;
175
- /* If ending in dot then add dot as well into key */
176
- if (nextIdx + 1 === remainingStr.length) {
177
- nIdx = remainingStr.length;
178
- nextIdx = -1;
179
- }
180
- const key = remainingStr.slice(currIdx + 1, nIdx);
181
- curObj[key] = nextIdx > -1 ? {} : firstFilterValue;
182
- curObj = curObj[key];
183
- currIdx = nextIdx;
184
- }
185
- rightF = res;
186
- }
187
- else {
188
- // console.trace(141, select, selItem, remainingStr)
189
- makeError("Bad filter. Could not find the valid col name or alias or col json path");
190
- }
191
- }
192
- else {
193
- leftQ = getLeftQ(selItem);
194
- }
195
- if (!leftQ)
196
- makeError("Internal error: leftQ missing?!");
197
- const parseRightVal = (val, expect) => {
198
- try {
199
- return (0, exports.parseFilterRightValue)(val, { selectItem: selItem, expect });
200
- }
201
- catch (e) {
202
- return makeError(e);
203
- }
204
- };
205
- /* Matching sel item */
206
- if ((0, prostgles_types_1.isObject)(rightF)) {
207
- const filterKeys = Object.keys(rightF);
208
- let filterOperand = filterKeys[0];
209
- /** JSON cannot be compared so we'll cast it to TEXT */
210
- if (selItem.column_udt_type === "json" || (0, prostgles_types_1.includes)(prostgles_types_1.TextFilterKeys, filterOperand)) {
211
- leftQ += "::TEXT ";
212
- }
213
- /** It's an object key which means it's an equality comparison against a json object */
214
- if (selItem.column_udt_type?.startsWith("json") && !(0, prostgles_types_1.includes)(exports.FILTER_OPERANDS, filterOperand)) {
215
- return leftQ + " = " + parseRightVal(rightF);
216
- }
217
- let filterValue = rightF[filterOperand];
218
- const ALLOWED_FUNCS = [...prostgles_types_1.GeomFilter_Funcs, ...prostgles_types_1.TextFilter_FullTextSearchFilterKeys];
219
- let funcName;
220
- let funcArgs;
221
- if (selItem.column_udt_type === "interval" &&
222
- (0, prostgles_types_1.isObject)(rightF) &&
223
- Object.values(rightF).every((v) => Number.isFinite(v))) {
224
- filterOperand = "=";
225
- filterValue = Object.entries(rightF)
226
- .map(([k, v]) => `${v}${k}`)
227
- .join(" ");
228
- }
229
- else if ((filterKeys.length !== 1 || !(0, prostgles_types_1.isDefined)(filterOperand)) &&
230
- selItem.column_udt_type !== "jsonb") {
231
- return makeError("Bad filter. Expecting one key only");
232
- }
233
- else if ((0, prostgles_types_1.isObject)(filterValue) && !(filterValue instanceof Date)) {
234
- /**
235
- * Filter notation
236
- * geom && st_makeenvelope(funcArgs)
237
- */
238
- const filterValueKeys = Object.keys(filterValue);
239
- funcName = filterValueKeys[0];
240
- if ((0, prostgles_types_1.includes)(ALLOWED_FUNCS, funcName)) {
241
- funcArgs = filterValue[funcName];
242
- }
243
- else {
244
- funcName = undefined;
245
- }
246
- }
247
- /** st_makeenvelope */
248
- if ((0, prostgles_types_1.includes)(prostgles_types_1.GeomFilterKeys, filterOperand) &&
249
- funcName &&
250
- (0, prostgles_types_1.includes)(prostgles_types_1.GeomFilter_Funcs, funcName)) {
251
- /**
252
- * If leftQ is geography then:
253
- * - err can happen: 'Antipodal (180 degrees long) edge detected!'
254
- * - inacurrate results at large envelopes due to the curvature of the earth
255
- * https://gis.stackexchange.com/questions/78816/maximum-size-on-the-bounding-box-with-st-makeenvelope-and-and-geography-colum
256
- */
257
- if (funcName.toLowerCase() === "st_makeenvelope") {
258
- leftQ += "::geometry";
259
- }
260
- return `${leftQ} ${filterOperand} ${funcName}${parseRightVal(funcArgs, "csv")}`;
261
- }
262
- else if (["=", "$eq"].includes(filterOperand) && !funcName) {
263
- if (filterValue === null)
264
- return leftQ + " IS NULL ";
265
- return leftQ + " = " + parseRightVal(filterValue);
266
- }
267
- else if (["<>", "$ne"].includes(filterOperand)) {
268
- if (filterValue === null)
269
- return leftQ + " IS NOT NULL ";
270
- return leftQ + " <> " + parseRightVal(filterValue);
271
- }
272
- else if ([">", "$gt"].includes(filterOperand)) {
273
- return leftQ + " > " + parseRightVal(filterValue);
274
- }
275
- else if (["<", "$lt"].includes(filterOperand)) {
276
- return leftQ + " < " + parseRightVal(filterValue);
277
- }
278
- else if ([">=", "$gte"].includes(filterOperand)) {
279
- return leftQ + " >= " + parseRightVal(filterValue);
280
- }
281
- else if (["<=", "$lte"].includes(filterOperand)) {
282
- return leftQ + " <= " + parseRightVal(filterValue);
283
- }
284
- else if (["$in", "$nin"].includes(filterOperand)) {
285
- const isIn = filterOperand === "$in";
286
- if (filterValue !== null && !Array.isArray(filterValue)) {
287
- return makeError("In filter expects an array");
288
- }
289
- if (!filterValue?.length) {
290
- return isIn ? " FALSE " : " TRUE ";
291
- }
292
- const nonNullFilterValues = filterValue.filter((v) => v !== null);
293
- const conditions = [];
294
- if (nonNullFilterValues.length) {
295
- conditions.push(leftQ + (isIn ? " IN " : " NOT IN ") + parseRightVal(nonNullFilterValues, "csv"));
296
- }
297
- if (filterValue.includes(null)) {
298
- const comparator = isIn ? " IS NULL " : " IS NOT NULL ";
299
- conditions.push(` ${leftQ} ${comparator} `);
300
- }
301
- const joinedConditions = conditions.join(isIn ? " OR " : " AND ");
302
- return conditions.length > 1 ? `(${joinedConditions})` : joinedConditions;
303
- }
304
- else if (["$between"].includes(filterOperand)) {
305
- if (!Array.isArray(filterValue) || filterValue.length !== 2) {
306
- return makeError("Between filter expects an array of two values");
307
- }
308
- return leftQ + " BETWEEN " + asValue(filterValue[0]) + " AND " + asValue(filterValue[1]);
309
- }
310
- else if (["$ilike"].includes(filterOperand)) {
311
- return leftQ + " ILIKE " + asValue(filterValue);
312
- }
313
- else if (["$like"].includes(filterOperand)) {
314
- return leftQ + " LIKE " + asValue(filterValue);
315
- }
316
- else if (["$nilike"].includes(filterOperand)) {
317
- return leftQ + " NOT ILIKE " + asValue(filterValue);
318
- }
319
- else if (["$nlike"].includes(filterOperand)) {
320
- return leftQ + " NOT LIKE " + asValue(filterValue);
321
- }
322
- else if (filterOperand === "$isDistinctFrom" || filterOperand === "$isNotDistinctFrom") {
323
- const operator = exports.FILTER_OPERAND_TO_SQL_OPERAND[filterOperand];
324
- return leftQ + ` ${operator} ` + asValue(filterValue);
325
- /* MAYBE TEXT OR MAYBE ARRAY */
326
- }
327
- else if (["@>", "<@", "$contains", "$containedBy", "$overlaps", "&&", "@@"].includes(filterOperand)) {
328
- const operand = filterOperand === "@@" ? "@@"
329
- : ["@>", "$contains"].includes(filterOperand) ? "@>"
330
- : ["&&", "$overlaps"].includes(filterOperand) ? "&&"
331
- : "<@";
332
- if (operand === "<@" || operand === "@>") {
333
- if (selItem.column_udt_type === "jsonb") {
334
- const filterValueAsString = typeof filterValue === "string" ? filterValue : JSON.stringify(filterValue);
335
- return leftQ + operand + parseRightVal(filterValueAsString);
336
- }
337
- }
338
- /* Array for sure */
339
- if (Array.isArray(filterValue)) {
340
- return leftQ + operand + parseRightVal(filterValue, "array");
341
- /* FTSQuery */
342
- }
343
- else if (["@@"].includes(filterOperand) &&
344
- (0, prostgles_types_1.includes)(prostgles_types_1.TextFilter_FullTextSearchFilterKeys, funcName)) {
345
- let lq = `to_tsvector(${leftQ}::text)`;
346
- if (selItem.columnPGDataType === "tsvector")
347
- lq = leftQ;
348
- const res = `${lq} ${operand} ` + `${funcName}${parseRightVal(funcArgs, "csv")}`;
349
- return res;
350
- }
351
- else {
352
- return makeError("Unrecognised filter operand: " + filterOperand + " ");
353
- }
354
- }
355
- else {
356
- return makeError("Unrecognised filter operand: " + filterOperand + " ");
357
- }
358
- }
359
- else {
360
- /* Is an equal filter */
361
- if (rightF === null) {
362
- return leftQ + " IS NULL ";
363
- }
364
- else {
365
- /**
366
- * Ensure that when comparing an array to a json column, the array is cast to json
367
- */
368
- let valueStr = asValue(rightF);
369
- if (selItem.column_udt_type?.startsWith("json") && Array.isArray(rightF)) {
370
- valueStr = DboBuilderTypes_1.pgp.as.format(`$1::jsonb`, [JSON.stringify(rightF)]);
371
- }
372
- return `${leftQ} = ${valueStr}`;
373
- }
374
- }
375
- };
376
- exports.parseFilterItem = parseFilterItem;
377
- const parseFilterRightValue = (val, { expect, selectItem }) => {
378
- const asValue = (v) => DboBuilderTypes_1.pgp.as.format("$1", [v]);
379
- const checkIfArr = () => {
380
- if (!Array.isArray(val)) {
381
- throw "This type of filter/column expects an Array of items";
382
- }
383
- };
384
- if (expect === "csv" || expect?.startsWith("json")) {
385
- checkIfArr();
386
- return DboBuilderTypes_1.pgp.as.format(`($1:${expect})`, [val]);
387
- }
388
- else if (expect === "array" || selectItem?.columnPGDataType === "ARRAY") {
389
- checkIfArr();
390
- return DboBuilderTypes_1.pgp.as.format(" ARRAY[$1:csv]", [val]);
391
- }
392
- return asValue(val);
393
- };
394
- exports.parseFilterRightValue = parseFilterRightValue;
395
- // ensure pgp is not NULL!!!
396
- // const asValue = v => v;// pgp.as.value;
397
- // const filters: FilterSpec[] = [
398
- // ...(["ilike", "like"].map(op => ({
399
- // operands: ["$" + op],
400
- // tsDataTypes: ["any"] as TSDataType[],
401
- // tsDefinition: ` { $${op}: string } `,
402
- // // data_types:
403
- // getQuery: (leftQuery: string, rightVal: any) => {
404
- // return `${leftQuery}::text ${op.toUpperCase()} ${asValue(rightVal)}::text`
405
- // }
406
- // }))),
407
- // {
408
- // operands: ["", "="],
409
- // tsDataTypes: ["any"],
410
- // tsDefinition: ` { "=": any } | any `,
411
- // // data_types:
412
- // getQuery: (leftQuery: string, rightVal: any) => {
413
- // if(rightVal === null) return`${leftQuery} IS NULL `;
414
- // return `${leftQuery} = ${asValue(rightVal)}`;
415
- // }
416
- // }
417
- // ];
418
- //# sourceMappingURL=Filtering.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Filtering.js","sourceRoot":"","sources":["../lib/Filtering.ts"],"names":[],"mappings":"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"}