@steedos/odata-v4-typeorm 1.20.0 → 2.2.27
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/LICENSE +21 -21
- package/README.md +125 -125
- package/config/default.json +6 -6
- package/{build/lib → lib}/createFilter.d.ts +13 -13
- package/{build/lib → lib}/createFilter.js +17 -15
- package/lib/createFilter.js.map +1 -0
- package/{build/lib → lib}/createQuery.d.ts +13 -13
- package/{build/lib → lib}/createQuery.js +14 -12
- package/lib/createQuery.js.map +1 -0
- package/{build/lib → lib}/executeQuery.d.ts +5 -5
- package/{build/lib → lib}/executeQuery.js +277 -268
- package/lib/executeQuery.js.map +1 -0
- package/{build/lib → lib}/index.d.ts +6 -6
- package/lib/index.js +14 -0
- package/lib/index.js.map +1 -0
- package/{build/lib → lib}/odataQueryMiddleware.d.ts +3 -3
- package/{build/lib → lib}/odataQueryMiddleware.js +29 -26
- package/lib/odataQueryMiddleware.js.map +1 -0
- package/{build/lib → lib}/sqlOptions.d.ts +7 -7
- package/lib/sqlOptions.js +3 -0
- package/{build/lib → lib}/sqlOptions.js.map +1 -1
- package/{build/lib → lib}/visitor.d.ts +20 -20
- package/{build/lib → lib}/visitor.js +308 -302
- package/lib/visitor.js.map +1 -0
- package/package.json +40 -52
- package/src/{lib/createFilter.ts → createFilter.ts} +26 -26
- package/src/{lib/createQuery.ts → createQuery.ts} +22 -22
- package/src/{lib/executeQuery.ts → executeQuery.ts} +291 -282
- package/src/{lib/index.ts → index.ts} +6 -6
- package/src/{lib/odataQueryMiddleware.ts → odataQueryMiddleware.ts} +17 -17
- package/src/{lib/sqlOptions.ts → sqlOptions.ts} +7 -7
- package/src/{lib/visitor.ts → visitor.ts} +301 -298
- package/tsconfig.json +11 -10
- package/build/example/sql.d.ts +0 -0
- package/build/example/sql.js +0 -131
- package/build/example/sql.js.map +0 -1
- package/build/lib/createFilter.js.map +0 -1
- package/build/lib/createQuery.js.map +0 -1
- package/build/lib/executeQuery.js.map +0 -1
- package/build/lib/index.js +0 -12
- package/build/lib/index.js.map +0 -1
- package/build/lib/odataQueryMiddleware.js.map +0 -1
- package/build/lib/sqlOptions.js +0 -2
- package/build/lib/visitor.js.map +0 -1
- package/src/example/sql.ts +0 -82
- package/src/example/world.sql +0 -5388
|
@@ -1,283 +1,292 @@
|
|
|
1
|
-
import { createQuery } from './createQuery';
|
|
2
|
-
import { SqlOptions } from './sqlOptions';
|
|
3
|
-
import { SQLLang } from 'odata-v4-sql';
|
|
4
|
-
const _ = require("underscore");
|
|
5
|
-
|
|
6
|
-
const mapToObject = (aMap) => {
|
|
7
|
-
const obj = {};
|
|
8
|
-
if (aMap) {
|
|
9
|
-
aMap.forEach((v, k) => {
|
|
10
|
-
obj[k] = v;
|
|
11
|
-
});
|
|
12
|
-
}
|
|
13
|
-
return obj;
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
const queryToOdataString = (query): string => {
|
|
17
|
-
let result = '';
|
|
18
|
-
for (let key in query) {
|
|
19
|
-
if (key.startsWith('$')) {
|
|
20
|
-
if (result !== '') {
|
|
21
|
-
result += '&';
|
|
22
|
-
}
|
|
23
|
-
result += `${key}=${query[key]}`;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
return result;
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
const processIncludes = (queryBuilder: any, odataQuery: any, alias: string) => {
|
|
30
|
-
if (odataQuery.includes && odataQuery.includes.length > 0) {
|
|
31
|
-
odataQuery.includes.forEach(item => {
|
|
32
|
-
queryBuilder = queryBuilder.leftJoinAndSelect(
|
|
33
|
-
(alias ? alias + '.' : '') + item.navigationProperty,
|
|
34
|
-
item.navigationProperty,
|
|
35
|
-
item.where.replace(/typeorm_query/g, item.navigationProperty),
|
|
36
|
-
mapToObject(item.parameters)
|
|
37
|
-
);
|
|
38
|
-
|
|
39
|
-
if (item.orderby && item.orderby != '1') {
|
|
40
|
-
const orders = item.orderby.split(',').map(i => i.trim().replace(/typeorm_query/g, item.navigationProperty));
|
|
41
|
-
orders.forEach((itemOrd) => {
|
|
42
|
-
queryBuilder = queryBuilder.addOrderBy(...(itemOrd.split(' ')));
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
if (item.includes && item.includes.length > 0) {
|
|
47
|
-
processIncludes(queryBuilder, { includes: item.includes }, item.navigationProperty);
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
return queryBuilder;
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
const executeQueryByQueryBuilder = async (inputQueryBuilder, query, options: SqlOptions, returnSql: boolean = false) => {
|
|
56
|
-
const alias = inputQueryBuilder.expressionMap.mainAlias.name;
|
|
57
|
-
options.alias = alias;
|
|
58
|
-
//const filter = createFilter(query.$filter, {alias: alias});
|
|
59
|
-
let odataQuery: any = {};
|
|
60
|
-
if (query) {
|
|
61
|
-
const odataString = queryToOdataString(query);
|
|
62
|
-
if (odataString) {
|
|
63
|
-
odataQuery = createQuery(odataString, options);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
let queryBuilder = inputQueryBuilder;
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
.andWhere(odataQuery.where)
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
// Oracle
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
if (
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
}
|
|
115
|
-
let
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
//
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
}
|
|
264
|
-
const
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
}
|
|
279
|
-
const
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
1
|
+
import { createQuery } from './createQuery';
|
|
2
|
+
import { SqlOptions } from './sqlOptions';
|
|
3
|
+
import { SQLLang } from 'odata-v4-sql';
|
|
4
|
+
const _ = require("underscore");
|
|
5
|
+
|
|
6
|
+
const mapToObject = (aMap) => {
|
|
7
|
+
const obj = {};
|
|
8
|
+
if (aMap) {
|
|
9
|
+
aMap.forEach((v, k) => {
|
|
10
|
+
obj[k] = v;
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
return obj;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const queryToOdataString = (query): string => {
|
|
17
|
+
let result = '';
|
|
18
|
+
for (let key in query) {
|
|
19
|
+
if (key.startsWith('$')) {
|
|
20
|
+
if (result !== '') {
|
|
21
|
+
result += '&';
|
|
22
|
+
}
|
|
23
|
+
result += `${key}=${query[key]}`;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return result;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const processIncludes = (queryBuilder: any, odataQuery: any, alias: string) => {
|
|
30
|
+
if (odataQuery.includes && odataQuery.includes.length > 0) {
|
|
31
|
+
odataQuery.includes.forEach(item => {
|
|
32
|
+
queryBuilder = queryBuilder.leftJoinAndSelect(
|
|
33
|
+
(alias ? alias + '.' : '') + item.navigationProperty,
|
|
34
|
+
item.navigationProperty,
|
|
35
|
+
item.where.replace(/typeorm_query/g, item.navigationProperty),
|
|
36
|
+
mapToObject(item.parameters)
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
if (item.orderby && item.orderby != '1') {
|
|
40
|
+
const orders = item.orderby.split(',').map(i => i.trim().replace(/typeorm_query/g, item.navigationProperty));
|
|
41
|
+
orders.forEach((itemOrd) => {
|
|
42
|
+
queryBuilder = queryBuilder.addOrderBy(...(itemOrd.split(' ')));
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (item.includes && item.includes.length > 0) {
|
|
47
|
+
processIncludes(queryBuilder, { includes: item.includes }, item.navigationProperty);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return queryBuilder;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
const executeQueryByQueryBuilder = async (inputQueryBuilder, query, options: SqlOptions, returnSql: boolean = false) => {
|
|
56
|
+
const alias = inputQueryBuilder.expressionMap.mainAlias.name;
|
|
57
|
+
options.alias = alias;
|
|
58
|
+
//const filter = createFilter(query.$filter, {alias: alias});
|
|
59
|
+
let odataQuery: any = {};
|
|
60
|
+
if (query) {
|
|
61
|
+
const odataString = queryToOdataString(query);
|
|
62
|
+
if (odataString) {
|
|
63
|
+
odataQuery = createQuery(odataString, options);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
let queryBuilder = inputQueryBuilder;
|
|
67
|
+
|
|
68
|
+
if(odataQuery.where){
|
|
69
|
+
queryBuilder = queryBuilder.andWhere(odataQuery.where)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if(odataQuery.parameters){
|
|
73
|
+
queryBuilder = queryBuilder.setParameters(mapToObject(odataQuery.parameters));
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const queryRunner = inputQueryBuilder.obtainQueryRunner();
|
|
77
|
+
const isPaging = query.$skip !== undefined || query.$top !== undefined;
|
|
78
|
+
if (isPaging && query.$top === undefined) {
|
|
79
|
+
query.$top = 100;
|
|
80
|
+
}
|
|
81
|
+
if (queryRunner && isPaging && [SQLLang.MsSql, SQLLang.Oracle].indexOf(options.type) >= 0) {
|
|
82
|
+
// 老版本的SqlServer/Oracle数据库不支持OFFSET FETCH 的语法来翻页,只能单独处理
|
|
83
|
+
// SqlServer 2012版本号options.version为11.0.3128.0,这以下的版本,比如2008/2005都不支持OFFSET FETCH 的语法来翻页
|
|
84
|
+
const oldVersionMsSql = options.type === SQLLang.MsSql && options.version && parseInt(options.version) < 11;
|
|
85
|
+
const tooOldVersionMsSql = oldVersionMsSql && parseInt(options.version) < 9;
|
|
86
|
+
// Oracle 12c版本号options.version为12.2...,这以下的版本,比如10.2都不支持OFFSET FETCH 的语法来翻页
|
|
87
|
+
const oldVersionOracle = options.type === SQLLang.Oracle && options.version && parseInt(options.version) < 12;
|
|
88
|
+
if (oldVersionMsSql || oldVersionOracle) {
|
|
89
|
+
let selectFields = "*";
|
|
90
|
+
if (odataQuery.select && odataQuery.select !== '*') {
|
|
91
|
+
selectFields = odataQuery.select;
|
|
92
|
+
}
|
|
93
|
+
const RowNumberKey = "RowNumber";
|
|
94
|
+
if (oldVersionMsSql) {
|
|
95
|
+
if (tooOldVersionMsSql) {
|
|
96
|
+
queryBuilder = queryBuilder.select(`top ${query.$top} ${selectFields}`);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
let orderby = odataQuery.orderby;
|
|
100
|
+
if (oldVersionMsSql && !(orderby && orderby !== '1')) {
|
|
101
|
+
orderby = "(select null) ASC";
|
|
102
|
+
}
|
|
103
|
+
queryBuilder = queryBuilder.select(`${selectFields},ROW_NUMBER() OVER(ORDER BY ${orderby}) ${RowNumberKey}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
else if (oldVersionOracle) {
|
|
107
|
+
queryBuilder = queryBuilder.select(`${selectFields}`);
|
|
108
|
+
}
|
|
109
|
+
if ((oldVersionOracle || tooOldVersionMsSql) && odataQuery.orderby && odataQuery.orderby !== '1') {
|
|
110
|
+
const orders = odataQuery.orderby.split(',').map(i => i.trim());
|
|
111
|
+
orders.forEach((item) => {
|
|
112
|
+
queryBuilder = queryBuilder.addOrderBy(...(item.split(' ')));
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
let qs = queryBuilder.getQueryAndParameters();
|
|
116
|
+
if (returnSql) {
|
|
117
|
+
return qs;
|
|
118
|
+
}
|
|
119
|
+
let splicedSql = "";
|
|
120
|
+
let start = query.$skip ? query.$skip : 0;
|
|
121
|
+
let end = 0;
|
|
122
|
+
if (query.$top) {
|
|
123
|
+
end = start + query.$top;
|
|
124
|
+
}
|
|
125
|
+
if (oldVersionMsSql) {
|
|
126
|
+
if (tooOldVersionMsSql) {
|
|
127
|
+
splicedSql = `SELECT * FROM (${qs[0]}) A`;
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
let betweenSql = "";
|
|
131
|
+
if (end) {
|
|
132
|
+
betweenSql = `BETWEEN ${start} + 1 and ${end}`;
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
betweenSql = `> ${start}`;
|
|
136
|
+
}
|
|
137
|
+
splicedSql = `SELECT * FROM (${qs[0]}) A WHERE ${RowNumberKey} ${betweenSql}`;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
else if (oldVersionOracle) {
|
|
141
|
+
splicedSql = `SELECT * FROM (SELECT A.*, ROWNUM ${RowNumberKey} FROM (${qs[0]}) A ${end ? ('WHERE ROWNUM <= ' + end) : ''}) b WHERE B.${RowNumberKey} > ${start}`;
|
|
142
|
+
}
|
|
143
|
+
try {
|
|
144
|
+
let getFieldMap = function(columns){
|
|
145
|
+
let map = {};
|
|
146
|
+
_.each(columns, function(column){
|
|
147
|
+
if(column.givenDatabaseName && column.givenDatabaseName != column.propertyName){
|
|
148
|
+
map[column.givenDatabaseName] = column.propertyName
|
|
149
|
+
}
|
|
150
|
+
})
|
|
151
|
+
return map;
|
|
152
|
+
}
|
|
153
|
+
let columnsMap = getFieldMap(queryBuilder.expressionMap.mainAlias.metadata.columns)
|
|
154
|
+
const result = await queryRunner.query(splicedSql, qs[1]);
|
|
155
|
+
let items = result.concat();
|
|
156
|
+
if(!_.isEmpty(columnsMap)){
|
|
157
|
+
items.map(function(item){
|
|
158
|
+
_.each(columnsMap, function(v, k){
|
|
159
|
+
item[v] = item[k];
|
|
160
|
+
delete item[k];
|
|
161
|
+
})
|
|
162
|
+
})
|
|
163
|
+
}
|
|
164
|
+
if (query.$count && query.$count !== 'false') {
|
|
165
|
+
return {
|
|
166
|
+
items: items,
|
|
167
|
+
count: result.length
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
return items;
|
|
172
|
+
}
|
|
173
|
+
} finally {
|
|
174
|
+
if (queryRunner !== queryBuilder.queryRunner) {
|
|
175
|
+
await queryRunner.release();
|
|
176
|
+
}
|
|
177
|
+
if (queryBuilder.connection.driver.options.type === "sqljs") {
|
|
178
|
+
// this.connection.driver instanceof SqljsDriver
|
|
179
|
+
// SqljsDriver is not export from typeorm,so we user driver.options.type to check the SqljsDriver instance
|
|
180
|
+
await queryBuilder.connection.driver.autoSave();
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
if (odataQuery.select && odataQuery.select != '*') {
|
|
187
|
+
queryBuilder = queryBuilder.select(odataQuery.select.split(',').map(i => i.trim()));
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
queryBuilder = processIncludes(queryBuilder, odataQuery, alias);
|
|
191
|
+
|
|
192
|
+
if (odataQuery.orderby && odataQuery.orderby !== '1') {
|
|
193
|
+
const orders = odataQuery.orderby.split(',').map(i => i.trim());
|
|
194
|
+
orders.forEach((item) => {
|
|
195
|
+
queryBuilder = queryBuilder.addOrderBy(...(item.split(' ')));
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
queryBuilder = queryBuilder.skip(query.$skip || 0);
|
|
199
|
+
if (query.$top) {
|
|
200
|
+
queryBuilder = queryBuilder.take(query.$top);
|
|
201
|
+
}
|
|
202
|
+
if (returnSql) {
|
|
203
|
+
return {
|
|
204
|
+
sql: queryBuilder.getSql(),
|
|
205
|
+
query: queryBuilder.getQuery()
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
if (query.$count && query.$count !== 'false') {
|
|
209
|
+
const resultData = await queryBuilder.getManyAndCount();
|
|
210
|
+
return {
|
|
211
|
+
items: resultData[0],
|
|
212
|
+
count: resultData[1]
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
return queryBuilder.getMany();
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
const executeQuery = async (repositoryOrQueryBuilder: any, query, options: SqlOptions) => {
|
|
220
|
+
// options = options || {};
|
|
221
|
+
const alias = options.alias || '';
|
|
222
|
+
let queryBuilder = null;
|
|
223
|
+
|
|
224
|
+
// check that input object is query builder
|
|
225
|
+
if (typeof repositoryOrQueryBuilder.expressionMap !== 'undefined') {
|
|
226
|
+
queryBuilder = repositoryOrQueryBuilder;
|
|
227
|
+
} else {
|
|
228
|
+
queryBuilder = await repositoryOrQueryBuilder.createQueryBuilder(alias);
|
|
229
|
+
}
|
|
230
|
+
const result = await executeQueryByQueryBuilder(queryBuilder, query, options);
|
|
231
|
+
return result;
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
const executeCountQueryByQueryBuilder = async (inputQueryBuilder, query, options: SqlOptions) => {
|
|
236
|
+
const alias = inputQueryBuilder.expressionMap.mainAlias.name;
|
|
237
|
+
options.alias = alias;
|
|
238
|
+
//const filter = createFilter(query.$filter, {alias: alias});
|
|
239
|
+
let odataQuery: any = {};
|
|
240
|
+
if (query) {
|
|
241
|
+
const odataString = queryToOdataString(query);
|
|
242
|
+
if (odataString) {
|
|
243
|
+
odataQuery = createQuery(odataString, options);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
const queryRunner = inputQueryBuilder.obtainQueryRunner();
|
|
247
|
+
let queryBuilder = inputQueryBuilder;
|
|
248
|
+
|
|
249
|
+
if(odataQuery.where){
|
|
250
|
+
queryBuilder = queryBuilder.andWhere(odataQuery.where)
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
if(odataQuery.parameters){
|
|
254
|
+
queryBuilder = queryBuilder.setParameters(mapToObject(odataQuery.parameters));
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
queryBuilder = processIncludes(queryBuilder, odataQuery, alias);
|
|
258
|
+
|
|
259
|
+
return await queryBuilder.getCount();
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
const executeCountQuery = async (repositoryOrQueryBuilder: any, query, options: SqlOptions) => {
|
|
263
|
+
// options = options || {};
|
|
264
|
+
const alias = options.alias || '';
|
|
265
|
+
let queryBuilder = null;
|
|
266
|
+
|
|
267
|
+
// check that input object is query builder
|
|
268
|
+
if (typeof repositoryOrQueryBuilder.expressionMap !== 'undefined') {
|
|
269
|
+
queryBuilder = repositoryOrQueryBuilder;
|
|
270
|
+
} else {
|
|
271
|
+
queryBuilder = repositoryOrQueryBuilder.createQueryBuilder(alias);
|
|
272
|
+
}
|
|
273
|
+
const result = await executeCountQueryByQueryBuilder(queryBuilder, query, options);
|
|
274
|
+
return result;
|
|
275
|
+
};
|
|
276
|
+
|
|
277
|
+
const getExecuteQuerySQL = async (repositoryOrQueryBuilder: any, query, options: SqlOptions) => {
|
|
278
|
+
// options = options || {};
|
|
279
|
+
const alias = options.alias || '';
|
|
280
|
+
let queryBuilder = null;
|
|
281
|
+
|
|
282
|
+
// check that input object is query builder
|
|
283
|
+
if (typeof repositoryOrQueryBuilder.expressionMap !== 'undefined') {
|
|
284
|
+
queryBuilder = repositoryOrQueryBuilder;
|
|
285
|
+
} else {
|
|
286
|
+
queryBuilder = await repositoryOrQueryBuilder.createQueryBuilder(alias);
|
|
287
|
+
}
|
|
288
|
+
const result = executeQueryByQueryBuilder(queryBuilder, query, options, true);
|
|
289
|
+
return result;
|
|
290
|
+
};
|
|
291
|
+
|
|
283
292
|
export { executeQuery, executeCountQuery, getExecuteQuerySQL };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {odataQuery} from './odataQueryMiddleware';
|
|
2
|
-
import { executeQuery, executeCountQuery, getExecuteQuerySQL} from './executeQuery';
|
|
3
|
-
import {SqlOptions} from './sqlOptions';
|
|
4
|
-
import {createQuery} from './createQuery';
|
|
5
|
-
import {createFilter} from './createFilter';
|
|
6
|
-
|
|
1
|
+
import {odataQuery} from './odataQueryMiddleware';
|
|
2
|
+
import { executeQuery, executeCountQuery, getExecuteQuerySQL} from './executeQuery';
|
|
3
|
+
import {SqlOptions} from './sqlOptions';
|
|
4
|
+
import {createQuery} from './createQuery';
|
|
5
|
+
import {createFilter} from './createFilter';
|
|
6
|
+
|
|
7
7
|
export { odataQuery, executeQuery, executeCountQuery, getExecuteQuerySQL, SqlOptions, createQuery, createFilter };
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import {executeQuery} from './executeQuery';
|
|
2
|
-
|
|
3
|
-
function odataQuery(repositoryOrQueryBuilder: any) {
|
|
4
|
-
return async (req: any, res: any, next) => {
|
|
5
|
-
try {
|
|
6
|
-
const alias = '';
|
|
7
|
-
|
|
8
|
-
const result = await executeQuery(repositoryOrQueryBuilder, req.query, {alias});
|
|
9
|
-
return res.status(200).json(result);
|
|
10
|
-
} catch (e) {
|
|
11
|
-
console.log('ODATA ERROR',e);
|
|
12
|
-
res.status(500).json({message: 'Internal server error.', error: {message: e.message}});
|
|
13
|
-
}
|
|
14
|
-
return next();
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
|
|
1
|
+
import {executeQuery} from './executeQuery';
|
|
2
|
+
|
|
3
|
+
function odataQuery(repositoryOrQueryBuilder: any) {
|
|
4
|
+
return async (req: any, res: any, next) => {
|
|
5
|
+
try {
|
|
6
|
+
const alias = '';
|
|
7
|
+
|
|
8
|
+
const result = await executeQuery(repositoryOrQueryBuilder, req.query, {alias});
|
|
9
|
+
return res.status(200).json(result);
|
|
10
|
+
} catch (e) {
|
|
11
|
+
console.log('ODATA ERROR',e);
|
|
12
|
+
res.status(500).json({message: 'Internal server error.', error: {message: e.message}});
|
|
13
|
+
}
|
|
14
|
+
return next();
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
18
|
export {odataQuery, executeQuery};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {SQLLang} from 'odata-v4-sql';
|
|
2
|
-
|
|
3
|
-
export interface SqlOptions {
|
|
4
|
-
useParameters?: boolean;
|
|
5
|
-
type?: SQLLang;
|
|
6
|
-
alias: string;
|
|
7
|
-
version?: string;
|
|
1
|
+
import {SQLLang} from 'odata-v4-sql';
|
|
2
|
+
|
|
3
|
+
export interface SqlOptions {
|
|
4
|
+
useParameters?: boolean;
|
|
5
|
+
type?: SQLLang;
|
|
6
|
+
alias: string;
|
|
7
|
+
version?: string;
|
|
8
8
|
}
|