prostgles-server 4.0.57 → 4.0.59
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/getColumns.d.ts.map +1 -1
- package/dist/DboBuilder/getColumns.js +1 -13
- package/dist/DboBuilder/getColumns.js.map +1 -1
- package/dist/DboBuilder/runSQL.js +2 -2
- package/dist/DboBuilder/runSQL.js.map +1 -1
- package/dist/Prostgles.d.ts.map +1 -1
- package/dist/PubSubManager/PubSubManager.d.ts +1 -1
- package/dist/PubSubManager/PubSubManager.d.ts.map +1 -1
- package/dist/PubSubManager/PubSubManager.js +14 -1
- package/dist/PubSubManager/PubSubManager.js.map +1 -1
- package/lib/DboBuilder/getColumns.ts +1 -18
- package/lib/DboBuilder/runSQL.ts +2 -2
- package/lib/Prostgles.ts +3 -3
- package/lib/PubSubManager/PubSubManager.ts +14 -1
- package/package.json +2 -2
- package/tests/client/PID.txt +1 -1
- package/tests/client/package.json +2 -2
- package/tests/client/tsconfig.json +2 -1
- package/tests/isomorphic_queries.ts +11 -9
- package/tests/server/DBoGenerated.d.ts +1 -1
- package/tests/server/dboTypeCheck.ts +3 -3
- package/tests/server/index.ts +7 -6
- package/tests/server/package-lock.json +1 -1
- package/tests/server/package.json +3 -3
- package/tests/server/publishTypeCheck.ts +1 -1
- package/tests/server/tsconfig.json +3 -2
- package/tests/test.sh +2 -0
- package/dist/FileManager.d.ts +0 -143
- package/dist/FileManager.d.ts.map +0 -1
- package/dist/FileManager.js +0 -646
- package/dist/FileManager.js.map +0 -1
- package/dist/TableConfig.d.ts +0 -267
- package/dist/TableConfig.d.ts.map +0 -1
- package/dist/TableConfig.js +0 -463
- package/dist/TableConfig.js.map +0 -1
- package/dist/validation.d.ts +0 -126
- package/dist/validation.d.ts.map +0 -1
- package/dist/validation.js +0 -405
- package/dist/validation.js.map +0 -1
- package/lib/AuthHandler.d.ts +0 -187
- package/lib/AuthHandler.d.ts.map +0 -1
- package/lib/AuthHandler.js +0 -478
- package/lib/DBEventsManager.d.ts +0 -38
- package/lib/DBEventsManager.d.ts.map +0 -1
- package/lib/DBEventsManager.js +0 -140
- package/lib/DBSchemaBuilder.d.ts +0 -13
- package/lib/DBSchemaBuilder.d.ts.map +0 -1
- package/lib/DBSchemaBuilder.js +0 -145
- package/lib/DboBuilder/QueryBuilder/Functions.d.ts +0 -64
- package/lib/DboBuilder/QueryBuilder/Functions.d.ts.map +0 -1
- package/lib/DboBuilder/QueryBuilder/Functions.js +0 -984
- package/lib/DboBuilder/QueryBuilder/QueryBuilder.d.ts +0 -73
- package/lib/DboBuilder/QueryBuilder/QueryBuilder.d.ts.map +0 -1
- package/lib/DboBuilder/QueryBuilder/QueryBuilder.js +0 -335
- package/lib/DboBuilder/QueryBuilder/makeSelectQuery.d.ts +0 -8
- package/lib/DboBuilder/QueryBuilder/makeSelectQuery.d.ts.map +0 -1
- package/lib/DboBuilder/QueryBuilder/makeSelectQuery.js +0 -227
- package/lib/DboBuilder/TableHandler.d.ts +0 -37
- package/lib/DboBuilder/TableHandler.d.ts.map +0 -1
- package/lib/DboBuilder/TableHandler.js +0 -213
- package/lib/DboBuilder/ViewHandler.d.ts +0 -119
- package/lib/DboBuilder/ViewHandler.d.ts.map +0 -1
- package/lib/DboBuilder/ViewHandler.js +0 -1023
- package/lib/DboBuilder/delete.d.ts +0 -6
- package/lib/DboBuilder/delete.d.ts.map +0 -1
- package/lib/DboBuilder/delete.js +0 -128
- package/lib/DboBuilder/find.d.ts +0 -8
- package/lib/DboBuilder/find.d.ts.map +0 -1
- package/lib/DboBuilder/find.js +0 -91
- package/lib/DboBuilder/getColumns.d.ts +0 -12
- package/lib/DboBuilder/getColumns.d.ts.map +0 -1
- package/lib/DboBuilder/getColumns.js +0 -92
- package/lib/DboBuilder/getCondition.d.ts +0 -22
- package/lib/DboBuilder/getCondition.d.ts.map +0 -1
- package/lib/DboBuilder/getCondition.js +0 -236
- package/lib/DboBuilder/getSubscribeRelatedTables.d.ts +0 -20
- package/lib/DboBuilder/getSubscribeRelatedTables.d.ts.map +0 -1
- package/lib/DboBuilder/getSubscribeRelatedTables.js +0 -152
- package/lib/DboBuilder/getTablesForSchemaPostgresSQL.d.ts +0 -3
- package/lib/DboBuilder/getTablesForSchemaPostgresSQL.d.ts.map +0 -1
- package/lib/DboBuilder/getTablesForSchemaPostgresSQL.js +0 -207
- package/lib/DboBuilder/insert.d.ts +0 -6
- package/lib/DboBuilder/insert.d.ts.map +0 -1
- package/lib/DboBuilder/insert.js +0 -180
- package/lib/DboBuilder/insertDataParse.d.ts +0 -12
- package/lib/DboBuilder/insertDataParse.d.ts.map +0 -1
- package/lib/DboBuilder/insertDataParse.js +0 -253
- package/lib/DboBuilder/parseUpdateRules.d.ts +0 -18
- package/lib/DboBuilder/parseUpdateRules.d.ts.map +0 -1
- package/lib/DboBuilder/parseUpdateRules.js +0 -123
- package/lib/DboBuilder/runSQL.d.ts +0 -7
- package/lib/DboBuilder/runSQL.d.ts.map +0 -1
- package/lib/DboBuilder/runSQL.js +0 -135
- package/lib/DboBuilder/subscribe.d.ts +0 -20
- package/lib/DboBuilder/subscribe.d.ts.map +0 -1
- package/lib/DboBuilder/subscribe.js +0 -90
- package/lib/DboBuilder/update.d.ts +0 -6
- package/lib/DboBuilder/update.d.ts.map +0 -1
- package/lib/DboBuilder/update.js +0 -151
- package/lib/DboBuilder/uploadFile.d.ts +0 -7
- package/lib/DboBuilder/uploadFile.d.ts.map +0 -1
- package/lib/DboBuilder/uploadFile.js +0 -53
- package/lib/DboBuilder.d.ts +0 -306
- package/lib/DboBuilder.d.ts.map +0 -1
- package/lib/DboBuilder.js +0 -745
- package/lib/Event_Trigger_Tags.d.ts +0 -4
- package/lib/Event_Trigger_Tags.d.ts.map +0 -1
- package/lib/Event_Trigger_Tags.js +0 -116
- package/lib/FileManager/FileManager.d.ts +0 -135
- package/lib/FileManager/FileManager.d.ts.map +0 -1
- package/lib/FileManager/FileManager.js +0 -303
- package/lib/FileManager/initFileManager.d.ts +0 -4
- package/lib/FileManager/initFileManager.d.ts.map +0 -1
- package/lib/FileManager/initFileManager.js +0 -231
- package/lib/FileManager/parseFile.d.ts +0 -15
- package/lib/FileManager/parseFile.d.ts.map +0 -1
- package/lib/FileManager/parseFile.js +0 -58
- package/lib/FileManager/upload.d.ts +0 -6
- package/lib/FileManager/upload.d.ts.map +0 -1
- package/lib/FileManager/upload.js +0 -98
- package/lib/FileManager/uploadStream.d.ts +0 -5
- package/lib/FileManager/uploadStream.d.ts.map +0 -1
- package/lib/FileManager/uploadStream.js +0 -92
- package/lib/Filtering.d.ts +0 -15
- package/lib/Filtering.d.ts.map +0 -1
- package/lib/Filtering.js +0 -336
- package/lib/JSONBValidation/validate_jsonb_schema_sql.d.ts +0 -4
- package/lib/JSONBValidation/validate_jsonb_schema_sql.d.ts.map +0 -1
- package/lib/JSONBValidation/validate_jsonb_schema_sql.js +0 -500
- package/lib/JSONBValidation/validation.d.ts +0 -9
- package/lib/JSONBValidation/validation.d.ts.map +0 -1
- package/lib/JSONBValidation/validation.js +0 -131
- package/lib/PostgresNotifListenManager.d.ts +0 -28
- package/lib/PostgresNotifListenManager.d.ts.map +0 -1
- package/lib/PostgresNotifListenManager.js +0 -134
- package/lib/Prostgles.d.ts +0 -289
- package/lib/Prostgles.d.ts.map +0 -1
- package/lib/Prostgles.js +0 -685
- package/lib/PubSubManager/PubSubManager.d.ts +0 -175
- package/lib/PubSubManager/PubSubManager.d.ts.map +0 -1
- package/lib/PubSubManager/PubSubManager.js +0 -452
- package/lib/PubSubManager/addSub.d.ts +0 -8
- package/lib/PubSubManager/addSub.d.ts.map +0 -1
- package/lib/PubSubManager/addSub.js +0 -166
- package/lib/PubSubManager/addSync.d.ts +0 -8
- package/lib/PubSubManager/addSync.d.ts.map +0 -1
- package/lib/PubSubManager/addSync.js +0 -109
- package/lib/PubSubManager/getInitQuery.d.ts +0 -9
- package/lib/PubSubManager/getInitQuery.d.ts.map +0 -1
- package/lib/PubSubManager/getInitQuery.js +0 -552
- package/lib/PubSubManager/initPubSubManager.d.ts +0 -3
- package/lib/PubSubManager/initPubSubManager.d.ts.map +0 -1
- package/lib/PubSubManager/initPubSubManager.js +0 -116
- package/lib/PubSubManager/notifListener.d.ts +0 -5
- package/lib/PubSubManager/notifListener.d.ts.map +0 -1
- package/lib/PubSubManager/notifListener.js +0 -100
- package/lib/PubSubManager/pushSubData.d.ts +0 -3
- package/lib/PubSubManager/pushSubData.d.ts.map +0 -1
- package/lib/PubSubManager/pushSubData.js +0 -51
- package/lib/PublishParser.d.ts +0 -284
- package/lib/PublishParser.d.ts.map +0 -1
- package/lib/PublishParser.js +0 -421
- package/lib/SchemaWatch.d.ts +0 -13
- package/lib/SchemaWatch.d.ts.map +0 -1
- package/lib/SchemaWatch.js +0 -35
- package/lib/SyncReplication.d.ts +0 -34
- package/lib/SyncReplication.d.ts.map +0 -1
- package/lib/SyncReplication.js +0 -412
- package/lib/TableConfig/TableConfig.d.ts +0 -284
- package/lib/TableConfig/TableConfig.d.ts.map +0 -1
- package/lib/TableConfig/TableConfig.js +0 -437
- package/lib/TableConfig/getColumnDefinitionQuery.d.ts +0 -27
- package/lib/TableConfig/getColumnDefinitionQuery.d.ts.map +0 -1
- package/lib/TableConfig/getColumnDefinitionQuery.js +0 -87
- package/lib/TableConfig/getConstraintDefinitionQueries.d.ts +0 -34
- package/lib/TableConfig/getConstraintDefinitionQueries.d.ts.map +0 -1
- package/lib/TableConfig/getConstraintDefinitionQueries.js +0 -65
- package/lib/TableConfig/getFutureTableSchema.d.ts +0 -15
- package/lib/TableConfig/getFutureTableSchema.d.ts.map +0 -1
- package/lib/TableConfig/getFutureTableSchema.js +0 -43
- package/lib/TableConfig/getTableColumnQueries.d.ts +0 -16
- package/lib/TableConfig/getTableColumnQueries.d.ts.map +0 -1
- package/lib/TableConfig/getTableColumnQueries.js +0 -107
- package/lib/index.d.ts +0 -5
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js +0 -7
- package/lib/shortestPath.d.ts +0 -10
- package/lib/shortestPath.d.ts.map +0 -1
- package/lib/shortestPath.js +0 -111
- package/lib/utils.d.ts +0 -3
- package/lib/utils.d.ts.map +0 -1
- package/lib/utils.js +0 -12
- package/tests/client/index.d.ts +0 -2
- package/tests/client/index.d.ts.map +0 -1
- package/tests/client/index.js +0 -80
- package/tests/client/index.js.map +0 -1
- package/tests/client_only_queries.d.ts +0 -4
- package/tests/client_only_queries.d.ts.map +0 -1
- package/tests/client_only_queries.js +0 -282
- package/tests/config_test/DBoGenerated.d.ts +0 -388
- package/tests/config_test/index.js +0 -174
- package/tests/config_test/index.js.map +0 -1
- package/tests/isomorphic_queries.d.ts +0 -9
- package/tests/isomorphic_queries.d.ts.map +0 -1
- package/tests/isomorphic_queries.js +0 -773
- package/tests/manual_test/DBoGenerated.d.ts +0 -398
- package/tests/manual_test/index.d.ts +0 -2
- package/tests/manual_test/index.d.ts.map +0 -1
- package/tests/manual_test/index.js +0 -65
- package/tests/server/dboTypeCheck.d.ts +0 -2
- package/tests/server/dboTypeCheck.d.ts.map +0 -1
- package/tests/server/dboTypeCheck.js +0 -27
- package/tests/server/index.d.ts +0 -2
- package/tests/server/index.d.ts.map +0 -1
- package/tests/server/index.js +0 -507
- package/tests/server/publishTypeCheck.d.ts +0 -2
- package/tests/server/publishTypeCheck.d.ts.map +0 -1
- package/tests/server/publishTypeCheck.js +0 -130
- package/tests/server_only_queries.d.ts +0 -2
- package/tests/server_only_queries.d.ts.map +0 -1
- package/tests/server_only_queries.js +0 -19
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { Filter, LocalParams, SortItem } from "../../DboBuilder";
|
|
2
|
-
import { TableRule } from "../../PublishParser";
|
|
3
|
-
import { SelectParams, ColumnInfo, PG_COLUMN_UDT_DATA_TYPE, Select, JoinSelect } from "prostgles-types";
|
|
4
|
-
import { TableHandler } from "../TableHandler";
|
|
5
|
-
import { FieldSpec, FunctionSpec } from "./Functions";
|
|
6
|
-
import { ViewHandler } from "../ViewHandler";
|
|
7
|
-
export type SelectItem = {
|
|
8
|
-
type: "column" | "function" | "aggregation" | "joinedColumn" | "computed";
|
|
9
|
-
getFields: (args?: any[]) => string[] | "*";
|
|
10
|
-
getQuery: (tableAlias?: string) => string;
|
|
11
|
-
columnPGDataType?: string;
|
|
12
|
-
column_udt_type?: PG_COLUMN_UDT_DATA_TYPE;
|
|
13
|
-
alias: string;
|
|
14
|
-
selected: boolean;
|
|
15
|
-
};
|
|
16
|
-
export type SelectItemValidated = SelectItem & {
|
|
17
|
-
fields: string[];
|
|
18
|
-
};
|
|
19
|
-
export type NewQuery = {
|
|
20
|
-
/**
|
|
21
|
-
* All fields from the table will be in nested SELECT and GROUP BY to allow order/filter by fields not in select
|
|
22
|
-
*/
|
|
23
|
-
allFields: string[];
|
|
24
|
-
/**
|
|
25
|
-
* Contains user selection and all the allowed columns. Allowed columns not selected are marked with selected: false
|
|
26
|
-
*/
|
|
27
|
-
select: SelectItem[];
|
|
28
|
-
table: string;
|
|
29
|
-
where: string;
|
|
30
|
-
whereOpts: Awaited<ReturnType<ViewHandler["prepareWhere"]>>;
|
|
31
|
-
orderByItems: SortItem[];
|
|
32
|
-
having: string;
|
|
33
|
-
limit: number;
|
|
34
|
-
offset: number;
|
|
35
|
-
isLeftJoin: boolean;
|
|
36
|
-
joins?: NewQuery[];
|
|
37
|
-
tableAlias?: string;
|
|
38
|
-
$path?: string[];
|
|
39
|
-
};
|
|
40
|
-
export declare const asNameAlias: (field: string, tableAlias?: string) => string;
|
|
41
|
-
export declare const parseFunctionObject: (funcData: any) => {
|
|
42
|
-
funcName: string;
|
|
43
|
-
args: any[];
|
|
44
|
-
};
|
|
45
|
-
export declare class SelectItemBuilder {
|
|
46
|
-
select: SelectItemValidated[];
|
|
47
|
-
private allFields;
|
|
48
|
-
private allowedFields;
|
|
49
|
-
private allowedOrderByFields;
|
|
50
|
-
private computedFields;
|
|
51
|
-
private functions;
|
|
52
|
-
private allowedFieldsIncludingComputed;
|
|
53
|
-
private isView;
|
|
54
|
-
private columns;
|
|
55
|
-
constructor(params: {
|
|
56
|
-
allowedFields: string[];
|
|
57
|
-
allowedOrderByFields: string[];
|
|
58
|
-
computedFields: FieldSpec[];
|
|
59
|
-
functions: FunctionSpec[];
|
|
60
|
-
allFields: string[];
|
|
61
|
-
isView: boolean;
|
|
62
|
-
columns: ColumnInfo[];
|
|
63
|
-
});
|
|
64
|
-
private checkField;
|
|
65
|
-
private addItem;
|
|
66
|
-
private addFunction;
|
|
67
|
-
addColumn: (fieldName: string, selected: boolean) => void;
|
|
68
|
-
parseUserSelect: (userSelect: Select, joinParse?: (key: string, val: JoinSelect, throwErr: (msg: string) => any) => any) => Promise<any[]>;
|
|
69
|
-
}
|
|
70
|
-
export declare function getNewQuery(_this: TableHandler, filter: Filter, selectParams: (SelectParams & {
|
|
71
|
-
alias?: string;
|
|
72
|
-
}), param3_unused: any, tableRules: TableRule | undefined, localParams: LocalParams | undefined, columns: ColumnInfo[]): Promise<NewQuery>;
|
|
73
|
-
//# sourceMappingURL=QueryBuilder.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"QueryBuilder.d.ts","sourceRoot":"","sources":["QueryBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,335 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/*---------------------------------------------------------------------------------------------
|
|
3
|
-
* Copyright (c) Stefan L. All rights reserved.
|
|
4
|
-
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
|
5
|
-
*--------------------------------------------------------------------------------------------*/
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.getNewQuery = exports.SelectItemBuilder = exports.parseFunctionObject = exports.asNameAlias = void 0;
|
|
8
|
-
const DboBuilder_1 = require("../../DboBuilder");
|
|
9
|
-
const prostgles_types_1 = require("prostgles-types");
|
|
10
|
-
const utils_1 = require("../../utils");
|
|
11
|
-
const Functions_1 = require("./Functions");
|
|
12
|
-
const asNameAlias = (field, tableAlias) => {
|
|
13
|
-
const result = (0, prostgles_types_1.asName)(field);
|
|
14
|
-
if (tableAlias)
|
|
15
|
-
return (0, prostgles_types_1.asName)(tableAlias) + "." + result;
|
|
16
|
-
return result;
|
|
17
|
-
};
|
|
18
|
-
exports.asNameAlias = asNameAlias;
|
|
19
|
-
const parseFunctionObject = (funcData) => {
|
|
20
|
-
const makeErr = (msg) => `Function not specified correctly. Expecting { $funcName: ["columnName",...] } object but got: ${JSON.stringify(funcData)} \n ${msg}`;
|
|
21
|
-
if (!(0, prostgles_types_1.isObject)(funcData))
|
|
22
|
-
throw makeErr("");
|
|
23
|
-
const keys = (0, prostgles_types_1.getKeys)(funcData);
|
|
24
|
-
if (keys.length !== 1)
|
|
25
|
-
throw makeErr("");
|
|
26
|
-
const funcName = keys[0];
|
|
27
|
-
const args = funcData[funcName];
|
|
28
|
-
if (!args || !Array.isArray(args)) {
|
|
29
|
-
throw makeErr("Arguments missing or invalid");
|
|
30
|
-
}
|
|
31
|
-
return { funcName, args };
|
|
32
|
-
};
|
|
33
|
-
exports.parseFunctionObject = parseFunctionObject;
|
|
34
|
-
class SelectItemBuilder {
|
|
35
|
-
select = [];
|
|
36
|
-
allFields;
|
|
37
|
-
allowedFields;
|
|
38
|
-
allowedOrderByFields;
|
|
39
|
-
computedFields;
|
|
40
|
-
functions;
|
|
41
|
-
allowedFieldsIncludingComputed;
|
|
42
|
-
isView;
|
|
43
|
-
columns;
|
|
44
|
-
constructor(params) {
|
|
45
|
-
this.allFields = params.allFields;
|
|
46
|
-
this.allowedFields = params.allowedFields;
|
|
47
|
-
this.allowedOrderByFields = params.allowedOrderByFields;
|
|
48
|
-
this.computedFields = params.computedFields;
|
|
49
|
-
this.isView = params.isView;
|
|
50
|
-
this.functions = params.functions;
|
|
51
|
-
this.columns = params.columns;
|
|
52
|
-
this.allowedFieldsIncludingComputed = this.allowedFields.concat(this.computedFields ? this.computedFields.map(cf => cf.name) : []);
|
|
53
|
-
if (!this.allowedFields.length) {
|
|
54
|
-
throw "allowedFields empty/missing";
|
|
55
|
-
}
|
|
56
|
-
/* Check for conflicting computed column names */
|
|
57
|
-
const conflictingCol = this.allFields.find(fieldName => this.computedFields.find(cf => cf.name === fieldName));
|
|
58
|
-
if (conflictingCol) {
|
|
59
|
-
throw "INTERNAL ERROR: Cannot have duplicate column names ( " + conflictingCol + " ). One or more computed column names are colliding with table columns ones";
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
checkField = (f, isSelected) => {
|
|
63
|
-
const allowedSelectedFields = this.allowedFieldsIncludingComputed;
|
|
64
|
-
const allowedNonSelectedFields = [...this.allowedFieldsIncludingComputed, ...this.allowedOrderByFields];
|
|
65
|
-
/** Not selected items can be part of the orderBy fields */
|
|
66
|
-
const allowedFields = isSelected ? allowedSelectedFields : allowedNonSelectedFields;
|
|
67
|
-
if (!allowedFields.includes(f)) {
|
|
68
|
-
throw "Field " + f + " is invalid or dissallowed. \nAllowed fields: " + allowedFields.join(", ");
|
|
69
|
-
}
|
|
70
|
-
return f;
|
|
71
|
-
};
|
|
72
|
-
addItem = (item) => {
|
|
73
|
-
let fields = item.getFields();
|
|
74
|
-
// console.trace(fields)
|
|
75
|
-
if (fields === "*")
|
|
76
|
-
fields = this.allowedFields.slice(0);
|
|
77
|
-
fields.map(f => this.checkField(f, item.selected));
|
|
78
|
-
if (this.select.find(s => s.alias === item.alias)) {
|
|
79
|
-
throw `Cannot specify duplicate columns ( ${item.alias} ). Perhaps you're using "*" with column names?`;
|
|
80
|
-
}
|
|
81
|
-
this.select.push({ ...item, fields });
|
|
82
|
-
};
|
|
83
|
-
addFunction = (func, args, alias) => {
|
|
84
|
-
const funcDef = (0, Functions_1.parseFunction)({
|
|
85
|
-
func, args, functions: this.functions,
|
|
86
|
-
allowedFields: this.allowedFieldsIncludingComputed,
|
|
87
|
-
});
|
|
88
|
-
this.addItem({
|
|
89
|
-
type: funcDef.type,
|
|
90
|
-
alias,
|
|
91
|
-
getFields: () => funcDef.getFields(args),
|
|
92
|
-
getQuery: (tableAlias) => funcDef.getQuery({ allColumns: this.columns, allowedFields: this.allowedFields, args, tableAlias,
|
|
93
|
-
ctidField: undefined,
|
|
94
|
-
/* CTID not available in AFTER trigger */
|
|
95
|
-
// ctidField: this.isView? undefined : "ctid"
|
|
96
|
-
}),
|
|
97
|
-
selected: true
|
|
98
|
-
});
|
|
99
|
-
};
|
|
100
|
-
addColumn = (fieldName, selected) => {
|
|
101
|
-
/* Check if computed col */
|
|
102
|
-
if (selected) {
|
|
103
|
-
const compCol = Functions_1.COMPUTED_FIELDS.find(cf => cf.name === fieldName);
|
|
104
|
-
if (compCol && !this.select.find(s => s.alias === fieldName)) {
|
|
105
|
-
const cf = {
|
|
106
|
-
...compCol,
|
|
107
|
-
type: "computed",
|
|
108
|
-
numArgs: 0,
|
|
109
|
-
singleColArg: false,
|
|
110
|
-
getFields: (_args) => []
|
|
111
|
-
};
|
|
112
|
-
this.addFunction(cf, [], compCol.name);
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
const colDef = this.columns.find(c => c.name === fieldName);
|
|
117
|
-
const alias = selected ? fieldName : ("not_selected_" + fieldName);
|
|
118
|
-
this.addItem({
|
|
119
|
-
type: "column",
|
|
120
|
-
columnPGDataType: colDef?.data_type,
|
|
121
|
-
column_udt_type: colDef?.udt_name,
|
|
122
|
-
alias,
|
|
123
|
-
getQuery: () => (0, prostgles_types_1.asName)(fieldName),
|
|
124
|
-
getFields: () => [fieldName],
|
|
125
|
-
selected
|
|
126
|
-
});
|
|
127
|
-
};
|
|
128
|
-
parseUserSelect = async (userSelect, joinParse) => {
|
|
129
|
-
/* [col1, col2, col3] */
|
|
130
|
-
if (Array.isArray(userSelect)) {
|
|
131
|
-
if (userSelect.find(key => typeof key !== "string"))
|
|
132
|
-
throw "Invalid array select. Expecting an array of strings";
|
|
133
|
-
userSelect.map(key => this.addColumn(key, true));
|
|
134
|
-
/* Empty select */
|
|
135
|
-
}
|
|
136
|
-
else if (userSelect === "") {
|
|
137
|
-
return [];
|
|
138
|
-
}
|
|
139
|
-
else if (userSelect === "*") {
|
|
140
|
-
this.allowedFields.map(key => this.addColumn(key, true));
|
|
141
|
-
}
|
|
142
|
-
else if ((0, DboBuilder_1.isPlainObject)(userSelect) && !(0, prostgles_types_1.isEmpty)(userSelect)) {
|
|
143
|
-
const selectKeys = Object.keys(userSelect), selectValues = Object.values(userSelect);
|
|
144
|
-
/* Cannot include and exclude at the same time */
|
|
145
|
-
if (selectValues.filter(v => [0, false].includes(v)).length) {
|
|
146
|
-
if (selectValues.filter(v => ![0, false].includes(v)).length) {
|
|
147
|
-
throw "\nCannot include and exclude fields at the same time";
|
|
148
|
-
}
|
|
149
|
-
/* Exclude only */
|
|
150
|
-
this.allowedFields.filter(f => !selectKeys.includes(f)).map(key => this.addColumn(key, true));
|
|
151
|
-
}
|
|
152
|
-
else {
|
|
153
|
-
await Promise.all(selectKeys.map(async (key) => {
|
|
154
|
-
const val = userSelect[key], throwErr = (extraErr = "") => {
|
|
155
|
-
console.trace(extraErr);
|
|
156
|
-
throw "Unexpected select -> " + JSON.stringify({ [key]: val }) + "\n" + extraErr;
|
|
157
|
-
};
|
|
158
|
-
/* Included fields */
|
|
159
|
-
if ([1, true].includes(val)) {
|
|
160
|
-
if (key === "*") {
|
|
161
|
-
this.allowedFields.map(key => this.addColumn(key, true));
|
|
162
|
-
}
|
|
163
|
-
else {
|
|
164
|
-
this.addColumn(key, true);
|
|
165
|
-
}
|
|
166
|
-
/* Aggs and functions */
|
|
167
|
-
}
|
|
168
|
-
else if (typeof val === "string" || (0, prostgles_types_1.isObject)(val)) {
|
|
169
|
-
/* Function shorthand notation
|
|
170
|
-
{ id: "$max" } === { id: { $max: ["id"] } } === SELECT MAX(id) AS id
|
|
171
|
-
*/
|
|
172
|
-
if ((typeof val === "string" && val !== "*") ||
|
|
173
|
-
(0, DboBuilder_1.isPlainObject)(val) && Object.keys(val).length === 1 && Array.isArray(Object.values(val)[0]) // !isPlainObject(Object.values(val)[0])
|
|
174
|
-
) {
|
|
175
|
-
// if(!Array.isArray(Object.values(val)[0])){
|
|
176
|
-
// throw `Could not parse selected item: ${JSON.stringify(val)}\nFunction arguments must be in an array`;
|
|
177
|
-
// }
|
|
178
|
-
let funcName, args;
|
|
179
|
-
if (typeof val === "string") {
|
|
180
|
-
/* Shorthand notation -> it is expected that the key is the column name used as the only argument */
|
|
181
|
-
try {
|
|
182
|
-
this.checkField(key, true);
|
|
183
|
-
}
|
|
184
|
-
catch (err) {
|
|
185
|
-
throwErr(` Shorthand function notation error: the specifield column ( ${key} ) is invalid or dissallowed. \n Use correct column name or full aliased function notation, e.g.: -> { alias: { $func_name: ["column_name"] } } `);
|
|
186
|
-
}
|
|
187
|
-
funcName = val;
|
|
188
|
-
args = [key];
|
|
189
|
-
/** Function full notation { $funcName: ["colName", ...args] } */
|
|
190
|
-
}
|
|
191
|
-
else {
|
|
192
|
-
({ funcName, args } = (0, exports.parseFunctionObject)(val));
|
|
193
|
-
}
|
|
194
|
-
this.addFunction(funcName, args, key);
|
|
195
|
-
/* Join */
|
|
196
|
-
}
|
|
197
|
-
else {
|
|
198
|
-
if (!joinParse) {
|
|
199
|
-
throw "Joins dissalowed";
|
|
200
|
-
}
|
|
201
|
-
await joinParse(key, val, throwErr);
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
else
|
|
205
|
-
throwErr();
|
|
206
|
-
}));
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
else
|
|
210
|
-
throw "Unexpected select -> " + JSON.stringify(userSelect);
|
|
211
|
-
};
|
|
212
|
-
}
|
|
213
|
-
exports.SelectItemBuilder = SelectItemBuilder;
|
|
214
|
-
async function getNewQuery(_this, filter, selectParams = {}, param3_unused = null, tableRules, localParams, columns) {
|
|
215
|
-
if (localParams?.isRemoteRequest && !tableRules?.select?.fields) {
|
|
216
|
-
throw `INTERNAL ERROR: publish.${_this.name}.select.fields rule missing`;
|
|
217
|
-
}
|
|
218
|
-
const allowedOrderByFields = !tableRules ? _this.column_names.slice(0) : _this.parseFieldFilter(tableRules?.select?.orderByFields ?? tableRules?.select?.fields);
|
|
219
|
-
const allowedSelectFields = !tableRules ? _this.column_names.slice(0) : _this.parseFieldFilter(tableRules?.select?.fields);
|
|
220
|
-
const joinQueries = [];
|
|
221
|
-
const { select: userSelect = "*" } = selectParams, sBuilder = new SelectItemBuilder({
|
|
222
|
-
allowedFields: allowedSelectFields,
|
|
223
|
-
allowedOrderByFields,
|
|
224
|
-
computedFields: Functions_1.COMPUTED_FIELDS,
|
|
225
|
-
isView: _this.is_view,
|
|
226
|
-
functions: Functions_1.FUNCTIONS,
|
|
227
|
-
allFields: _this.column_names.slice(0),
|
|
228
|
-
columns
|
|
229
|
-
});
|
|
230
|
-
await sBuilder.parseUserSelect(userSelect, async (key, val, throwErr) => {
|
|
231
|
-
const j_selectParams = {};
|
|
232
|
-
let j_filter = {}, j_isLeftJoin = true, j_path, j_alias, j_tableRules, j_table;
|
|
233
|
-
if (val === "*") {
|
|
234
|
-
j_selectParams.select = "*";
|
|
235
|
-
j_alias = key;
|
|
236
|
-
j_table = key;
|
|
237
|
-
}
|
|
238
|
-
else {
|
|
239
|
-
/* Full option join { field_name: db.innerJoin.table_name(filter, select) } */
|
|
240
|
-
const JOIN_KEYS = ["$innerJoin", "$leftJoin"];
|
|
241
|
-
const JOIN_PARAMS = ["select", "filter", "$path", "$condition", "offset", "limit", "orderBy"];
|
|
242
|
-
const joinKeys = Object.keys(val).filter(k => JOIN_KEYS.includes(k));
|
|
243
|
-
if (joinKeys.length > 1) {
|
|
244
|
-
throwErr("\nCannot specify more than one join type ( $innerJoin OR $leftJoin )");
|
|
245
|
-
}
|
|
246
|
-
else if (joinKeys.length === 1) {
|
|
247
|
-
const invalidParams = Object.keys(val).filter(k => ![...JOIN_PARAMS, ...JOIN_KEYS].includes(k));
|
|
248
|
-
if (invalidParams.length) {
|
|
249
|
-
throw "Invalid join params: " + invalidParams.join(", ");
|
|
250
|
-
}
|
|
251
|
-
j_isLeftJoin = joinKeys[0] === "$leftJoin";
|
|
252
|
-
j_table = val[joinKeys[0]];
|
|
253
|
-
j_alias = key;
|
|
254
|
-
if (typeof j_table !== "string") {
|
|
255
|
-
throw "\nIssue with select. \nJoin type must be a string table name but got -> " + JSON.stringify({ [key]: val });
|
|
256
|
-
}
|
|
257
|
-
j_selectParams.select = val.select || "*";
|
|
258
|
-
j_filter = val.filter || {};
|
|
259
|
-
j_selectParams.limit = val.limit;
|
|
260
|
-
j_selectParams.offset = val.offset;
|
|
261
|
-
j_selectParams.orderBy = val.orderBy;
|
|
262
|
-
j_path = val.$path;
|
|
263
|
-
}
|
|
264
|
-
else {
|
|
265
|
-
j_selectParams.select = val;
|
|
266
|
-
j_alias = key;
|
|
267
|
-
j_table = key;
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
if (!j_table) {
|
|
271
|
-
throw "j_table missing";
|
|
272
|
-
}
|
|
273
|
-
const _thisJoinedTable = _this.dboBuilder.dbo[j_table];
|
|
274
|
-
if (!_thisJoinedTable) {
|
|
275
|
-
throw `Joined table ${JSON.stringify(j_table)} is disallowed or inexistent \nOr you've forgot to put the function arguments into an array`;
|
|
276
|
-
}
|
|
277
|
-
let isLocal = true;
|
|
278
|
-
if (localParams && (localParams.socket || localParams.httpReq)) {
|
|
279
|
-
isLocal = false;
|
|
280
|
-
j_tableRules = await _this.dboBuilder.publishParser?.getValidatedRequestRuleWusr({ tableName: j_table, command: "find", localParams });
|
|
281
|
-
}
|
|
282
|
-
if (isLocal || j_tableRules) {
|
|
283
|
-
const joinQuery = await getNewQuery(_thisJoinedTable, j_filter, { ...j_selectParams, alias: j_alias }, param3_unused, j_tableRules, localParams, columns);
|
|
284
|
-
joinQuery.isLeftJoin = j_isLeftJoin;
|
|
285
|
-
joinQuery.tableAlias = j_alias;
|
|
286
|
-
joinQuery.$path = j_path;
|
|
287
|
-
joinQueries.push(joinQuery);
|
|
288
|
-
// console.log(joinQuery)
|
|
289
|
-
}
|
|
290
|
-
});
|
|
291
|
-
/**
|
|
292
|
-
* Add non selected columns
|
|
293
|
-
* This ensures all fields are available for orderBy in case of nested select
|
|
294
|
-
* */
|
|
295
|
-
Array.from(new Set([...allowedSelectFields, ...allowedOrderByFields])).map(key => {
|
|
296
|
-
if (!sBuilder.select.find(s => s.alias === key && s.type === "column")) {
|
|
297
|
-
sBuilder.addColumn(key, false);
|
|
298
|
-
}
|
|
299
|
-
});
|
|
300
|
-
const select = sBuilder.select;
|
|
301
|
-
// const validatedAggAliases = select
|
|
302
|
-
// .filter(s => s.type !== "joinedColumn")
|
|
303
|
-
// .map(s => s.alias);
|
|
304
|
-
const filterOpts = await _this.prepareWhere({
|
|
305
|
-
filter,
|
|
306
|
-
select,
|
|
307
|
-
forcedFilter: (0, utils_1.get)(tableRules, "select.forcedFilter"),
|
|
308
|
-
filterFields: (0, utils_1.get)(tableRules, "select.filterFields"),
|
|
309
|
-
tableAlias: selectParams.alias,
|
|
310
|
-
localParams,
|
|
311
|
-
tableRule: tableRules
|
|
312
|
-
});
|
|
313
|
-
const where = filterOpts.where;
|
|
314
|
-
const p = _this.getValidatedRules(tableRules, localParams);
|
|
315
|
-
const resQuery = {
|
|
316
|
-
/** Why was this the case? */
|
|
317
|
-
// allFields: allowedSelectFields,
|
|
318
|
-
allFields: _this.column_names.slice(0),
|
|
319
|
-
select,
|
|
320
|
-
table: _this.name,
|
|
321
|
-
joins: joinQueries,
|
|
322
|
-
where,
|
|
323
|
-
whereOpts: filterOpts,
|
|
324
|
-
having: "",
|
|
325
|
-
isLeftJoin: false,
|
|
326
|
-
// having: cond.having,
|
|
327
|
-
limit: _this.prepareLimitQuery(selectParams.limit, p),
|
|
328
|
-
orderByItems: _this.prepareSortItems(selectParams.orderBy, allowedOrderByFields, selectParams.alias, select),
|
|
329
|
-
offset: _this.prepareOffsetQuery(selectParams.offset)
|
|
330
|
-
};
|
|
331
|
-
// console.log(resQuery);
|
|
332
|
-
// console.log(buildJoinQuery(_this, resQuery));
|
|
333
|
-
return resQuery;
|
|
334
|
-
}
|
|
335
|
-
exports.getNewQuery = getNewQuery;
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { SelectParams } from "prostgles-types";
|
|
2
|
-
import { NewQuery } from "./QueryBuilder";
|
|
3
|
-
import { TableHandler } from "../TableHandler";
|
|
4
|
-
/**
|
|
5
|
-
* Creating the text query from the NewQuery spec
|
|
6
|
-
* No validation/authorisation at this point */
|
|
7
|
-
export declare function makeSelectQuery(_this: TableHandler, q: NewQuery, depth?: number, joinFields?: string[], selectParams?: SelectParams): string;
|
|
8
|
-
//# sourceMappingURL=makeSelectQuery.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"makeSelectQuery.d.ts","sourceRoot":"","sources":["makeSelectQuery.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAU,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAc,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C;;+CAE+C;AAC/C,wBAAgB,eAAe,CAC7B,KAAK,EAAE,YAAY,EACnB,CAAC,EAAE,QAAQ,EACX,KAAK,SAAI,EACT,UAAU,GAAE,MAAM,EAAO,EACzB,YAAY,GAAE,YAAiB,GAC9B,MAAM,CA2RR"}
|
|
@@ -1,227 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.makeSelectQuery = void 0;
|
|
4
|
-
const DboBuilder_1 = require("../../DboBuilder");
|
|
5
|
-
const prostgles_types_1 = require("prostgles-types");
|
|
6
|
-
/**
|
|
7
|
-
* Creating the text query from the NewQuery spec
|
|
8
|
-
* No validation/authorisation at this point */
|
|
9
|
-
function makeSelectQuery(_this, q, depth = 0, joinFields = [], selectParams = {}) {
|
|
10
|
-
const PREF = `prostgles`, joins = q.joins || [],
|
|
11
|
-
// aggs = q.aggs || [],
|
|
12
|
-
getTableAlias = (q) => !q.tableAlias ? q.table : `${q.tableAlias || ""}_${q.table}`, getTableJoinAliasAsName = (joinAlias, table) => (0, prostgles_types_1.asName)(!joinAlias ? table : `${joinAlias || ""}_${table}`), getTableAliasAsName = (q) => (0, prostgles_types_1.asName)(getTableAlias(q));
|
|
13
|
-
const indentLine = (numberOfSpaces, str, indentStr = " ") => new Array(numberOfSpaces).fill(indentStr).join("") + str;
|
|
14
|
-
const indentArray = (numberOfSpaces, strArr, indentStr = " ") => strArr.map(str => indentLine(numberOfSpaces, str, indentStr));
|
|
15
|
-
const indentArrayAndJoin = (numberOfSpaces, strArr, separator = " \n ", indentStr = " ") => indentArray(numberOfSpaces, strArr, indentStr).join(separator);
|
|
16
|
-
const appendCommas = (strArr) => strArr.map((s, i, arr) => s + (i < arr.length - 1 ? " , " : " "));
|
|
17
|
-
const createAlias = (q, str) => (0, prostgles_types_1.asName)(`${q.tableAlias || q.table}_${PREF}_${str}`);
|
|
18
|
-
// const indent = (a, b) => a;
|
|
19
|
-
const joinTables = (q1, q2) => {
|
|
20
|
-
const joinInfo = _this.getJoins(q1.table, q2.table, q2.$path, true);
|
|
21
|
-
const paths = joinInfo.paths;
|
|
22
|
-
let rowidSortedColName = "";
|
|
23
|
-
let rowidDupesColName = "";
|
|
24
|
-
let jsonColName = "";
|
|
25
|
-
let t2Alias = "";
|
|
26
|
-
let limitColName = "";
|
|
27
|
-
const t1Alias = q.table;
|
|
28
|
-
const queries = paths.flatMap(({ table, on }, i) => {
|
|
29
|
-
const getColName = (col, q) => {
|
|
30
|
-
if (table === q.table) {
|
|
31
|
-
const colFromSelect = q.select.find(s => s.getQuery() === (0, prostgles_types_1.asName)(col));
|
|
32
|
-
if (!colFromSelect) {
|
|
33
|
-
console.error(`${col} column might be missing in user publish `);
|
|
34
|
-
throw `Could not find join column (${col}) in allowe select. Some join tables and columns might be invalid/dissallowed`;
|
|
35
|
-
}
|
|
36
|
-
return colFromSelect.alias;
|
|
37
|
-
}
|
|
38
|
-
return col;
|
|
39
|
-
};
|
|
40
|
-
const getPrevColName = (col) => {
|
|
41
|
-
return getColName(col, q1);
|
|
42
|
-
};
|
|
43
|
-
const getThisColName = (col) => {
|
|
44
|
-
return getColName(col, q2);
|
|
45
|
-
};
|
|
46
|
-
// console.log(JSON.stringify({i, table, on, q1, q2}, null, 2));
|
|
47
|
-
const prevTable = i === 0 ? t1Alias : (paths[i - 1].table);
|
|
48
|
-
const thisAlias = getTableJoinAliasAsName(q2.tableAlias, table);
|
|
49
|
-
const prevAlias = i === 0 ? getTableAliasAsName(q1) : getTableJoinAliasAsName(q2.tableAlias, prevTable);
|
|
50
|
-
/* If root then prev table is aliased from root query. Alias from join otherwise */
|
|
51
|
-
let iQ = [
|
|
52
|
-
(0, prostgles_types_1.asName)(table) + ` ${thisAlias}`
|
|
53
|
-
];
|
|
54
|
-
/* If target table then add filters, options, etc */
|
|
55
|
-
if (i === paths.length - 1) {
|
|
56
|
-
const targetSelect = q2.select.filter(s => s.selected).map(s => {
|
|
57
|
-
/* Rename aggs to avoid collision with join cols */
|
|
58
|
-
if (s.type === "aggregation")
|
|
59
|
-
return (0, prostgles_types_1.asName)(`agg_${s.alias}`) + " AS " + (0, prostgles_types_1.asName)(s.alias);
|
|
60
|
-
return (0, prostgles_types_1.asName)(s.alias);
|
|
61
|
-
}).concat(q2.joins?.map(j => (0, prostgles_types_1.asName)(j.table)) ?? []).join(", ");
|
|
62
|
-
const leafSelect = makeSelectQuery(_this, q2, depth + 1, on.flatMap(cond => cond.map(([c1, c2]) => (0, prostgles_types_1.asName)(c2))), selectParams).split("\n");
|
|
63
|
-
t2Alias = thisAlias;
|
|
64
|
-
rowidSortedColName = createAlias(q2, `rowid_sorted`);
|
|
65
|
-
rowidDupesColName = createAlias(q2, `dupes_rowid`);
|
|
66
|
-
limitColName = createAlias(q2, `limit`);
|
|
67
|
-
jsonColName = createAlias(q2, `json`);
|
|
68
|
-
iQ = [
|
|
69
|
-
"(",
|
|
70
|
-
...indentArray(depth + 1, [
|
|
71
|
-
`-- 4. [target table] `,
|
|
72
|
-
`SELECT *,`,
|
|
73
|
-
`row_number() over() as ${rowidSortedColName},`,
|
|
74
|
-
`row_to_json((select x from (SELECT ${targetSelect}) as x)) AS ${jsonColName}`,
|
|
75
|
-
`FROM (`,
|
|
76
|
-
...indentArray(depth + 2, leafSelect),
|
|
77
|
-
`) ${(0, prostgles_types_1.asName)(q2.table)} `
|
|
78
|
-
]),
|
|
79
|
-
`) ${thisAlias}`
|
|
80
|
-
];
|
|
81
|
-
}
|
|
82
|
-
const getJoinCondition = (t1Alias, t2Alias, on) => {
|
|
83
|
-
return on.map(cond => cond.map(([c1, c2]) => `${t1Alias}.${(0, prostgles_types_1.asName)(getPrevColName(c1))} = ${t2Alias}.${(0, prostgles_types_1.asName)(getThisColName(c2))} `).join(" AND ")).join(" OR ");
|
|
84
|
-
};
|
|
85
|
-
const query = [
|
|
86
|
-
`${q2.isLeftJoin ? "LEFT" : "INNER"} JOIN `,
|
|
87
|
-
...iQ,
|
|
88
|
-
`ON ${getJoinCondition(prevAlias, thisAlias, on)}`
|
|
89
|
-
];
|
|
90
|
-
return { query, prevTable, thisAlias };
|
|
91
|
-
});
|
|
92
|
-
return { q: q2, query: queries.flatMap(q => q.query), t1Alias: q.table, t2Alias, rowidSortedColName: rowidSortedColName, jsonColName, rowidDupesColName, limitColName };
|
|
93
|
-
};
|
|
94
|
-
const getGroupBy = (rootSelectItems, groupByItems) => {
|
|
95
|
-
if (groupByItems.length) {
|
|
96
|
-
/** Root Select column index number is used where possible to prevent "non-integer constant in GROUP BY" error */
|
|
97
|
-
return `GROUP BY ` + groupByItems.map(gi => {
|
|
98
|
-
const idx = rootSelectItems.findIndex(si => si.alias === gi.alias);
|
|
99
|
-
if (idx < 0)
|
|
100
|
-
throw `Could not find GROUP BY column ${gi.alias} in ROOT SELECT ${rootSelectItems.map(s => s.alias)}`;
|
|
101
|
-
return idx + 1;
|
|
102
|
-
}).join(", ");
|
|
103
|
-
}
|
|
104
|
-
return "";
|
|
105
|
-
};
|
|
106
|
-
/* Leaf query with no joins -> return simple query */
|
|
107
|
-
const aggs = q.select.filter(s => s.type === "aggregation");
|
|
108
|
-
const nonAggs = q.select.filter(s => depth || s.selected).filter(s => s.type !== "aggregation");
|
|
109
|
-
if (!joins.length) {
|
|
110
|
-
/* Nested queries contain all fields to allow joining */
|
|
111
|
-
let groupBy = "";
|
|
112
|
-
const rootSelectItems = q.select.filter(s => joinFields.includes(s.getQuery()) || s.selected);
|
|
113
|
-
/* If aggs exist need to set groupBy add joinFields into select */
|
|
114
|
-
if (aggs.length || selectParams?.groupBy) {
|
|
115
|
-
if (nonAggs.length) {
|
|
116
|
-
const groupByFields = nonAggs.filter(sf => !depth || joinFields.includes(sf.getQuery()));
|
|
117
|
-
groupBy = getGroupBy(rootSelectItems, groupByFields);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
const simpleQuery = indentArrayAndJoin(depth, [
|
|
121
|
-
`-- 0. or 5. [leaf query] `
|
|
122
|
-
/* Group by selected fields + any join fields */
|
|
123
|
-
,
|
|
124
|
-
`SELECT ` + rootSelectItems.map(s => {
|
|
125
|
-
// return s.getQuery() + ((s.type !== "column")? (" AS " + s.alias) : "")
|
|
126
|
-
if (s.type === "aggregation") {
|
|
127
|
-
/* Rename aggs to avoid collision with join cols */
|
|
128
|
-
return s.getQuery() + " AS " + (0, prostgles_types_1.asName)((depth ? "agg_" : "") + s.alias);
|
|
129
|
-
}
|
|
130
|
-
return s.getQuery() + " AS " + (0, prostgles_types_1.asName)(s.alias);
|
|
131
|
-
}).join(", "),
|
|
132
|
-
`FROM ${(0, prostgles_types_1.asName)(q.table)} `,
|
|
133
|
-
q.where,
|
|
134
|
-
groupBy //!aggs.length? "" : `GROUP BY ${nonAggs.map(sf => asName(sf.alias)).join(", ")}`,
|
|
135
|
-
,
|
|
136
|
-
q.having ? `HAVING ${q.having}` : "",
|
|
137
|
-
(0, DboBuilder_1.prepareSort)(q.orderByItems),
|
|
138
|
-
!depth ? `LIMIT ${q.limit} ` : null,
|
|
139
|
-
!depth ? `OFFSET ${q.offset || 0} ` : null
|
|
140
|
-
].filter(v => v && (v + "").trim().length));
|
|
141
|
-
// console.log(fres);
|
|
142
|
-
return simpleQuery;
|
|
143
|
-
}
|
|
144
|
-
else {
|
|
145
|
-
// if(q.aggs && q.aggs && q.aggs.length) throw "Cannot join an aggregate";
|
|
146
|
-
if (q.select.find(s => s.type === "aggregation") &&
|
|
147
|
-
joins.find(j => j.select.find(s => s.type === "aggregation")))
|
|
148
|
-
throw "Cannot join two aggregates";
|
|
149
|
-
}
|
|
150
|
-
if (joins && joins.length && (aggs.length || selectParams.groupBy))
|
|
151
|
-
throw "Joins within Aggs dissallowed";
|
|
152
|
-
// if(q.selectFuncs.length) throw "Functions within select not allowed in joins yet. -> " + q.selectFuncs.map(s => s.alias).join(", ");
|
|
153
|
-
const rootSelectItems = q.select.filter(s => depth || s.selected);
|
|
154
|
-
let rootGroupBy;
|
|
155
|
-
if ((selectParams.groupBy || aggs.length || q.joins && q.joins.length) && nonAggs.length) {
|
|
156
|
-
const groupByItems = (depth ?
|
|
157
|
-
q.allFields.map(f => (0, prostgles_types_1.asName)(f)) :
|
|
158
|
-
nonAggs.map(s => s.type === "function" ? s.getQuery() : (0, prostgles_types_1.asName)(s.alias))).concat((aggs?.length) ?
|
|
159
|
-
[] :
|
|
160
|
-
[`ctid`]).filter(s => s);
|
|
161
|
-
/** Add ORDER BY items not included in root select */
|
|
162
|
-
q.orderByItems.forEach(sortItem => {
|
|
163
|
-
if ("fieldQuery" in sortItem && !groupByItems.includes(sortItem.fieldQuery)) {
|
|
164
|
-
groupByItems.push(sortItem.fieldQuery);
|
|
165
|
-
}
|
|
166
|
-
});
|
|
167
|
-
rootGroupBy = `GROUP BY ${groupByItems.join(", ")} `;
|
|
168
|
-
}
|
|
169
|
-
const parsedJoins = joins.map(j => joinTables(q, j));
|
|
170
|
-
/* Joined query */
|
|
171
|
-
const joinedQuery = [
|
|
172
|
-
" \n",
|
|
173
|
-
`-- 0. [joined root] `,
|
|
174
|
-
"SELECT ",
|
|
175
|
-
...appendCommas(rootSelectItems.map(s => s.getQuery() + " AS " + (0, prostgles_types_1.asName)(s.alias)).concat(parsedJoins.map((j, i) => {
|
|
176
|
-
/** Apply LIMIT to joined items */
|
|
177
|
-
const jsq = `json_agg(${j.jsonColName}::jsonb ORDER BY ${j.rowidSortedColName}) FILTER (WHERE ${j.limitColName} <= ${j.q.limit} AND ${j.rowidDupesColName} = 1 AND ${j.jsonColName} IS NOT NULL)`;
|
|
178
|
-
const resAlias = (0, prostgles_types_1.asName)(j.q.tableAlias || j.q.table);
|
|
179
|
-
/* If limit = 1 then return a single json object (first one) */
|
|
180
|
-
return (j.q.limit === 1 ? `${jsq}->0 ` : `COALESCE(${jsq}, '[]') `) + ` AS ${resAlias}`;
|
|
181
|
-
}))),
|
|
182
|
-
`FROM ( `,
|
|
183
|
-
...indentArray(depth + 1, [
|
|
184
|
-
"-- 1. [subquery limit + dupes] ",
|
|
185
|
-
"SELECT ",
|
|
186
|
-
...appendCommas([`t1.*`].concat(parsedJoins.map((j, i) => {
|
|
187
|
-
return `row_number() over(partition by ${j.rowidDupesColName}, ` +
|
|
188
|
-
`ctid order by ${j.rowidDupesColName}) AS ${j.limitColName} `;
|
|
189
|
-
}))),
|
|
190
|
-
`FROM ( ----------- ${getTableAliasAsName(q)}`,
|
|
191
|
-
...indentArray(depth + 1, [
|
|
192
|
-
"-- 2. [source full select + ctid to group by] ",
|
|
193
|
-
"SELECT ",
|
|
194
|
-
...appendCommas(q.allFields.concat(["ctid"])
|
|
195
|
-
.map(field => `${getTableAliasAsName(q)}.${(0, prostgles_types_1.asName)(field)} `)
|
|
196
|
-
.concat(parsedJoins.map((j, i) => j.t2Alias + "." + j.jsonColName + ", " +
|
|
197
|
-
j.t2Alias + "." + j.rowidSortedColName + ", " +
|
|
198
|
-
`row_number() over(partition by ` +
|
|
199
|
-
`${j.t2Alias}.${j.rowidSortedColName}, ` +
|
|
200
|
-
`${getTableAliasAsName(q)}.ctid ) AS ${j.rowidDupesColName}`))),
|
|
201
|
-
`FROM ( `,
|
|
202
|
-
...indentArray(depth + 1, [
|
|
203
|
-
"-- 3. [source table] ",
|
|
204
|
-
"SELECT ",
|
|
205
|
-
"*, row_number() over() as ctid ",
|
|
206
|
-
`FROM ${(0, prostgles_types_1.asName)(q.table)} `,
|
|
207
|
-
`${q.where} `
|
|
208
|
-
]),
|
|
209
|
-
`) ${getTableAliasAsName(q)} `,
|
|
210
|
-
...joins.flatMap((j, i) => joinTables(q, j).query)
|
|
211
|
-
]),
|
|
212
|
-
") t1"
|
|
213
|
-
]),
|
|
214
|
-
") t0",
|
|
215
|
-
rootGroupBy,
|
|
216
|
-
q.having ? `HAVING ${q.having} ` : "",
|
|
217
|
-
(0, DboBuilder_1.prepareSort)(q.orderByItems),
|
|
218
|
-
depth ? null : `LIMIT ${q.limit || 0} OFFSET ${q.offset || 0}`,
|
|
219
|
-
"-- EOF 0. joined root",
|
|
220
|
-
" \n"
|
|
221
|
-
].filter(v => v);
|
|
222
|
-
const res = indentArrayAndJoin(depth, joinedQuery);
|
|
223
|
-
// res = indent(res, depth);
|
|
224
|
-
// console.log(res);
|
|
225
|
-
return res;
|
|
226
|
-
}
|
|
227
|
-
exports.makeSelectQuery = makeSelectQuery;
|