taon-type-sql 21.0.22 → 21.0.24
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/browser/package.json +1 -1
- package/browser-prod/package.json +1 -1
- package/lib/build-info._auto-generated_.d.ts +1 -1
- package/lib/build-info._auto-generated_.js +1 -1
- package/lib/package.json +1 -1
- package/lib-prod/{build-info._auto-generated_.ts → build-info._auto-generated_.js} +1 -2
- package/lib-prod/builder/column/{basic-column.ts → basic-column.js} +4 -10
- package/lib-prod/builder/column/boolean-column.js +11 -0
- package/lib-prod/builder/column/comparable-column.js +39 -0
- package/lib-prod/builder/column/date-column.js +11 -0
- package/lib-prod/builder/column/number-column.js +16 -0
- package/lib-prod/builder/column/query-column.js +18 -0
- package/lib-prod/builder/column/string-column.js +33 -0
- package/lib-prod/builder/column/value-column.js +27 -0
- package/lib-prod/builder/condition/query-column-condition.js +16 -0
- package/lib-prod/builder/condition/query-condition-chain.js +26 -0
- package/lib-prod/builder/condition/query-condition.js +4 -0
- package/lib-prod/builder/condition/query-join-condition.js +16 -0
- package/lib-prod/builder/helpers/{generics-helper.ts → generics-helper.js} +2 -1
- package/lib-prod/builder/helpers/internal-types.js +1 -0
- package/lib-prod/builder/join/joined-tables-chain.js +11 -0
- package/lib-prod/builder/join/joined-tables.js +19 -0
- package/lib-prod/builder/other/query-ordering.js +14 -0
- package/lib-prod/builder/query/select-query.js +45 -0
- package/lib-prod/builder/query/table-condition-query.js +22 -0
- package/lib-prod/builder/query/table-query.js +52 -0
- package/lib-prod/builder/query-source.js +17 -0
- package/lib-prod/builder/query-table.js +22 -0
- package/lib-prod/client/{mysql.ts → mysql.js} +3 -5
- package/lib-prod/client/{pg.ts → pg.js} +3 -5
- package/lib-prod/client/query-processor.js +69 -0
- package/lib-prod/converter/{param-converter.ts → param-converter.js} +11 -8
- package/lib-prod/converter/parameterized-converter.js +14 -0
- package/lib-prod/converter/{query-converter.ts → query-converter.js} +94 -110
- package/lib-prod/converter/result-converter.js +85 -0
- package/lib-prod/converter/sql-converter.js +5 -0
- package/lib-prod/converter/type-converter.js +36 -0
- package/lib-prod/converter/types.js +1 -0
- package/lib-prod/env/{env.angular-node-app.ts → env.angular-node-app.js} +1 -1
- package/lib-prod/env/{env.docs-webapp.ts → env.docs-webapp.js} +1 -1
- package/lib-prod/env/{env.electron-app.ts → env.electron-app.js} +1 -1
- package/lib-prod/env/{env.mobile-app.ts → env.mobile-app.js} +1 -1
- package/lib-prod/env/{env.npm-lib-and-cli-tool.ts → env.npm-lib-and-cli-tool.js} +1 -1
- package/lib-prod/env/{env.vscode-plugin.ts → env.vscode-plugin.js} +1 -1
- package/lib-prod/{index._auto-generated_.ts → index._auto-generated_.js} +1 -1
- package/lib-prod/{index.ts → index.js} +0 -12
- package/lib-prod/migrations/index.js +2 -0
- package/lib-prod/migrations/{migrations_index._auto-generated_.ts → migrations_index._auto-generated_.js} +0 -2
- package/lib-prod/package.json +1 -1
- package/package.json +1 -1
- package/websql/package.json +1 -1
- package/websql-prod/package.json +1 -1
- package/lib-prod/builder/column/boolean-column.ts +0 -19
- package/lib-prod/builder/column/comparable-column.ts +0 -56
- package/lib-prod/builder/column/date-column.ts +0 -19
- package/lib-prod/builder/column/number-column.ts +0 -25
- package/lib-prod/builder/column/query-column.ts +0 -34
- package/lib-prod/builder/column/string-column.ts +0 -47
- package/lib-prod/builder/column/value-column.ts +0 -39
- package/lib-prod/builder/condition/query-column-condition.ts +0 -28
- package/lib-prod/builder/condition/query-condition-chain.ts +0 -42
- package/lib-prod/builder/condition/query-condition.ts +0 -13
- package/lib-prod/builder/condition/query-join-condition.ts +0 -27
- package/lib-prod/builder/helpers/internal-types.ts +0 -31
- package/lib-prod/builder/join/joined-tables-chain.ts +0 -17
- package/lib-prod/builder/join/joined-tables.ts +0 -28
- package/lib-prod/builder/other/query-ordering.ts +0 -26
- package/lib-prod/builder/query/select-query.ts +0 -68
- package/lib-prod/builder/query/table-condition-query.ts +0 -35
- package/lib-prod/builder/query/table-query.ts +0 -72
- package/lib-prod/builder/query-source.ts +0 -25
- package/lib-prod/builder/query-table.ts +0 -34
- package/lib-prod/client/query-processor.ts +0 -89
- package/lib-prod/converter/parameterized-converter.ts +0 -20
- package/lib-prod/converter/result-converter.ts +0 -88
- package/lib-prod/converter/sql-converter.ts +0 -7
- package/lib-prod/converter/type-converter.ts +0 -29
- package/lib-prod/converter/types.ts +0 -6
- package/lib-prod/lib-info.md +0 -8
- package/lib-prod/migrations/index.ts +0 -2
- package/lib-prod/migrations/migrations-info.md +0 -6
- /package/lib-prod/env/{index.ts → index.js} +0 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { createQueryConverter } from "./query-converter";
|
|
2
|
+
import { convertEscapedParam } from './param-converter';
|
|
3
|
+
let pgParamConverter = (index) => '$' + index;
|
|
4
|
+
let mySqlParamConverter = (index) => '?';
|
|
5
|
+
function convertSingleParam(param, params, paramConverter) {
|
|
6
|
+
params.push(convertEscapedParam(param));
|
|
7
|
+
return paramConverter(params.length);
|
|
8
|
+
}
|
|
9
|
+
export function convertQueryToParameterizedSQL(query, options, engine) {
|
|
10
|
+
let params = [];
|
|
11
|
+
let paramConverter = engine === 'mysql' ? mySqlParamConverter : pgParamConverter;
|
|
12
|
+
let sql = createQueryConverter((param) => convertSingleParam(param, params, paramConverter), options, engine)(query);
|
|
13
|
+
return { sql, params };
|
|
14
|
+
}
|
|
@@ -1,104 +1,91 @@
|
|
|
1
1
|
import { string, number, date, boolean } from './type-converter';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
export function createQueryConverter(paramConverter: (param: any) => string, options: ConverterOptions, engine: QueryEngine) {
|
|
6
|
-
|
|
2
|
+
export function createQueryConverter(paramConverter, options, engine) {
|
|
7
3
|
return convertQuery;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
if (query._action === 'delete')
|
|
12
|
-
|
|
13
|
-
if (query._action === '
|
|
4
|
+
function convertQuery(query) {
|
|
5
|
+
if (query._action === 'select')
|
|
6
|
+
return convertSelectQuery(query);
|
|
7
|
+
if (query._action === 'delete')
|
|
8
|
+
return convertDeleteQuery(query);
|
|
9
|
+
if (query._action === 'update')
|
|
10
|
+
return convertUpdateQuery(query);
|
|
11
|
+
if (query._action === 'insert')
|
|
12
|
+
return convertInsertQuery(query);
|
|
14
13
|
throw new Error('Unknown query type:' + query._action);
|
|
15
14
|
}
|
|
16
|
-
|
|
17
|
-
function convertDeleteQuery(query: any): string {
|
|
15
|
+
function convertDeleteQuery(query) {
|
|
18
16
|
let s = 'DELETE FROM ' + convertTable(query._table);
|
|
19
17
|
s += convertConditions(query._conditions);
|
|
20
18
|
return s;
|
|
21
19
|
}
|
|
22
|
-
|
|
23
|
-
function convertUpdateQuery(query: any): string {
|
|
20
|
+
function convertUpdateQuery(query) {
|
|
24
21
|
let s = 'UPDATE ' + convertTable(query._table) + ' SET ';
|
|
25
22
|
s += convertUpdateSetters(query._table, query._entity);
|
|
26
23
|
s += convertConditions(query._conditions);
|
|
27
24
|
return s;
|
|
28
25
|
}
|
|
29
|
-
|
|
30
|
-
function convertUpdateSetters(table: any, entity: any): string {
|
|
26
|
+
function convertUpdateSetters(table, entity) {
|
|
31
27
|
return Object.keys(entity).sort().map(key => {
|
|
32
28
|
let value = entity[key];
|
|
33
29
|
let column = table[key];
|
|
34
30
|
return convertColumnName(column) + ' = ' + convertParam(column, value);
|
|
35
31
|
}).join(', ');
|
|
36
32
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
let
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}, new Set
|
|
33
|
+
function convertInsertQuery(query) {
|
|
34
|
+
let items = Array.isArray(query._entity) ? query._entity : [query._entity];
|
|
35
|
+
let keySet = items.reduce((set, item) => {
|
|
36
|
+
Object.keys(item).forEach(key => set.add(key));
|
|
37
|
+
return set;
|
|
38
|
+
}, new Set());
|
|
43
39
|
let keys = Array.from(keySet).sort();
|
|
44
|
-
|
|
45
40
|
let s = 'INSERT INTO ' + convertTable(query._table) + ' ';
|
|
46
41
|
s += '(' + keys.map(key => convertColumnName(query._table[key])).join(', ') + ')';
|
|
47
42
|
s += options.lineBreak + 'VALUES ';
|
|
48
43
|
s += items.map(item => convertInsertItem(query._table, item, keys))
|
|
49
|
-
.map((row
|
|
50
|
-
|
|
44
|
+
.map((row) => '(' + row + ')').join(', ');
|
|
51
45
|
s += getPgInsertReturningIfNeeded(query);
|
|
52
46
|
return s;
|
|
53
47
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
function getPgInsertReturningIfNeeded(query: any): string {
|
|
48
|
+
function getPgInsertReturningIfNeeded(query) {
|
|
57
49
|
if (engine === 'pg' && query._action === 'insert' && !Array.isArray(query._entity) &&
|
|
58
50
|
query._table.$id && query._table.$id._table && query._table.$id._name) {
|
|
59
51
|
return ' RETURNING ' + convertColumnName(query._table.$id);
|
|
60
52
|
}
|
|
61
53
|
return '';
|
|
62
54
|
}
|
|
63
|
-
|
|
64
|
-
function convertInsertItem(table: any, entity: any, keys: string[]): string {
|
|
55
|
+
function convertInsertItem(table, entity, keys) {
|
|
65
56
|
return keys.map(key => {
|
|
66
57
|
let value = entity[key];
|
|
67
58
|
let column = table[key];
|
|
68
59
|
return convertParam(column, value);
|
|
69
60
|
}).join(', ');
|
|
70
61
|
}
|
|
71
|
-
|
|
72
|
-
function convertSelectQuery(query: any): string {
|
|
62
|
+
function convertSelectQuery(query) {
|
|
73
63
|
let s = 'SELECT ';
|
|
74
64
|
if (query._distinct) {
|
|
75
65
|
s += 'DISTINCT ';
|
|
76
66
|
}
|
|
77
|
-
|
|
78
67
|
if (query._columns == null || query._columns.length === 0) {
|
|
79
|
-
s += '*'
|
|
80
|
-
}
|
|
81
|
-
|
|
68
|
+
s += '*';
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
s += query._columns.map((column) => convertColumn(column)).join(', ');
|
|
82
72
|
}
|
|
83
|
-
|
|
84
73
|
s += options.lineBreak + 'FROM ';
|
|
85
74
|
if (query._tables) {
|
|
86
|
-
s+= query._tables.map((table
|
|
87
|
-
}
|
|
88
|
-
|
|
75
|
+
s += query._tables.map((table) => table._parent ? convertJoin(table) : convertTable(table)).join(', ');
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
s += convertTable(query._table);
|
|
89
79
|
}
|
|
90
|
-
|
|
91
80
|
s += convertConditions(query._conditions);
|
|
92
|
-
|
|
93
81
|
if (query._groupBy && query._groupBy.length > 0) {
|
|
94
82
|
s += options.lineBreak + 'GROUP BY ';
|
|
95
|
-
s += query._groupBy.map((column
|
|
83
|
+
s += query._groupBy.map((column) => convertColumn(column)).join(', ');
|
|
96
84
|
}
|
|
97
85
|
s += convertConditions(query._having, 'HAVING');
|
|
98
|
-
|
|
99
86
|
if (query._orderings && query._orderings.length > 0) {
|
|
100
87
|
s += options.lineBreak + 'ORDER BY ';
|
|
101
|
-
s += query._orderings.map((ordering
|
|
88
|
+
s += query._orderings.map((ordering) => convertOrdering(ordering)).join(', ');
|
|
102
89
|
}
|
|
103
90
|
if (query._limit != null) {
|
|
104
91
|
s += options.lineBreak + 'LIMIT ' + number(query._limit);
|
|
@@ -108,8 +95,7 @@ export function createQueryConverter(paramConverter: (param: any) => string, opt
|
|
|
108
95
|
}
|
|
109
96
|
return s;
|
|
110
97
|
}
|
|
111
|
-
|
|
112
|
-
function convertConditions(conditions: any[], keyword = 'WHERE'): string {
|
|
98
|
+
function convertConditions(conditions, keyword = 'WHERE') {
|
|
113
99
|
let s = '';
|
|
114
100
|
if (conditions && conditions.length > 0) {
|
|
115
101
|
s += options.lineBreak + keyword + ' ';
|
|
@@ -118,18 +104,15 @@ export function createQueryConverter(paramConverter: (param: any) => string, opt
|
|
|
118
104
|
}
|
|
119
105
|
return s;
|
|
120
106
|
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
let items: any[] = [];
|
|
107
|
+
function convertJoin(joinChain) {
|
|
108
|
+
let items = [];
|
|
124
109
|
while (joinChain) {
|
|
125
110
|
items.push(joinChain);
|
|
126
111
|
joinChain = joinChain._parent;
|
|
127
112
|
}
|
|
128
|
-
|
|
129
113
|
let root = items[items.length - 1];
|
|
130
114
|
let s = convertTable(root);
|
|
131
|
-
|
|
132
|
-
for (let i = items.length - 2; i >= 0; i-= 2) {
|
|
115
|
+
for (let i = items.length - 2; i >= 0; i -= 2) {
|
|
133
116
|
let table = items[i]._table;
|
|
134
117
|
let modifier = items[i]._modifier;
|
|
135
118
|
let condition = items[i - 1]._condition;
|
|
@@ -137,32 +120,28 @@ export function createQueryConverter(paramConverter: (param: any) => string, opt
|
|
|
137
120
|
s += ' ' + modifier.toUpperCase() + ' JOIN ' + convertTable(table) + ' ON ' +
|
|
138
121
|
convertColumnCondition(condition, param);
|
|
139
122
|
}
|
|
140
|
-
|
|
141
123
|
return s;
|
|
142
124
|
}
|
|
143
|
-
|
|
144
|
-
function convertOrdering(ordering: any): string {
|
|
125
|
+
function convertOrdering(ordering) {
|
|
145
126
|
if (ordering._column) {
|
|
146
127
|
let s = convertColumn(ordering._column);
|
|
147
|
-
|
|
148
128
|
if (ordering._nullsPosition != null) { // "NULLS FIRST" only exists in PG, this is the general solution
|
|
149
129
|
s += ' IS NULL ' + (ordering._nullsPosition === 'FIRST' ? 'DESC' : 'ASC') + ', ' + s;
|
|
150
130
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
if (ordering._direction === 'DESC')
|
|
154
|
-
|
|
131
|
+
if (ordering._direction === 'ASC')
|
|
132
|
+
s += ' ASC';
|
|
133
|
+
if (ordering._direction === 'DESC')
|
|
134
|
+
s += ' DESC';
|
|
155
135
|
return s;
|
|
156
|
-
}
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
157
138
|
return convertColumn(ordering);
|
|
158
139
|
}
|
|
159
140
|
}
|
|
160
|
-
|
|
161
|
-
function convertTable(table: any): string {
|
|
141
|
+
function convertTable(table) {
|
|
162
142
|
return options.nameEscape + table._$name + options.nameEscape;
|
|
163
143
|
}
|
|
164
|
-
|
|
165
|
-
function convertColumn(column: any): string {
|
|
144
|
+
function convertColumn(column) {
|
|
166
145
|
let s = '';
|
|
167
146
|
if (!(column._name === '*' && column._modifiers.length > 0 && column._modifiers[0].name === 'count')) {
|
|
168
147
|
s += convertTable(column._table) + '.';
|
|
@@ -170,31 +149,37 @@ export function createQueryConverter(paramConverter: (param: any) => string, opt
|
|
|
170
149
|
s += convertColumnName(column);
|
|
171
150
|
return convertColumnModifiers(s, column);
|
|
172
151
|
}
|
|
173
|
-
|
|
174
|
-
function convertColumnModifiers(s: string, column: any): string {
|
|
152
|
+
function convertColumnModifiers(s, column) {
|
|
175
153
|
if (column._modifiers) {
|
|
176
|
-
column._modifiers.forEach((modifier
|
|
154
|
+
column._modifiers.forEach((modifier) => {
|
|
177
155
|
let name = modifier.name;
|
|
178
|
-
if (name === 'lower')
|
|
179
|
-
|
|
180
|
-
else if (name === '
|
|
181
|
-
|
|
182
|
-
else if (name === '
|
|
183
|
-
|
|
184
|
-
else if (name === '
|
|
185
|
-
|
|
156
|
+
if (name === 'lower')
|
|
157
|
+
s = 'LOWER(' + s + ')';
|
|
158
|
+
else if (name === 'upper')
|
|
159
|
+
s = 'UPPER(' + s + ')';
|
|
160
|
+
else if (name === 'count')
|
|
161
|
+
s = 'COUNT(' + s + ')';
|
|
162
|
+
else if (name === 'sum')
|
|
163
|
+
s = 'SUM(' + s + ')';
|
|
164
|
+
else if (name === 'avg')
|
|
165
|
+
s = 'AVG(' + s + ')';
|
|
166
|
+
else if (name === 'min')
|
|
167
|
+
s = 'MIN(' + s + ')';
|
|
168
|
+
else if (name === 'max')
|
|
169
|
+
s = 'MAX(' + s + ')';
|
|
170
|
+
else if (name === 'as')
|
|
171
|
+
s = s + ' AS ' + options.nameEscape + modifier.params + options.nameEscape;
|
|
186
172
|
});
|
|
187
173
|
}
|
|
188
174
|
return s + '';
|
|
189
175
|
}
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
176
|
+
function convertColumnName(column) {
|
|
177
|
+
if (column._name === '*')
|
|
178
|
+
return column._name;
|
|
193
179
|
let name = typeof column._name === 'string' ? column._name : column._name.name;
|
|
194
180
|
return options.nameEscape + name + options.nameEscape;
|
|
195
181
|
}
|
|
196
|
-
|
|
197
|
-
function preprocessConditions(conditions: any[]): void {
|
|
182
|
+
function preprocessConditions(conditions) {
|
|
198
183
|
conditions.forEach(condition => {
|
|
199
184
|
if (conditions.length > 1 && condition._sibling) {
|
|
200
185
|
condition._parenthesis = true;
|
|
@@ -202,9 +187,8 @@ export function createQueryConverter(paramConverter: (param: any) => string, opt
|
|
|
202
187
|
preprocessParams(condition);
|
|
203
188
|
});
|
|
204
189
|
}
|
|
205
|
-
|
|
206
190
|
// this is only needed, so that the $1, $2... numbering is not reversed
|
|
207
|
-
function preprocessParams(condition
|
|
191
|
+
function preprocessParams(condition) {
|
|
208
192
|
if (condition._sibling) {
|
|
209
193
|
preprocessParams(condition._sibling);
|
|
210
194
|
}
|
|
@@ -215,12 +199,10 @@ export function createQueryConverter(paramConverter: (param: any) => string, opt
|
|
|
215
199
|
preprocessParams(condition._child);
|
|
216
200
|
}
|
|
217
201
|
}
|
|
218
|
-
|
|
219
|
-
function convertCondition(condition: any, root = false): string {
|
|
202
|
+
function convertCondition(condition, root = false) {
|
|
220
203
|
if (!condition._sibling && !condition._child) {
|
|
221
204
|
return convertColumnCondition(condition, condition.__param);
|
|
222
205
|
}
|
|
223
|
-
|
|
224
206
|
let s = '';
|
|
225
207
|
if (condition._child) {
|
|
226
208
|
s += convertCondition(condition._child);
|
|
@@ -236,14 +218,12 @@ export function createQueryConverter(paramConverter: (param: any) => string, opt
|
|
|
236
218
|
}
|
|
237
219
|
return s;
|
|
238
220
|
}
|
|
239
|
-
|
|
240
|
-
function convertColumnCondition(condition: any, param: string): string {
|
|
221
|
+
function convertColumnCondition(condition, param) {
|
|
241
222
|
let s = convertColumn(condition._column);
|
|
242
223
|
s += getConditionString(condition, param);
|
|
243
224
|
return s;
|
|
244
225
|
}
|
|
245
|
-
|
|
246
|
-
function getConditionString(condition: any, param: string): string {
|
|
226
|
+
function getConditionString(condition, param) {
|
|
247
227
|
switch (condition._type) {
|
|
248
228
|
case 'eq': return ' = ' + param;
|
|
249
229
|
case 'ne': return ' <> ' + param;
|
|
@@ -262,35 +242,39 @@ export function createQueryConverter(paramConverter: (param: any) => string, opt
|
|
|
262
242
|
default: return '';
|
|
263
243
|
}
|
|
264
244
|
}
|
|
265
|
-
|
|
266
|
-
function getConditionParam(condition: any): string {
|
|
245
|
+
function getConditionParam(condition) {
|
|
267
246
|
let param = '';
|
|
268
247
|
if (condition._otherColumn) {
|
|
269
248
|
param = convertColumn(condition._otherColumn);
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
let _convertParam = (param) => convertParam(condition._column, param);
|
|
273
252
|
if (condition._type === 'in' || condition._type === 'not-in') {
|
|
274
|
-
param = condition._values.map((value
|
|
275
|
-
}
|
|
253
|
+
param = condition._values.map((value) => _convertParam(value)).join(', ');
|
|
254
|
+
}
|
|
255
|
+
else if (condition._type === 'between' || condition._type === 'not-between') {
|
|
276
256
|
param = _convertParam(condition._values[0]) + ' AND ' + _convertParam(condition._values[1]);
|
|
277
|
-
}
|
|
257
|
+
}
|
|
258
|
+
else if (condition._type !== 'is-null' && condition._type !== 'is-not-null') {
|
|
278
259
|
param = _convertParam(condition._values[0]);
|
|
279
260
|
}
|
|
280
261
|
}
|
|
281
262
|
return param;
|
|
282
263
|
}
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
264
|
+
function convertParam(column, param) {
|
|
265
|
+
if (param == null)
|
|
266
|
+
return 'NULL';
|
|
286
267
|
return paramConverter(getTypedParam(column._type, param));
|
|
287
268
|
}
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
else if (type === 'boolean')
|
|
292
|
-
|
|
293
|
-
else if (type === '
|
|
269
|
+
function getTypedParam(type, param) {
|
|
270
|
+
if (type === 'number')
|
|
271
|
+
return number(param);
|
|
272
|
+
else if (type === 'boolean')
|
|
273
|
+
return boolean(param);
|
|
274
|
+
else if (type === 'date')
|
|
275
|
+
return date(param);
|
|
276
|
+
else if (type === 'string')
|
|
277
|
+
return string(param);
|
|
294
278
|
return param;
|
|
295
279
|
}
|
|
296
|
-
}
|
|
280
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
export function convertResult(query, result, engine) {
|
|
2
|
+
let rows = engine === 'pg' ? result.rows : result;
|
|
3
|
+
let rowCount = engine === 'pg' ? result.rowCount : result.affectedRows || result.changedRows;
|
|
4
|
+
if (query._action === 'select')
|
|
5
|
+
return convertSelectResult(query, rows);
|
|
6
|
+
if (query._action === 'delete')
|
|
7
|
+
return rowCount;
|
|
8
|
+
if (query._action === 'update')
|
|
9
|
+
return rowCount;
|
|
10
|
+
if (query._action === 'insert')
|
|
11
|
+
return convertInsertResult(result, engine);
|
|
12
|
+
throw new Error('Unknown query type:' + query._action);
|
|
13
|
+
}
|
|
14
|
+
function convertInsertResult(result, engine) {
|
|
15
|
+
if (engine === 'mysql')
|
|
16
|
+
return result.insertId > 0 ? result.insertId : undefined; // mysql returns 0 for tables that have a non-autoincrement ID
|
|
17
|
+
if (engine === 'pg' && result.rows && result.rows.length === 1) {
|
|
18
|
+
let columnName = Object.keys(result.rows[0])[0];
|
|
19
|
+
return result.rows[0][columnName];
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function convertSelectResult(query, rows) {
|
|
23
|
+
if (query._columns && query._columns.length === 1 &&
|
|
24
|
+
!(query._columns[0]._name === '*' && query._columns[0]._modifiers.length === 0)) {
|
|
25
|
+
if (rows.length == 0)
|
|
26
|
+
return [];
|
|
27
|
+
let columnName = Object.keys(rows[0])[0]; // easier than reverse engineering from the column modifiers
|
|
28
|
+
let values = rows.map((row) => row[columnName]);
|
|
29
|
+
if (query._columns[0]._name === '*' && query._columns[0]._modifiers.some((m) => m.name === 'count')) {
|
|
30
|
+
return values.map((value) => Number(value)); // string to number conversion for PG count values
|
|
31
|
+
}
|
|
32
|
+
return values;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
convertAliasFields(query, rows);
|
|
36
|
+
return rows;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function convertAliasFields(query, rows) {
|
|
40
|
+
let aliasByName = getColumnAliasesByName(query);
|
|
41
|
+
if (Object.keys(aliasByName).length === 0)
|
|
42
|
+
return;
|
|
43
|
+
rows.forEach((row) => {
|
|
44
|
+
Object.keys(row).forEach((name) => {
|
|
45
|
+
if (aliasByName[name]) {
|
|
46
|
+
row[aliasByName[name]] = row[name];
|
|
47
|
+
delete row[name];
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
function getColumnAliasesByName(query) {
|
|
53
|
+
let aliasByName = {};
|
|
54
|
+
if (query._columns && query._columns.length > 0) {
|
|
55
|
+
query._columns.forEach((column) => {
|
|
56
|
+
if (column._name && column._name.alias && column._modifiers.length === 0) {
|
|
57
|
+
aliasByName[column._name.name] = column._name.alias;
|
|
58
|
+
}
|
|
59
|
+
else if (column._name === '*' && column._modifiers.length === 0) {
|
|
60
|
+
getAliasColumnsOfTable(column._table).forEach((column) => {
|
|
61
|
+
aliasByName[column._name.name] = column._name.alias;
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
let tables = query._table ? [query._table] : query._tables;
|
|
68
|
+
tables.forEach((table) => {
|
|
69
|
+
getAliasColumnsOfTable(table).forEach((column) => {
|
|
70
|
+
aliasByName[column._name.name] = column._name.alias;
|
|
71
|
+
});
|
|
72
|
+
let joinTable = table._parent;
|
|
73
|
+
while (joinTable) {
|
|
74
|
+
getAliasColumnsOfTable(joinTable).forEach((column) => {
|
|
75
|
+
aliasByName[column._name.name] = column._name.alias;
|
|
76
|
+
});
|
|
77
|
+
joinTable = joinTable._parent;
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
return aliasByName;
|
|
82
|
+
}
|
|
83
|
+
function getAliasColumnsOfTable(table) {
|
|
84
|
+
return Object.keys(table).map(key => table[key]).filter((column) => column && column._name && column._name.alias);
|
|
85
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { createQueryConverter } from "./query-converter";
|
|
2
|
+
import { convertSubstitutionParam } from './param-converter';
|
|
3
|
+
export function convertQueryToSQL(query, options, engine) {
|
|
4
|
+
return createQueryConverter((param) => convertSubstitutionParam(param), options, engine)(query);
|
|
5
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export function number(param) {
|
|
2
|
+
let result = Number(param);
|
|
3
|
+
if (Number.isNaN(result))
|
|
4
|
+
throw new Error('Invalid number parameter in SQL query: ' + param);
|
|
5
|
+
return result;
|
|
6
|
+
}
|
|
7
|
+
export function boolean(param) {
|
|
8
|
+
if (typeof param === 'boolean')
|
|
9
|
+
return param;
|
|
10
|
+
if (param instanceof Boolean)
|
|
11
|
+
return param.valueOf();
|
|
12
|
+
if (param === 'true')
|
|
13
|
+
return true;
|
|
14
|
+
if (param === 'false')
|
|
15
|
+
return false;
|
|
16
|
+
throw new Error('Invalid boolean parameter in SQL query: ' + param);
|
|
17
|
+
}
|
|
18
|
+
export function date(param) {
|
|
19
|
+
if (param instanceof Date)
|
|
20
|
+
return param; // @ts-ignore
|
|
21
|
+
if (typeof param === 'number' || param instanceof Number)
|
|
22
|
+
return new Date(param);
|
|
23
|
+
if (typeof param === 'string' || param instanceof String) {
|
|
24
|
+
if (Number.isNaN(Date.parse(String(param))))
|
|
25
|
+
throw new Error('Invalid date parameter in SQL query: ' + param); // @ts-ignore
|
|
26
|
+
return new Date(param);
|
|
27
|
+
}
|
|
28
|
+
throw new Error('Invalid date parameter in SQL query: ' + param);
|
|
29
|
+
}
|
|
30
|
+
export function string(param) {
|
|
31
|
+
if (typeof param === 'string')
|
|
32
|
+
return param;
|
|
33
|
+
if (param instanceof String)
|
|
34
|
+
return param.valueOf();
|
|
35
|
+
throw new Error('Invalid string parameter in SQL query: ' + param);
|
|
36
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -63,4 +63,4 @@ export const ENV_ANGULAR_NODE_APP_IS_CI_PROCESS = undefined;
|
|
|
63
63
|
export const ENV_ANGULAR_NODE_APP_DOCKER_ADDITIONAL_CONTAINER = undefined;
|
|
64
64
|
export const ENV_ANGULAR_NODE_APP_DOCKER_SKIP_START_IN_ORDER = undefined;
|
|
65
65
|
export const ENV_ANGULAR_NODE_APP_DOCKER_SKIP_USING_MYSQL_DB = undefined;
|
|
66
|
-
// THIS FILE IS GENERATED - DO NOT MODIFY
|
|
66
|
+
// THIS FILE IS GENERATED - DO NOT MODIFY
|
|
@@ -63,4 +63,4 @@ export const ENV_DOCS_WEBAPP_IS_CI_PROCESS = undefined;
|
|
|
63
63
|
export const ENV_DOCS_WEBAPP_DOCKER_ADDITIONAL_CONTAINER = undefined;
|
|
64
64
|
export const ENV_DOCS_WEBAPP_DOCKER_SKIP_START_IN_ORDER = undefined;
|
|
65
65
|
export const ENV_DOCS_WEBAPP_DOCKER_SKIP_USING_MYSQL_DB = undefined;
|
|
66
|
-
// THIS FILE IS GENERATED - DO NOT MODIFY
|
|
66
|
+
// THIS FILE IS GENERATED - DO NOT MODIFY
|
|
@@ -63,4 +63,4 @@ export const ENV_ELECTRON_APP_IS_CI_PROCESS = undefined;
|
|
|
63
63
|
export const ENV_ELECTRON_APP_DOCKER_ADDITIONAL_CONTAINER = undefined;
|
|
64
64
|
export const ENV_ELECTRON_APP_DOCKER_SKIP_START_IN_ORDER = undefined;
|
|
65
65
|
export const ENV_ELECTRON_APP_DOCKER_SKIP_USING_MYSQL_DB = undefined;
|
|
66
|
-
// THIS FILE IS GENERATED - DO NOT MODIFY
|
|
66
|
+
// THIS FILE IS GENERATED - DO NOT MODIFY
|
|
@@ -63,4 +63,4 @@ export const ENV_MOBILE_APP_IS_CI_PROCESS = undefined;
|
|
|
63
63
|
export const ENV_MOBILE_APP_DOCKER_ADDITIONAL_CONTAINER = undefined;
|
|
64
64
|
export const ENV_MOBILE_APP_DOCKER_SKIP_START_IN_ORDER = undefined;
|
|
65
65
|
export const ENV_MOBILE_APP_DOCKER_SKIP_USING_MYSQL_DB = undefined;
|
|
66
|
-
// THIS FILE IS GENERATED - DO NOT MODIFY
|
|
66
|
+
// THIS FILE IS GENERATED - DO NOT MODIFY
|
|
@@ -63,4 +63,4 @@ export const ENV_NPM_LIB_AND_CLI_TOOL_IS_CI_PROCESS = undefined;
|
|
|
63
63
|
export const ENV_NPM_LIB_AND_CLI_TOOL_DOCKER_ADDITIONAL_CONTAINER = undefined;
|
|
64
64
|
export const ENV_NPM_LIB_AND_CLI_TOOL_DOCKER_SKIP_START_IN_ORDER = undefined;
|
|
65
65
|
export const ENV_NPM_LIB_AND_CLI_TOOL_DOCKER_SKIP_USING_MYSQL_DB = undefined;
|
|
66
|
-
// THIS FILE IS GENERATED - DO NOT MODIFY
|
|
66
|
+
// THIS FILE IS GENERATED - DO NOT MODIFY
|
|
@@ -63,4 +63,4 @@ export const ENV_VSCODE_PLUGIN_IS_CI_PROCESS = undefined;
|
|
|
63
63
|
export const ENV_VSCODE_PLUGIN_DOCKER_ADDITIONAL_CONTAINER = undefined;
|
|
64
64
|
export const ENV_VSCODE_PLUGIN_DOCKER_SKIP_START_IN_ORDER = undefined;
|
|
65
65
|
export const ENV_VSCODE_PLUGIN_DOCKER_SKIP_USING_MYSQL_DB = undefined;
|
|
66
|
-
// THIS FILE IS GENERATED - DO NOT MODIFY
|
|
66
|
+
// THIS FILE IS GENERATED - DO NOT MODIFY
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
// Builder:
|
|
2
|
-
|
|
3
2
|
export { default as BasicColumn } from './builder/column/basic-column';
|
|
4
3
|
export { default as BooleanColumn } from './builder/column/boolean-column';
|
|
5
4
|
export { default as ComparableColumn } from './builder/column/comparable-column';
|
|
@@ -8,30 +7,19 @@ export { default as NumberColumn } from './builder/column/number-column';
|
|
|
8
7
|
export { default as QueryColumn } from './builder/column/query-column';
|
|
9
8
|
export { default as StringColumn } from './builder/column/string-column';
|
|
10
9
|
export { default as ValueColumn } from './builder/column/value-column';
|
|
11
|
-
|
|
12
10
|
export { default as QueryColumnCondition } from './builder/condition/query-column-condition';
|
|
13
11
|
export { default as QueryCondition } from './builder/condition/query-condition';
|
|
14
12
|
export { default as QueryConditionChain } from './builder/condition/query-condition-chain';
|
|
15
13
|
export { default as QueryJoinCondition } from './builder/condition/query-join-condition';
|
|
16
|
-
|
|
17
14
|
export { default as JoinedTables } from './builder/join/joined-tables';
|
|
18
15
|
export { default as JoinedTablesChain } from './builder/join/joined-tables-chain';
|
|
19
|
-
|
|
20
16
|
export { default as QueryOrdering } from './builder/other/query-ordering';
|
|
21
|
-
|
|
22
17
|
export { default as SelectQuery } from './builder/query/select-query';
|
|
23
18
|
export { default as TableQuery } from './builder/query/table-query';
|
|
24
19
|
export { default as TableConditionQuery } from './builder/query/table-condition-query';
|
|
25
|
-
|
|
26
20
|
export { default as QuerySource } from './builder/query-source';
|
|
27
21
|
export { default as QueryTable } from './builder/query-table';
|
|
28
|
-
|
|
29
22
|
// Client:
|
|
30
|
-
|
|
31
23
|
export { default as MySqlQuerySource } from './client/mysql';
|
|
32
24
|
// export { default as PgQuerySource } from './client/pg';
|
|
33
|
-
|
|
34
25
|
export { QueryProcessorOptions } from './client/query-processor';
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
export type PropsEntitySQL<IEntityType> = { [prop in keyof Required<IEntityType>]: any; }
|
package/lib-prod/package.json
CHANGED
package/package.json
CHANGED
package/websql/package.json
CHANGED