prostgles-server 3.0.87 → 3.0.89
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/.eslintignore +5 -0
- package/.eslintrc.json +30 -0
- package/dist/DBEventsManager.js +1 -1
- package/dist/DBEventsManager.js.map +1 -1
- package/dist/DBSchemaBuilder.d.ts.map +1 -1
- package/dist/DBSchemaBuilder.js +6 -6
- package/dist/DBSchemaBuilder.js.map +1 -1
- package/dist/DboBuilder/QueryBuilder/Functions.js +9 -9
- package/dist/DboBuilder/QueryBuilder/Functions.js.map +1 -1
- package/dist/DboBuilder/QueryBuilder/QueryBuilder.d.ts.map +1 -1
- package/dist/DboBuilder/QueryBuilder/QueryBuilder.js +8 -7
- package/dist/DboBuilder/QueryBuilder/QueryBuilder.js.map +1 -1
- package/dist/DboBuilder/QueryBuilder/makeSelectQuery.d.ts.map +1 -1
- package/dist/DboBuilder/QueryBuilder/makeSelectQuery.js +4 -4
- package/dist/DboBuilder/QueryBuilder/makeSelectQuery.js.map +1 -1
- package/dist/DboBuilder/TableHandler.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler.js +18 -20
- package/dist/DboBuilder/TableHandler.js.map +1 -1
- package/dist/DboBuilder/ViewHandler.d.ts +0 -10
- package/dist/DboBuilder/ViewHandler.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler.js +50 -63
- package/dist/DboBuilder/ViewHandler.js.map +1 -1
- package/dist/DboBuilder/delete.js +0 -1
- package/dist/DboBuilder/delete.js.map +1 -1
- package/dist/DboBuilder/getColumns.js +5 -4
- package/dist/DboBuilder/getColumns.js.map +1 -1
- package/dist/DboBuilder/getCondition.d.ts.map +1 -1
- package/dist/DboBuilder/getCondition.js +6 -6
- package/dist/DboBuilder/getCondition.js.map +1 -1
- package/dist/DboBuilder/insert.js +15 -16
- package/dist/DboBuilder/insert.js.map +1 -1
- package/dist/DboBuilder/insertDataParse.d.ts.map +1 -1
- package/dist/DboBuilder/insertDataParse.js +9 -10
- package/dist/DboBuilder/insertDataParse.js.map +1 -1
- package/dist/DboBuilder/parseUpdateRules.js +2 -2
- package/dist/DboBuilder/parseUpdateRules.js.map +1 -1
- package/dist/DboBuilder/runSQL.d.ts.map +1 -1
- package/dist/DboBuilder/runSQL.js +5 -5
- package/dist/DboBuilder/runSQL.js.map +1 -1
- package/dist/DboBuilder/subscribe.js +3 -3
- package/dist/DboBuilder/subscribe.js.map +1 -1
- package/dist/DboBuilder/update.js +5 -6
- package/dist/DboBuilder/update.js.map +1 -1
- package/dist/DboBuilder/uploadFile.d.ts.map +1 -1
- package/dist/DboBuilder/uploadFile.js +1 -1
- package/dist/DboBuilder/uploadFile.js.map +1 -1
- package/dist/DboBuilder.d.ts.map +1 -1
- package/dist/DboBuilder.js +13 -14
- package/dist/DboBuilder.js.map +1 -1
- package/dist/FileManager.d.ts.map +1 -1
- package/dist/FileManager.js +3 -5
- package/dist/FileManager.js.map +1 -1
- package/dist/Filtering.js +7 -7
- package/dist/Filtering.js.map +1 -1
- package/dist/JSONBValidation/validate_jsonb_schema_sql.d.ts +3 -0
- package/dist/JSONBValidation/validate_jsonb_schema_sql.d.ts.map +1 -0
- package/dist/JSONBValidation/validate_jsonb_schema_sql.js +295 -0
- package/dist/JSONBValidation/validate_jsonb_schema_sql.js.map +1 -0
- package/dist/JSONBValidation/validation.d.ts +108 -0
- package/dist/JSONBValidation/validation.d.ts.map +1 -0
- package/dist/JSONBValidation/validation.js +222 -0
- package/dist/JSONBValidation/validation.js.map +1 -0
- package/dist/PostgresNotifListenManager.js +1 -1
- package/dist/PostgresNotifListenManager.js.map +1 -1
- package/dist/Prostgles.d.ts.map +1 -1
- package/dist/Prostgles.js +20 -20
- package/dist/Prostgles.js.map +1 -1
- package/dist/PubSubManager/initPubSubManager.d.ts.map +1 -1
- package/dist/PubSubManager/initPubSubManager.js +10 -7
- package/dist/PubSubManager/initPubSubManager.js.map +1 -1
- package/dist/PublishParser.d.ts.map +1 -1
- package/dist/PublishParser.js +122 -125
- package/dist/PublishParser.js.map +1 -1
- package/dist/SyncReplication.d.ts.map +1 -1
- package/dist/SyncReplication.js +19 -16
- package/dist/SyncReplication.js.map +1 -1
- package/dist/TableConfig.d.ts +9 -5
- package/dist/TableConfig.d.ts.map +1 -1
- package/dist/TableConfig.js +33 -12
- package/dist/TableConfig.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/shortestPath.js +11 -11
- package/dist/shortestPath.js.map +1 -1
- package/dist/validation.d.ts +50 -24
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +177 -53
- package/dist/validation.js.map +1 -1
- package/lib/AuthHandler.d.ts +11 -11
- package/lib/AuthHandler.d.ts.map +1 -1
- package/lib/DBEventsManager.js +1 -1
- package/lib/DBEventsManager.ts +1 -1
- package/lib/DBSchemaBuilder.d.ts +3 -3
- package/lib/DBSchemaBuilder.d.ts.map +1 -1
- package/lib/DBSchemaBuilder.js +6 -6
- package/lib/DBSchemaBuilder.ts +10 -12
- package/lib/DboBuilder/QueryBuilder/Functions.d.ts +3 -3
- package/lib/DboBuilder/QueryBuilder/Functions.d.ts.map +1 -1
- package/lib/DboBuilder/QueryBuilder/Functions.js +9 -9
- package/lib/DboBuilder/QueryBuilder/Functions.ts +13 -13
- package/lib/DboBuilder/QueryBuilder/QueryBuilder.d.ts +3 -3
- package/lib/DboBuilder/QueryBuilder/QueryBuilder.d.ts.map +1 -1
- package/lib/DboBuilder/QueryBuilder/QueryBuilder.js +8 -7
- package/lib/DboBuilder/QueryBuilder/QueryBuilder.ts +12 -12
- package/lib/DboBuilder/QueryBuilder/makeSelectQuery.d.ts.map +1 -1
- package/lib/DboBuilder/QueryBuilder/makeSelectQuery.js +4 -4
- package/lib/DboBuilder/QueryBuilder/makeSelectQuery.ts +5 -5
- package/lib/DboBuilder/TableHandler.d.ts +1 -1
- package/lib/DboBuilder/TableHandler.d.ts.map +1 -1
- package/lib/DboBuilder/TableHandler.js +18 -20
- package/lib/DboBuilder/TableHandler.ts +21 -20
- package/lib/DboBuilder/ViewHandler.d.ts +1 -11
- package/lib/DboBuilder/ViewHandler.d.ts.map +1 -1
- package/lib/DboBuilder/ViewHandler.js +50 -63
- package/lib/DboBuilder/ViewHandler.ts +68 -97
- package/lib/DboBuilder/delete.js +0 -1
- package/lib/DboBuilder/delete.ts +1 -1
- package/lib/DboBuilder/getColumns.js +5 -4
- package/lib/DboBuilder/getColumns.ts +5 -5
- package/lib/DboBuilder/getCondition.d.ts.map +1 -1
- package/lib/DboBuilder/getCondition.js +6 -6
- package/lib/DboBuilder/getCondition.ts +7 -7
- package/lib/DboBuilder/insert.js +15 -16
- package/lib/DboBuilder/insert.ts +18 -18
- package/lib/DboBuilder/insertDataParse.d.ts.map +1 -1
- package/lib/DboBuilder/insertDataParse.js +9 -10
- package/lib/DboBuilder/insertDataParse.ts +42 -43
- package/lib/DboBuilder/parseUpdateRules.js +2 -2
- package/lib/DboBuilder/parseUpdateRules.ts +2 -2
- package/lib/DboBuilder/runSQL.d.ts.map +1 -1
- package/lib/DboBuilder/runSQL.js +5 -5
- package/lib/DboBuilder/runSQL.ts +6 -6
- package/lib/DboBuilder/subscribe.d.ts +1 -1
- package/lib/DboBuilder/subscribe.d.ts.map +1 -1
- package/lib/DboBuilder/subscribe.js +3 -3
- package/lib/DboBuilder/subscribe.ts +3 -3
- package/lib/DboBuilder/update.js +5 -6
- package/lib/DboBuilder/update.ts +6 -6
- package/lib/DboBuilder/uploadFile.d.ts.map +1 -1
- package/lib/DboBuilder/uploadFile.js +1 -1
- package/lib/DboBuilder/uploadFile.ts +2 -2
- package/lib/DboBuilder.d.ts +22 -22
- package/lib/DboBuilder.d.ts.map +1 -1
- package/lib/DboBuilder.js +13 -14
- package/lib/DboBuilder.ts +19 -19
- package/lib/FileManager.d.ts +6 -6
- package/lib/FileManager.d.ts.map +1 -1
- package/lib/FileManager.js +3 -5
- package/lib/FileManager.ts +7 -6
- package/lib/Filtering.d.ts +1 -1
- package/lib/Filtering.d.ts.map +1 -1
- package/lib/Filtering.js +7 -7
- package/lib/Filtering.ts +7 -7
- package/lib/JSONBValidation/validate_jsonb_schema_sql.d.ts +3 -0
- package/lib/JSONBValidation/validate_jsonb_schema_sql.d.ts.map +1 -0
- package/lib/JSONBValidation/validate_jsonb_schema_sql.js +294 -0
- package/lib/JSONBValidation/validate_jsonb_schema_sql.ts +293 -0
- package/lib/JSONBValidation/validation.d.ts +108 -0
- package/lib/JSONBValidation/validation.d.ts.map +1 -0
- package/lib/JSONBValidation/validation.js +221 -0
- package/lib/JSONBValidation/validation.ts +332 -0
- package/lib/PostgresNotifListenManager.d.ts +1 -1
- package/lib/PostgresNotifListenManager.d.ts.map +1 -1
- package/lib/PostgresNotifListenManager.js +1 -1
- package/lib/PostgresNotifListenManager.ts +1 -1
- package/lib/Prostgles.d.ts +14 -14
- package/lib/Prostgles.d.ts.map +1 -1
- package/lib/Prostgles.js +20 -20
- package/lib/Prostgles.ts +22 -21
- package/lib/PubSubManager/PubSubManager.d.ts +7 -7
- package/lib/PubSubManager/PubSubManager.d.ts.map +1 -1
- package/lib/PubSubManager/initPubSubManager.d.ts.map +1 -1
- package/lib/PubSubManager/initPubSubManager.js +10 -7
- package/lib/PubSubManager/initPubSubManager.ts +12 -7
- package/lib/PublishParser.d.ts +32 -32
- package/lib/PublishParser.d.ts.map +1 -1
- package/lib/PublishParser.js +121 -124
- package/lib/PublishParser.ts +125 -127
- package/lib/SchemaWatch.d.ts +1 -1
- package/lib/SchemaWatch.d.ts.map +1 -1
- package/lib/SyncReplication.d.ts +5 -5
- package/lib/SyncReplication.d.ts.map +1 -1
- package/lib/SyncReplication.js +19 -16
- package/lib/SyncReplication.ts +470 -471
- package/lib/TableConfig.d.ts +28 -24
- package/lib/TableConfig.d.ts.map +1 -1
- package/lib/TableConfig.js +33 -12
- package/lib/TableConfig.ts +55 -21
- package/lib/index.js +1 -1
- package/lib/index.ts +1 -1
- package/lib/shortestPath.d.ts +1 -1
- package/lib/shortestPath.d.ts.map +1 -1
- package/lib/shortestPath.js +11 -11
- package/lib/shortestPath.ts +11 -11
- package/package.json +10 -6
- package/tests/client/PID.txt +1 -1
- package/tests/client/package-lock.json +53 -31
- package/tests/client/package.json +4 -1
- package/tests/isomorphic_queries.d.ts +4 -1
- package/tests/isomorphic_queries.d.ts.map +1 -1
- package/tests/isomorphic_queries.js +38 -30
- package/tests/isomorphic_queries.ts +40 -33
- package/tests/server/DBoGenerated.d.ts +1 -1
- package/tests/server/index.js +8 -7
- package/tests/server/index.ts +10 -8
- package/tests/server/package-lock.json +76 -58
- package/tests/server/package.json +2 -2
- package/tests/server/server.ts +2 -3
- package/lib/validation.d.ts +0 -100
- package/lib/validation.d.ts.map +0 -1
- package/lib/validation.js +0 -280
- package/lib/validation.ts +0 -360
|
@@ -2,7 +2,7 @@ import { makeSelectQuery } from "../DboBuilder/QueryBuilder/makeSelectQuery";
|
|
|
2
2
|
import { getCondition } from "./getCondition";
|
|
3
3
|
|
|
4
4
|
import * as pgPromise from 'pg-promise';
|
|
5
|
-
import { canRunSQL
|
|
5
|
+
import { canRunSQL } from "../DboBuilder/runSQL";
|
|
6
6
|
import {
|
|
7
7
|
ColumnInfo, FieldFilter, SelectParams,
|
|
8
8
|
OrderBy,
|
|
@@ -21,9 +21,9 @@ import {
|
|
|
21
21
|
} from "../DboBuilder";
|
|
22
22
|
import { Graph } from "../shortestPath";
|
|
23
23
|
import { TableRule, UpdateRule, ValidateRow } from "../PublishParser";
|
|
24
|
-
import { asValue
|
|
24
|
+
import { asValue } from "../PubSubManager/PubSubManager";
|
|
25
25
|
import { TableHandler } from "./TableHandler";
|
|
26
|
-
import { asNameAlias, getNewQuery,
|
|
26
|
+
import { asNameAlias, getNewQuery, SelectItem, SelectItemValidated } from "./QueryBuilder/QueryBuilder";
|
|
27
27
|
import { COMPUTED_FIELDS, FieldSpec } from "./QueryBuilder/Functions";
|
|
28
28
|
import { getColumns } from "./getColumns";
|
|
29
29
|
import { LocalFunc, subscribe } from "./subscribe";
|
|
@@ -67,7 +67,7 @@ class ColSet {
|
|
|
67
67
|
/**
|
|
68
68
|
* Add conversion functions for PostGIS data
|
|
69
69
|
*/
|
|
70
|
-
let escapedVal
|
|
70
|
+
let escapedVal = "";
|
|
71
71
|
if (["geometry", "geography"].includes(col.udt_name) && row[key] && isPlainObject(row[key])) {
|
|
72
72
|
|
|
73
73
|
const basicFunc = (args: any[]) => {
|
|
@@ -159,11 +159,11 @@ export class ViewHandler {
|
|
|
159
159
|
t?: pgPromise.ITask<{}>;
|
|
160
160
|
dbTX?: TableHandlers;
|
|
161
161
|
|
|
162
|
-
is_view
|
|
163
|
-
filterDef
|
|
162
|
+
is_view = true;
|
|
163
|
+
filterDef = "";
|
|
164
164
|
|
|
165
165
|
// pubSubManager: PubSubManager;
|
|
166
|
-
is_media
|
|
166
|
+
is_media = false;
|
|
167
167
|
constructor(db: DB, tableOrViewInfo: TableSchema, dboBuilder: DboBuilder, t?: pgPromise.ITask<{}>, dbTX?: TableHandlers, joinPaths?: JoinPaths) {
|
|
168
168
|
if (!db || !tableOrViewInfo) throw "";
|
|
169
169
|
|
|
@@ -189,7 +189,7 @@ export class ViewHandler {
|
|
|
189
189
|
// and also make hot schema reload over ws
|
|
190
190
|
this.colSet = new ColSet(this.columns, this.name);
|
|
191
191
|
|
|
192
|
-
const { $and: $and_key, $or: $or_key } = this.dboBuilder.prostgles.keywords;
|
|
192
|
+
// const { $and: $and_key, $or: $or_key } = this.dboBuilder.prostgles.keywords;
|
|
193
193
|
|
|
194
194
|
// this.tsDataName = snakify(this.name, true);
|
|
195
195
|
// if(this.tsDataName === "T") this.tsDataName = this.tsDataName + "_";
|
|
@@ -297,7 +297,7 @@ export class ViewHandler {
|
|
|
297
297
|
return true;
|
|
298
298
|
}
|
|
299
299
|
|
|
300
|
-
getShortestJoin(table1: string, table2: string, startAlias: number, isInner
|
|
300
|
+
getShortestJoin(table1: string, table2: string, startAlias: number, isInner = false): { query: string, toOne: boolean } {
|
|
301
301
|
// let searchedTables = [], result;
|
|
302
302
|
// while (!result && searchedTables.length <= this.joins.length * 2){
|
|
303
303
|
|
|
@@ -307,8 +307,8 @@ export class ViewHandler {
|
|
|
307
307
|
return on.map(cond => Object.keys(cond).map(lKey => `${leftTable}.${lKey} = ${rightTable}.${cond[lKey]}`).join("\nAND ")).join(" OR ")
|
|
308
308
|
}
|
|
309
309
|
|
|
310
|
-
let toOne = true
|
|
311
|
-
|
|
310
|
+
let toOne = true;
|
|
311
|
+
const query = this.joins.map(({ tables, on, type }, i) => {
|
|
312
312
|
if (type.split("-")[1] === "many") {
|
|
313
313
|
toOne = false;
|
|
314
314
|
}
|
|
@@ -375,10 +375,10 @@ export class ViewHandler {
|
|
|
375
375
|
const jo = this.joins.find(j => j.tables.includes(t1) && j.tables.includes(t2));
|
|
376
376
|
if (!jo) throw `Joining ${t1} <-> ${t2} dissallowed or missing`;;
|
|
377
377
|
|
|
378
|
-
|
|
378
|
+
const on: [string, string][][] = [];
|
|
379
379
|
|
|
380
380
|
jo.on.map(cond => {
|
|
381
|
-
|
|
381
|
+
const condArr: [string, string][] = [];
|
|
382
382
|
Object.keys(cond).map(leftKey => {
|
|
383
383
|
const rightKey = cond[leftKey];
|
|
384
384
|
|
|
@@ -403,7 +403,7 @@ export class ViewHandler {
|
|
|
403
403
|
on
|
|
404
404
|
};
|
|
405
405
|
});
|
|
406
|
-
|
|
406
|
+
const expectOne = false;
|
|
407
407
|
// paths.map(({ source, target, on }, i) => {
|
|
408
408
|
// if(expectOne && on.length === 1){
|
|
409
409
|
// const sourceCol = on[0][1];
|
|
@@ -508,7 +508,7 @@ export class ViewHandler {
|
|
|
508
508
|
|
|
509
509
|
if (tableRules) {
|
|
510
510
|
if (isEmpty(tableRules)) throw "INTERNAL ERROR: Unexpected case -> Empty table rules for " + this.name;
|
|
511
|
-
const throwFieldsErr = (command: "select" | "update" | "delete" | "insert", fieldType
|
|
511
|
+
const throwFieldsErr = (command: "select" | "update" | "delete" | "insert", fieldType = "fields") => {
|
|
512
512
|
throw `Invalid publish.${this.name}.${command} rule -> ${fieldType} setting is missing.\nPlease specify allowed ${fieldType} in this format: "*" | { col_name: false } | { col1: true, col2: true }`;
|
|
513
513
|
},
|
|
514
514
|
getFirstSpecified = (...fieldParams: (FieldFilter | undefined)[]): string[] => {
|
|
@@ -516,7 +516,7 @@ export class ViewHandler {
|
|
|
516
516
|
return this.parseFieldFilter(firstValid)
|
|
517
517
|
};
|
|
518
518
|
|
|
519
|
-
|
|
519
|
+
const res: ValidatedTableRules = {
|
|
520
520
|
allColumns,
|
|
521
521
|
getColumns: tableRules?.getColumns ?? true,
|
|
522
522
|
getInfo: tableRules?.getColumns ?? true,
|
|
@@ -639,25 +639,18 @@ export class ViewHandler {
|
|
|
639
639
|
}
|
|
640
640
|
|
|
641
641
|
/* Validate publish */
|
|
642
|
-
if (tableRules) {
|
|
643
|
-
|
|
644
|
-
let fields: FieldFilter,
|
|
645
|
-
filterFields: FieldFilter | undefined,
|
|
646
|
-
forcedFilter: AnyObject | undefined,
|
|
647
|
-
maxLimit: number | undefined | null;
|
|
642
|
+
if (tableRules) {
|
|
648
643
|
|
|
649
644
|
if (!tableRules.select) throw "select rules missing for " + this.name;
|
|
650
|
-
fields = tableRules.select.fields;
|
|
651
|
-
|
|
652
|
-
filterFields = tableRules.select.filterFields;
|
|
653
|
-
maxLimit = tableRules.select.maxLimit;
|
|
645
|
+
const fields = tableRules.select.fields;
|
|
646
|
+
const maxLimit = tableRules.select.maxLimit;
|
|
654
647
|
|
|
655
648
|
if (<any>tableRules.select !== "*" && typeof tableRules.select !== "boolean" && !isPlainObject(tableRules.select)) throw `\nINVALID publish.${this.name}.select\nExpecting any of: "*" | { fields: "*" } | true | false`
|
|
656
649
|
if (!fields) throw ` invalid ${this.name}.select rule -> fields (required) setting missing.\nExpecting any of: "*" | { col_name: false } | { col1: true, col2: true }`;
|
|
657
650
|
if (maxLimit && !Number.isInteger(maxLimit)) throw ` invalid publish.${this.name}.select.maxLimit -> expecting integer but got ` + maxLimit;
|
|
658
651
|
}
|
|
659
652
|
|
|
660
|
-
|
|
653
|
+
const q = await getNewQuery(this as unknown as TableHandler, filter, selectParams, param3_unused, tableRules, localParams, this.columns),
|
|
661
654
|
_query = makeSelectQuery(this as unknown as TableHandler, q, undefined, undefined, selectParams);
|
|
662
655
|
// console.log(_query, JSON.stringify(q, null, 2))
|
|
663
656
|
if (testRule) {
|
|
@@ -731,7 +724,7 @@ export class ViewHandler {
|
|
|
731
724
|
Promise<string | { unsubscribe: () => any }> {
|
|
732
725
|
|
|
733
726
|
//@ts-ignore
|
|
734
|
-
|
|
727
|
+
const func = localParams? undefined : (rows: AnyObject[]) => localFunc(rows[0]);
|
|
735
728
|
//@ts-ignore
|
|
736
729
|
return this.subscribe(filter, { ...params, limit: 2 }, func, table_rules, localParams);
|
|
737
730
|
}
|
|
@@ -740,10 +733,10 @@ export class ViewHandler {
|
|
|
740
733
|
filter = filter || {};
|
|
741
734
|
try {
|
|
742
735
|
return await this.find(filter, { select: "", limit: 0 }, undefined, table_rules, localParams)
|
|
743
|
-
.then(async
|
|
736
|
+
.then(async _allowed => {
|
|
744
737
|
const { filterFields, forcedFilter } = table_rules?.select || {};
|
|
745
738
|
const where = (await this.prepareWhere({ filter, forcedFilter, filterFields, addKeywords: true, localParams, tableRule: table_rules })).where;
|
|
746
|
-
|
|
739
|
+
const query = "SELECT COUNT(*) FROM " + this.escapedName + " " + where;
|
|
747
740
|
return (this.t || this.db).one(query, { _psqlWS_tableName: this.name }).then(({ count }) => +count);
|
|
748
741
|
});
|
|
749
742
|
} catch (e) {
|
|
@@ -782,9 +775,9 @@ export class ViewHandler {
|
|
|
782
775
|
}
|
|
783
776
|
}
|
|
784
777
|
|
|
785
|
-
getAllowedSelectFields(selectParams: FieldFilter = "*", allowed_cols: FieldFilter, allow_empty
|
|
786
|
-
|
|
787
|
-
|
|
778
|
+
getAllowedSelectFields(selectParams: FieldFilter = "*", allowed_cols: FieldFilter, allow_empty = true): string[] {
|
|
779
|
+
const all_columns = this.column_names.slice(0);
|
|
780
|
+
let allowedFields = all_columns.slice(0),
|
|
788
781
|
resultFields: string[] = [];
|
|
789
782
|
|
|
790
783
|
if (selectParams) {
|
|
@@ -801,42 +794,25 @@ export class ViewHandler {
|
|
|
801
794
|
return col_names;
|
|
802
795
|
}
|
|
803
796
|
|
|
804
|
-
prepareColumnSet(selectParams: FieldFilter = "*", allowed_cols: FieldFilter, allow_empty
|
|
805
|
-
|
|
797
|
+
prepareColumnSet(selectParams: FieldFilter = "*", allowed_cols: FieldFilter, allow_empty = true, onlyNames = true): string | pgPromise.ColumnSet {
|
|
798
|
+
const all_columns = this.column_names.slice(0);
|
|
806
799
|
let col_names = this.getAllowedSelectFields(selectParams, all_columns, allow_empty);
|
|
807
800
|
/** Ensure order is maintained */
|
|
808
801
|
if (selectParams && Array.isArray(selectParams) && typeof selectParams[0] === "string") {
|
|
809
802
|
col_names = col_names.sort((a, b) => selectParams.indexOf(a) - selectParams.indexOf(b))
|
|
810
|
-
}
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
return onlyNames ? colSet.names : colSet;
|
|
814
|
-
} catch (e) {
|
|
815
|
-
throw e;
|
|
816
|
-
}
|
|
803
|
+
}
|
|
804
|
+
const colSet = new pgp.helpers.ColumnSet(col_names);
|
|
805
|
+
return onlyNames ? colSet.names : colSet;
|
|
817
806
|
}
|
|
818
807
|
|
|
819
|
-
prepareSelect(selectParams: FieldFilter = "*", allowed_cols: FieldFilter, allow_empty
|
|
808
|
+
prepareSelect(selectParams: FieldFilter = "*", allowed_cols: FieldFilter, allow_empty = true, tableAlias?: string): string {
|
|
820
809
|
if (tableAlias) {
|
|
821
|
-
|
|
810
|
+
const cs = <pgPromise.ColumnSet>this.prepareColumnSet(selectParams, allowed_cols, true, false);
|
|
822
811
|
return cs.columns.map(col => `${this.escapedName}.${asName(col.name)}`).join(", ");
|
|
823
812
|
} else {
|
|
824
813
|
return <string>this.prepareColumnSet(selectParams, allowed_cols, true, true);
|
|
825
814
|
}
|
|
826
|
-
}
|
|
827
|
-
|
|
828
|
-
async prepareHaving(params: {
|
|
829
|
-
having: Filter;
|
|
830
|
-
select: SelectItem[];
|
|
831
|
-
forcedFilter: object;
|
|
832
|
-
filterFields: FieldFilter;
|
|
833
|
-
addKeywords?: boolean;
|
|
834
|
-
tableAlias?: string,
|
|
835
|
-
localParams: LocalParams,
|
|
836
|
-
tableRule: TableRule
|
|
837
|
-
}): Promise<string> {
|
|
838
|
-
return ""
|
|
839
|
-
}
|
|
815
|
+
}
|
|
840
816
|
|
|
841
817
|
/**
|
|
842
818
|
* Parses group or simple filter
|
|
@@ -861,7 +837,7 @@ export class ViewHandler {
|
|
|
861
837
|
const parseFullFilter = async (f: any, parentFilter: any = null, isForcedFilterBypass: boolean): Promise<string> => {
|
|
862
838
|
if (!f) throw "Invalid/missing group filter provided";
|
|
863
839
|
let result = "";
|
|
864
|
-
|
|
840
|
+
const keys = getKeys(f);
|
|
865
841
|
if (!keys.length) return result;
|
|
866
842
|
if ((keys.includes($and_key) || keys.includes($or_key))) {
|
|
867
843
|
if (keys.length > 1) throw `\ngroup filter must contain only one array property. e.g.: { ${$and_key}: [...] } OR { ${$or_key}: [...] } `;
|
|
@@ -873,7 +849,7 @@ export class ViewHandler {
|
|
|
873
849
|
|
|
874
850
|
if (group && group.length) {
|
|
875
851
|
const operand = $and ? " AND " : " OR ";
|
|
876
|
-
|
|
852
|
+
const conditions = (await Promise.all(group.map(async gf => await parseFullFilter(gf, group, isForcedFilterBypass)))).filter(c => c);
|
|
877
853
|
if (conditions && conditions.length) {
|
|
878
854
|
if (conditions.length === 1) return conditions.join(operand);
|
|
879
855
|
else return ` ( ${conditions.sort().join(operand)} ) `;
|
|
@@ -916,8 +892,8 @@ export class ViewHandler {
|
|
|
916
892
|
const thisTable = this.name;
|
|
917
893
|
const isNotExists = ["$notExists", "$notExistsJoined"].includes(eConfig.existType);
|
|
918
894
|
|
|
919
|
-
|
|
920
|
-
|
|
895
|
+
const { f2, tables, isJoined } = eConfig;
|
|
896
|
+
const t2 = tables[tables.length - 1];
|
|
921
897
|
|
|
922
898
|
tables.forEach(t => {
|
|
923
899
|
if (!this.dboBuilder.dbo[t]) throw { stack: ["prepareExistCondition()"], message: `Invalid or dissallowed table: ${t}` };
|
|
@@ -934,7 +910,7 @@ export class ViewHandler {
|
|
|
934
910
|
let joinPaths: JoinInfo["paths"] = [];
|
|
935
911
|
let expectOne = true;
|
|
936
912
|
tables.map((t2, depth) => {
|
|
937
|
-
|
|
913
|
+
const t1 = depth ? tables[depth - 1] : thisTable;
|
|
938
914
|
let exactPaths: string[] | undefined = [t1, t2];
|
|
939
915
|
|
|
940
916
|
if (!depth && eConfig.shortestJoin) exactPaths = undefined;
|
|
@@ -943,7 +919,7 @@ export class ViewHandler {
|
|
|
943
919
|
joinPaths = joinPaths.concat(jinf.paths);
|
|
944
920
|
});
|
|
945
921
|
|
|
946
|
-
|
|
922
|
+
const r = makeJoin({ paths: joinPaths, expectOne }, 0);
|
|
947
923
|
return r;
|
|
948
924
|
|
|
949
925
|
function makeJoin(joinInfo: JoinInfo, ji: number) {
|
|
@@ -951,11 +927,11 @@ export class ViewHandler {
|
|
|
951
927
|
const jp = paths[ji];
|
|
952
928
|
|
|
953
929
|
// let prevTable = ji? paths[ji - 1].table : jp.source;
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
930
|
+
const table = paths[ji].table;
|
|
931
|
+
const tableAlias = asName(ji < paths.length - 1 ? `jd${ji}` : table);
|
|
932
|
+
const prevTableAlias = asName(ji ? `jd${ji - 1}` : thisTable);
|
|
957
933
|
|
|
958
|
-
|
|
934
|
+
const cond = `${jp.on.map(c => {
|
|
959
935
|
return c.map(([c1, c2]) => `${prevTableAlias}.${asName(c1)} = ${tableAlias}.${asName(c2)}`).join(" AND ")
|
|
960
936
|
}).join("\n OR ")
|
|
961
937
|
}`;
|
|
@@ -978,7 +954,7 @@ export class ViewHandler {
|
|
|
978
954
|
|
|
979
955
|
j = indent(j, ji + 1);
|
|
980
956
|
|
|
981
|
-
|
|
957
|
+
const res = `${isNotExists ? " NOT " : " "} EXISTS ( \n` +
|
|
982
958
|
j +
|
|
983
959
|
`) \n`;
|
|
984
960
|
return indent(res, ji);
|
|
@@ -1002,20 +978,15 @@ export class ViewHandler {
|
|
|
1002
978
|
({ forcedFilter, filterFields } = t2Rules.select);
|
|
1003
979
|
}
|
|
1004
980
|
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
})).where
|
|
1015
|
-
} catch (err) {
|
|
1016
|
-
// console.trace(err)
|
|
1017
|
-
throw err
|
|
1018
|
-
}
|
|
981
|
+
finalWhere = (await (this.dboBuilder.dbo[t2] as TableHandler).prepareWhere({
|
|
982
|
+
filter: f2,
|
|
983
|
+
forcedFilter,
|
|
984
|
+
filterFields,
|
|
985
|
+
addKeywords: false,
|
|
986
|
+
tableAlias,
|
|
987
|
+
localParams,
|
|
988
|
+
tableRule: t2Rules
|
|
989
|
+
})).where
|
|
1019
990
|
|
|
1020
991
|
if (!isJoined) {
|
|
1021
992
|
res = `${isNotExists ? " NOT " : " "} EXISTS (SELECT 1 \nFROM ${asName(t2)} \n${finalWhere ? `WHERE ${finalWhere}` : ""}) `
|
|
@@ -1085,7 +1056,7 @@ export class ViewHandler {
|
|
|
1085
1056
|
} else if (Array.isArray(orderBy)) {
|
|
1086
1057
|
|
|
1087
1058
|
/* Order by is formed of a list of ascending field names */
|
|
1088
|
-
|
|
1059
|
+
const _orderBy = (orderBy as any[]);
|
|
1089
1060
|
if (_orderBy && !_orderBy.find(v => typeof v !== "string")) {
|
|
1090
1061
|
/* [string] */
|
|
1091
1062
|
_ob = _orderBy.map(key => ({ key, asc: true }));
|
|
@@ -1101,7 +1072,7 @@ export class ViewHandler {
|
|
|
1101
1072
|
(!s.fields.length || s.fields.every(f => allowed_cols.includes(f)))
|
|
1102
1073
|
).map(s => s.alias)
|
|
1103
1074
|
|
|
1104
|
-
|
|
1075
|
+
const bad_param = _ob.find(({ key }) =>
|
|
1105
1076
|
!(validatedAggAliases || []).includes(key) &&
|
|
1106
1077
|
!allowed_cols.includes(key)
|
|
1107
1078
|
);
|
|
@@ -1178,7 +1149,7 @@ export class ViewHandler {
|
|
|
1178
1149
|
}
|
|
1179
1150
|
|
|
1180
1151
|
|
|
1181
|
-
intersectColumns(allowedFields: FieldFilter, dissallowedFields: FieldFilter, fixIssues
|
|
1152
|
+
intersectColumns(allowedFields: FieldFilter, dissallowedFields: FieldFilter, fixIssues = false): string[] {
|
|
1182
1153
|
let result: string[] = [];
|
|
1183
1154
|
if (allowedFields) {
|
|
1184
1155
|
result = this.parseFieldFilter(allowedFields);
|
|
@@ -1206,16 +1177,16 @@ export class ViewHandler {
|
|
|
1206
1177
|
* @param {string[]} allowed_cols - allowed columns (excluding forcedData) from table rules
|
|
1207
1178
|
*/
|
|
1208
1179
|
prepareFieldValues(obj: Record<string, any> = {}, forcedData: object = {}, allowed_cols: FieldFilter | undefined, fixIssues = false): AnyObject {
|
|
1209
|
-
|
|
1180
|
+
const column_names = this.column_names.slice(0);
|
|
1210
1181
|
if (!column_names || !column_names.length) throw "table column_names mising";
|
|
1211
1182
|
let _allowed_cols = column_names.slice(0);
|
|
1212
|
-
|
|
1183
|
+
const _obj = { ...obj };
|
|
1213
1184
|
|
|
1214
1185
|
if (allowed_cols) {
|
|
1215
1186
|
_allowed_cols = this.parseFieldFilter(allowed_cols, false);
|
|
1216
1187
|
}
|
|
1217
|
-
let final_filter = { ..._obj }
|
|
1218
|
-
|
|
1188
|
+
let final_filter = { ..._obj };
|
|
1189
|
+
const filter_keys: Array<keyof typeof final_filter> = Object.keys(final_filter);
|
|
1219
1190
|
|
|
1220
1191
|
if (fixIssues && filter_keys.length) {
|
|
1221
1192
|
final_filter = {};
|
|
@@ -1240,7 +1211,7 @@ export class ViewHandler {
|
|
|
1240
1211
|
}
|
|
1241
1212
|
|
|
1242
1213
|
|
|
1243
|
-
parseFieldFilter(fieldParams: FieldFilter = "*", allow_empty
|
|
1214
|
+
parseFieldFilter(fieldParams: FieldFilter = "*", allow_empty = true, allowed_cols?: string[]): string[] {
|
|
1244
1215
|
return ViewHandler._parseFieldFilter(fieldParams, allow_empty, allowed_cols || this.column_names.slice(0))
|
|
1245
1216
|
}
|
|
1246
1217
|
|
|
@@ -1249,11 +1220,11 @@ export class ViewHandler {
|
|
|
1249
1220
|
* @param {FieldFilter} fieldParams - { col1: 0, col2: 0 } | { col1: true, col2: true } | "*" | ["key1", "key2"] | []
|
|
1250
1221
|
* @param {boolean} allow_empty - allow empty select. defaults to true
|
|
1251
1222
|
*/
|
|
1252
|
-
static _parseFieldFilter<AllowedKeys extends string[]>(fieldParams: FieldFilter<Record<AllowedKeys[number], any>> = "*", allow_empty
|
|
1223
|
+
static _parseFieldFilter<AllowedKeys extends string[]>(fieldParams: FieldFilter<Record<AllowedKeys[number], any>> = "*", allow_empty = true, all_cols: AllowedKeys): AllowedKeys | [""] {
|
|
1253
1224
|
if (!all_cols) throw "all_cols missing"
|
|
1254
1225
|
const all_fields = all_cols;// || this.column_names.slice(0);
|
|
1255
|
-
let colNames: AllowedKeys = [] as any
|
|
1256
|
-
|
|
1226
|
+
let colNames: AllowedKeys = [] as any;
|
|
1227
|
+
const initialParams = JSON.stringify(fieldParams);
|
|
1257
1228
|
|
|
1258
1229
|
if (fieldParams) {
|
|
1259
1230
|
|
|
@@ -1298,7 +1269,7 @@ export class ViewHandler {
|
|
|
1298
1269
|
return [] as unknown as typeof all_fields; //all_fields.slice(0) as typeof all_fields;
|
|
1299
1270
|
}
|
|
1300
1271
|
|
|
1301
|
-
|
|
1272
|
+
const keys = getKeys(fieldParams as {
|
|
1302
1273
|
[key: string]: boolean | 0 | 1;
|
|
1303
1274
|
}) as AllowedKeys;
|
|
1304
1275
|
if (keys[0] === "") {
|
|
@@ -1316,7 +1287,7 @@ export class ViewHandler {
|
|
|
1316
1287
|
if (!allowedVals.includes((fieldParams as any)[key])) throw `Invalid field selection value for: { ${key}: ${(fieldParams as any)[key]} }. \n Allowed values: ${allowedVals.join(" OR ")}`
|
|
1317
1288
|
})
|
|
1318
1289
|
|
|
1319
|
-
|
|
1290
|
+
const allowed = keys.filter(key => (fieldParams as any)[key]),
|
|
1320
1291
|
disallowed = keys.filter(key => !(fieldParams as any)[key]);
|
|
1321
1292
|
|
|
1322
1293
|
|
|
@@ -1335,7 +1306,7 @@ export class ViewHandler {
|
|
|
1335
1306
|
return colNames as any;
|
|
1336
1307
|
|
|
1337
1308
|
function validate(cols: AllowedKeys) {
|
|
1338
|
-
|
|
1309
|
+
const bad_keys = cols.filter(col => !all_fields.includes(col));
|
|
1339
1310
|
if (bad_keys && bad_keys.length) {
|
|
1340
1311
|
throw "\nUnrecognised or illegal fields: " + bad_keys.join(", ");
|
|
1341
1312
|
}
|
package/lib/DboBuilder/delete.js
CHANGED
package/lib/DboBuilder/delete.ts
CHANGED
|
@@ -130,4 +130,4 @@ export async function _delete(this: TableHandler, filter?: Filter, params?: Dele
|
|
|
130
130
|
if (localParams && localParams.testRule) throw e;
|
|
131
131
|
throw parseError(e, `dbo.${this.name}.delete(${JSON.stringify(filter || {}, null, 2)}, ${JSON.stringify(params || {}, null, 2)})`);
|
|
132
132
|
}
|
|
133
|
-
}
|
|
133
|
+
}
|
|
@@ -38,9 +38,10 @@ async function getColumns(lang, params, _param3, tableRules, localParams) {
|
|
|
38
38
|
].includes(c.name);
|
|
39
39
|
})
|
|
40
40
|
.map(_c => {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
41
|
+
const c = { ..._c };
|
|
42
|
+
const label = c.comment || capitalizeFirstLetter(c.name, " ");
|
|
43
|
+
const select = c.privileges.some(p => p.privilege_type === "SELECT"), insert = c.privileges.some(p => p.privilege_type === "INSERT"), _delete = this.tableOrViewInfo.privileges.delete; // c.privileges.some(p => p.privilege_type === "DELETE");
|
|
44
|
+
let update = c.privileges.some(p => p.privilege_type === "UPDATE");
|
|
44
45
|
delete c.privileges;
|
|
45
46
|
const prostgles = this.dboBuilder?.prostgles;
|
|
46
47
|
const fileConfig = prostgles.fileManager?.getColInfo({ colName: c.name, tableName: this.name });
|
|
@@ -49,7 +50,7 @@ async function getColumns(lang, params, _param3, tableRules, localParams) {
|
|
|
49
50
|
update = false;
|
|
50
51
|
}
|
|
51
52
|
const nonOrderableUD_Types = [...prostgles_types_1._PG_geometric, "xml"];
|
|
52
|
-
|
|
53
|
+
const result = {
|
|
53
54
|
...c,
|
|
54
55
|
label,
|
|
55
56
|
tsDataType: (0, DboBuilder_1.postgresToTsType)(c.udt_name),
|
|
@@ -58,14 +58,14 @@ export async function getColumns(
|
|
|
58
58
|
].includes(c.name)
|
|
59
59
|
})
|
|
60
60
|
.map(_c => {
|
|
61
|
-
|
|
61
|
+
const c = { ..._c };
|
|
62
62
|
|
|
63
|
-
|
|
63
|
+
const label = c.comment || capitalizeFirstLetter(c.name, " ");
|
|
64
64
|
|
|
65
|
-
|
|
65
|
+
const select = c.privileges.some(p => p.privilege_type === "SELECT"),
|
|
66
66
|
insert = c.privileges.some(p => p.privilege_type === "INSERT"),
|
|
67
|
-
update = c.privileges.some(p => p.privilege_type === "UPDATE"),
|
|
68
67
|
_delete = this.tableOrViewInfo.privileges.delete;// c.privileges.some(p => p.privilege_type === "DELETE");
|
|
68
|
+
let update = c.privileges.some(p => p.privilege_type === "UPDATE");
|
|
69
69
|
|
|
70
70
|
delete (c as any).privileges;
|
|
71
71
|
|
|
@@ -79,7 +79,7 @@ export async function getColumns(
|
|
|
79
79
|
|
|
80
80
|
const nonOrderableUD_Types: PG_COLUMN_UDT_DATA_TYPE[] = [..._PG_geometric, "xml" as any];
|
|
81
81
|
|
|
82
|
-
|
|
82
|
+
const result: ValidatedColumnInfo = {
|
|
83
83
|
...c,
|
|
84
84
|
label,
|
|
85
85
|
tsDataType: postgresToTsType(c.udt_name),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getCondition.d.ts","sourceRoot":"","sources":["getCondition.ts"],"names":[],"mappings":"AACA,OAAO,EAAsB,WAAW,
|
|
1
|
+
{"version":3,"file":"getCondition.d.ts","sourceRoot":"","sources":["getCondition.ts"],"names":[],"mappings":"AACA,OAAO,EAAsB,WAAW,EAAO,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG7C,OAAO,EAAoC,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC3F,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAM1C;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE;IAAE,MAAM,EAAE,GAAG,CAAC;IAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC;IAAC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,WAAW,CAAC;IAAC,UAAU,CAAC,EAAE,SAAS,CAAA;CAAE,mBAsQvM"}
|
|
@@ -16,11 +16,11 @@ const FILTER_FUNCS = Functions_1.FUNCTIONS.filter(f => f.canBeUsedForFilter);
|
|
|
16
16
|
*/
|
|
17
17
|
async function getCondition(params) {
|
|
18
18
|
const { filter: rawFilter, select, allowed_colnames, tableAlias, localParams, tableRules } = params;
|
|
19
|
-
|
|
19
|
+
const filter = { ...rawFilter };
|
|
20
20
|
/* Exists join filter */
|
|
21
21
|
const ERR = "Invalid exists filter. \nExpecting somethibng like: \n | { $exists: { tableName.tableName2: Filter } } \n | { $exists: { \"**.tableName3\": Filter } }\n | { path: string[]; filter: AnyObject }";
|
|
22
22
|
const SP_WILDCARD = "**";
|
|
23
|
-
|
|
23
|
+
const existsKeys = (0, prostgles_types_1.getKeys)(filter)
|
|
24
24
|
.filter(k => prostgles_types_1.EXISTS_KEYS.includes(k) && Object.keys(filter[k] ?? {}).length)
|
|
25
25
|
.map(key => {
|
|
26
26
|
const isJoined = key.toLowerCase().includes("join");
|
|
@@ -38,7 +38,7 @@ async function getCondition(params) {
|
|
|
38
38
|
*/
|
|
39
39
|
const firstKeyIsATable = !!this.dboBuilder.dbo[firstKey];
|
|
40
40
|
let tables = isDetailed ? filterValue.path : (firstKeyIsATable ? [firstKey] : firstKey.split("."));
|
|
41
|
-
|
|
41
|
+
const f2 = isDetailed ? filterValue.filter : filterValue[firstKey];
|
|
42
42
|
let shortestJoin = false;
|
|
43
43
|
if (!isJoined) {
|
|
44
44
|
if (tables.length !== 1)
|
|
@@ -74,7 +74,7 @@ async function getCondition(params) {
|
|
|
74
74
|
// });
|
|
75
75
|
// }
|
|
76
76
|
// });
|
|
77
|
-
|
|
77
|
+
const funcConds = [];
|
|
78
78
|
const funcFilter = FILTER_FUNCS.filter(f => f.name in filter);
|
|
79
79
|
funcFilter.map(f => {
|
|
80
80
|
const funcArgs = filter[f.name];
|
|
@@ -95,7 +95,7 @@ async function getCondition(params) {
|
|
|
95
95
|
/* Computed field queries */
|
|
96
96
|
const p = this.getValidatedRules(tableRules, localParams);
|
|
97
97
|
const computedFields = p.allColumns.filter(c => c.type === "computed");
|
|
98
|
-
|
|
98
|
+
const computedColConditions = [];
|
|
99
99
|
Object.keys(filter || {}).map(key => {
|
|
100
100
|
const compCol = computedFields.find(cf => cf.name === key);
|
|
101
101
|
if (compCol) {
|
|
@@ -196,7 +196,7 @@ async function getCondition(params) {
|
|
|
196
196
|
{ $joinFilter: { $ST_DWithin: [table.col, foreignTable.col, distance] }
|
|
197
197
|
will make an exists filter
|
|
198
198
|
*/
|
|
199
|
-
|
|
199
|
+
const filterKeys = Object.keys(filter).filter(k => k !== complexFilterKey && !funcFilter.find(ek => ek.name === k) && !computedFields.find(cf => cf.name === k) && !existsKeys.find(ek => ek.key === k));
|
|
200
200
|
// if(allowed_colnames){
|
|
201
201
|
// const aliasedColumns = (select || []).filter(s =>
|
|
202
202
|
// ["function", "computed", "column"].includes(s.type) && allowed_colnames.includes(s.alias) ||
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AnyObject, EXISTS_KEY, EXISTS_KEYS, getKeys, isObject, pickKeys } from "prostgles-types";
|
|
2
|
-
import { ExistsFilterConfig, LocalParams,
|
|
2
|
+
import { ExistsFilterConfig, LocalParams, pgp } from "../DboBuilder";
|
|
3
3
|
import { TableRule } from "../PublishParser";
|
|
4
4
|
import { asValue } from "../PubSubManager/PubSubManager";
|
|
5
5
|
import { FUNCTIONS, parseFunction } from "./QueryBuilder/Functions";
|
|
@@ -20,12 +20,12 @@ const FILTER_FUNCS = FUNCTIONS.filter(f => f.canBeUsedForFilter);
|
|
|
20
20
|
const { filter: rawFilter, select, allowed_colnames, tableAlias, localParams, tableRules } = params;
|
|
21
21
|
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
const filter = { ... (rawFilter as any) } as any;
|
|
24
24
|
|
|
25
25
|
/* Exists join filter */
|
|
26
26
|
const ERR = "Invalid exists filter. \nExpecting somethibng like: \n | { $exists: { tableName.tableName2: Filter } } \n | { $exists: { \"**.tableName3\": Filter } }\n | { path: string[]; filter: AnyObject }"
|
|
27
27
|
const SP_WILDCARD = "**";
|
|
28
|
-
|
|
28
|
+
const existsKeys: ExistsFilterConfig[] = getKeys(filter)
|
|
29
29
|
.filter(k => EXISTS_KEYS.includes(k as EXISTS_KEY) && Object.keys(filter[k] ?? {}).length)
|
|
30
30
|
.map(key => {
|
|
31
31
|
|
|
@@ -47,7 +47,7 @@ const FILTER_FUNCS = FUNCTIONS.filter(f => f.canBeUsedForFilter);
|
|
|
47
47
|
*/
|
|
48
48
|
const firstKeyIsATable = !!this.dboBuilder.dbo[firstKey];
|
|
49
49
|
let tables = isDetailed? filterValue.path : (firstKeyIsATable? [firstKey] : firstKey.split("."));
|
|
50
|
-
|
|
50
|
+
const f2 = isDetailed? filterValue.filter : filterValue[firstKey];
|
|
51
51
|
let shortestJoin = false;
|
|
52
52
|
|
|
53
53
|
if (!isJoined) {
|
|
@@ -86,7 +86,7 @@ const FILTER_FUNCS = FUNCTIONS.filter(f => f.canBeUsedForFilter);
|
|
|
86
86
|
// }
|
|
87
87
|
// });
|
|
88
88
|
|
|
89
|
-
|
|
89
|
+
const funcConds: string[] = [];
|
|
90
90
|
const funcFilter = FILTER_FUNCS.filter(f => f.name in filter);
|
|
91
91
|
|
|
92
92
|
funcFilter.map(f => {
|
|
@@ -112,7 +112,7 @@ const FILTER_FUNCS = FUNCTIONS.filter(f => f.canBeUsedForFilter);
|
|
|
112
112
|
/* Computed field queries */
|
|
113
113
|
const p = this.getValidatedRules(tableRules, localParams);
|
|
114
114
|
const computedFields = p.allColumns.filter(c => c.type === "computed");
|
|
115
|
-
|
|
115
|
+
const computedColConditions: string[] = [];
|
|
116
116
|
Object.keys(filter || {}).map(key => {
|
|
117
117
|
const compCol = computedFields.find(cf => cf.name === key);
|
|
118
118
|
if (compCol) {
|
|
@@ -231,7 +231,7 @@ const FILTER_FUNCS = FUNCTIONS.filter(f => f.canBeUsedForFilter);
|
|
|
231
231
|
will make an exists filter
|
|
232
232
|
*/
|
|
233
233
|
|
|
234
|
-
|
|
234
|
+
const filterKeys = Object.keys(filter).filter(k => k !== complexFilterKey && !funcFilter.find(ek => ek.name === k) && !computedFields.find(cf => cf.name === k) && !existsKeys.find(ek => ek.key === k));
|
|
235
235
|
// if(allowed_colnames){
|
|
236
236
|
// const aliasedColumns = (select || []).filter(s =>
|
|
237
237
|
// ["function", "computed", "column"].includes(s.type) && allowed_colnames.includes(s.alias) ||
|