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