@malloydata/malloy-tests 0.0.135 → 0.0.136-dev240326234246

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 (118) hide show
  1. package/dist/api.spec.d.ts +1 -0
  2. package/dist/api.spec.js +113 -0
  3. package/dist/api.spec.js.map +1 -0
  4. package/dist/databases/all/db_index.spec.d.ts +1 -0
  5. package/dist/databases/all/db_index.spec.js +126 -0
  6. package/dist/databases/all/db_index.spec.js.map +1 -0
  7. package/dist/databases/all/expr.spec.d.ts +1 -0
  8. package/dist/databases/all/expr.spec.js +652 -0
  9. package/dist/databases/all/expr.spec.js.map +1 -0
  10. package/dist/databases/all/functions.spec.d.ts +1 -0
  11. package/dist/databases/all/functions.spec.js +1180 -0
  12. package/dist/databases/all/functions.spec.js.map +1 -0
  13. package/dist/databases/all/join.spec.d.ts +1 -0
  14. package/dist/databases/all/join.spec.js +255 -0
  15. package/dist/databases/all/join.spec.js.map +1 -0
  16. package/dist/databases/all/lenses.spec.d.ts +1 -0
  17. package/dist/databases/all/lenses.spec.js +374 -0
  18. package/dist/databases/all/lenses.spec.js.map +1 -0
  19. package/dist/databases/all/nomodel.spec.d.ts +1 -0
  20. package/dist/databases/all/nomodel.spec.js +1070 -0
  21. package/dist/databases/all/nomodel.spec.js.map +1 -0
  22. package/dist/databases/all/orderby.spec.d.ts +1 -0
  23. package/dist/databases/all/orderby.spec.js +170 -0
  24. package/dist/databases/all/orderby.spec.js.map +1 -0
  25. package/dist/databases/all/problems.spec.d.ts +1 -0
  26. package/dist/databases/all/problems.spec.js +106 -0
  27. package/dist/databases/all/problems.spec.js.map +1 -0
  28. package/dist/databases/all/sql_expressions.spec.d.ts +1 -0
  29. package/dist/databases/all/sql_expressions.spec.js +73 -0
  30. package/dist/databases/all/sql_expressions.spec.js.map +1 -0
  31. package/dist/databases/all/time.spec.d.ts +1 -0
  32. package/dist/databases/all/time.spec.js +602 -0
  33. package/dist/databases/all/time.spec.js.map +1 -0
  34. package/dist/databases/bigquery/double_truncation.spec.d.ts +1 -0
  35. package/dist/databases/bigquery/double_truncation.spec.js +50 -0
  36. package/dist/databases/bigquery/double_truncation.spec.js.map +1 -0
  37. package/dist/databases/bigquery/handexpr.spec.d.ts +1 -0
  38. package/dist/databases/bigquery/handexpr.spec.js +723 -0
  39. package/dist/databases/bigquery/handexpr.spec.js.map +1 -0
  40. package/dist/databases/bigquery/injestion_time_partitioning.spec.d.ts +1 -0
  41. package/dist/databases/bigquery/injestion_time_partitioning.spec.js +235 -0
  42. package/dist/databases/bigquery/injestion_time_partitioning.spec.js.map +1 -0
  43. package/dist/databases/bigquery/joined_filters.spec.d.ts +1 -0
  44. package/dist/databases/bigquery/joined_filters.spec.js +72 -0
  45. package/dist/databases/bigquery/joined_filters.spec.js.map +1 -0
  46. package/dist/databases/bigquery/json.spec.d.ts +1 -0
  47. package/dist/databases/bigquery/json.spec.js +66 -0
  48. package/dist/databases/bigquery/json.spec.js.map +1 -0
  49. package/dist/databases/bigquery/malloy_query.spec.d.ts +1 -0
  50. package/dist/databases/bigquery/malloy_query.spec.js +840 -0
  51. package/dist/databases/bigquery/malloy_query.spec.js.map +1 -0
  52. package/dist/databases/bigquery/performance.skipped.spec.d.ts +1 -0
  53. package/dist/databases/bigquery/performance.skipped.spec.js +70 -0
  54. package/dist/databases/bigquery/performance.skipped.spec.js.map +1 -0
  55. package/dist/databases/bigquery/time.spec.d.ts +1 -0
  56. package/dist/databases/bigquery/time.spec.js +52 -0
  57. package/dist/databases/bigquery/time.spec.js.map +1 -0
  58. package/dist/databases/bigquery/wildcard_table_names.spec.d.ts +1 -0
  59. package/dist/databases/bigquery/wildcard_table_names.spec.js +212 -0
  60. package/dist/databases/bigquery/wildcard_table_names.spec.js.map +1 -0
  61. package/dist/databases/bigquery-duckdb/nested_source_table.spec.d.ts +1 -0
  62. package/dist/databases/bigquery-duckdb/nested_source_table.spec.js +213 -0
  63. package/dist/databases/bigquery-duckdb/nested_source_table.spec.js.map +1 -0
  64. package/dist/databases/duckdb/duckdb.spec.d.ts +1 -0
  65. package/dist/databases/duckdb/duckdb.spec.js +124 -0
  66. package/dist/databases/duckdb/duckdb.spec.js.map +1 -0
  67. package/dist/databases/duckdb/streaming.spec.d.ts +1 -0
  68. package/dist/databases/duckdb/streaming.spec.js +142 -0
  69. package/dist/databases/duckdb/streaming.spec.js.map +1 -0
  70. package/dist/databases/multi-connection/multi_connection.spec.d.ts +1 -0
  71. package/dist/databases/multi-connection/multi_connection.spec.js +120 -0
  72. package/dist/databases/multi-connection/multi_connection.spec.js.map +1 -0
  73. package/dist/databases/postgres/postgres.spec.d.ts +1 -0
  74. package/dist/databases/postgres/postgres.spec.js +140 -0
  75. package/dist/databases/postgres/postgres.spec.js.map +1 -0
  76. package/dist/databases/shared/test_list.d.ts +3 -0
  77. package/dist/databases/shared/test_list.js +5 -0
  78. package/dist/databases/shared/test_list.js.map +1 -0
  79. package/dist/databases/streaming/streaming.spec.d.ts +1 -0
  80. package/dist/databases/streaming/streaming.spec.js +93 -0
  81. package/dist/databases/streaming/streaming.spec.js.map +1 -0
  82. package/dist/dependencies.spec.d.ts +1 -0
  83. package/dist/dependencies.spec.js +63 -0
  84. package/dist/dependencies.spec.js.map +1 -0
  85. package/dist/index.d.ts +4 -0
  86. package/dist/index.js +49 -0
  87. package/dist/index.js.map +1 -0
  88. package/dist/jestMatcher.spec.d.ts +1 -0
  89. package/dist/jestMatcher.spec.js +81 -0
  90. package/dist/jestMatcher.spec.js.map +1 -0
  91. package/dist/model/sql_source.spec.d.ts +1 -0
  92. package/dist/model/sql_source.spec.js +47 -0
  93. package/dist/model/sql_source.spec.js.map +1 -0
  94. package/dist/models/faa_model.d.ts +5 -0
  95. package/dist/models/faa_model.js +997 -0
  96. package/dist/models/faa_model.js.map +1 -0
  97. package/dist/models/medicare_model.d.ts +4 -0
  98. package/dist/models/medicare_model.js +259 -0
  99. package/dist/models/medicare_model.js.map +1 -0
  100. package/dist/render/drill.spec.d.ts +1 -0
  101. package/dist/render/drill.spec.js +107 -0
  102. package/dist/render/drill.spec.js.map +1 -0
  103. package/dist/render/render.spec.d.ts +1 -0
  104. package/dist/render/render.spec.js +548 -0
  105. package/dist/render/render.spec.js.map +1 -0
  106. package/dist/runtimes.d.ts +35 -0
  107. package/dist/runtimes.js +180 -0
  108. package/dist/runtimes.js.map +1 -0
  109. package/dist/tags.spec.d.ts +8 -0
  110. package/dist/tags.spec.js +490 -0
  111. package/dist/tags.spec.js.map +1 -0
  112. package/dist/util/db-jest-matchers.d.ts +30 -0
  113. package/dist/util/db-jest-matchers.js +157 -0
  114. package/dist/util/db-jest-matchers.js.map +1 -0
  115. package/dist/util/index.d.ts +15 -0
  116. package/dist/util/index.js +182 -0
  117. package/dist/util/index.js.map +1 -0
  118. package/package.json +8 -8
