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.
Files changed (221) hide show
  1. package/dist/DboBuilder/getColumns.d.ts.map +1 -1
  2. package/dist/DboBuilder/getColumns.js +1 -13
  3. package/dist/DboBuilder/getColumns.js.map +1 -1
  4. package/dist/DboBuilder/runSQL.js +2 -2
  5. package/dist/DboBuilder/runSQL.js.map +1 -1
  6. package/dist/Prostgles.d.ts.map +1 -1
  7. package/dist/PubSubManager/PubSubManager.d.ts +1 -1
  8. package/dist/PubSubManager/PubSubManager.d.ts.map +1 -1
  9. package/dist/PubSubManager/PubSubManager.js +14 -1
  10. package/dist/PubSubManager/PubSubManager.js.map +1 -1
  11. package/lib/DboBuilder/getColumns.ts +1 -18
  12. package/lib/DboBuilder/runSQL.ts +2 -2
  13. package/lib/Prostgles.ts +3 -3
  14. package/lib/PubSubManager/PubSubManager.ts +14 -1
  15. package/package.json +2 -2
  16. package/tests/client/PID.txt +1 -1
  17. package/tests/client/package.json +2 -2
  18. package/tests/client/tsconfig.json +2 -1
  19. package/tests/isomorphic_queries.ts +11 -9
  20. package/tests/server/DBoGenerated.d.ts +1 -1
  21. package/tests/server/dboTypeCheck.ts +3 -3
  22. package/tests/server/index.ts +7 -6
  23. package/tests/server/package-lock.json +1 -1
  24. package/tests/server/package.json +3 -3
  25. package/tests/server/publishTypeCheck.ts +1 -1
  26. package/tests/server/tsconfig.json +3 -2
  27. package/tests/test.sh +2 -0
  28. package/dist/FileManager.d.ts +0 -143
  29. package/dist/FileManager.d.ts.map +0 -1
  30. package/dist/FileManager.js +0 -646
  31. package/dist/FileManager.js.map +0 -1
  32. package/dist/TableConfig.d.ts +0 -267
  33. package/dist/TableConfig.d.ts.map +0 -1
  34. package/dist/TableConfig.js +0 -463
  35. package/dist/TableConfig.js.map +0 -1
  36. package/dist/validation.d.ts +0 -126
  37. package/dist/validation.d.ts.map +0 -1
  38. package/dist/validation.js +0 -405
  39. package/dist/validation.js.map +0 -1
  40. package/lib/AuthHandler.d.ts +0 -187
  41. package/lib/AuthHandler.d.ts.map +0 -1
  42. package/lib/AuthHandler.js +0 -478
  43. package/lib/DBEventsManager.d.ts +0 -38
  44. package/lib/DBEventsManager.d.ts.map +0 -1
  45. package/lib/DBEventsManager.js +0 -140
  46. package/lib/DBSchemaBuilder.d.ts +0 -13
  47. package/lib/DBSchemaBuilder.d.ts.map +0 -1
  48. package/lib/DBSchemaBuilder.js +0 -145
  49. package/lib/DboBuilder/QueryBuilder/Functions.d.ts +0 -64
  50. package/lib/DboBuilder/QueryBuilder/Functions.d.ts.map +0 -1
  51. package/lib/DboBuilder/QueryBuilder/Functions.js +0 -984
  52. package/lib/DboBuilder/QueryBuilder/QueryBuilder.d.ts +0 -73
  53. package/lib/DboBuilder/QueryBuilder/QueryBuilder.d.ts.map +0 -1
  54. package/lib/DboBuilder/QueryBuilder/QueryBuilder.js +0 -335
  55. package/lib/DboBuilder/QueryBuilder/makeSelectQuery.d.ts +0 -8
  56. package/lib/DboBuilder/QueryBuilder/makeSelectQuery.d.ts.map +0 -1
  57. package/lib/DboBuilder/QueryBuilder/makeSelectQuery.js +0 -227
  58. package/lib/DboBuilder/TableHandler.d.ts +0 -37
  59. package/lib/DboBuilder/TableHandler.d.ts.map +0 -1
  60. package/lib/DboBuilder/TableHandler.js +0 -213
  61. package/lib/DboBuilder/ViewHandler.d.ts +0 -119
  62. package/lib/DboBuilder/ViewHandler.d.ts.map +0 -1
  63. package/lib/DboBuilder/ViewHandler.js +0 -1023
  64. package/lib/DboBuilder/delete.d.ts +0 -6
  65. package/lib/DboBuilder/delete.d.ts.map +0 -1
  66. package/lib/DboBuilder/delete.js +0 -128
  67. package/lib/DboBuilder/find.d.ts +0 -8
  68. package/lib/DboBuilder/find.d.ts.map +0 -1
  69. package/lib/DboBuilder/find.js +0 -91
  70. package/lib/DboBuilder/getColumns.d.ts +0 -12
  71. package/lib/DboBuilder/getColumns.d.ts.map +0 -1
  72. package/lib/DboBuilder/getColumns.js +0 -92
  73. package/lib/DboBuilder/getCondition.d.ts +0 -22
  74. package/lib/DboBuilder/getCondition.d.ts.map +0 -1
  75. package/lib/DboBuilder/getCondition.js +0 -236
  76. package/lib/DboBuilder/getSubscribeRelatedTables.d.ts +0 -20
  77. package/lib/DboBuilder/getSubscribeRelatedTables.d.ts.map +0 -1
  78. package/lib/DboBuilder/getSubscribeRelatedTables.js +0 -152
  79. package/lib/DboBuilder/getTablesForSchemaPostgresSQL.d.ts +0 -3
  80. package/lib/DboBuilder/getTablesForSchemaPostgresSQL.d.ts.map +0 -1
  81. package/lib/DboBuilder/getTablesForSchemaPostgresSQL.js +0 -207
  82. package/lib/DboBuilder/insert.d.ts +0 -6
  83. package/lib/DboBuilder/insert.d.ts.map +0 -1
  84. package/lib/DboBuilder/insert.js +0 -180
  85. package/lib/DboBuilder/insertDataParse.d.ts +0 -12
  86. package/lib/DboBuilder/insertDataParse.d.ts.map +0 -1
  87. package/lib/DboBuilder/insertDataParse.js +0 -253
  88. package/lib/DboBuilder/parseUpdateRules.d.ts +0 -18
  89. package/lib/DboBuilder/parseUpdateRules.d.ts.map +0 -1
  90. package/lib/DboBuilder/parseUpdateRules.js +0 -123
  91. package/lib/DboBuilder/runSQL.d.ts +0 -7
  92. package/lib/DboBuilder/runSQL.d.ts.map +0 -1
  93. package/lib/DboBuilder/runSQL.js +0 -135
  94. package/lib/DboBuilder/subscribe.d.ts +0 -20
  95. package/lib/DboBuilder/subscribe.d.ts.map +0 -1
  96. package/lib/DboBuilder/subscribe.js +0 -90
  97. package/lib/DboBuilder/update.d.ts +0 -6
  98. package/lib/DboBuilder/update.d.ts.map +0 -1
  99. package/lib/DboBuilder/update.js +0 -151
  100. package/lib/DboBuilder/uploadFile.d.ts +0 -7
  101. package/lib/DboBuilder/uploadFile.d.ts.map +0 -1
  102. package/lib/DboBuilder/uploadFile.js +0 -53
  103. package/lib/DboBuilder.d.ts +0 -306
  104. package/lib/DboBuilder.d.ts.map +0 -1
  105. package/lib/DboBuilder.js +0 -745
  106. package/lib/Event_Trigger_Tags.d.ts +0 -4
  107. package/lib/Event_Trigger_Tags.d.ts.map +0 -1
  108. package/lib/Event_Trigger_Tags.js +0 -116
  109. package/lib/FileManager/FileManager.d.ts +0 -135
  110. package/lib/FileManager/FileManager.d.ts.map +0 -1
  111. package/lib/FileManager/FileManager.js +0 -303
  112. package/lib/FileManager/initFileManager.d.ts +0 -4
  113. package/lib/FileManager/initFileManager.d.ts.map +0 -1
  114. package/lib/FileManager/initFileManager.js +0 -231
  115. package/lib/FileManager/parseFile.d.ts +0 -15
  116. package/lib/FileManager/parseFile.d.ts.map +0 -1
  117. package/lib/FileManager/parseFile.js +0 -58
  118. package/lib/FileManager/upload.d.ts +0 -6
  119. package/lib/FileManager/upload.d.ts.map +0 -1
  120. package/lib/FileManager/upload.js +0 -98
  121. package/lib/FileManager/uploadStream.d.ts +0 -5
  122. package/lib/FileManager/uploadStream.d.ts.map +0 -1
  123. package/lib/FileManager/uploadStream.js +0 -92
  124. package/lib/Filtering.d.ts +0 -15
  125. package/lib/Filtering.d.ts.map +0 -1
  126. package/lib/Filtering.js +0 -336
  127. package/lib/JSONBValidation/validate_jsonb_schema_sql.d.ts +0 -4
  128. package/lib/JSONBValidation/validate_jsonb_schema_sql.d.ts.map +0 -1
  129. package/lib/JSONBValidation/validate_jsonb_schema_sql.js +0 -500
  130. package/lib/JSONBValidation/validation.d.ts +0 -9
  131. package/lib/JSONBValidation/validation.d.ts.map +0 -1
  132. package/lib/JSONBValidation/validation.js +0 -131
  133. package/lib/PostgresNotifListenManager.d.ts +0 -28
  134. package/lib/PostgresNotifListenManager.d.ts.map +0 -1
  135. package/lib/PostgresNotifListenManager.js +0 -134
  136. package/lib/Prostgles.d.ts +0 -289
  137. package/lib/Prostgles.d.ts.map +0 -1
  138. package/lib/Prostgles.js +0 -685
  139. package/lib/PubSubManager/PubSubManager.d.ts +0 -175
  140. package/lib/PubSubManager/PubSubManager.d.ts.map +0 -1
  141. package/lib/PubSubManager/PubSubManager.js +0 -452
  142. package/lib/PubSubManager/addSub.d.ts +0 -8
  143. package/lib/PubSubManager/addSub.d.ts.map +0 -1
  144. package/lib/PubSubManager/addSub.js +0 -166
  145. package/lib/PubSubManager/addSync.d.ts +0 -8
  146. package/lib/PubSubManager/addSync.d.ts.map +0 -1
  147. package/lib/PubSubManager/addSync.js +0 -109
  148. package/lib/PubSubManager/getInitQuery.d.ts +0 -9
  149. package/lib/PubSubManager/getInitQuery.d.ts.map +0 -1
  150. package/lib/PubSubManager/getInitQuery.js +0 -552
  151. package/lib/PubSubManager/initPubSubManager.d.ts +0 -3
  152. package/lib/PubSubManager/initPubSubManager.d.ts.map +0 -1
  153. package/lib/PubSubManager/initPubSubManager.js +0 -116
  154. package/lib/PubSubManager/notifListener.d.ts +0 -5
  155. package/lib/PubSubManager/notifListener.d.ts.map +0 -1
  156. package/lib/PubSubManager/notifListener.js +0 -100
  157. package/lib/PubSubManager/pushSubData.d.ts +0 -3
  158. package/lib/PubSubManager/pushSubData.d.ts.map +0 -1
  159. package/lib/PubSubManager/pushSubData.js +0 -51
  160. package/lib/PublishParser.d.ts +0 -284
  161. package/lib/PublishParser.d.ts.map +0 -1
  162. package/lib/PublishParser.js +0 -421
  163. package/lib/SchemaWatch.d.ts +0 -13
  164. package/lib/SchemaWatch.d.ts.map +0 -1
  165. package/lib/SchemaWatch.js +0 -35
  166. package/lib/SyncReplication.d.ts +0 -34
  167. package/lib/SyncReplication.d.ts.map +0 -1
  168. package/lib/SyncReplication.js +0 -412
  169. package/lib/TableConfig/TableConfig.d.ts +0 -284
  170. package/lib/TableConfig/TableConfig.d.ts.map +0 -1
  171. package/lib/TableConfig/TableConfig.js +0 -437
  172. package/lib/TableConfig/getColumnDefinitionQuery.d.ts +0 -27
  173. package/lib/TableConfig/getColumnDefinitionQuery.d.ts.map +0 -1
  174. package/lib/TableConfig/getColumnDefinitionQuery.js +0 -87
  175. package/lib/TableConfig/getConstraintDefinitionQueries.d.ts +0 -34
  176. package/lib/TableConfig/getConstraintDefinitionQueries.d.ts.map +0 -1
  177. package/lib/TableConfig/getConstraintDefinitionQueries.js +0 -65
  178. package/lib/TableConfig/getFutureTableSchema.d.ts +0 -15
  179. package/lib/TableConfig/getFutureTableSchema.d.ts.map +0 -1
  180. package/lib/TableConfig/getFutureTableSchema.js +0 -43
  181. package/lib/TableConfig/getTableColumnQueries.d.ts +0 -16
  182. package/lib/TableConfig/getTableColumnQueries.d.ts.map +0 -1
  183. package/lib/TableConfig/getTableColumnQueries.js +0 -107
  184. package/lib/index.d.ts +0 -5
  185. package/lib/index.d.ts.map +0 -1
  186. package/lib/index.js +0 -7
  187. package/lib/shortestPath.d.ts +0 -10
  188. package/lib/shortestPath.d.ts.map +0 -1
  189. package/lib/shortestPath.js +0 -111
  190. package/lib/utils.d.ts +0 -3
  191. package/lib/utils.d.ts.map +0 -1
  192. package/lib/utils.js +0 -12
  193. package/tests/client/index.d.ts +0 -2
  194. package/tests/client/index.d.ts.map +0 -1
  195. package/tests/client/index.js +0 -80
  196. package/tests/client/index.js.map +0 -1
  197. package/tests/client_only_queries.d.ts +0 -4
  198. package/tests/client_only_queries.d.ts.map +0 -1
  199. package/tests/client_only_queries.js +0 -282
  200. package/tests/config_test/DBoGenerated.d.ts +0 -388
  201. package/tests/config_test/index.js +0 -174
  202. package/tests/config_test/index.js.map +0 -1
  203. package/tests/isomorphic_queries.d.ts +0 -9
  204. package/tests/isomorphic_queries.d.ts.map +0 -1
  205. package/tests/isomorphic_queries.js +0 -773
  206. package/tests/manual_test/DBoGenerated.d.ts +0 -398
  207. package/tests/manual_test/index.d.ts +0 -2
  208. package/tests/manual_test/index.d.ts.map +0 -1
  209. package/tests/manual_test/index.js +0 -65
  210. package/tests/server/dboTypeCheck.d.ts +0 -2
  211. package/tests/server/dboTypeCheck.d.ts.map +0 -1
  212. package/tests/server/dboTypeCheck.js +0 -27
  213. package/tests/server/index.d.ts +0 -2
  214. package/tests/server/index.d.ts.map +0 -1
  215. package/tests/server/index.js +0 -507
  216. package/tests/server/publishTypeCheck.d.ts +0 -2
  217. package/tests/server/publishTypeCheck.d.ts.map +0 -1
  218. package/tests/server/publishTypeCheck.js +0 -130
  219. package/tests/server_only_queries.d.ts +0 -2
  220. package/tests/server_only_queries.d.ts.map +0 -1
  221. 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;