@stamhoofd/sql 2.83.5 → 2.84.0

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 (176) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +9 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/src/QueryableModel.d.ts +1 -0
  6. package/dist/src/QueryableModel.d.ts.map +1 -1
  7. package/dist/src/QueryableModel.js +20 -2
  8. package/dist/src/QueryableModel.js.map +1 -1
  9. package/dist/src/SQL.d.ts +9 -16
  10. package/dist/src/SQL.d.ts.map +1 -1
  11. package/dist/src/SQL.js +16 -13
  12. package/dist/src/SQL.js.map +1 -1
  13. package/dist/src/SQLDelete.d.ts +2 -2
  14. package/dist/src/SQLDelete.d.ts.map +1 -1
  15. package/dist/src/SQLDelete.js +13 -3
  16. package/dist/src/SQLDelete.js.map +1 -1
  17. package/dist/src/SQLExpression.d.ts +3 -0
  18. package/dist/src/SQLExpression.d.ts.map +1 -1
  19. package/dist/src/SQLExpression.js.map +1 -1
  20. package/dist/src/SQLExpressions.d.ts +17 -6
  21. package/dist/src/SQLExpressions.d.ts.map +1 -1
  22. package/dist/src/SQLExpressions.js +20 -12
  23. package/dist/src/SQLExpressions.js.map +1 -1
  24. package/dist/src/SQLJoin.d.ts +3 -3
  25. package/dist/src/SQLJoin.d.ts.map +1 -1
  26. package/dist/src/SQLJoin.js +5 -1
  27. package/dist/src/SQLJoin.js.map +1 -1
  28. package/dist/src/SQLJsonExpressions.d.ts +22 -0
  29. package/dist/src/SQLJsonExpressions.d.ts.map +1 -1
  30. package/dist/src/SQLJsonExpressions.js +56 -4
  31. package/dist/src/SQLJsonExpressions.js.map +1 -1
  32. package/dist/src/SQLSelect.d.ts +10 -4
  33. package/dist/src/SQLSelect.d.ts.map +1 -1
  34. package/dist/src/SQLSelect.js +25 -11
  35. package/dist/src/SQLSelect.js.map +1 -1
  36. package/dist/src/SQLWhere.d.ts +29 -1
  37. package/dist/src/SQLWhere.d.ts.map +1 -1
  38. package/dist/src/SQLWhere.js +181 -12
  39. package/dist/src/SQLWhere.js.map +1 -1
  40. package/dist/src/filters/SQLFilter.d.ts +1 -0
  41. package/dist/src/filters/SQLFilter.d.ts.map +1 -1
  42. package/dist/src/filters/SQLFilter.js +8 -0
  43. package/dist/src/filters/SQLFilter.js.map +1 -1
  44. package/dist/src/filters/modern/SQLModernFilter.d.ts +73 -0
  45. package/dist/src/filters/modern/SQLModernFilter.d.ts.map +1 -0
  46. package/dist/src/filters/modern/SQLModernFilter.js +200 -0
  47. package/dist/src/filters/modern/SQLModernFilter.js.map +1 -0
  48. package/dist/src/filters/modern/compilers/contains.d.ts +4 -0
  49. package/dist/src/filters/modern/compilers/contains.d.ts.map +1 -0
  50. package/dist/src/filters/modern/compilers/contains.js +28 -0
  51. package/dist/src/filters/modern/compilers/contains.js.map +1 -0
  52. package/dist/src/filters/modern/compilers/equals.d.ts +4 -0
  53. package/dist/src/filters/modern/compilers/equals.d.ts.map +1 -0
  54. package/dist/src/filters/modern/compilers/equals.js +46 -0
  55. package/dist/src/filters/modern/compilers/equals.js.map +1 -0
  56. package/dist/src/filters/modern/compilers/greater.d.ts +4 -0
  57. package/dist/src/filters/modern/compilers/greater.d.ts.map +1 -0
  58. package/dist/src/filters/modern/compilers/greater.js +17 -0
  59. package/dist/src/filters/modern/compilers/greater.js.map +1 -0
  60. package/dist/src/filters/modern/compilers/in.d.ts +4 -0
  61. package/dist/src/filters/modern/compilers/in.d.ts.map +1 -0
  62. package/dist/src/filters/modern/compilers/in.js +50 -0
  63. package/dist/src/filters/modern/compilers/in.js.map +1 -0
  64. package/dist/src/filters/modern/compilers/index.d.ts +5 -0
  65. package/dist/src/filters/modern/compilers/index.d.ts.map +1 -0
  66. package/dist/src/filters/modern/compilers/index.js +8 -0
  67. package/dist/src/filters/modern/compilers/index.js.map +1 -0
  68. package/dist/src/filters/modern/compilers/less.d.ts +4 -0
  69. package/dist/src/filters/modern/compilers/less.d.ts.map +1 -0
  70. package/dist/src/filters/modern/compilers/less.js +17 -0
  71. package/dist/src/filters/modern/compilers/less.js.map +1 -0
  72. package/dist/src/filters/modern/helpers/isJSONColumn.d.ts +4 -0
  73. package/dist/src/filters/modern/helpers/isJSONColumn.d.ts.map +1 -0
  74. package/dist/src/filters/modern/helpers/isJSONColumn.js +16 -0
  75. package/dist/src/filters/modern/helpers/isJSONColumn.js.map +1 -0
  76. package/dist/src/filters/modern/helpers/normalizeCompareValue.d.ts +9 -0
  77. package/dist/src/filters/modern/helpers/normalizeCompareValue.d.ts.map +1 -0
  78. package/dist/src/filters/modern/helpers/normalizeCompareValue.js +82 -0
  79. package/dist/src/filters/modern/helpers/normalizeCompareValue.js.map +1 -0
  80. package/dist/tests/filters/$and.test.d.ts +2 -0
  81. package/dist/tests/filters/$and.test.d.ts.map +1 -0
  82. package/dist/tests/filters/$and.test.js +185 -0
  83. package/dist/tests/filters/$and.test.js.map +1 -0
  84. package/dist/tests/filters/$contains.test.d.ts +2 -0
  85. package/dist/tests/filters/$contains.test.d.ts.map +1 -0
  86. package/dist/tests/filters/$contains.test.js +701 -0
  87. package/dist/tests/filters/$contains.test.js.map +1 -0
  88. package/dist/tests/filters/$eq.test.d.ts +2 -0
  89. package/dist/tests/filters/$eq.test.d.ts.map +1 -0
  90. package/dist/tests/filters/$eq.test.js +986 -0
  91. package/dist/tests/filters/$eq.test.js.map +1 -0
  92. package/dist/tests/filters/$gt.test.d.ts +2 -0
  93. package/dist/tests/filters/$gt.test.d.ts.map +1 -0
  94. package/dist/tests/filters/$gt.test.js +463 -0
  95. package/dist/tests/filters/$gt.test.js.map +1 -0
  96. package/dist/tests/filters/$gte.test.d.ts +2 -0
  97. package/dist/tests/filters/$gte.test.d.ts.map +1 -0
  98. package/dist/tests/filters/$gte.test.js +433 -0
  99. package/dist/tests/filters/$gte.test.js.map +1 -0
  100. package/dist/tests/filters/$in.test.d.ts +2 -0
  101. package/dist/tests/filters/$in.test.d.ts.map +1 -0
  102. package/dist/tests/filters/$in.test.js +590 -0
  103. package/dist/tests/filters/$in.test.js.map +1 -0
  104. package/dist/tests/filters/$lt.test.d.ts +2 -0
  105. package/dist/tests/filters/$lt.test.d.ts.map +1 -0
  106. package/dist/tests/filters/$lt.test.js +433 -0
  107. package/dist/tests/filters/$lt.test.js.map +1 -0
  108. package/dist/tests/filters/$lte.test.d.ts +2 -0
  109. package/dist/tests/filters/$lte.test.d.ts.map +1 -0
  110. package/dist/tests/filters/$lte.test.js +472 -0
  111. package/dist/tests/filters/$lte.test.js.map +1 -0
  112. package/dist/tests/filters/$neq.test.d.ts +2 -0
  113. package/dist/tests/filters/$neq.test.d.ts.map +1 -0
  114. package/dist/tests/filters/$neq.test.js +32 -0
  115. package/dist/tests/filters/$neq.test.js.map +1 -0
  116. package/dist/tests/filters/$not.test.d.ts +2 -0
  117. package/dist/tests/filters/$not.test.d.ts.map +1 -0
  118. package/dist/tests/filters/$not.test.js +50 -0
  119. package/dist/tests/filters/$not.test.js.map +1 -0
  120. package/dist/tests/filters/$or.test.d.ts +2 -0
  121. package/dist/tests/filters/$or.test.d.ts.map +1 -0
  122. package/dist/tests/filters/$or.test.js +185 -0
  123. package/dist/tests/filters/$or.test.js.map +1 -0
  124. package/dist/tests/filters/dot-syntax.test.d.ts +2 -0
  125. package/dist/tests/filters/dot-syntax.test.d.ts.map +1 -0
  126. package/dist/tests/filters/dot-syntax.test.js +210 -0
  127. package/dist/tests/filters/dot-syntax.test.js.map +1 -0
  128. package/dist/tests/filters/exists.test.d.ts +2 -0
  129. package/dist/tests/filters/exists.test.d.ts.map +1 -0
  130. package/dist/tests/filters/exists.test.js +106 -0
  131. package/dist/tests/filters/exists.test.js.map +1 -0
  132. package/dist/tests/filters/joined-relations.test.d.ts +2 -0
  133. package/dist/tests/filters/joined-relations.test.d.ts.map +1 -0
  134. package/dist/tests/filters/joined-relations.test.js +167 -0
  135. package/dist/tests/filters/joined-relations.test.js.map +1 -0
  136. package/dist/tests/filters/special-cases.test.d.ts +2 -0
  137. package/dist/tests/filters/special-cases.test.d.ts.map +1 -0
  138. package/dist/tests/filters/special-cases.test.js +114 -0
  139. package/dist/tests/filters/special-cases.test.js.map +1 -0
  140. package/dist/tests/filters/wildcard.test.d.ts +2 -0
  141. package/dist/tests/filters/wildcard.test.d.ts.map +1 -0
  142. package/dist/tests/filters/wildcard.test.js +67 -0
  143. package/dist/tests/filters/wildcard.test.js.map +1 -0
  144. package/dist/tests/jest.global.setup.d.ts +3 -0
  145. package/dist/tests/jest.global.setup.d.ts.map +1 -0
  146. package/dist/tests/jest.global.setup.js +7 -0
  147. package/dist/tests/jest.global.setup.js.map +1 -0
  148. package/dist/tests/jest.setup.d.ts +2 -0
  149. package/dist/tests/jest.setup.d.ts.map +1 -0
  150. package/dist/tests/jest.setup.js +5 -0
  151. package/dist/tests/jest.setup.js.map +1 -0
  152. package/dist/tests/utils/index.d.ts +57 -0
  153. package/dist/tests/utils/index.d.ts.map +1 -0
  154. package/dist/tests/utils/index.js +206 -0
  155. package/dist/tests/utils/index.js.map +1 -0
  156. package/dist/tsconfig.tsbuildinfo +1 -1
  157. package/package.json +4 -3
  158. package/src/QueryableModel.ts +22 -2
  159. package/src/SQL.ts +21 -30
  160. package/src/SQLDelete.ts +26 -15
  161. package/src/SQLExpression.ts +4 -0
  162. package/src/SQLExpressions.ts +23 -14
  163. package/src/SQLJoin.ts +8 -4
  164. package/src/SQLJsonExpressions.ts +65 -4
  165. package/src/SQLSelect.ts +31 -15
  166. package/src/SQLWhere.ts +208 -13
  167. package/src/filters/SQLFilter.ts +8 -0
  168. package/src/filters/modern/SQLModernFilter.ts +256 -0
  169. package/src/filters/modern/compilers/contains.ts +43 -0
  170. package/src/filters/modern/compilers/equals.ts +72 -0
  171. package/src/filters/modern/compilers/greater.ts +20 -0
  172. package/src/filters/modern/compilers/in.ts +62 -0
  173. package/src/filters/modern/compilers/index.ts +4 -0
  174. package/src/filters/modern/compilers/less.ts +19 -0
  175. package/src/filters/modern/helpers/isJSONColumn.ts +13 -0
  176. package/src/filters/modern/helpers/normalizeCompareValue.ts +95 -0
