@malloydata/malloy-tests 0.0.69-dev230808200646 → 0.0.69-dev230809221417

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 (79) hide show
  1. package/dist/databases/all/db_index.spec.d.ts +1 -1
  2. package/dist/databases/all/db_index.spec.js +116 -6
  3. package/dist/databases/all/db_index.spec.js.map +1 -1
  4. package/dist/databases/all/expr.spec.js +542 -6
  5. package/dist/databases/all/expr.spec.js.map +1 -1
  6. package/dist/databases/all/functions.spec.d.ts +1 -1
  7. package/dist/databases/all/functions.spec.js +745 -6
  8. package/dist/databases/all/functions.spec.js.map +1 -1
  9. package/dist/databases/all/join.spec.d.ts +1 -1
  10. package/dist/databases/all/join.spec.js +272 -6
  11. package/dist/databases/all/join.spec.js.map +1 -1
  12. package/dist/databases/all/nomodel.spec.d.ts +1 -1
  13. package/dist/databases/all/nomodel.spec.js +919 -6
  14. package/dist/databases/all/nomodel.spec.js.map +1 -1
  15. package/dist/databases/all/orderby.spec.d.ts +1 -1
  16. package/dist/databases/all/orderby.spec.js +187 -6
  17. package/dist/databases/all/orderby.spec.js.map +1 -1
  18. package/dist/databases/all/problems.spec.d.ts +1 -1
  19. package/dist/databases/all/problems.spec.js +76 -6
  20. package/dist/databases/all/problems.spec.js.map +1 -1
  21. package/dist/databases/all/sql_expressions.spec.d.ts +1 -1
  22. package/dist/databases/all/sql_expressions.spec.js +58 -6
  23. package/dist/databases/all/sql_expressions.spec.js.map +1 -1
  24. package/dist/databases/all/time.spec.d.ts +1 -1
  25. package/dist/databases/all/time.spec.js +609 -5
  26. package/dist/databases/all/time.spec.js.map +1 -1
  27. package/dist/databases/shared/test_list.js +1 -20
  28. package/dist/databases/shared/test_list.js.map +1 -1
  29. package/dist/index.d.ts +0 -8
  30. package/dist/index.js +1 -17
  31. package/dist/index.js.map +1 -1
  32. package/package.json +6 -6
  33. package/src/databases/all/db_index.spec.ts +137 -6
  34. package/src/databases/all/expr.spec.ts +661 -7
  35. package/src/databases/all/functions.spec.ts +1092 -6
  36. package/src/databases/all/join.spec.ts +309 -6
  37. package/src/databases/all/nomodel.spec.ts +1114 -7
  38. package/src/databases/all/orderby.spec.ts +229 -6
  39. package/src/databases/all/problems.spec.ts +82 -6
  40. package/src/databases/all/sql_expressions.spec.ts +65 -6
  41. package/src/databases/all/time.spec.ts +734 -5
  42. package/src/databases/shared/test_list.ts +1 -20
  43. package/src/index.ts +0 -9
  44. package/dist/databases/shared/db_index.d.ts +0 -3
  45. package/dist/databases/shared/db_index.js +0 -123
  46. package/dist/databases/shared/db_index.js.map +0 -1
  47. package/dist/databases/shared/expr.d.ts +0 -3
  48. package/dist/databases/shared/expr.js +0 -551
  49. package/dist/databases/shared/expr.js.map +0 -1
  50. package/dist/databases/shared/functions.d.ts +0 -3
  51. package/dist/databases/shared/functions.js +0 -754
  52. package/dist/databases/shared/functions.js.map +0 -1
  53. package/dist/databases/shared/join.d.ts +0 -3
  54. package/dist/databases/shared/join.js +0 -302
  55. package/dist/databases/shared/join.js.map +0 -1
  56. package/dist/databases/shared/nomodel.d.ts +0 -3
  57. package/dist/databases/shared/nomodel.js +0 -950
  58. package/dist/databases/shared/nomodel.js.map +0 -1
  59. package/dist/databases/shared/orderby.d.ts +0 -3
  60. package/dist/databases/shared/orderby.js +0 -217
  61. package/dist/databases/shared/orderby.js.map +0 -1
  62. package/dist/databases/shared/problems.d.ts +0 -3
  63. package/dist/databases/shared/problems.js +0 -106
  64. package/dist/databases/shared/problems.js.map +0 -1
  65. package/dist/databases/shared/sql_expressions.d.ts +0 -3
  66. package/dist/databases/shared/sql_expressions.js +0 -88
  67. package/dist/databases/shared/sql_expressions.js.map +0 -1
  68. package/dist/databases/shared/time.d.ts +0 -3
  69. package/dist/databases/shared/time.js +0 -640
  70. package/dist/databases/shared/time.js.map +0 -1
  71. package/src/databases/shared/db_index.ts +0 -167
  72. package/src/databases/shared/expr.ts +0 -695
  73. package/src/databases/shared/functions.ts +0 -1126
  74. package/src/databases/shared/join.ts +0 -340
  75. package/src/databases/shared/nomodel.ts +0 -1150
  76. package/src/databases/shared/orderby.ts +0 -260
  77. package/src/databases/shared/problems.ts +0 -113
  78. package/src/databases/shared/sql_expressions.ts +0 -96
  79. package/src/databases/shared/time.ts +0 -786
