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.
Files changed (52) hide show
  1. package/dist/DboBuilder/TableHandler/TableHandler.js +1 -1
  2. package/dist/DboBuilder/TableHandler/TableHandler.js.map +1 -1
  3. package/dist/DboBuilder/TableHandler/delete.js +1 -0
  4. package/dist/DboBuilder/TableHandler/delete.js.map +1 -1
  5. package/dist/DboBuilder/TableHandler/runInsertUpdateQuery.d.ts.map +1 -1
  6. package/dist/DboBuilder/TableHandler/runInsertUpdateQuery.js +1 -0
  7. package/dist/DboBuilder/TableHandler/runInsertUpdateQuery.js.map +1 -1
  8. package/dist/DboBuilder/TableHandler/update.d.ts.map +1 -1
  9. package/dist/DboBuilder/TableHandler/update.js +1 -0
  10. package/dist/DboBuilder/TableHandler/update.js.map +1 -1
  11. package/dist/DboBuilder/ViewHandler/ViewHandler.d.ts +1 -1
  12. package/dist/DboBuilder/ViewHandler/getExistsCondition.d.ts.map +1 -1
  13. package/dist/DboBuilder/ViewHandler/getExistsCondition.js +1 -0
  14. package/dist/DboBuilder/ViewHandler/getExistsCondition.js.map +1 -1
  15. package/dist/DboBuilder/ViewHandler/parseComplexFilter.d.ts +12 -0
  16. package/dist/DboBuilder/ViewHandler/parseComplexFilter.d.ts.map +1 -0
  17. package/dist/DboBuilder/ViewHandler/parseComplexFilter.js +78 -0
  18. package/dist/DboBuilder/ViewHandler/parseComplexFilter.js.map +1 -0
  19. package/dist/DboBuilder/ViewHandler/prepareWhere.d.ts +1 -1
  20. package/dist/DboBuilder/ViewHandler/prepareWhere.d.ts.map +1 -1
  21. package/dist/DboBuilder/ViewHandler/prepareWhere.js.map +1 -1
  22. package/dist/DboBuilder/getCondition.d.ts +1 -1
  23. package/dist/DboBuilder/getCondition.d.ts.map +1 -1
  24. package/dist/DboBuilder/getCondition.js +9 -52
  25. package/dist/DboBuilder/getCondition.js.map +1 -1
  26. package/dist/DboBuilder/getSubscribeRelatedTables.d.ts +1 -1
  27. package/dist/DboBuilder/getSubscribeRelatedTables.d.ts.map +1 -1
  28. package/dist/DboBuilder/getSubscribeRelatedTables.js +3 -1
  29. package/dist/DboBuilder/getSubscribeRelatedTables.js.map +1 -1
  30. package/dist/DboBuilder/parseUpdateRules.d.ts.map +1 -1
  31. package/dist/DboBuilder/parseUpdateRules.js +25 -4
  32. package/dist/DboBuilder/parseUpdateRules.js.map +1 -1
  33. package/dist/Filtering.d.ts +7 -0
  34. package/dist/Filtering.d.ts.map +1 -1
  35. package/dist/Filtering.js +73 -25
  36. package/dist/Filtering.js.map +1 -1
  37. package/lib/DboBuilder/TableHandler/TableHandler.ts +1 -1
  38. package/lib/DboBuilder/TableHandler/delete.ts +1 -1
  39. package/lib/DboBuilder/TableHandler/runInsertUpdateQuery.ts +1 -0
  40. package/lib/DboBuilder/TableHandler/update.ts +1 -0
  41. package/lib/DboBuilder/ViewHandler/getExistsCondition.ts +1 -0
  42. package/lib/DboBuilder/ViewHandler/parseComplexFilter.ts +96 -0
  43. package/lib/DboBuilder/ViewHandler/prepareWhere.ts +1 -3
  44. package/lib/DboBuilder/getCondition.ts +11 -57
  45. package/lib/DboBuilder/getSubscribeRelatedTables.ts +3 -1
  46. package/lib/DboBuilder/parseUpdateRules.ts +26 -4
  47. package/lib/Filtering.ts +65 -25
  48. package/package.json +2 -2
  49. package/tests/client/package-lock.json +8 -2442
  50. package/tests/client/package.json +1 -1
  51. package/tests/isomorphicQueries.spec.ts +10 -0
  52. 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: "csv" | "array" | "json" | "jsonb" | null = null) => {
203
- const checkIfArr = () => {
204
- if(!Array.isArray(val)) return mErr("This type of filter/column expects an Array of items");
205
- }
206
- if(expect === "csv" || expect?.startsWith("json")){
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 OPERANDS[number] = filterKeys[0] as any;
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") && !OPERANDS.includes(filterOperand)){
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 _fVal: any[] = filterValue.filter((v: any) => v !== null);
335
+ const nonNullFilterValues: any[] = filterValue.filter((v: any) => v !== null);
319
336
  let c1 = "", c2 = "";
320
- if(_fVal.length) c1 = leftQ + " NOT IN " + parseRightVal(_fVal, "csv");
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.54",
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.81"
46
+ "prostgles-types": "^4.0.84"
47
47
  },
48
48
  "devDependencies": {
49
49
  "@types/bluebird": "^3.5.36",