@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.
- package/dist/api.spec.d.ts +1 -0
- package/dist/api.spec.js +113 -0
- package/dist/api.spec.js.map +1 -0
- package/dist/databases/all/db_index.spec.d.ts +1 -0
- package/dist/databases/all/db_index.spec.js +126 -0
- package/dist/databases/all/db_index.spec.js.map +1 -0
- package/dist/databases/all/expr.spec.d.ts +1 -0
- package/dist/databases/all/expr.spec.js +652 -0
- package/dist/databases/all/expr.spec.js.map +1 -0
- package/dist/databases/all/functions.spec.d.ts +1 -0
- package/dist/databases/all/functions.spec.js +1180 -0
- package/dist/databases/all/functions.spec.js.map +1 -0
- package/dist/databases/all/join.spec.d.ts +1 -0
- package/dist/databases/all/join.spec.js +255 -0
- package/dist/databases/all/join.spec.js.map +1 -0
- package/dist/databases/all/lenses.spec.d.ts +1 -0
- package/dist/databases/all/lenses.spec.js +374 -0
- package/dist/databases/all/lenses.spec.js.map +1 -0
- package/dist/databases/all/nomodel.spec.d.ts +1 -0
- package/dist/databases/all/nomodel.spec.js +1070 -0
- package/dist/databases/all/nomodel.spec.js.map +1 -0
- package/dist/databases/all/orderby.spec.d.ts +1 -0
- package/dist/databases/all/orderby.spec.js +170 -0
- package/dist/databases/all/orderby.spec.js.map +1 -0
- package/dist/databases/all/problems.spec.d.ts +1 -0
- package/dist/databases/all/problems.spec.js +106 -0
- package/dist/databases/all/problems.spec.js.map +1 -0
- package/dist/databases/all/sql_expressions.spec.d.ts +1 -0
- package/dist/databases/all/sql_expressions.spec.js +73 -0
- package/dist/databases/all/sql_expressions.spec.js.map +1 -0
- package/dist/databases/all/time.spec.d.ts +1 -0
- package/dist/databases/all/time.spec.js +602 -0
- package/dist/databases/all/time.spec.js.map +1 -0
- package/dist/databases/bigquery/double_truncation.spec.d.ts +1 -0
- package/dist/databases/bigquery/double_truncation.spec.js +50 -0
- package/dist/databases/bigquery/double_truncation.spec.js.map +1 -0
- package/dist/databases/bigquery/handexpr.spec.d.ts +1 -0
- package/dist/databases/bigquery/handexpr.spec.js +723 -0
- package/dist/databases/bigquery/handexpr.spec.js.map +1 -0
- package/dist/databases/bigquery/injestion_time_partitioning.spec.d.ts +1 -0
- package/dist/databases/bigquery/injestion_time_partitioning.spec.js +235 -0
- package/dist/databases/bigquery/injestion_time_partitioning.spec.js.map +1 -0
- package/dist/databases/bigquery/joined_filters.spec.d.ts +1 -0
- package/dist/databases/bigquery/joined_filters.spec.js +72 -0
- package/dist/databases/bigquery/joined_filters.spec.js.map +1 -0
- package/dist/databases/bigquery/json.spec.d.ts +1 -0
- package/dist/databases/bigquery/json.spec.js +66 -0
- package/dist/databases/bigquery/json.spec.js.map +1 -0
- package/dist/databases/bigquery/malloy_query.spec.d.ts +1 -0
- package/dist/databases/bigquery/malloy_query.spec.js +840 -0
- package/dist/databases/bigquery/malloy_query.spec.js.map +1 -0
- package/dist/databases/bigquery/performance.skipped.spec.d.ts +1 -0
- package/dist/databases/bigquery/performance.skipped.spec.js +70 -0
- package/dist/databases/bigquery/performance.skipped.spec.js.map +1 -0
- package/dist/databases/bigquery/time.spec.d.ts +1 -0
- package/dist/databases/bigquery/time.spec.js +52 -0
- package/dist/databases/bigquery/time.spec.js.map +1 -0
- package/dist/databases/bigquery/wildcard_table_names.spec.d.ts +1 -0
- package/dist/databases/bigquery/wildcard_table_names.spec.js +212 -0
- package/dist/databases/bigquery/wildcard_table_names.spec.js.map +1 -0
- package/dist/databases/bigquery-duckdb/nested_source_table.spec.d.ts +1 -0
- package/dist/databases/bigquery-duckdb/nested_source_table.spec.js +213 -0
- package/dist/databases/bigquery-duckdb/nested_source_table.spec.js.map +1 -0
- package/dist/databases/duckdb/duckdb.spec.d.ts +1 -0
- package/dist/databases/duckdb/duckdb.spec.js +124 -0
- package/dist/databases/duckdb/duckdb.spec.js.map +1 -0
- package/dist/databases/duckdb/streaming.spec.d.ts +1 -0
- package/dist/databases/duckdb/streaming.spec.js +142 -0
- package/dist/databases/duckdb/streaming.spec.js.map +1 -0
- package/dist/databases/multi-connection/multi_connection.spec.d.ts +1 -0
- package/dist/databases/multi-connection/multi_connection.spec.js +120 -0
- package/dist/databases/multi-connection/multi_connection.spec.js.map +1 -0
- package/dist/databases/postgres/postgres.spec.d.ts +1 -0
- package/dist/databases/postgres/postgres.spec.js +140 -0
- package/dist/databases/postgres/postgres.spec.js.map +1 -0
- package/dist/databases/shared/test_list.d.ts +3 -0
- package/dist/databases/shared/test_list.js +5 -0
- package/dist/databases/shared/test_list.js.map +1 -0
- package/dist/databases/streaming/streaming.spec.d.ts +1 -0
- package/dist/databases/streaming/streaming.spec.js +93 -0
- package/dist/databases/streaming/streaming.spec.js.map +1 -0
- package/dist/dependencies.spec.d.ts +1 -0
- package/dist/dependencies.spec.js +63 -0
- package/dist/dependencies.spec.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/jestMatcher.spec.d.ts +1 -0
- package/dist/jestMatcher.spec.js +81 -0
- package/dist/jestMatcher.spec.js.map +1 -0
- package/dist/model/sql_source.spec.d.ts +1 -0
- package/dist/model/sql_source.spec.js +47 -0
- package/dist/model/sql_source.spec.js.map +1 -0
- package/dist/models/faa_model.d.ts +5 -0
- package/dist/models/faa_model.js +997 -0
- package/dist/models/faa_model.js.map +1 -0
- package/dist/models/medicare_model.d.ts +4 -0
- package/dist/models/medicare_model.js +259 -0
- package/dist/models/medicare_model.js.map +1 -0
- package/dist/render/drill.spec.d.ts +1 -0
- package/dist/render/drill.spec.js +107 -0
- package/dist/render/drill.spec.js.map +1 -0
- package/dist/render/render.spec.d.ts +1 -0
- package/dist/render/render.spec.js +548 -0
- package/dist/render/render.spec.js.map +1 -0
- package/dist/runtimes.d.ts +35 -0
- package/dist/runtimes.js +180 -0
- package/dist/runtimes.js.map +1 -0
- package/dist/tags.spec.d.ts +8 -0
- package/dist/tags.spec.js +490 -0
- package/dist/tags.spec.js.map +1 -0
- package/dist/util/db-jest-matchers.d.ts +30 -0
- package/dist/util/db-jest-matchers.js +157 -0
- package/dist/util/db-jest-matchers.js.map +1 -0
- package/dist/util/index.d.ts +15 -0
- package/dist/util/index.js +182 -0
- package/dist/util/index.js.map +1 -0
- 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';
|