@@ -24,11 +24,615 @@
24
24
  */
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
26
  const runtimes_1 = require("../../runtimes");
27
- const time_1 = require("../shared/time");
27
+ require("../../util/db-jest-matchers");
28
+ const util_1 = require("../../util");
29
+ const luxon_1 = require("luxon");
28
30
  const runtimes = new runtimes_1.RuntimeList(runtimes_1.allDatabases);
31
+ const timeSQL = "SELECT DATE '2021-02-24' as t_date, TIMESTAMP '2021-02-24 03:05:06' as t_timestamp";
32
+ // MTOY todo look at this list for timezone problems, I know there are some
33
+ describe.each(runtimes.runtimeList)('%s date and time', (dbName, runtime) => {
34
+ const sqlEq = (0, util_1.mkSqlEqWith)(runtime, { sql: timeSQL });
35
+ describe('interval measurement', () => {
36
+ test('forwards is positive', async () => {
37
+ const eq = sqlEq('day(@2000-01-01 to @2000-01-02)', '1');
38
+ expect(await eq).isSqlEq();
39
+ });
40
+ test('reverse is negative', async () => {
41
+ const eq = sqlEq('day(@2000-01-02 to @2000-01-01)', '-1');
42
+ expect(await eq).isSqlEq();
43
+ });
44
+ test('seconds', async () => {
45
+ expect(await sqlEq('seconds(now to now + 1 second)', 1)).isSqlEq();
46
+ expect(await sqlEq('seconds(now to now)', 0)).isSqlEq();
47
+ expect(await sqlEq('seconds(now to now + 2 seconds)', 2)).isSqlEq();
48
+ expect(await sqlEq('seconds(now to now - 2 seconds)', -2)).isSqlEq();
49
+ const a = '@2001-01-01 00:00:00';
50
+ const b = '@2001-01-01 00:00:00.999';
51
+ expect(await sqlEq(`seconds(${a} to ${b})`, 0)).isSqlEq();
52
+ expect(await sqlEq(`seconds(${b} to @2001-01-01 00:00:01)`, 0)).isSqlEq();
53
+ });
54
+ test('minutes', async () => {
55
+ expect(await sqlEq('minutes(@2022-10-03 10:23:08 to @2022-10-03 10:24:07)', 0)).isSqlEq();
56
+ expect(await sqlEq('minutes(now to now + 1 minute)', 1)).isSqlEq();
57
+ expect(await sqlEq('minutes(now to now + 59 seconds)', 0)).isSqlEq();
58
+ expect(await sqlEq('minutes(now to now + 2 minutes)', 2)).isSqlEq();
59
+ expect(await sqlEq('minutes(now to now - 2 minutes)', -2)).isSqlEq();
60
+ });
61
+ test('hours', async () => {
62
+ expect(await sqlEq('hours(@2022-10-03 10:23:00 to @2022-10-03 11:22:00)', 0)).isSqlEq();
63
+ expect(await sqlEq('hours(now to now + 1 hour)', 1)).isSqlEq();
64
+ expect(await sqlEq('hours(now to now + 59 minutes)', 0)).isSqlEq();
65
+ expect(await sqlEq('hours(now to now + 120 minutes)', 2)).isSqlEq();
66
+ expect(await sqlEq('hours(now to now - 2 hours)', -2)).isSqlEq();
67
+ });
68
+ test('days', async () => {
69
+ expect(await sqlEq('days(now.day to now.day + 1 day)', 1)).isSqlEq();
70
+ expect(await sqlEq('days(now.day to now.day + 23 hours)', 0)).isSqlEq();
71
+ expect(await sqlEq('days(now.day to now.day + 48 hours)', 2)).isSqlEq();
72
+ expect(await sqlEq('days(now.day to now.day - 48 hours)', -2)).isSqlEq();
73
+ expect(await sqlEq('days(@2022-10-03 10:23:00 to @2022-10-04 09:23:00)', 0)).isSqlEq();
74
+ });
75
+ // MTOY TODO remove or implment
76
+ // These all are complicated by civul time issues, skipping for now
77
+ // test.skip('weeks', async () => {
78
+ // expect(await sqlEq('week(now.week to now.week + 6 days)', 0)).isSqlEq();
79
+ // expect(await sqlEq('week(now.week to now.week + 7 days)', 1)).isSqlEq();
80
+ // expect(
81
+ // await sqlEq('week(now.week to now.week + 7 days - 1 second)', 0)
82
+ // ).isSqlEq();
83
+ // expect(await sqlEq('weeks(@2022-10-01 to @2022-10-07)', 0)).isSqlEq();
84
+ // expect(await sqlEq('weeks(@2022-10-01 to @2022-10-08)', 1)).isSqlEq();
85
+ // expect(await sqlEq('weeks(@2022-10-15 to @2022-10-01)', -2)).isSqlEq();
86
+ // expect(await sqlEq('weeks(@2022-10-02 to @2023-10-02)', 52)).isSqlEq();
87
+ // expect(
88
+ // await sqlEq('weeks(@2022-10-01 12:00 to @2022-10-08 11:59)', 0)
89
+ // ).isSqlEq();
90
+ // });
91
+ // test.skip('months', async () => {
92
+ // expect(await sqlEq('months(now to now)', 0)).isSqlEq();
93
+ // expect(await sqlEq('months(@2001-01-01 to @2001-02-01)', 1)).isSqlEq();
94
+ // expect(await sqlEq('months(@2001-01-01 to @2001-03-01)', 2)).isSqlEq();
95
+ // expect(await sqlEq('months(@2001-01-01 to @2002-02-01)', 13)).isSqlEq();
96
+ // expect(
97
+ // await sqlEq('months(@2022-10-02 12:00 to @2022-11-02 11:59)', 0)
98
+ // ).isSqlEq();
99
+ // });
100
+ // test.skip('quarters', async () => {
101
+ // expect(await sqlEq('quarters(now to now + 1 quarter)', 1)).isSqlEq();
102
+ // expect(
103
+ // await sqlEq('quarters(now.quarter to now.quarter + 27 days)', 0)
104
+ // ).isSqlEq();
105
+ // expect(await sqlEq('quarters(now to now + 2 quarters)', 2)).isSqlEq();
106
+ // expect(await sqlEq('quarters(now to now - 2 quarters)', -2)).isSqlEq();
107
+ // expect(
108
+ // await sqlEq('quarters(@2022-01-01 12:00 to @2022-04-01 12:00)', 1)
109
+ // ).isSqlEq();
110
+ // expect(
111
+ // await sqlEq('quarters(@2022-01-01 12:00 to @2022-04-01 11:59)', 0)
112
+ // ).isSqlEq();
113
+ // });
114
+ // test.skip('years', async () => {
115
+ // expect(await sqlEq('years(@2022 to @2023)', 1)).isSqlEq();
116
+ // expect(await sqlEq('years(@2022-01-01 to @2022-12-31)', 0)).isSqlEq();
117
+ // expect(await sqlEq('years(@2022 to @2024)', 2)).isSqlEq();
118
+ // expect(await sqlEq('years(@2024 to @2022)', -2)).isSqlEq();
119
+ // expect(
120
+ // await sqlEq('years(@2022-01-01 12:00 to @2024-01-01 11:59)', 1)
121
+ // ).isSqlEq();
122
+ // });
123
+ });
124
+ describe('timestamp truncation', () => {
125
+ // 2021-02-24 03:05:06
126
+ test('trunc second', async () => {
127
+ const eq = sqlEq('t_timestamp.second', '@2021-02-24 03:05:06');
128
+ expect(await eq).isSqlEq();
129
+ });
130
+ test('trunc minute', async () => {
131
+ const eq = sqlEq('t_timestamp.minute', '@2021-02-24 03:05:00');
132
+ expect(await eq).isSqlEq();
133
+ });
134
+ test('trunc hour', async () => {
135
+ const eq = sqlEq('t_timestamp.hour', '@2021-02-24 03:00:00');
136
+ expect(await eq).isSqlEq();
137
+ });
138
+ test('trunc day', async () => {
139
+ const eq = sqlEq('t_timestamp.day', '@2021-02-24 00:00:00');
140
+ expect(await eq).isSqlEq();
141
+ });
142
+ test('trunc week', async () => {
143
+ const eq = sqlEq('t_timestamp.week', '@2021-02-21 00:00:00');
144
+ expect(await eq).isSqlEq();
145
+ });
146
+ test('trunc month', async () => {
147
+ const eq = sqlEq('t_timestamp.month', '@2021-02-01 00:00:00');
148
+ expect(await eq).isSqlEq();
149
+ });
150
+ test('trunc quarter', async () => {
151
+ const eq = sqlEq('t_timestamp.quarter', '@2021-01-01 00:00:00');
152
+ expect(await eq).isSqlEq();
153
+ });
154
+ test('trunc year', async () => {
155
+ const eq = sqlEq('t_timestamp.year', '@2021-01-01 00:00:00');
156
+ expect(await eq).isSqlEq();
157
+ });
158
+ });
159
+ describe('timestamp extraction', () => {
160
+ // 2021-02-24 03:05:06
161
+ test('extract second', async () => {
162
+ const eq = sqlEq('second(t_timestamp)', '6');
163
+ expect(await eq).isSqlEq();
164
+ });
165
+ test('extract minute', async () => {
166
+ const eq = sqlEq('minute(t_timestamp)', '5');
167
+ expect(await eq).isSqlEq();
168
+ });
169
+ test('extract hour', async () => {
170
+ const eq = sqlEq('hour(t_timestamp)', '3');
171
+ expect(await eq).isSqlEq();
172
+ });
173
+ test('extract day', async () => {
174
+ const eq = sqlEq('day(t_timestamp)', '24');
175
+ expect(await eq).isSqlEq();
176
+ });
177
+ test('extract day_of_week', async () => {
178
+ const eq = sqlEq('day_of_week(t_timestamp)', '4');
179
+ expect(await eq).isSqlEq();
180
+ });
181
+ test('first week day is one ', async () => {
182
+ const eq = sqlEq('day_of_week(t_timestamp.week)', '1');
183
+ expect(await eq).isSqlEq();
184
+ });
185
+ test('extract day_of_year', async () => {
186
+ const eq = sqlEq('day_of_year(t_timestamp)', '55');
187
+ expect(await eq).isSqlEq();
188
+ });
189
+ test('extract week', async () => {
190
+ const eq = sqlEq('week(t_timestamp)', '8');
191
+ expect(await eq).isSqlEq();
192
+ });
193
+ test('extract month', async () => {
194
+ const eq = sqlEq('month(t_timestamp)', '2');
195
+ expect(await eq).isSqlEq();
196
+ });
197
+ test('extract quarter', async () => {
198
+ const eq = sqlEq('quarter(t_timestamp)', '1');
199
+ expect(await eq).isSqlEq();
200
+ });
201
+ test('extract year', async () => {
202
+ const eq = sqlEq('year(t_timestamp)', '2021');
203
+ expect(await eq).isSqlEq();
204
+ });
205
+ });
206
+ describe('date truncation', () => {
207
+ test('date trunc day', async () => {
208
+ const eq = sqlEq('t_date.day', '@2021-02-24');
209
+ expect(await eq).isSqlEq();
210
+ });
211
+ test('date trunc week', async () => {
212
+ const eq = sqlEq('t_date.week', '@2021-02-21');
213
+ expect(await eq).isSqlEq();
214
+ });
215
+ test('date trunc month', async () => {
216
+ const eq = sqlEq('t_date.month', '@2021-02-01');
217
+ expect(await eq).isSqlEq();
218
+ });
219
+ test('date trunc quarter', async () => {
220
+ const eq = sqlEq('t_date.quarter', '@2021-01-01');
221
+ expect(await eq).isSqlEq();
222
+ });
223
+ test('date trunc year', async () => {
224
+ const eq = sqlEq('t_date.year', '@2021');
225
+ expect(await eq).isSqlEq();
226
+ });
227
+ });
228
+ describe('date extraction', () => {
229
+ test('date extract day', async () => {
230
+ const eq = sqlEq('day(t_date)', '24');
231
+ expect(await eq).isSqlEq();
232
+ });
233
+ test('date extract day_of_week', async () => {
234
+ const eq = sqlEq('day_of_week(t_date)', '4');
235
+ expect(await eq).isSqlEq();
236
+ });
237
+ test('date extract day_of_year', async () => {
238
+ const eq = sqlEq('day_of_year(t_date)', '55');
239
+ expect(await eq).isSqlEq();
240
+ });
241
+ test('date extract week', async () => {
242
+ const eq = sqlEq('week(t_date)', '8');
243
+ expect(await eq).isSqlEq();
244
+ });
245
+ test('date extract month', async () => {
246
+ const eq = sqlEq('month(t_date)', '2');
247
+ expect(await eq).isSqlEq();
248
+ });
249
+ test('date extract quarter', async () => {
250
+ const eq = sqlEq('quarter(t_date)', '1');
251
+ expect(await eq).isSqlEq();
252
+ });
253
+ test('date extract year', async () => {
254
+ const eq = sqlEq('year(t_date)', '2021');
255
+ expect(await eq).isSqlEq();
256
+ });
257
+ });
258
+ describe('delta computations', () => {
259
+ test('timestamp delta second', async () => {
260
+ const eq = sqlEq('t_timestamp + 10 seconds', '@2021-02-24 03:05:16');
261
+ expect(await eq).isSqlEq();
262
+ });
263
+ test('timestamp delta negative second', async () => {
264
+ const eq = sqlEq('t_timestamp - 6 seconds', '@2021-02-24 03:05:00');
265
+ expect(await eq).isSqlEq();
266
+ });
267
+ test('timestamp delta minute', async () => {
268
+ const eq = sqlEq('t_timestamp + 10 minutes', '@2021-02-24 03:15:06');
269
+ expect(await eq).isSqlEq();
270
+ });
271
+ test('timestamp delta hours', async () => {
272
+ const eq = await sqlEq('t_timestamp + 10 hours', '@2021-02-24 13:05:06');
273
+ expect(eq).isSqlEq();
274
+ });
275
+ test('timestamp delta week', async () => {
276
+ const eq = sqlEq('(t_timestamp - 2 weeks)::date', '@2021-02-10');
277
+ expect(await eq).isSqlEq();
278
+ });
279
+ test('timestamp delta month', async () => {
280
+ const eq = sqlEq('(t_timestamp + 9 months)::date', '@2021-11-24');
281
+ expect(await eq).isSqlEq();
282
+ });
283
+ test('timestamp delta quarter', async () => {
284
+ const eq = sqlEq('(t_timestamp + 2 quarters)::date', '@2021-08-24');
285
+ expect(await eq).isSqlEq();
286
+ });
287
+ test('timestamp delta year', async () => {
288
+ const eq = sqlEq('(t_timestamp + 10 years)::date', '@2031-02-24');
289
+ expect(await eq).isSqlEq();
290
+ });
291
+ test('date delta week', async () => {
292
+ const eq = sqlEq('t_date - 2 weeks', '@2021-02-10');
293
+ expect(await eq).isSqlEq();
294
+ });
295
+ test('date delta month', async () => {
296
+ const eq = sqlEq('t_date + 9 months', '@2021-11-24');
297
+ expect(await eq).isSqlEq();
298
+ });
299
+ test('date delta quarter', async () => {
300
+ const eq = sqlEq('t_date + 2 quarters', '@2021-08-24');
301
+ expect(await eq).isSqlEq();
302
+ });
303
+ test('date delta year', async () => {
304
+ const eq = sqlEq('t_date + 10 years', '@2031-02-24');
305
+ expect(await eq).isSqlEq();
306
+ });
307
+ });
308
+ describe('for range edge tests', () => {
309
+ describe('date', () => {
310
+ test('before for-range is outside', async () => {
311
+ const eq = sqlEq('t_date ? @2021-02-25 for 1 day', false);
312
+ expect(await eq).isSqlEq();
313
+ });
314
+ test('first for-range is inside', async () => {
315
+ const eq = sqlEq('t_date ? @2021-02-24 for 1 day', true);
316
+ expect(await eq).isSqlEq();
317
+ });
318
+ test('last for-range is outside', async () => {
319
+ const eq = sqlEq('t_date ? @2021-02-23 for 1 day', false);
320
+ expect(await eq).isSqlEq();
321
+ });
322
+ });
323
+ describe('timestamp', () => {
324
+ test('before for-range is outside', async () => {
325
+ const eq = sqlEq('t_timestamp ? @2021-02-25 00:00:00 for 1 day', false);
326
+ expect(await eq).isSqlEq();
327
+ });
328
+ test('first for-range is inside', async () => {
329
+ const eq = sqlEq('t_timestamp ? @2021-02-24 03:04:05 for 1 day', true);
330
+ expect(await eq).isSqlEq();
331
+ });
332
+ test('last for-range is outside', async () => {
333
+ const eq = sqlEq('t_timestamp ? @2021-02-23 03:05:06 for 1 day', false);
334
+ expect(await eq).isSqlEq();
335
+ });
336
+ });
337
+ });
338
+ describe('to range edge tests', () => {
339
+ describe('date', () => {
340
+ test('before to is outside', async () => {
341
+ const eq = sqlEq('t_date ? @2021-02-25 to @2021-03-01', false);
342
+ expect(await eq).isSqlEq();
343
+ });
344
+ test('first to is inside', async () => {
345
+ const eq = sqlEq('t_date ? @2021-02-24 to @2021-03-01', true);
346
+ expect(await eq).isSqlEq();
347
+ });
348
+ test('last to is outside', async () => {
349
+ const eq = sqlEq('t_date ? @2021-02-01 to @2021-02-24', false);
350
+ expect(await eq).isSqlEq();
351
+ });
352
+ });
353
+ describe('timestamp', () => {
354
+ test('before to is outside', async () => {
355
+ const eq = sqlEq('t_timestamp ? @2021-02-25 00:00:00 to @2021-02-26 00:00:00', false);
356
+ expect(await eq).isSqlEq();
357
+ });
358
+ test('first to is inside', async () => {
359
+ const eq = sqlEq('t_timestamp ? @2021-02-24 03:04:05 to @2021-02-26 00:00:00', true);
360
+ expect(await eq).isSqlEq();
361
+ });
362
+ test('last to is outside', async () => {
363
+ const eq = sqlEq('t_timestamp ? @2021-02-24 00:00:00 to @2021-02-24 03:05:06', false);
364
+ expect(await eq).isSqlEq();
365
+ });
366
+ });
367
+ });
368
+ test('date in sql_block no explore', async () => {
369
+ const eq = sqlEq('t_date', '@2021-02-24');
370
+ expect(await eq).isSqlEq();
371
+ });
372
+ test('timestamp in sql_block no explore', async () => {
373
+ const eq = sqlEq('t_timestamp', '@2021-02-24 03:05:06');
374
+ expect(await eq).isSqlEq();
375
+ });
376
+ test('valid timestamp without seconds', async () => {
377
+ // discovered this writing tests ...
378
+ const eq = sqlEq('year(@2000-01-01 00:00)', '2000');
379
+ expect(await eq).isSqlEq();
380
+ });
381
+ describe('granular time range checks', () => {
382
+ const tsMoment = '@2021-02-24 03:05:06';
383
+ test('minute implied truncated range', async () => {
384
+ const tsBefore = '@2021-03-24 03:04:59';
385
+ expect(await sqlEq(`${tsMoment} ? t_timestamp.minute`, true)).isSqlEq();
386
+ expect(await sqlEq(`${tsBefore} ? t_timestamp.minute`, false)).isSqlEq();
387
+ });
388
+ test('day implied truncated range', async () => {
389
+ expect(await sqlEq(`${tsMoment} ? t_timestamp.day`, true)).isSqlEq();
390
+ });
391
+ test('year implied truncated range', async () => {
392
+ expect(await sqlEq(`${tsMoment} ? t_timestamp.year`, true)).isSqlEq();
393
+ });
394
+ test('timestamp in literal minute', async () => {
395
+ expect(await sqlEq('t_timestamp ? @2021-02-24 03:05', true)).isSqlEq();
396
+ });
397
+ test('timestamp in literal day', async () => {
398
+ expect(await sqlEq('t_timestamp ? @2021-02-24', true)).isSqlEq();
399
+ });
400
+ test('date in literal month', async () => {
401
+ expect(await sqlEq('t_date ? @2021-02', true)).isSqlEq();
402
+ });
403
+ test('timestamp in literal month', async () => {
404
+ expect(await sqlEq('t_timestamp ? @2021-02', true)).isSqlEq();
405
+ });
406
+ test('timestamp in literal year', async () => {
407
+ expect(await sqlEq('t_timestamp ? @2021', true)).isSqlEq();
408
+ });
409
+ });
410
+ test('dependant join dialect fragments', async () => {
411
+ await expect(runtime).queryMatches(`
412
+ sql: timeData is { connection: "${dbName}" select: """${timeSQL}""" }
413
+ query: from_sql(timeData) -> {
414
+ join_one: joined is from_sql(timeData) on t_date = joined.t_date
415
+ group_by: t_month is joined.t_timestamp.month
416
+ }
417
+ `, { t_month: new Date('2021-02-01') });
418
+ });
419
+ describe('timezone set correctly', () => {
420
+ test('timezone set in source used by query', async () => {
421
+ expect((await (0, util_1.runQuery)(runtime, `sql: timeData is { connection: "${dbName}" select: """SELECT 1"""}
422
+ source: timezone is from_sql(timeData) + {
423
+ timezone: 'America/Los_Angeles'
424
+ dimension: la_time is @2021-02-24 03:05:06
425
+ }
426
+ query: timezone -> {
427
+ group_by: la_time
428
+ }
429
+ `)).resultExplore.queryTimezone).toBe('America/Los_Angeles');
430
+ });
431
+ (0, util_1.testIf)(runtime.supportsNesting)('timezone set in query inside source', async () => {
432
+ expect((await (0, util_1.runQuery)(runtime, `sql: timeData is { connection: "${dbName}" select: """SELECT 1"""}
433
+ source: timezone is from_sql(timeData) + {
434
+ dimension: default_time is @2021-02-24 03:05:06
435
+ query: la_query is {
436
+ timezone: 'America/Los_Angeles'
437
+ project: la_time is @2021-02-24 03:05:06
438
+ }
439
+ }
440
+
441
+ query: timezone -> {
442
+ group_by: default_time
443
+ nest: la_query
444
+ }
445
+ `)).resultExplore.structDef).toMatchObject({
446
+ fields: [
447
+ {},
448
+ { name: 'la_query', queryTimezone: 'America/Los_Angeles' },
449
+ ],
450
+ });
451
+ });
452
+ (0, util_1.testIf)(runtime.supportsNesting)('timezone set in query using source', async () => {
453
+ expect((await (0, util_1.runQuery)(runtime, `sql: timeData is { connection: "${dbName}" select: """SELECT 1"""}
454
+ source: timezone is from_sql(timeData) + {
455
+ dimension: default_time is @2021-02-24 03:05:06
456
+ query: undef_query is {
457
+ project: undef_time is @2021-02-24 03:05:06
458
+ }
459
+ }
460
+
461
+ query: timezone -> {
462
+ timezone: 'America/Los_Angeles'
463
+ group_by: default_time
464
+ nest: undef_query
465
+ }
466
+ `)).resultExplore.queryTimezone).toBe('America/Los_Angeles');
467
+ });
468
+ (0, util_1.testIf)(runtime.supportsNesting)('multiple timezones', async () => {
469
+ expect((await (0, util_1.runQuery)(runtime, `sql: timeData is { connection: "${dbName}" select: """SELECT 1"""}
470
+ source: timezone is from_sql(timeData) + {
471
+ timezone: 'America/New_York'
472
+ dimension: ny_time is @2021-02-24 03:05:06
473
+ query: la_query is {
474
+ timezone: 'America/Los_Angeles'
475
+ project: la_time is @2021-02-24 03:05:06
476
+ }
477
+ query: mex_query is {
478
+ timezone: 'America/Mexico_City'
479
+ project: mex_time is @2021-02-24 03:05:06
480
+ }
481
+ }
482
+
483
+ query: timezone -> {
484
+ group_by: ny_time
485
+ nest: la_query, mex_query
486
+ }
487
+ `)).resultExplore.structDef).toMatchObject({
488
+ queryTimezone: 'America/New_York',
489
+ fields: [
490
+ {},
491
+ { name: 'la_query', queryTimezone: 'America/Los_Angeles' },
492
+ { name: 'mex_query', queryTimezone: 'America/Mexico_City' },
493
+ ],
494
+ });
495
+ });
496
+ });
497
+ });
29
498
  /*
30
- * This test file reuses common tests definitions.
31
- * For actual test development please go to: test/src/databases/shared/time.spec.ts
32
- */
33
- (0, time_1.timeSharedTests)(runtimes);
499
+ not entirely sure what to test here so i am going to free-wheel a bit
500
+
501
+ 1) All of the extraction and truncation functions need to work
502
+ in the query timezone.
503
+ 2) All rendering needs to happen in the query time zone
504
+ 3) If we feed rendered data back into a query, it needs to retain
505
+ offsets on all timestamps. Worried that rendering it in the query
506
+ time zone would somehow confuse bigquery which is always in UTC
507
+ 4) when we filter on a binned time, that we generate a filter between
508
+ the edges of the bin, instead of computing the bin and use '='
509
+ 5) connection, model, and query time zone setting
510
+ 6) piping a query in one time zone into a query in another
511
+ 7) graphs neeed to respect query time zone
512
+ */
513
+ const zone = 'America/Mexico_City'; // -06:00 no DST
514
+ const zone_2020 = luxon_1.DateTime.fromObject({
515
+ year: 2020,
516
+ month: 2,
517
+ day: 20,
518
+ hour: 0,
519
+ minute: 0,
520
+ second: 0,
521
+ zone,
522
+ });
523
+ const utc_2020 = luxon_1.DateTime.fromObject({
524
+ year: 2020,
525
+ month: 2,
526
+ day: 20,
527
+ hour: 0,
528
+ minute: 0,
529
+ second: 0,
530
+ zone: 'UTC',
531
+ });
532
+ describe.each(runtimes.runtimeList)('%s: tz literals', (dbName, runtime) => {
533
+ test(`${dbName} - default timezone is UTC`, async () => {
534
+ // this makes sure that the tests which use the test timezome are actually
535
+ // testing something ... file this under "abundance of caution". It
536
+ // really tests nothing, but I feel calmer with this here.
537
+ const query = runtime.loadQuery(`
538
+ sql: tzTest is { connection: "${dbName}" select: """SELECT 1 as one""" }
539
+ query: from_sql(tzTest) -> {
540
+ group_by: literalTime is @2020-02-20 00:00:00
541
+ }
542
+ `);
543
+ const result = await query.run();
544
+ const literal = result.data.path(0, 'literalTime').value;
545
+ const have = luxon_1.DateTime.fromJSDate(literal);
546
+ expect(have.valueOf()).toEqual(utc_2020.valueOf());
547
+ });
548
+ test('literal with zone name', async () => {
549
+ const query = runtime.loadQuery(`
550
+ sql: tzTest is { connection: "${dbName}" select: """SELECT 1 as one""" }
551
+ query: from_sql(tzTest) -> {
552
+ group_by: literalTime is @2020-02-20 00:00:00[America/Mexico_City]
553
+ }
554
+ `);
555
+ const result = await query.run();
556
+ const literal = result.data.path(0, 'literalTime').value;
557
+ const have = luxon_1.DateTime.fromJSDate(literal);
558
+ expect(have.valueOf()).toEqual(zone_2020.valueOf());
559
+ });
560
+ });
561
+ describe.each(runtimes.runtimeList)('%s: query tz', (dbName, runtime) => {
562
+ test('literal timestamps', async () => {
563
+ const query = runtime.loadQuery(`
564
+ sql: tzTest is { connection: "${dbName}" select: """SELECT 1 as one""" }
565
+ query: from_sql(tzTest) -> {
566
+ timezone: '${zone}'
567
+ group_by: literalTime is @2020-02-20 00:00:00
568
+ }
569
+ `);
570
+ const result = await query.run();
571
+ const literal = result.data.path(0, 'literalTime').value;
572
+ const have = luxon_1.DateTime.fromJSDate(literal);
573
+ expect(have.valueOf()).toEqual(zone_2020.valueOf());
574
+ });
575
+ test('extract', async () => {
576
+ await expect(runtime).queryMatches(`sql: tzTest is { connection: "${dbName}" select: """SELECT 1 as one""" }
577
+ query: from_sql(tzTest) -> {
578
+ timezone: '${zone}'
579
+ declare: utc_midnight is @2020-02-20 00:00:00[UTC]
580
+ project:
581
+ mex_midnight is hour(utc_midnight)
582
+ mex_day is day(utc_midnight)
583
+ }`, { mex_midnight: 18, mex_day: 19 });
584
+ });
585
+ test('truncate day', async () => {
586
+ // At midnight in london it the 19th in Mexico, so that truncates to
587
+ // midnight on the 19th
588
+ const mex_19 = luxon_1.DateTime.fromISO('2020-02-19T00:00:00', { zone });
589
+ await expect(runtime).queryMatches(`sql: tzTest is { connection: "${dbName}" select: """SELECT 1 as one""" }
590
+ query: from_sql(tzTest) -> {
591
+ timezone: '${zone}'
592
+ declare: utc_midnight is @2020-02-20 00:00:00[UTC]
593
+ project:
594
+ mex_day is utc_midnight.day
595
+ }`, { mex_day: mex_19.toJSDate() });
596
+ });
597
+ test('cast timestamp to date', async () => {
598
+ // At midnight in london it the 19th in Mexico, so when we cast that
599
+ // to a date, it should be the 19th.
600
+ await expect(runtime).queryMatches(`sql: tzTest is { connection: "${dbName}" select: """SELECT 1 as one""" }
601
+ query: from_sql(tzTest) -> {
602
+ timezone: '${zone}'
603
+ declare: utc_midnight is @2020-02-20 00:00:00[UTC]
604
+ project: mex_day is day(utc_midnight::date)
605
+ }`, { mex_day: 19 });
606
+ });
607
+ test('cast date to timestamp', async () => {
608
+ await expect(runtime).queryMatches(`sql: tzTest is { connection: "${dbName}" select: """
609
+ SELECT DATE '2020-02-20' AS mex_20
610
+ """ }
611
+ query: from_sql(tzTest) -> {
612
+ timezone: '${zone}'
613
+ project: mex_ts is mex_20::timestamp
614
+ }`, { mex_ts: zone_2020.toJSDate() });
615
+ });
616
+ test('can use unsupported types', async () => {
617
+ if (dbName === 'bigquery') {
618
+ await expect(runtime).queryMatches(`sql: timeData is { connection: "${dbName}" select: """
619
+ SELECT DATETIME '2020-02-20 00:00:00' as t_datetime
620
+ """}
621
+ query: from_sql(timeData) -> {
622
+ project: mex_220 is t_datetime::timestamp
623
+ }`, { mex_220: utc_2020.toJSDate() });
624
+ }
625
+ else if (dbName === 'duckdb' || dbName === 'postgres') {
626
+ await expect(runtime).queryMatches(`sql: timeData is { connection: "duckdb" select: """
627
+ SELECT TIMESTAMPTZ '2020-02-20 00:00:00 ${zone}' as t_tstz
628
+ """}
629
+ query: from_sql(timeData) -> {
630
+ project: mex_220 is t_tstz::timestamp
631
+ }`, { mex_220: zone_2020.toJSDate() });
632
+ }
633
+ });
634
+ });
635
+ afterAll(async () => {
636
+ await runtimes.closeAll();
637
+ });
34
638
  //# sourceMappingURL=time.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"time.spec.js","sourceRoot":"","sources":["../../../src/databases/all/time.spec.ts"],"names":[],"mappings":";AAAA,+BAA+B;AAC/B;;;;;;;;;;;;;;;;;;;;;GAqBG;;AAEH,6CAAyD;AACzD,yCAA+C;AAE/C,MAAM,QAAQ,GAAG,IAAI,sBAAW,CAAC,uBAAY,CAAC,CAAC;AAC/C;;;GAGG;AACH,IAAA,sBAAe,EAAC,QAAQ,CAAC,CAAC"}
1
+ {"version":3,"file":"time.spec.js","sourceRoot":"","sources":["../../../src/databases/all/time.spec.ts"],"names":[],"mappings":"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"}