prostgles-server 4.2.632 → 4.2.635
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/debug/client-schema-types/a94d5cf8/DBGeneratedSchema.ts +102 -0
- package/debug/client-schema-types/aa40d42e/DBGeneratedSchema.ts +102 -0
- package/debug/client-schema-types/b5b54baa/DBGeneratedSchema.ts +102 -0
- package/debug/client-schema-types/e4696dfd/DBGeneratedSchema.ts +102 -0
- package/dist/DboBuilder/DboBuilder.d.ts.map +1 -1
- package/dist/DboBuilder/DboBuilder.js +1 -14
- package/dist/DboBuilder/DboBuilder.js.map +1 -1
- package/dist/DboBuilder/QueryBuilder/Functions/Functions.d.ts.map +1 -1
- package/dist/DboBuilder/QueryBuilder/Functions/Functions.js +14 -0
- package/dist/DboBuilder/QueryBuilder/Functions/Functions.js.map +1 -1
- package/dist/DboBuilder/TableHandler/TableHandler.d.ts +1 -1
- package/dist/DboBuilder/TableHandler/TableHandler.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/ViewHandler.d.ts +2 -2
- package/dist/DboBuilder/ViewHandler/ViewHandler.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/ViewHandler.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/parseJoinPath.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/parseJoinPath.js +15 -62
- package/dist/DboBuilder/ViewHandler/parseJoinPath.js.map +1 -1
- package/dist/DboBuilder/joins/prepareShortestJoinPaths.d.ts.map +1 -1
- package/dist/DboBuilder/joins/prepareShortestJoinPaths.js +24 -9
- package/dist/DboBuilder/joins/prepareShortestJoinPaths.js.map +1 -1
- package/dist/TableConfig/TableConfigTypes.d.ts +1 -15
- package/dist/TableConfig/TableConfigTypes.d.ts.map +1 -1
- package/dist/TableConfig/TableConfigurator.d.ts +0 -2
- package/dist/TableConfig/TableConfigurator.d.ts.map +1 -1
- package/dist/TableConfig/TableConfigurator.js +0 -24
- package/dist/TableConfig/TableConfigurator.js.map +1 -1
- package/dist/TableConfig/getTableColumnQueries.d.ts.map +1 -1
- package/dist/TableConfig/getTableColumnQueries.js +1 -4
- package/dist/TableConfig/getTableColumnQueries.js.map +1 -1
- package/lib/DboBuilder/DboBuilder.ts +1 -16
- package/lib/DboBuilder/QueryBuilder/Functions/Functions.ts +15 -0
- package/lib/DboBuilder/TableHandler/TableHandler.ts +1 -1
- package/lib/DboBuilder/ViewHandler/ViewHandler.ts +2 -2
- package/lib/DboBuilder/ViewHandler/parseJoinPath.ts +26 -87
- package/lib/DboBuilder/joins/prepareShortestJoinPaths.ts +32 -15
- package/lib/TableConfig/TableConfigTypes.ts +0 -17
- package/lib/TableConfig/TableConfigurator.ts +0 -26
- package/lib/TableConfig/getTableColumnQueries.ts +1 -4
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableConfigurator.d.ts","sourceRoot":"","sources":["../../lib/TableConfig/TableConfigurator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"TableConfigurator.d.ts","sourceRoot":"","sources":["../../lib/TableConfig/TableConfigurator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,KAAK,EAAE,EAAE,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAMnE,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAExF;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,UAAU,SAA8B;IAExC,IAAI,MAAM,6CAET;IACD,IAAI,GAAG,IAAI,eAAe,CAGzB;IACD,IAAI,EAAE,IAAI,EAAE,CAGX;IACD,SAAS,EAAE,SAAS,CAAC;gBAET,SAAS,EAAE,SAAS;IAIhC,OAAO,sBAQL;IAEF,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC,CAAM;IAC9E,gBAAgB,sBAad;IAEF,eAAe,GAAI,WAAW,MAAM,EAAE,SAAS,MAAM,KAAG,YAAY,GAAG,SAAS,CAM9E;IAEF,kBAAkB,GAAI,WAAW,MAAM;;;;;kBASrC;IAEF,aAAa,GAAI,QAAQ;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,wBAS3D;IAEF,UAAU,GAAI,QAAQ;QACpB,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,KAAG,CAAC,YAAY,GAAG;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,GAAG,SAAS,CAwBnF;IAEF,WAAW,GAAI,QAAQ;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,KAAG,IAAI,CAUnF;IAEF,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,YAAY,UAAS;IACrB,IAAI,2BAA8B;CACnC;AAED,eAAO,MAAM,SAAS,GAAI,MAAM,SAAS,iBAAiB,EAAE,QAAQ;IAClE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC,KAAG,SAAS,GAAG,MAWf,CAAC"}
|
|
@@ -108,30 +108,6 @@ class TableConfigurator {
|
|
|
108
108
|
throw `${params.col} must be less than ${max}`;
|
|
109
109
|
}
|
|
110
110
|
};
|
|
111
|
-
getJoinInfo = (sourceTable, targetTable) => {
|
|
112
|
-
const sourceTableConfig = this.config[sourceTable];
|
|
113
|
-
if (sourceTableConfig && "columns" in sourceTableConfig) {
|
|
114
|
-
const targetColConfig = sourceTableConfig.columns?.[targetTable];
|
|
115
|
-
if (targetColConfig) {
|
|
116
|
-
if ((0, prostgles_types_1.isObject)(targetColConfig) && "joinDef" in targetColConfig) {
|
|
117
|
-
if (!targetColConfig.joinDef)
|
|
118
|
-
throw "targetColConfig.joinDef missing";
|
|
119
|
-
const { joinDef } = targetColConfig;
|
|
120
|
-
const res = {
|
|
121
|
-
expectOne: false,
|
|
122
|
-
paths: joinDef.map(({ sourceTable, targetTable: table, on }) => ({
|
|
123
|
-
source: sourceTable,
|
|
124
|
-
target: targetTable,
|
|
125
|
-
table,
|
|
126
|
-
on,
|
|
127
|
-
})),
|
|
128
|
-
};
|
|
129
|
-
return res;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
return undefined;
|
|
134
|
-
};
|
|
135
111
|
prevInitQueryHistory;
|
|
136
112
|
initialising = false;
|
|
137
113
|
init = initTableConfig_1.initTableConfig.bind(this);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableConfigurator.js","sourceRoot":"","sources":["../../lib/TableConfig/TableConfigurator.ts"],"names":[],"mappings":";;;AACA,qDAA2C;
|
|
1
|
+
{"version":3,"file":"TableConfigurator.js","sourceRoot":"","sources":["../../lib/TableConfig/TableConfigurator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getTableColumnQueries.d.ts","sourceRoot":"","sources":["../../lib/TableConfig/getTableColumnQueries.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,KAAK,IAAI,GAAG;IACV,EAAE,EAAE,EAAE,CAAC;IACP,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;CACnD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,GAAU,6CAKzC,IAAI,KAAG,OAAO,CACb,SAAS,GACT;IACE,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB,
|
|
1
|
+
{"version":3,"file":"getTableColumnQueries.d.ts","sourceRoot":"","sources":["../../lib/TableConfig/getTableColumnQueries.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,KAAK,IAAI,GAAG;IACV,EAAE,EAAE,EAAE,CAAC;IACP,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;CACnD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,GAAU,6CAKzC,IAAI,KAAG,OAAO,CACb,SAAS,GACT;IACE,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB,CA4HJ,CAAC"}
|
|
@@ -32,10 +32,7 @@ const getTableColumnQueries = async ({ db, tableConf, tableName, tableHandler, }
|
|
|
32
32
|
throw err;
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
|
-
const columns = (0, prostgles_types_1.getObjectEntries)(tableConf.columns)
|
|
36
|
-
/** Exclude NamedJoinColumn */
|
|
37
|
-
return typeof colDef === "string" || !("joinDef" in colDef);
|
|
38
|
-
});
|
|
35
|
+
const columns = (0, prostgles_types_1.getObjectEntries)(tableConf.columns);
|
|
39
36
|
const columnDefinitions = [];
|
|
40
37
|
for (const [colName, colConf] of columns) {
|
|
41
38
|
/* Get column definition */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getTableColumnQueries.js","sourceRoot":"","sources":["../../lib/TableConfig/getTableColumnQueries.ts"],"names":[],"mappings":";;;AAAA,qDAA8E;AAC9E,4FAAsG;AAEtG,+EAA6F;AAC7F,iEAA8D;AAU9D;;;GAGG;AACI,MAAM,qBAAqB,GAAG,KAAK,EAAE,EAC1C,EAAE,EACF,SAAS,EACT,SAAS,EACT,YAAY,GACP,EAQL,EAAE;IACF,MAAM,oBAAoB,GAAa,EAAE,CAAC;IAC1C,MAAM,eAAe,GAAa,EAAE,CAAC;IACrC,MAAM,iBAAiB,GAAa,EAAE,CAAC;IACvC,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,IAAI,CAAC,CAAC,SAAS,IAAI,SAAS,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,kBAAkB,GAAG,IAAA,yBAAO,EAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;QAC/D,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QACrC,OAAO,KAAK,IAAI,IAAA,0BAAQ,EAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEH,uCAAuC;IACvC,IAAI,kBAAkB,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,GAAG,CACV,0CAA0C,GAAG,4DAAmC,CACjF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,gEAAgE,EAAE,GAAG,CAAC,CAAC;YACrF,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,IAAA,kCAAgB,EAAC,SAAS,CAAC,OAAO,CAAC,CAAC
|
|
1
|
+
{"version":3,"file":"getTableColumnQueries.js","sourceRoot":"","sources":["../../lib/TableConfig/getTableColumnQueries.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,7 +24,6 @@ import type {
|
|
|
24
24
|
import { QueryStreamer } from "./runSql/QueryStreamer";
|
|
25
25
|
import { TableHandler } from "./TableHandler/TableHandler";
|
|
26
26
|
import type { JoinPaths } from "./ViewHandler/ViewHandler";
|
|
27
|
-
import { parseJoinPath } from "./ViewHandler/parseJoinPath";
|
|
28
27
|
import type { PGConstraint } from "./dboBuilderUtils";
|
|
29
28
|
import {
|
|
30
29
|
getCanExecute,
|
|
@@ -198,7 +197,7 @@ export class DboBuilder {
|
|
|
198
197
|
|
|
199
198
|
_joins?: Join[];
|
|
200
199
|
get joins(): Join[] {
|
|
201
|
-
return clone(this._joins ?? [])
|
|
200
|
+
return clone(this._joins ?? []);
|
|
202
201
|
}
|
|
203
202
|
|
|
204
203
|
set joins(j: Join[]) {
|
|
@@ -406,20 +405,6 @@ export class DboBuilder {
|
|
|
406
405
|
target: string,
|
|
407
406
|
): JoinPaths[number] | undefined => {
|
|
408
407
|
const source = viewHandler.name;
|
|
409
|
-
if (source === target) {
|
|
410
|
-
parseJoinPath({
|
|
411
|
-
rawPath: target,
|
|
412
|
-
rootTable: source,
|
|
413
|
-
viewHandler,
|
|
414
|
-
});
|
|
415
|
-
|
|
416
|
-
return {
|
|
417
|
-
t1: source,
|
|
418
|
-
t2: target,
|
|
419
|
-
path: [source],
|
|
420
|
-
};
|
|
421
|
-
}
|
|
422
|
-
|
|
423
408
|
const jp = this.shortestJoinPaths.find((jp) => jp.t1 === source && jp.t2 === target);
|
|
424
409
|
return jp;
|
|
425
410
|
};
|
|
@@ -753,6 +753,21 @@ export const FUNCTIONS: FunctionSpec[] = [
|
|
|
753
753
|
}),
|
|
754
754
|
),
|
|
755
755
|
|
|
756
|
+
asFunction({
|
|
757
|
+
name: "$array_element",
|
|
758
|
+
type: "function",
|
|
759
|
+
description: ` :[column_name, index] -> get an array element using PostgreSQL's 1-based index`,
|
|
760
|
+
numArgs: 2,
|
|
761
|
+
singleColArg: false,
|
|
762
|
+
getFields: ([columnName]) => [columnName],
|
|
763
|
+
getQuery: ({ args: [columnName, index], tableAliasRaw: tableAlias }) => {
|
|
764
|
+
if (!Number.isInteger(index) || index < 1) {
|
|
765
|
+
throw new Error("$array_element index must be a positive integer");
|
|
766
|
+
}
|
|
767
|
+
return `${asNameAlias(columnName, tableAlias)}[${asValue(index)}]`;
|
|
768
|
+
},
|
|
769
|
+
}),
|
|
770
|
+
|
|
756
771
|
/* Aggs */
|
|
757
772
|
...["max", "min", "count", "avg", "json_agg", "jsonb_agg", "string_agg", "array_agg", "sum"].map(
|
|
758
773
|
(aggName) =>
|
|
@@ -67,7 +67,7 @@ export class TableHandler extends ViewHandler {
|
|
|
67
67
|
config: TableDefinition<any> | undefined;
|
|
68
68
|
hooks: TableHooksDefinition<AnyObject, TableHandlers, any> | undefined;
|
|
69
69
|
tx?: { t: pgPromise.ITask<{}>; dbTX: TableHandlers };
|
|
70
|
-
joinPaths
|
|
70
|
+
joinPaths: JoinPaths;
|
|
71
71
|
}) {
|
|
72
72
|
super({ db, tableOrViewInfo, dboBuilder, config, hooks, tx, joinPaths });
|
|
73
73
|
|
|
@@ -51,7 +51,7 @@ export class ViewHandler {
|
|
|
51
51
|
tsColumnDefs: string[] = [];
|
|
52
52
|
joins: Join[];
|
|
53
53
|
joinGraph?: Graph;
|
|
54
|
-
joinPaths
|
|
54
|
+
joinPaths: JoinPaths;
|
|
55
55
|
dboBuilder: DboBuilder;
|
|
56
56
|
config: TableDefinition<any> | undefined;
|
|
57
57
|
hooks: TableHooksDefinition<AnyObject, TableHandlers, any> | undefined;
|
|
@@ -84,7 +84,7 @@ export class ViewHandler {
|
|
|
84
84
|
config: TableDefinition<any> | undefined;
|
|
85
85
|
hooks: TableHooksDefinition<AnyObject, TableHandlers, any> | undefined;
|
|
86
86
|
tx?: { t: pgPromise.ITask<{}>; dbTX: TableHandlers };
|
|
87
|
-
joinPaths
|
|
87
|
+
joinPaths: JoinPaths;
|
|
88
88
|
}) {
|
|
89
89
|
this.config = config;
|
|
90
90
|
this.hooks = hooks;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import type { JoinPath, RawJoinPath} from "prostgles-types";
|
|
1
|
+
import type { JoinPath, RawJoinPath } from "prostgles-types";
|
|
2
2
|
import { reverseJoinOn } from "prostgles-types";
|
|
3
3
|
import type { ViewHandler } from "./ViewHandler";
|
|
4
|
+
import type { JoinInfo } from "../DboBuilder";
|
|
4
5
|
|
|
5
6
|
type parseJoinPathArgs = {
|
|
6
7
|
rawPath: RawJoinPath;
|
|
@@ -39,10 +40,10 @@ export const parseJoinPath = ({
|
|
|
39
40
|
|
|
40
41
|
joinInfo.paths.forEach((path) => {
|
|
41
42
|
/** Check if join tables are valid */
|
|
42
|
-
if (!viewHandler.dboBuilder.
|
|
43
|
+
if (!viewHandler.dboBuilder.dboMap.get(path.table)) {
|
|
43
44
|
throw {
|
|
44
45
|
stack: ["prepareExistCondition()"],
|
|
45
|
-
message: `Invalid or
|
|
46
|
+
message: `Invalid or disallowed table in join path: ${path.table}`,
|
|
46
47
|
};
|
|
47
48
|
}
|
|
48
49
|
result.push({
|
|
@@ -70,8 +71,6 @@ export const parseJoinPath = ({
|
|
|
70
71
|
return result;
|
|
71
72
|
};
|
|
72
73
|
|
|
73
|
-
import type { JoinInfo } from "../DboBuilder";
|
|
74
|
-
|
|
75
74
|
type Opts = {
|
|
76
75
|
allowMultiOrJoin?: boolean;
|
|
77
76
|
getShortestJoin?: boolean;
|
|
@@ -81,12 +80,12 @@ type Opts = {
|
|
|
81
80
|
* Returns all tables and fields required to join from source table to target table
|
|
82
81
|
* Respecting the path.on condition
|
|
83
82
|
*/
|
|
84
|
-
|
|
83
|
+
const getJoins = (
|
|
85
84
|
viewHandler: ViewHandler,
|
|
86
85
|
source: string,
|
|
87
86
|
path: JoinPath[],
|
|
88
|
-
{ allowMultiOrJoin = true, getShortestJoin }: Opts = {}
|
|
89
|
-
): JoinInfo {
|
|
87
|
+
{ allowMultiOrJoin = true, getShortestJoin }: Opts = {},
|
|
88
|
+
): JoinInfo => {
|
|
90
89
|
const [lastItem] = path;
|
|
91
90
|
if (!lastItem) {
|
|
92
91
|
throw `Empty path`;
|
|
@@ -95,80 +94,27 @@ function getJoins(
|
|
|
95
94
|
throw `getShortestJoin requires exactly 1 path item`;
|
|
96
95
|
}
|
|
97
96
|
const target = lastItem.table;
|
|
98
|
-
if (!viewHandler.joinPaths) {
|
|
99
|
-
throw `Join info missing`;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
/* Self join */
|
|
103
|
-
if (source === target) {
|
|
104
|
-
const tableHandler = viewHandler.dboBuilder.tablesOrViews?.find((t) => t.name === source);
|
|
105
|
-
if (!tableHandler) throw `Table not found for joining ${source}`;
|
|
106
|
-
|
|
107
|
-
const fcols = tableHandler.columns.filter((c) =>
|
|
108
|
-
c.references?.some(({ ftable }) => ftable === viewHandler.name)
|
|
109
|
-
);
|
|
110
|
-
if (!fcols.length) {
|
|
111
|
-
throw `There is no self-join foreign key relationship for table ${JSON.stringify(target)}`;
|
|
112
|
-
}
|
|
113
|
-
let allOnJoins: [string, string][][] = [];
|
|
114
|
-
fcols.forEach((fc) => {
|
|
115
|
-
fc.references!.forEach(({ fcols, cols }) => {
|
|
116
|
-
const fieldArr = fcols.map((fcol, i) => [fcol, cols[i]!] as [string, string]);
|
|
117
|
-
allOnJoins.push(fieldArr);
|
|
118
|
-
});
|
|
119
|
-
});
|
|
120
|
-
allOnJoins = [
|
|
121
|
-
...allOnJoins,
|
|
122
|
-
/** Reverse as well */
|
|
123
|
-
...allOnJoins.map((constraint) =>
|
|
124
|
-
constraint.map(([left, right]) => [right, left] as [string, string])
|
|
125
|
-
),
|
|
126
|
-
];
|
|
127
|
-
return {
|
|
128
|
-
paths: [
|
|
129
|
-
{
|
|
130
|
-
source,
|
|
131
|
-
target,
|
|
132
|
-
table: target,
|
|
133
|
-
on: getValidOn(
|
|
134
|
-
lastItem.on,
|
|
135
|
-
allOnJoins.map((v) => Object.fromEntries(v))
|
|
136
|
-
),
|
|
137
|
-
},
|
|
138
|
-
],
|
|
139
|
-
expectOne: false,
|
|
140
|
-
};
|
|
141
|
-
}
|
|
142
97
|
|
|
143
98
|
/* Find the join path between tables */
|
|
144
|
-
const
|
|
145
|
-
|
|
146
|
-
target
|
|
147
|
-
);
|
|
148
|
-
if (tableConfigJoinInfo) return tableConfigJoinInfo;
|
|
149
|
-
|
|
150
|
-
const actualPath =
|
|
151
|
-
getShortestJoin ?
|
|
152
|
-
viewHandler.joinPaths
|
|
99
|
+
const actualPath = getShortestJoin
|
|
100
|
+
? viewHandler.joinPaths
|
|
153
101
|
.find((j) => {
|
|
154
102
|
return j.t1 === source && j.t2 === target;
|
|
155
103
|
})
|
|
156
104
|
?.path.map((table) => ({ table, on: undefined }))
|
|
157
105
|
.slice(1)
|
|
158
|
-
: (
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
path
|
|
164
|
-
: undefined;
|
|
106
|
+
: viewHandler.joinPaths.find((j) => {
|
|
107
|
+
return j.path.join() === [{ table: source }, ...path].map((p) => p.table).join();
|
|
108
|
+
})
|
|
109
|
+
? path
|
|
110
|
+
: undefined;
|
|
165
111
|
|
|
166
112
|
if (getShortestJoin && actualPath?.length && lastItem.on?.length) {
|
|
167
113
|
actualPath[actualPath.length - 1]!.on = lastItem.on;
|
|
168
114
|
}
|
|
169
115
|
|
|
170
116
|
if (!actualPath) {
|
|
171
|
-
throw `Joining ${source} <-...-> ${target}
|
|
117
|
+
throw `Joining ${source} <-...-> ${target} disallowed or missing`;
|
|
172
118
|
}
|
|
173
119
|
|
|
174
120
|
/* Make the join chain info */
|
|
@@ -178,11 +124,13 @@ function getJoins(
|
|
|
178
124
|
const t1 = i === 0 ? source : prevTable.table;
|
|
179
125
|
|
|
180
126
|
/* Get join options */
|
|
181
|
-
const join = viewHandler.joins.find(
|
|
182
|
-
|
|
183
|
-
|
|
127
|
+
const join = viewHandler.joins.find(({ tables: [left, right] }) => {
|
|
128
|
+
return (
|
|
129
|
+
(left === t1 && right === tablePath.table) || (right === t1 && left === tablePath.table)
|
|
130
|
+
);
|
|
131
|
+
});
|
|
184
132
|
if (!join) {
|
|
185
|
-
throw `Joining ${t1} <-> ${tablePath.table}
|
|
133
|
+
throw `Joining ${t1} <-> ${tablePath.table} disallowed or missing`;
|
|
186
134
|
}
|
|
187
135
|
const isLtr = join.tables[0] === t1;
|
|
188
136
|
const joinOn = isLtr ? join.on : reverseJoinOn(join.on);
|
|
@@ -196,17 +144,6 @@ function getJoins(
|
|
|
196
144
|
});
|
|
197
145
|
});
|
|
198
146
|
const expectOne = false;
|
|
199
|
-
// paths.map(({ source, target, on }, i) => {
|
|
200
|
-
// if(expectOne && on.length === 1){
|
|
201
|
-
// const sourceCol = on[0][1];
|
|
202
|
-
// const targetCol = on[0][0];
|
|
203
|
-
|
|
204
|
-
// const sCol = this.dboBuilder.dbo[source].columns.find(c => c.name === sourceCol)
|
|
205
|
-
// const tCol = this.dboBuilder.dbo[target].columns.find(c => c.name === targetCol)
|
|
206
|
-
// console.log({ sourceCol, targetCol, sCol, source, tCol, target, on})
|
|
207
|
-
// expectOne = sCol.is_pkey && tCol.is_pkey
|
|
208
|
-
// }
|
|
209
|
-
// })
|
|
210
147
|
|
|
211
148
|
const isMultiOrJoin = paths.find((p) => p.on.length > 1);
|
|
212
149
|
if (!allowMultiOrJoin && isMultiOrJoin) {
|
|
@@ -216,7 +153,7 @@ function getJoins(
|
|
|
216
153
|
paths,
|
|
217
154
|
expectOne,
|
|
218
155
|
};
|
|
219
|
-
}
|
|
156
|
+
};
|
|
220
157
|
|
|
221
158
|
const getValidOn = (requested: JoinPath["on"], possible: ParsedJoinPath["on"]) => {
|
|
222
159
|
if (!requested) {
|
|
@@ -227,7 +164,7 @@ const getValidOn = (requested: JoinPath["on"], possible: ParsedJoinPath["on"]) =
|
|
|
227
164
|
}
|
|
228
165
|
const isValid = requested.every((requestedConstraint) => {
|
|
229
166
|
return possible.some((possibleConstraint) =>
|
|
230
|
-
conditionsMatch(possibleConstraint, requestedConstraint)
|
|
167
|
+
conditionsMatch(possibleConstraint, requestedConstraint),
|
|
231
168
|
);
|
|
232
169
|
});
|
|
233
170
|
|
|
@@ -241,5 +178,7 @@ const getValidOn = (requested: JoinPath["on"], possible: ParsedJoinPath["on"]) =
|
|
|
241
178
|
const conditionsMatch = (c1: Record<string, string>, c2: Record<string, string>) => {
|
|
242
179
|
const keys1 = Object.keys(c1);
|
|
243
180
|
const keys2 = Object.keys(c2);
|
|
244
|
-
return
|
|
181
|
+
return (
|
|
182
|
+
keys1.toSorted().join() === keys2.toSorted().join() && keys1.every((key) => c1[key] === c2[key])
|
|
183
|
+
);
|
|
245
184
|
};
|
|
@@ -15,19 +15,18 @@ type Result = {
|
|
|
15
15
|
};
|
|
16
16
|
|
|
17
17
|
export const prepareShortestJoinPaths = (dboBuilder: DboBuilder): Result => {
|
|
18
|
-
|
|
18
|
+
const { joins: joinConfigFromOpts } = dboBuilder.prostgles.opts;
|
|
19
|
+
if (!joinConfigFromOpts) {
|
|
19
20
|
return {
|
|
20
21
|
joins: [],
|
|
21
22
|
shortestJoinPaths: [],
|
|
22
23
|
};
|
|
23
24
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
if (Array.isArray(joinConfig)) {
|
|
27
|
-
joinConfig.forEach((join, index, configured) => {
|
|
25
|
+
if (Array.isArray(joinConfigFromOpts)) {
|
|
26
|
+
joinConfigFromOpts.forEach((join, index, configured) => {
|
|
28
27
|
const duplicate = configured
|
|
29
28
|
.slice(0, index)
|
|
30
|
-
.some((existing) =>
|
|
29
|
+
.some((existing) => sortedArraysMatch(existing.tables, join.tables));
|
|
31
30
|
if (duplicate) {
|
|
32
31
|
throw new Error(
|
|
33
32
|
`Duplicate configured join for table pair ${JSON.stringify(join.tables)}. Combine conditions in a single Join.on.`,
|
|
@@ -35,10 +34,13 @@ export const prepareShortestJoinPaths = (dboBuilder: DboBuilder): Result => {
|
|
|
35
34
|
}
|
|
36
35
|
});
|
|
37
36
|
}
|
|
37
|
+
|
|
38
38
|
if (!dboBuilder.tablesOrViews) {
|
|
39
39
|
throw new Error("Could not create join config. this.tablesOrViews missing");
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
+
let joinConfig = joinConfigFromOpts;
|
|
43
|
+
|
|
42
44
|
// The initial DBO is needed by tableConfig before its tables/columns exist.
|
|
43
45
|
// Defer only joins that cannot be resolved yet; the final rebuild validates all.
|
|
44
46
|
if (Array.isArray(joinConfig) && dboBuilder.prostgles.preparingTableConfig) {
|
|
@@ -57,6 +59,7 @@ export const prepareShortestJoinPaths = (dboBuilder: DboBuilder): Result => {
|
|
|
57
59
|
}),
|
|
58
60
|
);
|
|
59
61
|
}
|
|
62
|
+
|
|
60
63
|
const inferredJoins = getInferredJoins(dboBuilder.tablesOrViews);
|
|
61
64
|
if (joinConfig === "inferred") {
|
|
62
65
|
joinConfig = inferredJoins;
|
|
@@ -69,7 +72,14 @@ export const prepareShortestJoinPaths = (dboBuilder: DboBuilder): Result => {
|
|
|
69
72
|
JSON.stringify(joinConfig),
|
|
70
73
|
);
|
|
71
74
|
}
|
|
72
|
-
const joins =
|
|
75
|
+
const joins = structuredClone(joinConfig).map((join) => {
|
|
76
|
+
if (join.tables[0] !== join.tables[1]) return join;
|
|
77
|
+
|
|
78
|
+
return {
|
|
79
|
+
...join,
|
|
80
|
+
on: getUniqueJoinConditions([...join.on, ...reverseJoinOn(join.on)]),
|
|
81
|
+
};
|
|
82
|
+
});
|
|
73
83
|
|
|
74
84
|
// Validate joins
|
|
75
85
|
try {
|
|
@@ -136,7 +146,13 @@ export const prepareShortestJoinPaths = (dboBuilder: DboBuilder): Result => {
|
|
|
136
146
|
joinGraph[t2][t1] = 1;
|
|
137
147
|
});
|
|
138
148
|
const tables = Array.from(new Set(joins.flatMap((t) => t.tables)));
|
|
139
|
-
const shortestJoinPaths: JoinPaths =
|
|
149
|
+
const shortestJoinPaths: JoinPaths = joins
|
|
150
|
+
.filter(({ tables: [t1, t2] }) => t1 === t2)
|
|
151
|
+
.map(({ tables: [table] }) => ({
|
|
152
|
+
t1: table,
|
|
153
|
+
t2: table,
|
|
154
|
+
path: [table, table],
|
|
155
|
+
}));
|
|
140
156
|
tables.forEach((t1) => {
|
|
141
157
|
tables.forEach((t2) => {
|
|
142
158
|
/** Prevent recursion */
|
|
@@ -182,18 +198,13 @@ export const prepareShortestJoinPaths = (dboBuilder: DboBuilder): Result => {
|
|
|
182
198
|
const mergeJoins = (inferred: Join[], configured: Join[]): Join[] => {
|
|
183
199
|
const joins = [...inferred];
|
|
184
200
|
configured.forEach((join) => {
|
|
185
|
-
const index = joins.findIndex((existing) =>
|
|
186
|
-
isEqual(existing.tables.toSorted(), join.tables.toSorted()),
|
|
187
|
-
);
|
|
201
|
+
const index = joins.findIndex((existing) => sortedArraysMatch(existing.tables, join.tables));
|
|
188
202
|
const existing = joins[index];
|
|
189
203
|
const previousOn =
|
|
190
204
|
!existing || join.override ? []
|
|
191
205
|
: existing.tables[0] === join.tables[0] ? existing.on
|
|
192
206
|
: reverseJoinOn(existing.on);
|
|
193
|
-
const on = [...previousOn, ...join.on]
|
|
194
|
-
(condition, index, conditions) =>
|
|
195
|
-
conditions.findIndex((candidate) => isEqual(candidate, condition)) === index,
|
|
196
|
-
);
|
|
207
|
+
const on = getUniqueJoinConditions([...previousOn, ...join.on]);
|
|
197
208
|
const merged = { ...join, on };
|
|
198
209
|
if (existing) {
|
|
199
210
|
joins[index] = merged;
|
|
@@ -203,3 +214,9 @@ const mergeJoins = (inferred: Join[], configured: Join[]): Join[] => {
|
|
|
203
214
|
});
|
|
204
215
|
return joins;
|
|
205
216
|
};
|
|
217
|
+
|
|
218
|
+
const getUniqueJoinConditions = (conditions: Join["on"]): Join["on"] =>
|
|
219
|
+
conditions.filter(
|
|
220
|
+
(condition, index) =>
|
|
221
|
+
conditions.findIndex((candidate) => isEqual(candidate, condition)) === index,
|
|
222
|
+
);
|
|
@@ -5,7 +5,6 @@ import type {
|
|
|
5
5
|
MaybePromise,
|
|
6
6
|
StrictUnion,
|
|
7
7
|
} from "prostgles-types";
|
|
8
|
-
import type { JoinInfo } from "../DboBuilder/DboBuilder";
|
|
9
8
|
import type { DB, DBHandlerServer } from "../Prostgles";
|
|
10
9
|
import type { SyncConfig } from "../PublishParser/PublishParser";
|
|
11
10
|
|
|
@@ -154,20 +153,6 @@ type ReferencedColumn = BaseColumnTypes & {
|
|
|
154
153
|
};
|
|
155
154
|
};
|
|
156
155
|
|
|
157
|
-
type JoinDef = {
|
|
158
|
-
sourceTable: string;
|
|
159
|
-
targetTable: string;
|
|
160
|
-
on: JoinInfo["paths"][number]["on"];
|
|
161
|
-
};
|
|
162
|
-
|
|
163
|
-
/**
|
|
164
|
-
* Used in specifying a join path to a table. This column name can then be used in select
|
|
165
|
-
*/
|
|
166
|
-
type NamedJoinColumn = {
|
|
167
|
-
label?: string;
|
|
168
|
-
joinDef: JoinDef[];
|
|
169
|
-
};
|
|
170
|
-
|
|
171
156
|
type Enum<T extends string | number = any> = {
|
|
172
157
|
enum: T[] | readonly T[];
|
|
173
158
|
nullable?: boolean;
|
|
@@ -177,7 +162,6 @@ type Enum<T extends string | number = any> = {
|
|
|
177
162
|
export type ColumnConfig<LANG_IDS = { en: 1 }> =
|
|
178
163
|
| string
|
|
179
164
|
| StrictUnion<
|
|
180
|
-
| NamedJoinColumn
|
|
181
165
|
| MediaColumn
|
|
182
166
|
| (BaseColumn<LANG_IDS> &
|
|
183
167
|
(SQLDefColumn | ReferencedColumn | TextColumn | JSONBColumnDef | Enum))
|
|
@@ -185,7 +169,6 @@ export type ColumnConfig<LANG_IDS = { en: 1 }> =
|
|
|
185
169
|
|
|
186
170
|
export type ColumnConfigs<LANG_IDS = { en: 1 }> = {
|
|
187
171
|
sql: string | (BaseColumn<LANG_IDS> & SQLDefColumn);
|
|
188
|
-
join: BaseColumn<LANG_IDS> & NamedJoinColumn;
|
|
189
172
|
media: BaseColumn<LANG_IDS> & MediaColumn;
|
|
190
173
|
referenced: BaseColumn<LANG_IDS> & ReferencedColumn;
|
|
191
174
|
text: BaseColumn<LANG_IDS> & TextColumn;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { ColumnInfo } from "prostgles-types";
|
|
2
2
|
import { isObject } from "prostgles-types";
|
|
3
|
-
import type { JoinInfo } from "../DboBuilder/DboBuilder";
|
|
4
3
|
import type { DB, DBHandlerServer, Prostgles } from "../Prostgles";
|
|
5
4
|
import {
|
|
6
5
|
DEFAULT_SYNC_BATCH_SIZE,
|
|
@@ -130,31 +129,6 @@ export class TableConfigurator {
|
|
|
130
129
|
}
|
|
131
130
|
};
|
|
132
131
|
|
|
133
|
-
getJoinInfo = (sourceTable: string, targetTable: string): JoinInfo | undefined => {
|
|
134
|
-
const sourceTableConfig = this.config[sourceTable];
|
|
135
|
-
if (sourceTableConfig && "columns" in sourceTableConfig) {
|
|
136
|
-
const targetColConfig = sourceTableConfig.columns?.[targetTable];
|
|
137
|
-
if (targetColConfig) {
|
|
138
|
-
if (isObject(targetColConfig) && "joinDef" in targetColConfig) {
|
|
139
|
-
if (!targetColConfig.joinDef) throw "targetColConfig.joinDef missing";
|
|
140
|
-
const { joinDef } = targetColConfig;
|
|
141
|
-
const res: JoinInfo = {
|
|
142
|
-
expectOne: false,
|
|
143
|
-
paths: joinDef.map(({ sourceTable, targetTable: table, on }) => ({
|
|
144
|
-
source: sourceTable,
|
|
145
|
-
target: targetTable,
|
|
146
|
-
table,
|
|
147
|
-
on,
|
|
148
|
-
})),
|
|
149
|
-
};
|
|
150
|
-
|
|
151
|
-
return res;
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
return undefined;
|
|
156
|
-
};
|
|
157
|
-
|
|
158
132
|
prevInitQueryHistory?: string[];
|
|
159
133
|
initialising = false;
|
|
160
134
|
init = initTableConfig.bind(this);
|
|
@@ -57,10 +57,7 @@ export const getTableColumnQueries = async ({
|
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
-
const columns = getObjectEntries(tableConf.columns)
|
|
61
|
-
/** Exclude NamedJoinColumn */
|
|
62
|
-
return typeof colDef === "string" || !("joinDef" in colDef);
|
|
63
|
-
});
|
|
60
|
+
const columns = getObjectEntries(tableConf.columns);
|
|
64
61
|
|
|
65
62
|
const columnDefinitions: { name: string; def: string }[] = [];
|
|
66
63
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "prostgles-server",
|
|
3
|
-
"version": "4.2.
|
|
3
|
+
"version": "4.2.635",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"pg": "^8.23.0",
|
|
58
58
|
"pg-cursor": "^2.22.0",
|
|
59
59
|
"pg-promise": "^12.7.1",
|
|
60
|
-
"prostgles-types": "^4.0.
|
|
60
|
+
"prostgles-types": "^4.0.292"
|
|
61
61
|
},
|
|
62
62
|
"devDependencies": {
|
|
63
63
|
"@eslint/js": "^9.22.0",
|