prostgles-server 4.2.54 → 4.2.56
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.
- package/dist/DboBuilder/TableHandler/TableHandler.js +1 -1
- package/dist/DboBuilder/TableHandler/TableHandler.js.map +1 -1
- package/dist/DboBuilder/TableHandler/delete.js +1 -0
- package/dist/DboBuilder/TableHandler/delete.js.map +1 -1
- package/dist/DboBuilder/TableHandler/runInsertUpdateQuery.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/runInsertUpdateQuery.js +1 -0
- package/dist/DboBuilder/TableHandler/runInsertUpdateQuery.js.map +1 -1
- package/dist/DboBuilder/TableHandler/update.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/update.js +1 -0
- package/dist/DboBuilder/TableHandler/update.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/ViewHandler.d.ts +1 -1
- package/dist/DboBuilder/ViewHandler/getExistsCondition.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/getExistsCondition.js +1 -0
- package/dist/DboBuilder/ViewHandler/getExistsCondition.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/parseComplexFilter.d.ts +12 -0
- package/dist/DboBuilder/ViewHandler/parseComplexFilter.d.ts.map +1 -0
- package/dist/DboBuilder/ViewHandler/parseComplexFilter.js +78 -0
- package/dist/DboBuilder/ViewHandler/parseComplexFilter.js.map +1 -0
- package/dist/DboBuilder/ViewHandler/prepareWhere.d.ts +1 -1
- package/dist/DboBuilder/ViewHandler/prepareWhere.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/prepareWhere.js.map +1 -1
- package/dist/DboBuilder/getCondition.d.ts +1 -1
- package/dist/DboBuilder/getCondition.d.ts.map +1 -1
- package/dist/DboBuilder/getCondition.js +9 -52
- package/dist/DboBuilder/getCondition.js.map +1 -1
- package/dist/DboBuilder/getSubscribeRelatedTables.d.ts +1 -1
- package/dist/DboBuilder/getSubscribeRelatedTables.d.ts.map +1 -1
- package/dist/DboBuilder/getSubscribeRelatedTables.js +3 -1
- package/dist/DboBuilder/getSubscribeRelatedTables.js.map +1 -1
- package/dist/DboBuilder/parseUpdateRules.d.ts.map +1 -1
- package/dist/DboBuilder/parseUpdateRules.js +25 -4
- package/dist/DboBuilder/parseUpdateRules.js.map +1 -1
- package/dist/Filtering.d.ts +7 -0
- package/dist/Filtering.d.ts.map +1 -1
- package/dist/Filtering.js +73 -25
- package/dist/Filtering.js.map +1 -1
- package/lib/DboBuilder/TableHandler/TableHandler.ts +1 -1
- package/lib/DboBuilder/TableHandler/delete.ts +1 -1
- package/lib/DboBuilder/TableHandler/runInsertUpdateQuery.ts +1 -0
- package/lib/DboBuilder/TableHandler/update.ts +1 -0
- package/lib/DboBuilder/ViewHandler/getExistsCondition.ts +1 -0
- package/lib/DboBuilder/ViewHandler/parseComplexFilter.ts +96 -0
- package/lib/DboBuilder/ViewHandler/prepareWhere.ts +1 -3
- package/lib/DboBuilder/getCondition.ts +11 -57
- package/lib/DboBuilder/getSubscribeRelatedTables.ts +3 -1
- package/lib/DboBuilder/parseUpdateRules.ts +26 -4
- package/lib/Filtering.ts +65 -25
- package/package.json +2 -2
- package/tests/client/package-lock.json +8 -2442
- package/tests/client/package.json +1 -1
- package/tests/isomorphicQueries.spec.ts +10 -0
- package/tests/server/package-lock.json +3 -3
package/lib/Filtering.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
|
+
BetweenFilterKeys,
|
|
4
5
|
CompareFilterKeys,
|
|
5
6
|
CompareInFilterKeys,
|
|
6
7
|
FilterDataType,
|
|
@@ -16,6 +17,38 @@ import {
|
|
|
16
17
|
import { SelectItem } from "./DboBuilder/QueryBuilder/QueryBuilder";
|
|
17
18
|
import { pgp } from "./DboBuilder/DboBuilderTypes";
|
|
18
19
|
|
|
20
|
+
|
|
21
|
+
export const FILTER_OPERANDS = [
|
|
22
|
+
...TextFilterKeys,
|
|
23
|
+
...JsonbFilterKeys,
|
|
24
|
+
...CompareFilterKeys,
|
|
25
|
+
...BetweenFilterKeys,
|
|
26
|
+
...CompareInFilterKeys
|
|
27
|
+
] as const;
|
|
28
|
+
|
|
29
|
+
export const FILTER_OPERAND_TO_SQL_OPERAND = Object.fromEntries(
|
|
30
|
+
FILTER_OPERANDS.map(filterOperand => {
|
|
31
|
+
let sqlOperand = filterOperand as string;
|
|
32
|
+
if (filterOperand === "$eq") sqlOperand = "=";
|
|
33
|
+
else if (filterOperand === "$gt") sqlOperand = ">";
|
|
34
|
+
else if (filterOperand === "$gte") sqlOperand = ">=";
|
|
35
|
+
else if (filterOperand === "$lt") sqlOperand = "<";
|
|
36
|
+
else if (filterOperand === "$lte") sqlOperand = "<=";
|
|
37
|
+
else if (filterOperand === "$ne") sqlOperand = "<>";
|
|
38
|
+
else if (filterOperand === "$like") sqlOperand = "LIKE";
|
|
39
|
+
else if (filterOperand === "$ilike") sqlOperand = "ILIKE";
|
|
40
|
+
else if (filterOperand === "$nlike") sqlOperand = "NOT LIKE";
|
|
41
|
+
else if (filterOperand === "$nilike") sqlOperand = "NOT ILIKE";
|
|
42
|
+
else if (filterOperand === "$in") sqlOperand = "IN";
|
|
43
|
+
else if (filterOperand === "$nin") sqlOperand = "NOT IN";
|
|
44
|
+
else if (filterOperand === "$between") sqlOperand = "BETWEEN";
|
|
45
|
+
else if (filterOperand === "$notBetween") sqlOperand = "NOT BETWEEN";
|
|
46
|
+
else if (filterOperand === "$isDistinctFrom") sqlOperand = "IS DISTINCT FROM";
|
|
47
|
+
else if (filterOperand === "$isNotDistinctFrom") sqlOperand = "IS NOT DISTINCT FROM";
|
|
48
|
+
return [filterOperand, sqlOperand];
|
|
49
|
+
})
|
|
50
|
+
) as Record<typeof FILTER_OPERANDS[number], string>;
|
|
51
|
+
|
|
19
52
|
/**
|
|
20
53
|
* Parse a single filter
|
|
21
54
|
* Ensure only single key objects reach this point
|
|
@@ -199,35 +232,19 @@ export const parseFilterItem = (args: ParseFilterItemArgs): string => {
|
|
|
199
232
|
|
|
200
233
|
if(!leftQ) mErr("Internal error: leftQ missing?!");
|
|
201
234
|
|
|
202
|
-
const parseRightVal = (val: any, expect
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
checkIfArr();
|
|
208
|
-
return pgp.as.format(`($1:${expect})`, [val]);
|
|
209
|
-
|
|
210
|
-
} else if(expect === "array" || selItem && selItem.columnPGDataType && selItem.columnPGDataType === "ARRAY"){
|
|
211
|
-
checkIfArr();
|
|
212
|
-
return pgp.as.format(" ARRAY[$1:csv]", [val]);
|
|
213
|
-
|
|
235
|
+
const parseRightVal = (val: any, expect?: "csv" | "array" | "json" | "jsonb") => {
|
|
236
|
+
try {
|
|
237
|
+
return parseFilterRightValue(val, { selectItem: selItem, expect });
|
|
238
|
+
} catch(e: any){
|
|
239
|
+
return mErr(e);
|
|
214
240
|
}
|
|
215
|
-
|
|
216
|
-
return asValue(val);
|
|
217
241
|
}
|
|
218
242
|
|
|
219
243
|
/* Matching sel item */
|
|
220
244
|
if(isObject(rightF)){
|
|
221
245
|
|
|
222
|
-
const OPERANDS = [
|
|
223
|
-
...TextFilterKeys,
|
|
224
|
-
...JsonbFilterKeys,
|
|
225
|
-
...CompareFilterKeys,
|
|
226
|
-
...CompareInFilterKeys
|
|
227
|
-
] as const;
|
|
228
|
-
|
|
229
246
|
const filterKeys = Object.keys(rightF);
|
|
230
|
-
let filterOperand: typeof
|
|
247
|
+
let filterOperand: typeof FILTER_OPERANDS[number] = filterKeys[0] as any;
|
|
231
248
|
|
|
232
249
|
/** JSON cannot be compared so we'll cast it to TEXT */
|
|
233
250
|
if(selItem?.column_udt_type === "json" || TextFilterKeys.includes(filterOperand as any)){
|
|
@@ -235,7 +252,7 @@ export const parseFilterItem = (args: ParseFilterItemArgs): string => {
|
|
|
235
252
|
}
|
|
236
253
|
|
|
237
254
|
/** It's an object key which means it's an equality comparison against a json object */
|
|
238
|
-
if(selItem?.column_udt_type?.startsWith("json") && !
|
|
255
|
+
if(selItem?.column_udt_type?.startsWith("json") && !FILTER_OPERANDS.includes(filterOperand)){
|
|
239
256
|
return leftQ + " = " + parseRightVal(rightF);
|
|
240
257
|
}
|
|
241
258
|
|
|
@@ -315,9 +332,9 @@ export const parseFilterItem = (args: ParseFilterItemArgs): string => {
|
|
|
315
332
|
return " TRUE ";
|
|
316
333
|
}
|
|
317
334
|
|
|
318
|
-
const
|
|
335
|
+
const nonNullFilterValues: any[] = filterValue.filter((v: any) => v !== null);
|
|
319
336
|
let c1 = "", c2 = "";
|
|
320
|
-
if(
|
|
337
|
+
if(nonNullFilterValues.length) c1 = leftQ + " NOT IN " + parseRightVal(nonNullFilterValues, "csv");
|
|
321
338
|
if(filterValue.includes(null)) c2 = ` ${leftQ} IS NOT NULL `;
|
|
322
339
|
return [c1, c2].filter(c => c).join(" AND ");
|
|
323
340
|
|
|
@@ -387,6 +404,29 @@ export const parseFilterItem = (args: ParseFilterItemArgs): string => {
|
|
|
387
404
|
}
|
|
388
405
|
}
|
|
389
406
|
|
|
407
|
+
type ParseRightValOpts = {
|
|
408
|
+
expect?: "csv" | "array" | "json" | "jsonb";
|
|
409
|
+
selectItem: SelectItem | undefined;
|
|
410
|
+
}
|
|
411
|
+
export const parseFilterRightValue = (val: any, { expect, selectItem }: ParseRightValOpts) => {
|
|
412
|
+
const asValue = (v: any) => pgp.as.format("$1", [v]);
|
|
413
|
+
const checkIfArr = () => {
|
|
414
|
+
if(!Array.isArray(val)) {
|
|
415
|
+
throw "This type of filter/column expects an Array of items";
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
if(expect === "csv" || expect?.startsWith("json")){
|
|
419
|
+
checkIfArr();
|
|
420
|
+
return pgp.as.format(`($1:${expect})`, [val]);
|
|
421
|
+
|
|
422
|
+
} else if(expect === "array" || selectItem?.columnPGDataType === "ARRAY"){
|
|
423
|
+
checkIfArr();
|
|
424
|
+
return pgp.as.format(" ARRAY[$1:csv]", [val]);
|
|
425
|
+
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
return asValue(val);
|
|
429
|
+
}
|
|
390
430
|
|
|
391
431
|
// ensure pgp is not NULL!!!
|
|
392
432
|
// const asValue = v => v;// pgp.as.value;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "prostgles-server",
|
|
3
|
-
"version": "4.2.
|
|
3
|
+
"version": "4.2.56",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"pg-cursor": "^2.10.5",
|
|
44
44
|
"pg-promise": "^11.6.0",
|
|
45
45
|
"prostgles-client": "^4.0.53",
|
|
46
|
-
"prostgles-types": "^4.0.
|
|
46
|
+
"prostgles-types": "^4.0.84"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
49
|
"@types/bluebird": "^3.5.36",
|