@@ -0,0 +1,701 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const SQLModernFilter_1 = require("../../src/filters/modern/SQLModernFilter");
4
+ const SQL_1 = require("../../src/SQL");
5
+ const utils_1 = require("../utils");
6
+ describe('$contains', () => {
7
+ /**
8
+ * Tests that should be repeated for all filter types
9
+ */
10
+ describe('Common checks', () => {
11
+ // todo
12
+ });
13
+ it('Throws when passing non-string values', async () => {
14
+ const filters = {
15
+ ...SQLModernFilter_1.baseModernSQLFilterCompilers,
16
+ name: (0, SQLModernFilter_1.createColumnFilter)({ expression: SQL_1.SQL.column('name'), type: SQLModernFilter_1.SQLModernValueType.String, nullable: false }),
17
+ };
18
+ await (0, utils_1.testMultipleErrors)({
19
+ testFilters: [
20
+ {
21
+ name: {
22
+ $contains: ['test'],
23
+ },
24
+ },
25
+ ],
26
+ filters,
27
+ error: 'Invalid compare value',
28
+ });
29
+ await (0, utils_1.testMultipleErrors)({
30
+ testFilters: [
31
+ {
32
+ name: {
33
+ $contains: 123,
34
+ },
35
+ },
36
+ {
37
+ name: {
38
+ $contains: true,
39
+ },
40
+ },
41
+ ],
42
+ filters,
43
+ error: 'Cannot compare',
44
+ });
45
+ await (0, utils_1.testMultipleErrors)({
46
+ testFilters: [
47
+ {
48
+ name: {
49
+ $contains: null,
50
+ },
51
+ },
52
+ ],
53
+ filters,
54
+ error: 'Expected string at $contains filter',
55
+ });
56
+ });
57
+ describe('Searching in native string columns', () => {
58
+ it('Removes caps in the query', async () => {
59
+ const filters = {
60
+ ...SQLModernFilter_1.baseModernSQLFilterCompilers,
61
+ name: (0, SQLModernFilter_1.createColumnFilter)({ expression: SQL_1.SQL.column('name'), type: SQLModernFilter_1.SQLModernValueType.String, nullable: false }),
62
+ };
63
+ await (0, utils_1.test)({
64
+ filter: {
65
+ name: {
66
+ $contains: 'Caps Are Removed',
67
+ },
68
+ },
69
+ filters,
70
+ query: {
71
+ query: '`default`.`name` LIKE ?',
72
+ params: ['%caps are removed%'],
73
+ },
74
+ });
75
+ });
76
+ it('Escapes percentage', async () => {
77
+ const filters = {
78
+ ...SQLModernFilter_1.baseModernSQLFilterCompilers,
79
+ name: (0, SQLModernFilter_1.createColumnFilter)({ expression: SQL_1.SQL.column('name'), type: SQLModernFilter_1.SQLModernValueType.String, nullable: false }),
80
+ };
81
+ await (0, utils_1.test)({
82
+ filter: {
83
+ name: {
84
+ $contains: '%',
85
+ },
86
+ },
87
+ filters,
88
+ query: {
89
+ query: '`default`.`name` LIKE ?',
90
+ params: ['%\\%%'],
91
+ },
92
+ });
93
+ });
94
+ it('Escapes underscore', async () => {
95
+ const filters = {
96
+ ...SQLModernFilter_1.baseModernSQLFilterCompilers,
97
+ name: (0, SQLModernFilter_1.createColumnFilter)({ expression: SQL_1.SQL.column('name'), type: SQLModernFilter_1.SQLModernValueType.String, nullable: false }),
98
+ };
99
+ await (0, utils_1.test)({
100
+ filter: {
101
+ name: {
102
+ $contains: '_',
103
+ },
104
+ },
105
+ filters,
106
+ query: {
107
+ query: '`default`.`name` LIKE ?',
108
+ params: ['%\\_%'],
109
+ },
110
+ });
111
+ });
112
+ it('Escapes backslash characters', async () => {
113
+ const filters = {
114
+ ...SQLModernFilter_1.baseModernSQLFilterCompilers,
115
+ name: (0, SQLModernFilter_1.createColumnFilter)({ expression: SQL_1.SQL.column('name'), type: SQLModernFilter_1.SQLModernValueType.String, nullable: false }),
116
+ };
117
+ await (0, utils_1.test)({
118
+ filter: {
119
+ name: {
120
+ $contains: '\\%',
121
+ },
122
+ },
123
+ filters,
124
+ query: {
125
+ query: '`default`.`name` LIKE ?',
126
+ params: ['%\\\\\\%%'],
127
+ },
128
+ });
129
+ });
130
+ });
131
+ describe('MySQL behaviour', () => {
132
+ describe('Native MySQL strings', () => {
133
+ const tableDefinition = {
134
+ name: {
135
+ type: 'varchar',
136
+ nullable: true,
137
+ },
138
+ };
139
+ const filters = {
140
+ ...SQLModernFilter_1.baseModernSQLFilterCompilers,
141
+ name: (0, SQLModernFilter_1.createColumnFilter)({ expression: SQL_1.SQL.column('name'), type: SQLModernFilter_1.SQLModernValueType.String, nullable: true }),
142
+ };
143
+ it('Can actually search for %', async () => {
144
+ await (0, utils_1.testMatch)({
145
+ tableDefinition,
146
+ filters,
147
+ rows: [
148
+ {
149
+ name: 'This contains 50% more',
150
+ },
151
+ ],
152
+ doMatch: [
153
+ {
154
+ name: {
155
+ $contains: '50%',
156
+ },
157
+ },
158
+ {
159
+ name: {
160
+ $contains: '0%',
161
+ },
162
+ },
163
+ {
164
+ name: {
165
+ $contains: '%',
166
+ },
167
+ },
168
+ ],
169
+ doNotMatch: [
170
+ {
171
+ name: {
172
+ $contains: '%%',
173
+ },
174
+ },
175
+ {
176
+ name: {
177
+ $contains: '%50',
178
+ },
179
+ },
180
+ ],
181
+ });
182
+ });
183
+ it('Does not return values without % when filtering for %', async () => {
184
+ await (0, utils_1.testMatch)({
185
+ tableDefinition,
186
+ filters,
187
+ rows: [
188
+ {
189
+ name: 'This contains 50 percent more',
190
+ },
191
+ ],
192
+ doNotMatch: [
193
+ {
194
+ name: {
195
+ $contains: '%',
196
+ },
197
+ },
198
+ ],
199
+ });
200
+ });
201
+ it('Can actually search for _', async () => {
202
+ await (0, utils_1.testMatch)({
203
+ tableDefinition,
204
+ filters,
205
+ rows: [
206
+ {
207
+ name: 'john_doe@example.com',
208
+ },
209
+ ],
210
+ doMatch: [
211
+ {
212
+ name: {
213
+ $contains: 'john_doe',
214
+ },
215
+ },
216
+ {
217
+ name: {
218
+ $contains: '_',
219
+ },
220
+ },
221
+ {
222
+ name: {
223
+ $contains: '_doe',
224
+ },
225
+ },
226
+ ],
227
+ doNotMatch: [
228
+ {
229
+ name: {
230
+ $contains: '__',
231
+ },
232
+ },
233
+ {
234
+ name: {
235
+ $contains: 'john__doe',
236
+ },
237
+ },
238
+ ],
239
+ });
240
+ });
241
+ it('Does not return values without _ when filtering for _', async () => {
242
+ await (0, utils_1.testMatch)({
243
+ tableDefinition,
244
+ filters,
245
+ rows: [
246
+ {
247
+ name: 'johndoe@example.com',
248
+ },
249
+ ],
250
+ doNotMatch: [
251
+ {
252
+ name: {
253
+ $contains: '_',
254
+ },
255
+ },
256
+ {
257
+ name: {
258
+ $contains: 'john_',
259
+ },
260
+ },
261
+ ],
262
+ });
263
+ });
264
+ it('Can search for backslash', async () => {
265
+ await (0, utils_1.testMatch)({
266
+ tableDefinition,
267
+ filters,
268
+ rows: [
269
+ {
270
+ name: 'john\\%doe',
271
+ },
272
+ ],
273
+ doMatch: [
274
+ {
275
+ name: {
276
+ $contains: '\\',
277
+ },
278
+ },
279
+ {
280
+ name: {
281
+ $contains: '\\%',
282
+ },
283
+ },
284
+ ],
285
+ doNotMatch: [
286
+ {
287
+ name: {
288
+ $contains: '\\_',
289
+ },
290
+ },
291
+ {
292
+ name: {
293
+ $contains: '\\\\',
294
+ },
295
+ },
296
+ ],
297
+ });
298
+ await (0, utils_1.testMatch)({
299
+ tableDefinition,
300
+ filters,
301
+ rows: [
302
+ {
303
+ name: 'john\\doe',
304
+ },
305
+ ],
306
+ doNotMatch: [
307
+ {
308
+ name: {
309
+ $contains: '\\%',
310
+ },
311
+ },
312
+ ],
313
+ });
314
+ });
315
+ });
316
+ // Same, but for JSON strings:
317
+ describe('JSON strings', () => {
318
+ const tableDefinition = {
319
+ settings: {
320
+ type: 'json',
321
+ nullable: true,
322
+ },
323
+ };
324
+ const filters = {
325
+ ...SQLModernFilter_1.baseModernSQLFilterCompilers,
326
+ 'settings.name': (0, SQLModernFilter_1.createColumnFilter)({ expression: SQL_1.SQL.jsonValue(SQL_1.SQL.column('settings'), '$.name'), type: SQLModernFilter_1.SQLModernValueType.JSONString, nullable: false }),
327
+ };
328
+ it('Can actually search for %', async () => {
329
+ await (0, utils_1.testMatch)({
330
+ tableDefinition,
331
+ filters,
332
+ rows: [
333
+ {
334
+ settings: {
335
+ name: 'This contains 50% more',
336
+ },
337
+ },
338
+ ],
339
+ doMatch: [
340
+ {
341
+ 'settings.name': {
342
+ $contains: '50%',
343
+ },
344
+ },
345
+ {
346
+ 'settings.name': {
347
+ $contains: '0%',
348
+ },
349
+ },
350
+ {
351
+ 'settings.name': {
352
+ $contains: '%',
353
+ },
354
+ },
355
+ ],
356
+ doNotMatch: [
357
+ {
358
+ 'settings.name': {
359
+ $contains: '%%',
360
+ },
361
+ },
362
+ {
363
+ 'settings.name': {
364
+ $contains: '%50',
365
+ },
366
+ },
367
+ ],
368
+ });
369
+ });
370
+ it('Does not return values without % when filtering for %', async () => {
371
+ await (0, utils_1.testMatch)({
372
+ tableDefinition,
373
+ filters,
374
+ rows: [
375
+ {
376
+ settings: {
377
+ name: 'This contains 50 percent more',
378
+ },
379
+ },
380
+ ],
381
+ doNotMatch: [
382
+ {
383
+ 'settings.name': {
384
+ $contains: '%',
385
+ },
386
+ },
387
+ ],
388
+ });
389
+ });
390
+ it('Can actually search for _', async () => {
391
+ await (0, utils_1.testMatch)({
392
+ tableDefinition,
393
+ filters,
394
+ rows: [
395
+ {
396
+ settings: {
397
+ name: 'john_doe@example.com',
398
+ },
399
+ },
400
+ ],
401
+ doMatch: [
402
+ {
403
+ 'settings.name': {
404
+ $contains: 'john_doe',
405
+ },
406
+ },
407
+ {
408
+ 'settings.name': {
409
+ $contains: '_',
410
+ },
411
+ },
412
+ {
413
+ 'settings.name': {
414
+ $contains: '_doe',
415
+ },
416
+ },
417
+ ],
418
+ doNotMatch: [
419
+ {
420
+ 'settings.name': {
421
+ $contains: '__',
422
+ },
423
+ },
424
+ {
425
+ 'settings.name': {
426
+ $contains: 'john__doe',
427
+ },
428
+ },
429
+ ],
430
+ });
431
+ });
432
+ it('Does not return values without _ when filtering for _', async () => {
433
+ await (0, utils_1.testMatch)({
434
+ tableDefinition,
435
+ filters,
436
+ rows: [
437
+ {
438
+ settings: {
439
+ name: 'johndoe@example.com',
440
+ },
441
+ },
442
+ ],
443
+ doNotMatch: [
444
+ {
445
+ 'settings.name': {
446
+ $contains: '_',
447
+ },
448
+ },
449
+ {
450
+ 'settings.name': {
451
+ $contains: 'john_',
452
+ },
453
+ },
454
+ ],
455
+ });
456
+ });
457
+ it('Can search for backslash', async () => {
458
+ await (0, utils_1.testMatch)({
459
+ tableDefinition,
460
+ filters,
461
+ rows: [
462
+ {
463
+ settings: {
464
+ name: 'john\\%doe',
465
+ },
466
+ },
467
+ ],
468
+ doMatch: [
469
+ {
470
+ 'settings.name': {
471
+ $contains: '\\',
472
+ },
473
+ },
474
+ {
475
+ 'settings.name': {
476
+ $contains: '\\%',
477
+ },
478
+ },
479
+ ],
480
+ doNotMatch: [
481
+ {
482
+ 'settings.name': {
483
+ $contains: '\\_',
484
+ },
485
+ },
486
+ {
487
+ 'settings.name': {
488
+ $contains: '\\\\',
489
+ },
490
+ },
491
+ ],
492
+ });
493
+ await (0, utils_1.testMatch)({
494
+ tableDefinition,
495
+ filters,
496
+ rows: [
497
+ {
498
+ settings: {
499
+ name: 'john\\doe',
500
+ },
501
+ },
502
+ ],
503
+ doNotMatch: [
504
+ {
505
+ 'settings.name': {
506
+ $contains: '\\%',
507
+ },
508
+ },
509
+ ],
510
+ });
511
+ });
512
+ });
513
+ describe('JSON arrays', () => {
514
+ const tableDefinition = {
515
+ settings: {
516
+ type: 'json',
517
+ nullable: true,
518
+ },
519
+ };
520
+ const filters = {
521
+ ...SQLModernFilter_1.baseModernSQLFilterCompilers,
522
+ settings: {
523
+ ...SQLModernFilter_1.baseModernSQLFilterCompilers,
524
+ names: (0, SQLModernFilter_1.createColumnFilter)({ expression: SQL_1.SQL.jsonValue(SQL_1.SQL.column('settings'), '$.names'), type: SQLModernFilter_1.SQLModernValueType.JSONArray, nullable: false }),
525
+ },
526
+ };
527
+ it('Can search in the array', async () => {
528
+ await (0, utils_1.testMatch)({
529
+ tableDefinition,
530
+ filters,
531
+ rows: [
532
+ {
533
+ settings: {
534
+ names: ['apple', 'BAnana', 'cherry'],
535
+ },
536
+ },
537
+ ],
538
+ doMatch: [
539
+ {
540
+ 'settings.names': {
541
+ $contains: 'pple',
542
+ },
543
+ },
544
+ {
545
+ settings: {
546
+ names: {
547
+ $contains: 'pple',
548
+ },
549
+ },
550
+ },
551
+ {
552
+ 'settings.names': {
553
+ $contains: 'banana',
554
+ },
555
+ },
556
+ {
557
+ 'settings.names': {
558
+ $contains: 'BAnana',
559
+ },
560
+ },
561
+ ],
562
+ doNotMatch: [
563
+ {
564
+ 'settings.names': {
565
+ $contains: 'chrry',
566
+ },
567
+ },
568
+ ],
569
+ });
570
+ });
571
+ it('Can search for % in the array', async () => {
572
+ await (0, utils_1.testMatch)({
573
+ tableDefinition,
574
+ filters,
575
+ rows: [
576
+ {
577
+ settings: {
578
+ names: ['apple', 'BAn%ana', 'cherry'],
579
+ },
580
+ },
581
+ ],
582
+ doMatch: [
583
+ {
584
+ 'settings.names': {
585
+ $contains: '%',
586
+ },
587
+ },
588
+ {
589
+ 'settings.names': {
590
+ $contains: 'BAn%ana',
591
+ },
592
+ },
593
+ ],
594
+ doNotMatch: [
595
+ {
596
+ 'settings.names': {
597
+ $contains: 'BAnana',
598
+ },
599
+ },
600
+ {
601
+ 'settings.names': {
602
+ $contains: '%%',
603
+ },
604
+ },
605
+ ],
606
+ });
607
+ });
608
+ it('Can search for backslash in the array', async () => {
609
+ await (0, utils_1.testMatch)({
610
+ tableDefinition,
611
+ filters,
612
+ rows: [
613
+ {
614
+ settings: {
615
+ names: ['apple', 'BAn\\ana', 'cherry'],
616
+ },
617
+ },
618
+ ],
619
+ doMatch: [
620
+ {
621
+ 'settings.names': {
622
+ $contains: '\\',
623
+ },
624
+ },
625
+ {
626
+ 'settings.names': {
627
+ $contains: 'BAn\\ana',
628
+ },
629
+ },
630
+ ],
631
+ doNotMatch: [
632
+ {
633
+ 'settings.names': {
634
+ $contains: 'BAnana',
635
+ },
636
+ },
637
+ {
638
+ 'settings.names': {
639
+ $contains: '\\\\',
640
+ },
641
+ },
642
+ ],
643
+ });
644
+ });
645
+ });
646
+ describe('JSON wildcard arrays', () => {
647
+ const tableDefinition = {
648
+ settings: {
649
+ type: 'json',
650
+ nullable: true,
651
+ },
652
+ };
653
+ const filters = {
654
+ ...SQLModernFilter_1.baseModernSQLFilterCompilers,
655
+ 'settings.names': (0, SQLModernFilter_1.createColumnFilter)({ expression: SQL_1.SQL.jsonValue(SQL_1.SQL.column('settings'), '$.parents[*].name'), type: SQLModernFilter_1.SQLModernValueType.JSONArray, nullable: false }),
656
+ };
657
+ it('Can search in the array', async () => {
658
+ await (0, utils_1.testMatch)({
659
+ tableDefinition,
660
+ filters,
661
+ rows: [
662
+ {
663
+ settings: {
664
+ parents: [
665
+ { name: 'apple' },
666
+ { name: 'BAnana' },
667
+ { name: 'cherry' },
668
+ ],
669
+ },
670
+ },
671
+ ],
672
+ doMatch: [
673
+ {
674
+ 'settings.names': {
675
+ $contains: 'pple',
676
+ },
677
+ },
678
+ {
679
+ 'settings.names': {
680
+ $contains: 'banana',
681
+ },
682
+ },
683
+ {
684
+ 'settings.names': {
685
+ $contains: 'BAnana',
686
+ },
687
+ },
688
+ ],
689
+ doNotMatch: [
690
+ {
691
+ 'settings.names': {
692
+ $contains: 'chrry',
693
+ },
694
+ },
695
+ ],
696
+ });
697
+ });
698
+ });
699
+ });
700
+ });
701
+ //# sourceMappingURL=$contains.test.js.map