@@ -0,0 +1,652 @@
1
+ "use strict";
2
+ /* eslint-disable no-console */
3
+ /*
4
+ * Copyright 2023 Google LLC
5
+ *
6
+ * Permission is hereby granted, free of charge, to any person obtaining
7
+ * a copy of this software and associated documentation files
8
+ * (the "Software"), to deal in the Software without restriction,
9
+ * including without limitation the rights to use, copy, modify, merge,
10
+ * publish, distribute, sublicense, and/or sell copies of the Software,
11
+ * and to permit persons to whom the Software is furnished to do so,
12
+ * subject to the following conditions:
13
+ *
14
+ * The above copyright notice and this permission notice shall be
15
+ * included in all copies or substantial portions of the Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
21
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
+ */
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ const runtimes_1 = require("../../runtimes");
27
+ require("../../util/db-jest-matchers");
28
+ const util_1 = require("../../util");
29
+ const assert_1 = require("assert");
30
+ const runtimes = new runtimes_1.RuntimeList((0, util_1.databasesFromEnvironmentOr)(runtimes_1.allDatabases));
31
+ function modelText(databaseName) {
32
+ return `
33
+ source: aircraft_models is ${databaseName}.table('malloytest.aircraft_models') extend {
34
+ primary_key: aircraft_model_code
35
+ measure:
36
+ aircraft_model_count is count(),
37
+ total_seats is sum(seats),
38
+ boeing_seats is sum(seats) { where: manufacturer ? 'BOEING'},
39
+ percent_boeing is boeing_seats / total_seats * 100,
40
+ percent_boeing_floor is floor(boeing_seats / total_seats * 100),
41
+ dimension: seats_bucketed is floor(seats/20)*20.0
42
+ }
43
+
44
+ source: aircraft is ${databaseName}.table('malloytest.aircraft') extend {
45
+ primary_key: tail_num
46
+ join_one: aircraft_models with aircraft_model_code
47
+ measure: aircraft_count is count()
48
+ view: by_manufacturer is {
49
+ top: 5
50
+ group_by: aircraft_models.manufacturer
51
+ aggregate: aircraft_count
52
+ }
53
+ }
54
+ `;
55
+ }
56
+ describe.each(runtimes.runtimeList)('%s', (databaseName, runtime) => {
57
+ const expressionModel = runtime.loadModel(modelText(databaseName));
58
+ // basic calculations for sum, filtered sum, without a join.
59
+ const q = runtime.getQuoter();
60
+ it('basic calculations', async () => {
61
+ await expect(`
62
+ run: aircraft_models->{
63
+ aggregate:
64
+ total_seats,
65
+ total_seats2 is sum(seats),
66
+ boeing_seats,
67
+ boeing_seats2 is sum(seats) { where: manufacturer ? 'BOEING'},
68
+ boeing_seats3 is total_seats { where: manufacturer ? 'BOEING'},
69
+ percent_boeing_floor,
70
+ }
71
+ `).malloyResultMatches(expressionModel, {
72
+ total_seats: 452415,
73
+ total_seats2: 452415,
74
+ boeing_seats: 252771,
75
+ boeing_seats2: 252771,
76
+ boeing_seats3: 252771,
77
+ percent_boeing_floor: 55,
78
+ });
79
+ });
80
+ // Floor was broken (wouldn't compile because the expression returned isn't an aggregate.)
81
+ it('Floor() -or any function bustage with aggregates', async () => {
82
+ await expect(`
83
+ run: aircraft_models->{
84
+ aggregate:
85
+ percent_boeing_floor
86
+ percent_boeing_floor2 is floor(boeing_seats / total_seats * 100)
87
+ }
88
+ `).malloyResultMatches(expressionModel, {
89
+ percent_boeing_floor: 55,
90
+ percent_boeing_floor2: 55,
91
+ });
92
+ });
93
+ // Model based version of sums.
94
+ it('model: expression fixups.', async () => {
95
+ await expect(`
96
+ run: aircraft->{
97
+ aggregate:
98
+ aircraft_models.total_seats
99
+ aircraft_models.boeing_seats
100
+ }
101
+ `).malloyResultMatches(expressionModel, {
102
+ total_seats: 18294,
103
+ boeing_seats: 6244,
104
+ });
105
+ });
106
+ // turtle expressions
107
+ it('model: turtle', async () => {
108
+ await expect('run: aircraft->by_manufacturer').malloyResultMatches(expressionModel, { manufacturer: 'CESSNA' });
109
+ });
110
+ // filtered turtle expressions
111
+ test('model: filtered turtle', (0, util_1.onlyIf)(runtime.supportsNesting, async () => {
112
+ await expect(`
113
+ run: aircraft->{
114
+ nest: b is by_manufacturer + { where: aircraft_models.manufacturer ?~'B%'}
115
+ }
116
+ `).malloyResultMatches(expressionModel, { 'b.manufacturer': 'BEECH' });
117
+ }));
118
+ // having.
119
+ it('model: simple having', async () => {
120
+ await expect(`
121
+ run: aircraft->{
122
+ having: aircraft_count >90
123
+ group_by: state
124
+ aggregate: aircraft_count
125
+ order_by: 2
126
+ }
127
+ `).malloyResultMatches(expressionModel, { aircraft_count: 91 });
128
+ });
129
+ test('model: having in a nest', (0, util_1.onlyIf)(runtime.supportsNesting, async () => {
130
+ await expect(`
131
+ run: aircraft->{
132
+ top: 10
133
+ order_by: 1
134
+ where: region != NULL
135
+ group_by: region
136
+ nest: by_state is {
137
+ top: 10
138
+ order_by: 1 desc
139
+ having: aircraft_count > 50
140
+ group_by: state
141
+ aggregate: aircraft_count
142
+ }
143
+ }
144
+ `).malloyResultMatches(expressionModel, { 'by_state.state': 'VA' });
145
+ }));
146
+ test('model: turtle having on main', (0, util_1.onlyIf)(runtime.supportsNesting, async () => {
147
+ await expect(`
148
+ run: aircraft->{
149
+ order_by: 2 asc
150
+ having: aircraft_count ? >500
151
+ group_by: region
152
+ aggregate: aircraft_count
153
+ nest: by_state is {
154
+ order_by: 2 asc
155
+ having: aircraft_count >45
156
+ group_by: state
157
+ aggregate: aircraft_count
158
+ nest: by_city is {
159
+ order_by: 2 asc
160
+ having: aircraft_count ? >5
161
+ group_by: city
162
+ aggregate: aircraft_count
163
+ }
164
+ }
165
+ }
166
+ `).malloyResultMatches(expressionModel, {
167
+ 'by_state.by_city.city': 'ALBUQUERQUE',
168
+ });
169
+ }));
170
+ // bigquery doesn't like to partition by floats,
171
+ test('model: having float group by partition', (0, util_1.onlyIf)(runtime.supportsNesting, async () => {
172
+ await expect(`${modelText(databaseName)}
173
+ run: aircraft_models->{
174
+ order_by: 1
175
+ where: seats_bucketed > 0
176
+ having: aircraft_model_count > 400
177
+ group_by: seats_bucketed
178
+ aggregate: aircraft_model_count
179
+ nest: foo is {
180
+ group_by: engines
181
+ aggregate: aircraft_model_count
182
+ }
183
+ }`).malloyResultMatches(runtime, { aircraft_model_count: 448 });
184
+ }));
185
+ it('model: aggregate functions distinct min max', async () => {
186
+ await expect(`
187
+ run: aircraft_models->{
188
+ aggregate:
189
+ distinct_seats is count(seats),
190
+ boeing_distinct_seats is count(seats) { where:manufacturer ? 'BOEING'},
191
+ min_seats is min(seats),
192
+ cessna_min_seats is min(seats) { where: manufacturer ? 'CESSNA'},
193
+ max_seats is max(seats),
194
+ cessna_max_seats is max(seats) { where: manufacturer ? 'CESSNA'},
195
+ min_code is min(aircraft_model_code),
196
+ boeing_min_model is min(model) { where: manufacturer ? 'BOEING'},
197
+ max_model is max(model),
198
+ boeing_max_model is max(model) { where: manufacturer ? 'BOEING'},
199
+ }
200
+ `).malloyResultMatches(expressionModel, {
201
+ distinct_seats: 187,
202
+ boeing_distinct_seats: 85,
203
+ min_seats: 0,
204
+ cessna_min_seats: 1,
205
+ max_seats: 660,
206
+ min_code: '0030109',
207
+ cessna_max_seats: 14,
208
+ boeing_min_model: '100',
209
+ max_model: 'ZWEIFEL PA18',
210
+ boeing_max_model: 'YL-15',
211
+ });
212
+ });
213
+ // TODO not sure why this test needs to be skipped on postgres, feels like an oversight
214
+ // NOTE: unless underlying type is stored as a timestamp snowflake does not support extraction
215
+ test('model: dates named', (0, util_1.onlyIf)(!['postgres', 'snowflake'].includes(databaseName), async () => {
216
+ await expect(`
217
+ run: ${databaseName}.table('malloytest.alltypes')->{
218
+ group_by:
219
+ t_date,
220
+ t_date_month is t_date.month,
221
+ t_date_year is t_date.year,
222
+ t_timestamp,
223
+ t_timestamp_date is t_timestamp.day,
224
+ t_timestamp_hour is t_timestamp.hour,
225
+ t_timestamp_minute is t_timestamp.minute,
226
+ t_timestamp_second is t_timestamp.second,
227
+ t_timestamp_month is t_timestamp.month,
228
+ t_timestamp_year is t_timestamp.year,
229
+ }
230
+ `).malloyResultMatches(runtime, {
231
+ t_date: new Date('2020-03-02'),
232
+ t_date_month: new Date('2020-03-01'),
233
+ t_date_year: new Date('2020-01-01'),
234
+ t_timestamp: new Date('2020-03-02T12:35:56.000Z'),
235
+ t_timestamp_second: new Date('2020-03-02T12:35:56.000Z'),
236
+ t_timestamp_minute: new Date('2020-03-02T12:35:00.000Z'),
237
+ t_timestamp_hour: new Date('2020-03-02T12:00:00.000Z'),
238
+ t_timestamp_date: new Date('2020-03-02'),
239
+ t_timestamp_month: new Date('2020-03-01'),
240
+ t_timestamp_year: new Date('2020-01-01'),
241
+ });
242
+ }));
243
+ it('named query metadata undefined', async () => {
244
+ const result = await expressionModel
245
+ .loadQuery(`
246
+ run: aircraft->{
247
+ aggregate: aircraft_count is count()
248
+ }
249
+ `)
250
+ .run();
251
+ // TODO The result explore should really be unnamed. This test currently
252
+ // inspects inner information because we have no way to have unnamed
253
+ // explores today.
254
+ // expect(result.getResultExplore().name).toBe(undefined);
255
+ expect(result._queryResult.queryName).toBe(undefined);
256
+ });
257
+ it('named query metadata named', async () => {
258
+ const result = await expressionModel
259
+ .loadQuery('run: aircraft->by_manufacturer')
260
+ .run();
261
+ expect(result.resultExplore.name).toBe('by_manufacturer');
262
+ });
263
+ it('named query metadata named head of pipeline', async () => {
264
+ const result = await expressionModel
265
+ .loadQuery(`
266
+ run: aircraft->by_manufacturer->{ aggregate: c is count()}
267
+ `)
268
+ .run();
269
+ // TODO Same as above -- this test should check the explore name
270
+ // expect(result.resultExplore.name).toBe(undefined);
271
+ expect(result._queryResult.queryName).toBe(undefined);
272
+ });
273
+ it('filtered explores basic', async () => {
274
+ await expect(`
275
+ run: aircraft extend { where: aircraft_models.manufacturer ? ~'B%' }
276
+ -> {aggregate: m_count is count(aircraft_models.manufacturer) }
277
+ `).malloyResultMatches(expressionModel, { m_count: 63 });
278
+ });
279
+ it('sql cast', async () => {
280
+ await expect(`
281
+ run: aircraft -> {
282
+ group_by: a is "312"::"integer"
283
+ }
284
+ `).malloyResultMatches(expressionModel, { a: 312 });
285
+ });
286
+ test('sql safe cast', (0, util_1.onlyIf)(!['postgres', 'snowflake'].includes(runtime.connection.name), async () => {
287
+ await expect(`
288
+ run: ${databaseName}.sql('SELECT 1 as one') -> { select:
289
+ bad_date is '123':::date
290
+ bad_number is 'abc':::number
291
+ good_number is "312":::"integer"
292
+ }
293
+ `).malloyResultMatches(expressionModel, {
294
+ bad_date: null,
295
+ bad_number: null,
296
+ good_number: 312,
297
+ });
298
+ }));
299
+ it('many_field.sum() has correct locality', async () => {
300
+ await expect(`
301
+ source: a is ${databaseName}.table('malloytest.aircraft')
302
+ source: am is ${databaseName}.table('malloytest.aircraft_models') extend {
303
+ join_many: a on a.aircraft_model_code = a.aircraft_model_code
304
+ dimension: a_year_built is a.year_built
305
+ }
306
+
307
+ run: am -> {
308
+ aggregate: avg_a_year_built1 is floor(a_year_built.avg())
309
+ aggregate: avg_a_year_built2 is floor(a.avg(a_year_built))
310
+ }
311
+ `).malloyResultMatches(runtime, {
312
+ avg_a_year_built1: 1969,
313
+ avg_a_year_built2: 1969,
314
+ });
315
+ });
316
+ describe('sql expr functions', () => {
317
+ it('sql_string', async () => {
318
+ await expect(`
319
+ ##! experimental { sql_functions }
320
+ source: a is ${databaseName}.table('malloytest.aircraft_models') extend { where: aircraft_model_code ? '0270202' }
321
+
322
+ run: a -> {
323
+ group_by: string_1 is sql_string("UPPER(\${manufacturer})")
324
+ }
325
+ `).malloyResultMatches(expressionModel, {
326
+ string_1: 'AHRENS AIRCRAFT CORP.',
327
+ });
328
+ });
329
+ it('sql_number', async () => {
330
+ await expect(`
331
+ ##! experimental { sql_functions }
332
+ source: a is ${databaseName}.table('malloytest.aircraft_models') extend { where: aircraft_model_code ? '0270202' }
333
+
334
+ run: a -> {
335
+ group_by: seats
336
+ group_by: number_1 is sql_number("\${seats} * 2")
337
+ }
338
+ `).malloyResultMatches(expressionModel, {
339
+ seats: 29,
340
+ number_1: 58,
341
+ });
342
+ });
343
+ it('sql_number can be sum()med', async () => {
344
+ await expect(`
345
+ ##! experimental { sql_functions }
346
+ source: a is ${databaseName}.table('malloytest.aircraft_models') extend {
347
+ where: aircraft_model_code ? '0270202'
348
+ dimension: number_1 is sql_number("\${seats} * 2")
349
+ }
350
+
351
+ run: a -> {
352
+ aggregate: s is number_1.sum()
353
+ }
354
+ `).malloyResultMatches(expressionModel, {
355
+ s: 58,
356
+ });
357
+ });
358
+ it('sql_boolean', async () => {
359
+ await expect(`
360
+ ##! experimental { sql_functions }
361
+ source: a is ${databaseName}.table('malloytest.aircraft_models') extend { where: aircraft_model_code ? '0270202' }
362
+
363
+ run: a -> {
364
+ group_by: boolean_1 is sql_boolean("\${seats} > 20")
365
+ group_by: boolean_2 is sql_boolean("\${engines} = 2")
366
+ }
367
+ `).malloyResultMatches(expressionModel, {
368
+ boolean_1: true,
369
+ boolean_2: false,
370
+ });
371
+ });
372
+ it('sql_date', async () => {
373
+ await expect(`
374
+ ##! experimental { sql_functions }
375
+ source: a is ${databaseName}.table('malloytest.aircraft') extend { where: tail_num ? 'N110WL' }
376
+
377
+ run: a -> {
378
+ group_by: date_1 is sql_date("\${last_action_date}")
379
+ }
380
+ `).malloyResultMatches(expressionModel, {
381
+ date_1: new Date('2000-01-04T00:00:00.000Z'),
382
+ });
383
+ });
384
+ it('sql_timestamp', async () => {
385
+ await expect(`
386
+ ##! experimental { sql_functions }
387
+ source: a is ${databaseName}.table('malloytest.aircraft') extend { where: tail_num ? 'N110WL' }
388
+
389
+ run: a -> {
390
+ group_by: timestamp_1 is sql_timestamp("\${last_action_date}")
391
+ }
392
+ `).malloyResultMatches(expressionModel, {
393
+ timestamp_1: new Date('2000-01-04T00:00:00.000Z'),
394
+ });
395
+ });
396
+ it('with ${TABLE}.field', async () => {
397
+ await expect(`
398
+ ##! experimental { sql_functions }
399
+ source: a is ${databaseName}.table('malloytest.aircraft_models') extend { where: aircraft_model_code ? '0270202' }
400
+
401
+ run: a -> {
402
+ group_by: string_1 is sql_string('UPPER(\${TABLE}.${q `manufacturer`})')
403
+ }
404
+ `).malloyResultMatches(expressionModel, {
405
+ string_1: 'AHRENS AIRCRAFT CORP.',
406
+ });
407
+ });
408
+ it('with ${field}', async () => {
409
+ await expect(`
410
+ ##! experimental { sql_functions }
411
+ source: a is ${databaseName}.table('malloytest.aircraft_models') extend { where: aircraft_model_code ? '0270202' }
412
+
413
+ run: a -> {
414
+ group_by: string_1 is sql_string("UPPER(\${manufacturer})")
415
+ }
416
+ `).malloyResultMatches(expressionModel, {
417
+ string_1: 'AHRENS AIRCRAFT CORP.',
418
+ });
419
+ });
420
+ it('sql_functions - experimental feature is ignored', async () => {
421
+ const query = await expressionModel.loadQuery(`
422
+ source: a is ${databaseName}.table('malloytest.aircraft_models') extend { where: aircraft_model_code ? '0270202' }
423
+
424
+ run: a -> {
425
+ group_by: manufacturer
426
+ group_by: string_1 is sql_string("UPPER(\${manufacturer})")
427
+ }
428
+ `);
429
+ const runResult = await query.run();
430
+ const dataResult = runResult.data.toObject();
431
+ expect(dataResult.length).toEqual(1);
432
+ const firstRow = dataResult.at(0);
433
+ if (firstRow !== undefined) {
434
+ expect(firstRow['manufacturer']).toEqual('AHRENS AIRCRAFT CORP.');
435
+ expect('string_1' in firstRow).toBeFalsy();
436
+ }
437
+ else {
438
+ (0, assert_1.fail)('exepected a single row, but found none');
439
+ }
440
+ });
441
+ describe('[not yet supported]', () => {
442
+ // See ${...} documentation for lookml here for guidance on remaining work:
443
+ // https://cloud.google.com/looker/docs/reference/param-field-sql#sql_for_dimensions
444
+ it('${view_name.dimension_name} - one path', async () => {
445
+ const query = await expressionModel.loadQuery(`
446
+ ##! experimental { sql_functions }
447
+ source: a is ${databaseName}.table('malloytest.aircraft_models') extend { where: aircraft_model_code ? '0270202' }
448
+
449
+ run: a -> {
450
+ group_by: string_1 is sql_string("UPPER(\${a.manufacturer})")
451
+ }
452
+ `);
453
+ await expect(query.run()).rejects.toThrow("'.' paths are not yet supported in sql interpolations, found ${a.manufacturer}");
454
+ });
455
+ it('${view_name.dimension_name} - multiple paths', async () => {
456
+ const query = await expressionModel.loadQuery(`
457
+ ##! experimental { sql_functions }
458
+ source: a is ${databaseName}.table('malloytest.aircraft_models') extend { where: aircraft_model_code ? '0270202' }
459
+
460
+ run: a -> {
461
+ group_by: number_1 is sql_number("\${a.seats} * \${a.seats} + \${a.total_seats}")
462
+ }
463
+ `);
464
+ await expect(query.run()).rejects.toThrow("'.' paths are not yet supported in sql interpolations, found [${a.seats}, ${a.seats}, ${a.total_seats}]");
465
+ });
466
+ it('${view_name.SQL_TABLE_NAME}', async () => {
467
+ const query = await expressionModel.loadQuery(`
468
+ ##! experimental { sql_functions }
469
+ source: a is ${databaseName}.table('malloytest.aircraft_models') extend { where: aircraft_model_code ? '0270202' }
470
+
471
+ run: a -> {
472
+ group_by: number_1 is sql_number("\${a.SQL_TABLE_NAME}.seats")
473
+ }
474
+ `);
475
+ await expect(query.run()).rejects.toThrow("'.' paths are not yet supported in sql interpolations, found ${a.SQL_TABLE_NAME}");
476
+ });
477
+ });
478
+ });
479
+ test('query with aliasname used twice', (0, util_1.onlyIf)(runtime.supportsNesting, async () => {
480
+ await expect(`
481
+ run: aircraft->{
482
+ group_by: first is substr(city,1,1)
483
+ aggregate: aircraft_count is count()
484
+ nest: aircraft is {
485
+ group_by: first_two is substr(city,1,2)
486
+ aggregate: aircraft_count is count()
487
+ nest: aircraft is {
488
+ group_by: first_three is substr(city,1,3)
489
+ aggregate: aircraft_count is count()
490
+ }
491
+ }
492
+ } -> {
493
+ select:
494
+ aircraft.aircraft.first_three
495
+ aircraft_count
496
+ order_by: 2 desc, 1
497
+ }
498
+ `).malloyResultMatches(expressionModel, { first_three: 'SAB' });
499
+ }));
500
+ it('joined filtered sources', async () => {
501
+ await expect(`
502
+ source: a_models is ${databaseName}.table('malloytest.aircraft_models') extend {
503
+ where: manufacturer ? ~'B%'
504
+ primary_key: aircraft_model_code
505
+ measure:model_count is count()
506
+ }
507
+
508
+ source: aircraft2 is ${databaseName}.table('malloytest.aircraft') extend {
509
+ join_one: model is a_models with aircraft_model_code
510
+ measure: aircraft_count is count()
511
+ }
512
+
513
+ run: aircraft2->{
514
+ aggregate:
515
+ model.model_count
516
+ aircraft_count
517
+ }
518
+ `).malloyResultMatches(expressionModel, {
519
+ model_count: 244,
520
+ aircraft_count: 3599,
521
+ });
522
+ });
523
+ it('joined filtered explores with dependencies', async () => {
524
+ await expect(`
525
+ source: bo_models is
526
+ ${databaseName}.table('malloytest.aircraft_models') extend { where: manufacturer ? ~ 'BO%' }
527
+ -> { select: aircraft_model_code, manufacturer, seats }
528
+ extend {
529
+ primary_key: aircraft_model_code
530
+ measure: bo_count is count()
531
+ }
532
+ source: b_models is
533
+ ${databaseName}.table('malloytest.aircraft_models') extend { where: manufacturer ? ~ 'B%' }
534
+ -> { select: aircraft_model_code, manufacturer, seats }
535
+ extend {
536
+ where: bo_models.seats > 200
537
+ primary_key: aircraft_model_code
538
+ measure: b_count is count()
539
+ join_one: bo_models with aircraft_model_code
540
+ }
541
+
542
+ source: models is ${databaseName}.table('malloytest.aircraft_models') extend {
543
+ join_one: b_models with aircraft_model_code
544
+ measure: model_count is count()
545
+ }
546
+
547
+ run: models -> {
548
+ aggregate: model_count
549
+ aggregate: b_models.b_count
550
+ -- aggregate: b_models.bo_models.bo_count
551
+ }
552
+ `).malloyResultMatches(runtime, { model_count: 60461, b_count: 355 });
553
+ });
554
+ });
555
+ describe.each(runtimes.runtimeList)('%s', (databaseName, runtime) => {
556
+ const q = runtime.getQuoter();
557
+ const sqlEq = (0, util_1.mkSqlEqWith)(runtime, databaseName, {
558
+ malloy: `extend {
559
+ dimension: friName is 'friday'
560
+ dimension: friDay is 5
561
+ dimension: satName is 'saturday'
562
+ dimension: satDay is 6
563
+ }`,
564
+ });
565
+ describe.skip('alternations with not-eq', () => {
566
+ /*
567
+ Here's the desired truth table ...
568
+
569
+ x x != y | z
570
+ ====== ============
571
+ y false
572
+ z false
573
+ ^[yz] true
574
+ */
575
+ test('x not-eq y or z : x eq y', async () => {
576
+ const result = await sqlEq('6 != (6|7)', false);
577
+ expect(result).isSqlEq();
578
+ });
579
+ test('x not-eq y or z : x eq z', async () => {
580
+ const result = await sqlEq('7 != (6|7)', false);
581
+ expect(result).isSqlEq();
582
+ });
583
+ test('x not-eq y or z : else', async () => {
584
+ const result = await sqlEq('5 != (6|7)', true);
585
+ expect(result).isSqlEq();
586
+ });
587
+ /*
588
+ Writing this the old way, should have the same truth table ...
589
+ x != y & != z
590
+ */
591
+ test('x not-eq y and not-eq z : x eq y', async () => {
592
+ const result = await sqlEq('6 != (6 & !=7)', false);
593
+ expect(result).isSqlEq();
594
+ });
595
+ test('x not-eq y and not-eq z : x eq z', async () => {
596
+ const result = await sqlEq('7 != (6 & != 7)', false);
597
+ expect(result).isSqlEq();
598
+ });
599
+ test('x not-eq y and not-eq z : else', async () => {
600
+ const result = await sqlEq('5 != (6 & !=7)', true);
601
+ expect(result).isSqlEq();
602
+ });
603
+ });
604
+ describe('string literal quoting', () => {
605
+ const dq = '"';
606
+ const tick = "'";
607
+ const back = '\\';
608
+ test('quote single character', async () => {
609
+ expect(await sqlEq(`'${back}x'`, 'x')).isSqlEq();
610
+ });
611
+ test('quote single quote', async () => {
612
+ expect(await sqlEq(`'${back}${tick}'`, tick)).isSqlEq();
613
+ });
614
+ test('quote double quote', async () => {
615
+ await expect(`run: ${databaseName}.sql("SELECT 1 as one") -> {
616
+ select: double_quote is "${back}${dq}"
617
+ }`).malloyResultMatches(runtime, { double_quote: '"' });
618
+ });
619
+ test('quote backslash', async () => {
620
+ expect(await sqlEq(`'${back}${back}'`, back)).isSqlEq();
621
+ });
622
+ });
623
+ test('nullish ?? operator', async () => {
624
+ await expect(`run: ${databaseName}.sql("""
625
+ SELECT '' as ${q `null_value`}, '' as ${q `string_value`}
626
+ UNION ALL SELECT null, 'correct'
627
+ """) -> {
628
+ where: null_value = null
629
+ select:
630
+ found_null is null_value ?? 'correct',
631
+ else_pass is string_value ?? 'incorrect'
632
+ literal_null is null ?? 'correct'
633
+ }`).malloyResultMatches(runtime, {
634
+ found_null: 'correct',
635
+ else_pass: 'correct',
636
+ literal_null: 'correct',
637
+ });
638
+ });
639
+ test('dimension expressions expanded with parens properly', async () => {
640
+ await expect(`run: ${databaseName}.sql("SELECT 1 as one") extend {
641
+ dimension: fot is (false) or (true)
642
+ } -> {
643
+ select:
644
+ no_paren is false and fot
645
+ paren is false and (fot)
646
+ }`).malloyResultMatches(runtime, { paren: false, no_paren: false });
647
+ });
648
+ });
649
+ afterAll(async () => {
650
+ await runtimes.closeAll();
651
+ });
652
+ //# sourceMappingURL=expr.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expr.spec.js","sourceRoot":"","sources":["../../../src/databases/all/expr.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ import '../../util/db-jest-matchers';