@syncfusion/ej2-querybuilder 24.2.9 → 25.1.35

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 (58) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/ej2-querybuilder.min.js +2 -2
  3. package/dist/ej2-querybuilder.umd.min.js +2 -2
  4. package/dist/ej2-querybuilder.umd.min.js.map +1 -1
  5. package/dist/es6/ej2-querybuilder.es2015.js +1609 -159
  6. package/dist/es6/ej2-querybuilder.es2015.js.map +1 -1
  7. package/dist/es6/ej2-querybuilder.es5.js +1611 -159
  8. package/dist/es6/ej2-querybuilder.es5.js.map +1 -1
  9. package/dist/global/ej2-querybuilder.min.js +2 -2
  10. package/dist/global/ej2-querybuilder.min.js.map +1 -1
  11. package/dist/global/index.d.ts +1 -1
  12. package/package.json +12 -12
  13. package/src/global.js +2 -0
  14. package/src/query-builder/index.d.ts +1 -0
  15. package/src/query-builder/index.js +1 -0
  16. package/src/query-builder/query-builder-model.d.ts +69 -1
  17. package/src/query-builder/query-builder.d.ts +189 -4
  18. package/src/query-builder/query-builder.js +895 -130
  19. package/src/query-builder/query-library.d.ts +24 -0
  20. package/src/query-builder/query-library.js +689 -0
  21. package/styles/bootstrap-dark.css +29 -12
  22. package/styles/bootstrap.css +29 -12
  23. package/styles/bootstrap4.css +25 -12
  24. package/styles/bootstrap5-dark.css +35 -11
  25. package/styles/bootstrap5.css +35 -11
  26. package/styles/fabric-dark.css +25 -12
  27. package/styles/fabric.css +25 -12
  28. package/styles/fluent-dark.css +39 -11
  29. package/styles/fluent.css +39 -11
  30. package/styles/highcontrast-light.css +25 -12
  31. package/styles/highcontrast.css +25 -12
  32. package/styles/material-dark.css +25 -12
  33. package/styles/material.css +25 -12
  34. package/styles/material3-dark.css +25 -12
  35. package/styles/material3.css +25 -12
  36. package/styles/query-builder/_bds-definition.scss +107 -0
  37. package/styles/query-builder/_layout.scss +37 -7
  38. package/styles/query-builder/_theme.scss +16 -1
  39. package/styles/query-builder/bootstrap-dark.css +29 -12
  40. package/styles/query-builder/bootstrap.css +29 -12
  41. package/styles/query-builder/bootstrap4.css +25 -12
  42. package/styles/query-builder/bootstrap5-dark.css +35 -11
  43. package/styles/query-builder/bootstrap5.css +35 -11
  44. package/styles/query-builder/fabric-dark.css +25 -12
  45. package/styles/query-builder/fabric.css +25 -12
  46. package/styles/query-builder/fluent-dark.css +39 -11
  47. package/styles/query-builder/fluent.css +39 -11
  48. package/styles/query-builder/highcontrast-light.css +25 -12
  49. package/styles/query-builder/highcontrast.css +25 -12
  50. package/styles/query-builder/icons/_bds.scss +7 -0
  51. package/styles/query-builder/material-dark.css +25 -12
  52. package/styles/query-builder/material.css +25 -12
  53. package/styles/query-builder/material3-dark.css +25 -12
  54. package/styles/query-builder/material3.css +25 -12
  55. package/styles/query-builder/tailwind-dark.css +30 -11
  56. package/styles/query-builder/tailwind.css +30 -11
  57. package/styles/tailwind-dark.css +30 -11
  58. package/styles/tailwind.css +30 -11
@@ -0,0 +1,689 @@
1
+ import { extend, isNullOrUndefined } from '@syncfusion/ej2-base';
2
+ var QueryLibrary = /** @class */ (function () {
3
+ function QueryLibrary(parent) {
4
+ this.parent = parent;
5
+ this.addEventListener();
6
+ }
7
+ QueryLibrary.prototype.destroy = function () {
8
+ if (this.parent.isDestroyed) {
9
+ return;
10
+ }
11
+ this.removeEventListener();
12
+ };
13
+ QueryLibrary.prototype.addEventListener = function () {
14
+ if (this.parent.isDestroyed) {
15
+ return;
16
+ }
17
+ this.parent.on('query-library', this.queryLibrary, this);
18
+ this.parent.on('destroyed', this.destroy, this);
19
+ };
20
+ QueryLibrary.prototype.removeEventListener = function () {
21
+ this.parent.off('query-library', this.queryLibrary);
22
+ this.parent.off('destroyed', this.destroy);
23
+ };
24
+ QueryLibrary.prototype.queryLibrary = function (args) {
25
+ switch (args.prop) {
26
+ case 'getMongoFromRules':
27
+ args.value['obj']['mongoQuery'] = this.getMongoFromRules(args.value['rule'], args.value['mongoQuery']);
28
+ break;
29
+ case 'mongoParser':
30
+ this.mongoParser(args.value['mongoQuery'], args.value['rule'], args.value['mongoLocale']);
31
+ break;
32
+ case 'getParameterSql':
33
+ args.value['obj']['sql'] = this.getParameterSql(args.value['rule']);
34
+ break;
35
+ case 'getNamedParameterSql':
36
+ args.value['obj']['sql'] = this.getNamedParameterSql(args.value['rule']);
37
+ break;
38
+ case 'convertParamSqlToSql':
39
+ args.value['obj']['sql'] = this.convertParamSqlToSql(args.value['sql']);
40
+ break;
41
+ case 'convertNamedParamSqlToSql':
42
+ args.value['obj']['sql'] = this.convertNamedParamSqlToSql(args.value['sql']);
43
+ break;
44
+ }
45
+ };
46
+ QueryLibrary.prototype.getMongoFromRules = function (rule, mongoQuery) {
47
+ mongoQuery = '{';
48
+ if (rule.condition === 'or') {
49
+ mongoQuery += '"$or":[';
50
+ mongoQuery = this.convertMongoQuery(rule.rules, mongoQuery) + ']';
51
+ }
52
+ else {
53
+ mongoQuery += '"$and":[';
54
+ mongoQuery = this.convertMongoQuery(rule.rules, mongoQuery) + ']';
55
+ }
56
+ mongoQuery += '}';
57
+ return mongoQuery;
58
+ };
59
+ QueryLibrary.prototype.getOperatorFromMongoOperator = function (operator) {
60
+ var operatorValue;
61
+ switch (operator) {
62
+ case '$ne':
63
+ operatorValue = 'notequal';
64
+ break;
65
+ case '$gt':
66
+ operatorValue = 'greaterthan';
67
+ break;
68
+ case '$gte':
69
+ operatorValue = 'greaterthanorequal';
70
+ break;
71
+ case '$lt':
72
+ operatorValue = 'lessthan';
73
+ break;
74
+ case '$lte':
75
+ operatorValue = 'lessthanorequal';
76
+ break;
77
+ case '$nin':
78
+ operatorValue = 'notin';
79
+ break;
80
+ }
81
+ return operatorValue;
82
+ };
83
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
84
+ QueryLibrary.prototype.convertMongoQuery = function (rules, mongoQuery) {
85
+ var _this = this;
86
+ var i = 0;
87
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
88
+ rules.forEach(function (item) {
89
+ i++;
90
+ mongoQuery += '{';
91
+ if (item.rules !== undefined) {
92
+ if (item.condition === 'or') {
93
+ mongoQuery += ' "$or":[';
94
+ mongoQuery = _this.convertMongoQuery(item.rules, mongoQuery) + ']';
95
+ }
96
+ else {
97
+ mongoQuery += ' "$and":[';
98
+ mongoQuery = _this.convertMongoQuery(item.rules, mongoQuery) + ']';
99
+ }
100
+ }
101
+ var itVal = item.type === 'string' && item.operator !== 'in' && item.operator !== 'notin' && item.value && item.value.trim() !== '' ? item.value.replace(/'/g, '\\') : '';
102
+ if (item.type === 'string' && (item.operator === 'in' || item.operator === 'notin') && item.value && item.value.length === 1) {
103
+ itVal = item.value[0].replace(/'/g, '\\');
104
+ }
105
+ var field = item.field ? item.field.substring(0) : '';
106
+ switch (item.operator) {
107
+ case 'contains':
108
+ mongoQuery += '"' + field + '":{"$regex":"' + itVal + '"}';
109
+ break;
110
+ case 'notcontains':
111
+ mongoQuery += '"' + field + '":{"$not":{"$regex":"' + item.value + '"}}';
112
+ break;
113
+ case 'startswith':
114
+ mongoQuery += '"' + field + '":{"$regex":"^' + itVal + '"}';
115
+ break;
116
+ case 'notstartswith':
117
+ mongoQuery += '"' + field + '":{"$not":{"$regex":"^' + item.value + '"}}';
118
+ break;
119
+ case 'endswith':
120
+ mongoQuery += '"' + field + '":{"$regex":"' + itVal + '$"}';
121
+ break;
122
+ case 'notendswith':
123
+ mongoQuery += '"' + field + '":{"$not":{"$regex":"' + item.value + '$"}}';
124
+ break;
125
+ case 'isnull':
126
+ mongoQuery += '"' + field + '": null';
127
+ break;
128
+ case 'isnotnull':
129
+ mongoQuery += '"' + field + '":{"$ne": null}';
130
+ break;
131
+ case 'isempty':
132
+ mongoQuery += '"' + field + '": ""';
133
+ break;
134
+ case 'isnotempty':
135
+ mongoQuery += '"' + field + '":{"$ne": ""}';
136
+ break;
137
+ case 'equal':
138
+ if (item.type === 'string') {
139
+ mongoQuery += '"' + field + '":"' + itVal + '"';
140
+ }
141
+ else if (item.type === 'date') {
142
+ mongoQuery += '"' + field + '":"' + item.value + '"';
143
+ }
144
+ else if (item.type === 'boolean') {
145
+ mongoQuery += '"' + field + '":' + item.value + '';
146
+ }
147
+ else {
148
+ mongoQuery += '"' + field + '":' + item.value + '';
149
+ }
150
+ break;
151
+ case 'notequal':
152
+ if (item.type === 'string') {
153
+ mongoQuery += '"' + field + '":{"$ne":"' + itVal + '"}';
154
+ }
155
+ else if (item.type === 'date') {
156
+ mongoQuery += '"' + field + '":{"$ne":"' + item.value + '"}';
157
+ }
158
+ else {
159
+ mongoQuery += '"' + field + '":{"$ne":' + item.value + '}';
160
+ }
161
+ break;
162
+ case 'in':
163
+ if (item.type === 'string') {
164
+ if (item.value.length > 1) {
165
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
166
+ var s = item.value.map(function (x, j) { return (j < item.value.length ? "\"" + x + "\"" : ''); }).toString();
167
+ s = s.endsWith(',') ? s.substring(0, s.length - 1) : s;
168
+ mongoQuery += '"' + field + '": { "$in": [' + s + ']}';
169
+ }
170
+ else {
171
+ mongoQuery += '"' + field + '": { "$in": ["' + itVal + '"]}';
172
+ }
173
+ }
174
+ else if (item.type === 'number') {
175
+ if (item.value.length > 1) {
176
+ mongoQuery += '"' + field + '": { "$in": [' + item.value.toString() + ']}';
177
+ }
178
+ else {
179
+ mongoQuery += '"' + field + '": { "$in": [' + item.value + ']}';
180
+ }
181
+ }
182
+ break;
183
+ case 'notin':
184
+ if (item.type === 'string') {
185
+ if (item.value.length > 1) {
186
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
187
+ var s = item.value.map(function (x, j) { return (j < item.value.length ? "\"" + x + "\"" : ''); }).toString();
188
+ s = s.endsWith(',') ? s.substring(0, s.length - 1) : s;
189
+ mongoQuery += '"' + field + '": { "$nin": [' + s + ']}';
190
+ }
191
+ else {
192
+ mongoQuery += '"' + field + '": { "$nin": ["' + itVal + '"]}';
193
+ }
194
+ }
195
+ else if (item.type === 'number') {
196
+ if (item.value.length > 1) {
197
+ mongoQuery += '"' + field + '": { "$nin": [' + item.value.toString() + ']}';
198
+ }
199
+ else {
200
+ mongoQuery += '"' + field + '": { "$nin": [' + item.value + ']}';
201
+ }
202
+ }
203
+ break;
204
+ case 'greaterthan':
205
+ if (item.type === 'number') {
206
+ mongoQuery += '"' + field + '": { "$gt": ' + item.value + '}';
207
+ }
208
+ else {
209
+ mongoQuery += '"' + field + '": { "$gt": "' + item.value + '"}';
210
+ }
211
+ break;
212
+ case 'greaterthanorequal':
213
+ if (item.type === 'number') {
214
+ mongoQuery += '"' + field + '": { "$gte": ' + item.value + '}';
215
+ }
216
+ else {
217
+ mongoQuery += '"' + field + '": { "$gte": "' + item.value + '"}';
218
+ }
219
+ break;
220
+ case 'between':
221
+ if (item.type === 'number') {
222
+ mongoQuery += '"' + field + '": {"$gte":' + item.value[0] + ', "$lte":' + item.value[1] + '}';
223
+ }
224
+ else {
225
+ mongoQuery += '"' + field + '": {"$gte": "' + item.value[0] + '", "$lte": "' + item.value[1] + '"}';
226
+ }
227
+ break;
228
+ case 'notbetween':
229
+ if (item.type === 'number') {
230
+ mongoQuery += '"$or":[{"' + field + '": {"$lt":' + item.value[0] + '}}, {"' + field + '": {"$gt":' + item.value[1] + '}}]';
231
+ }
232
+ else {
233
+ mongoQuery += '"$or":[{"' + field + '": {"$lt": "' + item.value[0] + '"}}, {"' + field + '": {"$gt": "' + item.value[1] + '"}}]';
234
+ }
235
+ break;
236
+ case 'lessthan':
237
+ if (item.type === 'number') {
238
+ mongoQuery += '"' + field + '": { "$lt": ' + item.value + '}';
239
+ }
240
+ else {
241
+ mongoQuery += '"' + field + '": { "$lt": "' + item.value + '"}';
242
+ }
243
+ break;
244
+ case 'lessthanorequal':
245
+ if (item.type === 'number') {
246
+ mongoQuery += '"' + field + '": { "$lte": ' + item.value + '}';
247
+ }
248
+ else {
249
+ mongoQuery += '"' + field + '": { "$lte": "' + item.value + '"}';
250
+ }
251
+ break;
252
+ }
253
+ mongoQuery += '}';
254
+ if (rules.length !== i) {
255
+ mongoQuery += ',';
256
+ }
257
+ });
258
+ return mongoQuery;
259
+ };
260
+ QueryLibrary.prototype.mongoParser = function (mongoQuery, rule, mongoLocale) {
261
+ var mongoList;
262
+ if (Object.keys(mongoQuery).indexOf('$and') > -1) {
263
+ mongoList = mongoQuery['$and'];
264
+ rule.condition = 'and';
265
+ }
266
+ else if (Object.keys(mongoQuery).indexOf('$or') > -1) {
267
+ mongoList = mongoQuery['$or'];
268
+ rule.condition = 'or';
269
+ }
270
+ rule.rules = [];
271
+ this.mongoRecursion(mongoList, rule.rules, mongoLocale);
272
+ };
273
+ QueryLibrary.prototype.mongoRecursion = function (mongoList, rules, mongoLocale) {
274
+ var operatorValue;
275
+ var type;
276
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
277
+ var stringValue;
278
+ var key;
279
+ var betweenValue;
280
+ var condition;
281
+ var value;
282
+ var subRules;
283
+ var rule;
284
+ var keyObj;
285
+ var ruleValue;
286
+ for (var i = 0, len = mongoList.length; i < len; i++) {
287
+ var betweenOperatorArray = [];
288
+ var inOperatorArray = [];
289
+ condition = Object.keys(mongoList[i])[0];
290
+ value = mongoList[i][condition];
291
+ if (condition === '$and') {
292
+ if (this.parent.enableNotCondition) {
293
+ subRules = { condition: condition.replace('$', ''), rules: [], not: false };
294
+ }
295
+ else {
296
+ subRules = { condition: condition.replace('$', ''), rules: [] };
297
+ }
298
+ rules.push(subRules);
299
+ this.mongoRecursion(mongoList[i][condition], rules[rules.length - 1].rules, mongoLocale);
300
+ }
301
+ else if (condition === '$or') {
302
+ var notBetween = void 0;
303
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any, max-len
304
+ var innerObject = [];
305
+ var keys = [];
306
+ var firstKey = [];
307
+ var secondKey = [];
308
+ var innerKeys = [];
309
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any, max-len
310
+ var firstValue = [];
311
+ var secondValue = [];
312
+ var innerFirstValue = [];
313
+ var innerSecondValue = [];
314
+ if (Array.isArray(value) && value.length === 2) {
315
+ keys = Object.keys(value);
316
+ innerFirstValue = value[keys[0]];
317
+ innerSecondValue = value[keys[1]];
318
+ if (typeof innerFirstValue === 'object') {
319
+ innerObject = Object.keys(innerFirstValue)[0];
320
+ innerKeys = Object.keys(innerFirstValue[Object.keys(innerFirstValue)[0]]);
321
+ firstKey = innerKeys[0];
322
+ secondKey = Object.keys(innerSecondValue[Object.keys(innerSecondValue)[0]])[0];
323
+ if (firstKey === '$lt' && secondKey === '$gt') {
324
+ operatorValue = 'notbetween';
325
+ // eslint-disable-next-line security/detect-object-injection
326
+ firstValue = innerFirstValue[innerObject][firstKey];
327
+ // eslint-disable-next-line security/detect-object-injection
328
+ secondValue = innerSecondValue[innerObject][secondKey];
329
+ type = typeof firstValue === 'number' ? 'number' : 'date';
330
+ ruleValue = [firstValue, secondValue];
331
+ rule = { field: innerObject, label: innerObject, value: ruleValue, operator: operatorValue, type: type };
332
+ rules.push(rule);
333
+ notBetween = true;
334
+ }
335
+ }
336
+ }
337
+ if (!notBetween) {
338
+ if (this.parent.enableNotCondition) {
339
+ subRules = { condition: condition.replace('$', ''), rules: [], not: false };
340
+ }
341
+ else {
342
+ subRules = { condition: condition.replace('$', ''), rules: [] };
343
+ }
344
+ rules.push(subRules);
345
+ this.mongoRecursion(mongoList[i][condition], rules[rules.length - 1].rules, mongoLocale);
346
+ }
347
+ }
348
+ else {
349
+ value = mongoList[i][condition];
350
+ if (value === null) { // isnull operator
351
+ operatorValue = 'isnull';
352
+ }
353
+ if (typeof value === 'boolean') { // boolean type values
354
+ operatorValue = 'equal';
355
+ type = 'boolean';
356
+ ruleValue = value;
357
+ }
358
+ if (typeof (value) === 'number') {
359
+ ruleValue = value;
360
+ type = 'number';
361
+ operatorValue = 'equal';
362
+ }
363
+ else if (typeof (value) === 'object' && value !== null) {
364
+ keyObj = Object.keys(value);
365
+ for (var i_1 = 0; i_1 < keyObj.length; i_1++) {
366
+ key = keyObj[i_1];
367
+ stringValue = (value)[keyObj[i_1]];
368
+ if (key === '$ne' && isNullOrUndefined(stringValue)) { // not null operator
369
+ operatorValue = 'isnotnull';
370
+ ruleValue = null;
371
+ }
372
+ if (key === '$ne' && typeof stringValue === 'boolean') { // not equal operator for boolean
373
+ operatorValue = 'notequal';
374
+ ruleValue = stringValue;
375
+ type = 'boolean';
376
+ }
377
+ if (keyObj.length >= 2 && keyObj[i_1]) {
378
+ if (typeof (stringValue) == 'object') { // between and notbetween operators
379
+ operatorValue = 'notbetween';
380
+ condition = Object.keys(stringValue)[0];
381
+ betweenValue = [Object.keys(stringValue[condition])[0]];
382
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
383
+ betweenOperatorArray.push(stringValue[condition][betweenValue]);
384
+ type = 'number';
385
+ }
386
+ else {
387
+ operatorValue = 'between';
388
+ betweenOperatorArray.push(stringValue);
389
+ }
390
+ if (typeof (stringValue) === 'number') {
391
+ type = 'number';
392
+ }
393
+ }
394
+ else if (typeof (stringValue) === 'object' && stringValue !== null) { // "in" and "notin" operator
395
+ if (key === '$not' && Object.keys(stringValue)[0] === '$regex') {
396
+ if (stringValue['$regex'].indexOf('^') > -1) {
397
+ operatorValue = 'notstartswith';
398
+ ruleValue = stringValue['$regex'].replace('^', '');
399
+ }
400
+ else if (stringValue['$regex'].indexOf('$') > -1) {
401
+ operatorValue = 'notendswith';
402
+ ruleValue = stringValue['$regex'].replace('$', '');
403
+ }
404
+ else {
405
+ operatorValue = 'notcontains';
406
+ ruleValue = stringValue['$regex'];
407
+ }
408
+ }
409
+ else {
410
+ operatorValue = key === '$in' ? 'in' : 'notin';
411
+ inOperatorArray = stringValue;
412
+ type = typeof (stringValue[0]) === 'number' ? 'number' : 'string';
413
+ }
414
+ }
415
+ else if (typeof (stringValue) === 'number') { // number type values
416
+ operatorValue = this.getOperatorFromMongoOperator(key);
417
+ type = 'number';
418
+ ruleValue = stringValue;
419
+ }
420
+ if (typeof (stringValue) === 'string') { // string type values
421
+ if (key === '$regex') {
422
+ operatorValue = 'contains';
423
+ ruleValue = stringValue;
424
+ type = 'string';
425
+ }
426
+ if (key === '$ne') { // not equal
427
+ if (stringValue !== null && stringValue.length > 0 && isNaN(Date.parse(stringValue))) {
428
+ operatorValue = 'notequal';
429
+ ruleValue = stringValue;
430
+ }
431
+ else if (isNullOrUndefined(stringValue)) { // is not null operator
432
+ operatorValue = 'isnotnull';
433
+ ruleValue = stringValue;
434
+ }
435
+ else if (stringValue === '') { // is not empty operator
436
+ operatorValue = 'isnotempty';
437
+ ruleValue = stringValue;
438
+ }
439
+ type = 'string';
440
+ }
441
+ if (stringValue.indexOf('^') > -1) {
442
+ operatorValue = 'startswith';
443
+ ruleValue = stringValue.replace('^', '');
444
+ type = 'string';
445
+ }
446
+ if (stringValue.indexOf('$') > -1 && key !== '$not') {
447
+ operatorValue = 'endswith';
448
+ ruleValue = stringValue.replace('$', '');
449
+ type = 'string';
450
+ }
451
+ if (!isNaN(Date.parse(stringValue))) { // Date type operators
452
+ operatorValue = operatorValue || this.getOperatorFromMongoOperator(key);
453
+ type = 'date';
454
+ ruleValue = stringValue;
455
+ }
456
+ }
457
+ }
458
+ }
459
+ else if (value && typeof (value) === 'string' && !isNaN(Date.parse(value))) {
460
+ operatorValue = 'equal';
461
+ ruleValue = value;
462
+ type = 'date';
463
+ }
464
+ else if (typeof (value) === 'string' && value !== '' && value !== 'true' && value !== 'false') {
465
+ operatorValue = 'equal';
466
+ ruleValue = value;
467
+ type = 'string';
468
+ }
469
+ else if (typeof (value) === 'string' && value === '') {
470
+ operatorValue = 'isempty';
471
+ ruleValue = value;
472
+ type = 'string';
473
+ }
474
+ if (betweenOperatorArray && betweenOperatorArray.length > 1) { // between opertor value
475
+ rule = { field: condition, label: condition, value: betweenOperatorArray, operator: operatorValue, type: type };
476
+ }
477
+ else if (inOperatorArray && inOperatorArray.length > 1) { // in operator value
478
+ rule = { field: condition, label: condition, value: inOperatorArray, operator: operatorValue, type: type };
479
+ }
480
+ else {
481
+ rule = { field: condition, label: condition, value: ruleValue, operator: operatorValue, type: type };
482
+ }
483
+ rules.push(rule);
484
+ operatorValue = '';
485
+ }
486
+ }
487
+ };
488
+ QueryLibrary.prototype.convertParamSqlToSql = function (sql) {
489
+ var paramSql = sql.sql;
490
+ var paramValues = sql.params;
491
+ var parts = paramSql.split('?');
492
+ var normalSql = parts[0];
493
+ for (var i = 0; i < paramValues.length; i++) {
494
+ normalSql += (typeof (paramValues[i]) === 'string' ? "'" + paramValues[i] + "'" + parts[i + 1] : paramValues[i] + parts[i + 1]);
495
+ }
496
+ if (normalSql.length >= 2 && normalSql[0] === '(' && normalSql[normalSql.length - 1] === ')') {
497
+ normalSql = normalSql.slice(1, -1);
498
+ }
499
+ normalSql = normalSql.replace(/!= ''(?! =)/g, 'IS NOT EMPTY').replace(/= ''/g, 'IS EMPTY');
500
+ return normalSql;
501
+ };
502
+ QueryLibrary.prototype.convertNamedParamSqlToSql = function (sql) {
503
+ var namedParamSql = sql.sql;
504
+ var params = sql.params;
505
+ var normalSql = namedParamSql;
506
+ Object.keys(params).forEach(function (paramName) {
507
+ var paramValue = params[paramName];
508
+ paramName = ':' + paramName;
509
+ normalSql = normalSql.replace(paramName, typeof (paramValue) === 'string' ? "'" + paramValue + "'" : String(paramValue));
510
+ });
511
+ if (normalSql.length >= 2 && normalSql[0] === '(' && normalSql[normalSql.length - 1] === ')') {
512
+ normalSql = normalSql.slice(1, -1);
513
+ }
514
+ normalSql = normalSql.replace(/!= ''(?! =)/g, 'IS NOT EMPTY').replace(/= ''/g, 'IS EMPTY');
515
+ return normalSql;
516
+ };
517
+ QueryLibrary.prototype.getParameterSql = function (qbrule) {
518
+ var qbRule = extend({}, qbrule, null, true);
519
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
520
+ var value = this.updateRuleValue(qbRule, false);
521
+ return this.getParameterSQLVal(this.parent.getSqlFromRules(qbRule), value['ruleVal']);
522
+ };
523
+ QueryLibrary.prototype.getNamedParameterSql = function (qbrule) {
524
+ var qbRule = extend({}, qbrule, null, true);
525
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
526
+ var value = this.updateRuleValue(qbRule, true);
527
+ return this.getNamedParameterSQLVal(this.parent.getSqlFromRules(qbRule), value['namedRuleVal']);
528
+ };
529
+ QueryLibrary.prototype.getParameterSQLVal = function (content, ruleValue) {
530
+ var replacedString = content.replace(/[%']/g, '');
531
+ return { sql: '(' + replacedString + ')', params: ruleValue };
532
+ };
533
+ QueryLibrary.prototype.getNamedParameterSQLVal = function (content, ruleValue) {
534
+ var replacedString = content.replace(/[%']/g, '');
535
+ return { sql: '(' + replacedString + ')', params: ruleValue };
536
+ };
537
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
538
+ QueryLibrary.prototype.updateRuleValue = function (rule, isNamedParameter) {
539
+ var ruleVal = [];
540
+ var namedRuleVal = {};
541
+ var namedParameters = [];
542
+ return this.updateValue(rule.rules, isNamedParameter, ruleVal, namedRuleVal, namedParameters);
543
+ };
544
+ QueryLibrary.prototype.updateValue = function (rules, isNamedParameter, ruleVal,
545
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
546
+ namedRuleVal, namedParameters) {
547
+ if (isNullOrUndefined(rules)) {
548
+ return { ruleVal: ruleVal, namedRuleVal: namedRuleVal };
549
+ }
550
+ for (var i = 0; i < rules.length; i++) {
551
+ if (rules[i].rules) {
552
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
553
+ var value = this.updateValue(rules[i].rules, isNamedParameter, ruleVal, namedRuleVal, namedParameters);
554
+ ruleVal = value['ruleVal'];
555
+ namedRuleVal = value['namedRuleVal'];
556
+ }
557
+ else {
558
+ var namedField = void 0;
559
+ if (rules[i].value instanceof Array) {
560
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
561
+ for (var j = 0; j < (rules[i].value).length; j++) {
562
+ if (isNamedParameter) {
563
+ namedField = this.getNamedParameter(rules[i].field, namedParameters);
564
+ }
565
+ if (!isNullOrUndefined(rules[i].value[j])) {
566
+ if (rules[i].type === 'string' || rules[i].type === 'date') {
567
+ if (isNamedParameter) {
568
+ namedRuleVal[namedField] = rules[i].value[j];
569
+ }
570
+ else {
571
+ ruleVal.push(rules[i].value[j]);
572
+ }
573
+ }
574
+ else {
575
+ if (isNamedParameter) {
576
+ namedRuleVal[namedField] = rules[i].value[j];
577
+ }
578
+ else {
579
+ ruleVal.push(rules[i].value[j]);
580
+ }
581
+ }
582
+ }
583
+ if (isNamedParameter) {
584
+ rules[i].value[j] = ':' + namedField;
585
+ }
586
+ else {
587
+ rules[i].value[j] = '?';
588
+ }
589
+ }
590
+ }
591
+ else {
592
+ if (isNamedParameter) {
593
+ namedField = this.getNamedParameter(rules[i].field, namedParameters);
594
+ }
595
+ if (rules[i].operator.indexOf('null') < 1) {
596
+ if (rules[i].type !== 'string' || (rules[i].type === 'string' && (rules[i].value !== '' || rules[i].value === 0))) {
597
+ if (rules[i].type === 'string' || rules[i].type === 'date') {
598
+ if (rules[i].operator.indexOf('empty') < 1) {
599
+ var value = rules[i].value.toString();
600
+ switch (rules[i].operator) {
601
+ case 'startswith':
602
+ case 'notstartswith':
603
+ value = value + '%';
604
+ break;
605
+ case 'endswith':
606
+ case 'notendswith':
607
+ value = '%' + value;
608
+ break;
609
+ case 'contains':
610
+ case 'notcontains':
611
+ value = '%' + value + '%';
612
+ break;
613
+ }
614
+ if (isNamedParameter) {
615
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
616
+ namedRuleVal[namedField] = value;
617
+ }
618
+ else {
619
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
620
+ ruleVal.push(value);
621
+ }
622
+ }
623
+ else {
624
+ if (isNamedParameter) {
625
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
626
+ namedRuleVal[namedField] = '';
627
+ }
628
+ else {
629
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
630
+ ruleVal.push('');
631
+ }
632
+ if (rules[i].operator === 'isempty') {
633
+ rules[i].operator = 'equal';
634
+ }
635
+ else {
636
+ rules[i].operator = 'notequal';
637
+ }
638
+ }
639
+ }
640
+ else {
641
+ if (!isNullOrUndefined(rules[i].value)) {
642
+ if (isNamedParameter) {
643
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
644
+ namedRuleVal[namedField] = rules[i].value;
645
+ }
646
+ else {
647
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
648
+ ruleVal.push(rules[i].value);
649
+ }
650
+ }
651
+ }
652
+ if (isNamedParameter) {
653
+ rules[i].value = ':' + namedField;
654
+ }
655
+ else {
656
+ rules[i].value = '?';
657
+ }
658
+ }
659
+ }
660
+ }
661
+ }
662
+ }
663
+ return { ruleVal: ruleVal, namedRuleVal: namedRuleVal };
664
+ };
665
+ QueryLibrary.prototype.getNamedParameter = function (field, namedParameters) {
666
+ var newField = null;
667
+ if (namedParameters.length > 0) {
668
+ for (var i = namedParameters.length - 1; i >= 0; i--) {
669
+ var currField = namedParameters[i];
670
+ if (currField.indexOf(field) > -1) {
671
+ var idx = parseInt(currField.split('_')[1], 10) + 1;
672
+ newField = field + '_' + idx;
673
+ namedParameters.push(newField);
674
+ break;
675
+ }
676
+ }
677
+ }
678
+ if (!newField) {
679
+ newField = field + '_1';
680
+ namedParameters.push(newField);
681
+ }
682
+ return newField;
683
+ };
684
+ QueryLibrary.prototype.getModuleName = function () {
685
+ return 'query-library';
686
+ };
687
+ return QueryLibrary;
688
+ }());
689
+ export { QueryLibrary };