@malloydata/malloy-tests 0.0.68 → 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.
- package/dist/databases/all/db_index.spec.d.ts +1 -1
- package/dist/databases/all/db_index.spec.js +116 -6
- package/dist/databases/all/db_index.spec.js.map +1 -1
- package/dist/databases/all/expr.spec.js +542 -6
- package/dist/databases/all/expr.spec.js.map +1 -1
- package/dist/databases/all/functions.spec.d.ts +1 -1
- package/dist/databases/all/functions.spec.js +745 -6
- package/dist/databases/all/functions.spec.js.map +1 -1
- package/dist/databases/all/join.spec.d.ts +1 -1
- package/dist/databases/all/join.spec.js +272 -6
- package/dist/databases/all/join.spec.js.map +1 -1
- package/dist/databases/all/nomodel.spec.d.ts +1 -1
- package/dist/databases/all/nomodel.spec.js +919 -6
- package/dist/databases/all/nomodel.spec.js.map +1 -1
- package/dist/databases/all/orderby.spec.d.ts +1 -1
- package/dist/databases/all/orderby.spec.js +187 -6
- package/dist/databases/all/orderby.spec.js.map +1 -1
- package/dist/databases/all/problems.spec.d.ts +1 -1
- package/dist/databases/all/problems.spec.js +76 -6
- package/dist/databases/all/problems.spec.js.map +1 -1
- package/dist/databases/all/sql_expressions.spec.d.ts +1 -1
- package/dist/databases/all/sql_expressions.spec.js +58 -6
- package/dist/databases/all/sql_expressions.spec.js.map +1 -1
- package/dist/databases/all/time.spec.d.ts +1 -1
- package/dist/databases/all/time.spec.js +609 -5
- package/dist/databases/all/time.spec.js.map +1 -1
- package/dist/databases/shared/test_list.js +1 -20
- package/dist/databases/shared/test_list.js.map +1 -1
- package/dist/index.d.ts +0 -8
- package/dist/index.js +1 -17
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
- package/src/databases/all/db_index.spec.ts +137 -6
- package/src/databases/all/expr.spec.ts +661 -7
- package/src/databases/all/functions.spec.ts +1092 -6
- package/src/databases/all/join.spec.ts +309 -6
- package/src/databases/all/nomodel.spec.ts +1114 -7
- package/src/databases/all/orderby.spec.ts +229 -6
- package/src/databases/all/problems.spec.ts +82 -6
- package/src/databases/all/sql_expressions.spec.ts +65 -6
- package/src/databases/all/time.spec.ts +734 -5
- package/src/databases/shared/test_list.ts +1 -20
- package/src/index.ts +0 -9
- package/dist/databases/shared/db_index.d.ts +0 -3
- package/dist/databases/shared/db_index.js +0 -123
- package/dist/databases/shared/db_index.js.map +0 -1
- package/dist/databases/shared/expr.d.ts +0 -3
- package/dist/databases/shared/expr.js +0 -551
- package/dist/databases/shared/expr.js.map +0 -1
- package/dist/databases/shared/functions.d.ts +0 -3
- package/dist/databases/shared/functions.js +0 -754
- package/dist/databases/shared/functions.js.map +0 -1
- package/dist/databases/shared/join.d.ts +0 -3
- package/dist/databases/shared/join.js +0 -302
- package/dist/databases/shared/join.js.map +0 -1
- package/dist/databases/shared/nomodel.d.ts +0 -3
- package/dist/databases/shared/nomodel.js +0 -950
- package/dist/databases/shared/nomodel.js.map +0 -1
- package/dist/databases/shared/orderby.d.ts +0 -3
- package/dist/databases/shared/orderby.js +0 -217
- package/dist/databases/shared/orderby.js.map +0 -1
- package/dist/databases/shared/problems.d.ts +0 -3
- package/dist/databases/shared/problems.js +0 -106
- package/dist/databases/shared/problems.js.map +0 -1
- package/dist/databases/shared/sql_expressions.d.ts +0 -3
- package/dist/databases/shared/sql_expressions.js +0 -88
- package/dist/databases/shared/sql_expressions.js.map +0 -1
- package/dist/databases/shared/time.d.ts +0 -3
- package/dist/databases/shared/time.js +0 -640
- package/dist/databases/shared/time.js.map +0 -1
- package/src/databases/shared/db_index.ts +0 -167
- package/src/databases/shared/expr.ts +0 -695
- package/src/databases/shared/functions.ts +0 -1126
- package/src/databases/shared/join.ts +0 -340
- package/src/databases/shared/nomodel.ts +0 -1150
- package/src/databases/shared/orderby.ts +0 -260
- package/src/databases/shared/problems.ts +0 -113
- package/src/databases/shared/sql_expressions.ts +0 -96
- package/src/databases/shared/time.ts +0 -786
|
@@ -1,551 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.exprSharedTests = void 0;
|
|
4
|
-
require("../../util/db-jest-matchers");
|
|
5
|
-
const util_1 = require("../../util");
|
|
6
|
-
const expressionModelText = `
|
|
7
|
-
source: aircraft_models is table('malloytest.aircraft_models') extend {
|
|
8
|
-
primary_key: aircraft_model_code
|
|
9
|
-
measure:
|
|
10
|
-
airport_count is count(*),
|
|
11
|
-
aircraft_model_count is count(),
|
|
12
|
-
total_seats is sum(seats),
|
|
13
|
-
boeing_seats is sum(seats) {? manufacturer ? 'BOEING'},
|
|
14
|
-
percent_boeing is boeing_seats / total_seats * 100,
|
|
15
|
-
percent_boeing_floor is floor(boeing_seats / total_seats * 100),
|
|
16
|
-
dimension: seats_bucketed is floor(seats/20)*20.0
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
source: aircraft is table('malloytest.aircraft') extend {
|
|
20
|
-
primary_key: tail_num
|
|
21
|
-
join_one: aircraft_models with aircraft_model_code
|
|
22
|
-
measure: aircraft_count is count(*)
|
|
23
|
-
query: by_manufacturer is {
|
|
24
|
-
top: 5
|
|
25
|
-
group_by: aircraft_models.manufacturer
|
|
26
|
-
aggregate: aircraft_count
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
`;
|
|
30
|
-
const exprSharedTests = (runtimes, _splitFunction) => {
|
|
31
|
-
describe.each(runtimes.runtimeList)('%s', (databaseName, runtime) => {
|
|
32
|
-
const expressionModel = runtime.loadModel(expressionModelText);
|
|
33
|
-
// basic calculations for sum, filtered sum, without a join.
|
|
34
|
-
it('basic calculations', async () => {
|
|
35
|
-
const result = await expressionModel
|
|
36
|
-
.loadQuery(`
|
|
37
|
-
query: aircraft_models->{
|
|
38
|
-
aggregate:
|
|
39
|
-
total_seats,
|
|
40
|
-
total_seats2 is sum(seats),
|
|
41
|
-
boeing_seats,
|
|
42
|
-
boeing_seats2 is sum(seats) {? manufacturer ? 'BOEING'},
|
|
43
|
-
boeing_seats3 is total_seats {? manufacturer ? 'BOEING'},
|
|
44
|
-
percent_boeing,
|
|
45
|
-
percent_boeing2 is boeing_seats / total_seats * 100,
|
|
46
|
-
-- percent_boeing_floor,
|
|
47
|
-
-- percent_boeing_floor2 is FLOOR(boeing_seats / total_seats * 100)
|
|
48
|
-
}
|
|
49
|
-
`)
|
|
50
|
-
.run();
|
|
51
|
-
expect(result.data.path(0, 'total_seats').value).toBe(452415);
|
|
52
|
-
expect(result.data.path(0, 'total_seats2').value).toBe(452415);
|
|
53
|
-
expect(result.data.path(0, 'boeing_seats').value).toBe(252771);
|
|
54
|
-
expect(result.data.path(0, 'boeing_seats2').value).toBe(252771);
|
|
55
|
-
expect(result.data.path(0, 'boeing_seats3').value).toBe(252771);
|
|
56
|
-
expect(Math.floor(result.data.path(0, 'percent_boeing').number.value)).toBe(55);
|
|
57
|
-
expect(Math.floor(result.data.path(0, 'percent_boeing2').number.value)).toBe(55);
|
|
58
|
-
// expect(result.data.path(0, "percent_boeing_floor").value).toBe(55);
|
|
59
|
-
// expect(result.data.path(0, "percent_boeing_floor2").value).toBe(55);
|
|
60
|
-
});
|
|
61
|
-
// Floor is broken (doesn't compile because the expression returned isn't an aggregate.)
|
|
62
|
-
it('Floor() -or any function bustage with aggregates', async () => {
|
|
63
|
-
const result = await expressionModel
|
|
64
|
-
.loadQuery(`
|
|
65
|
-
query: aircraft_models->{
|
|
66
|
-
aggregate:
|
|
67
|
-
percent_boeing_floor
|
|
68
|
-
percent_boeing_floor2 is FLOOR(boeing_seats / total_seats * 100)
|
|
69
|
-
}
|
|
70
|
-
`)
|
|
71
|
-
.run();
|
|
72
|
-
expect(result.data.path(0, 'percent_boeing_floor').value).toBe(55);
|
|
73
|
-
expect(result.data.path(0, 'percent_boeing_floor2').value).toBe(55);
|
|
74
|
-
});
|
|
75
|
-
// Model based version of sums.
|
|
76
|
-
it('model: expression fixups.', async () => {
|
|
77
|
-
const result = await expressionModel
|
|
78
|
-
.loadQuery(`
|
|
79
|
-
query: aircraft->{
|
|
80
|
-
aggregate:
|
|
81
|
-
aircraft_models.total_seats
|
|
82
|
-
aircraft_models.boeing_seats
|
|
83
|
-
}
|
|
84
|
-
`)
|
|
85
|
-
.run();
|
|
86
|
-
expect(result.data.path(0, 'total_seats').value).toBe(18294);
|
|
87
|
-
expect(result.data.path(0, 'boeing_seats').value).toBe(6244);
|
|
88
|
-
});
|
|
89
|
-
// turtle expressions
|
|
90
|
-
it('model: turtle', async () => {
|
|
91
|
-
const result = await expressionModel
|
|
92
|
-
.loadQuery(`
|
|
93
|
-
query: aircraft->by_manufacturer
|
|
94
|
-
`)
|
|
95
|
-
.run();
|
|
96
|
-
expect(result.data.path(0, 'manufacturer').value).toBe('CESSNA');
|
|
97
|
-
});
|
|
98
|
-
// filtered turtle expressions
|
|
99
|
-
(0, util_1.testIf)(runtime.supportsNesting)('model: filtered turtle', async () => {
|
|
100
|
-
const result = await expressionModel
|
|
101
|
-
.loadQuery(`
|
|
102
|
-
query: aircraft->{
|
|
103
|
-
nest: b is by_manufacturer{? aircraft_models.manufacturer ?~'B%'}
|
|
104
|
-
}
|
|
105
|
-
`)
|
|
106
|
-
.run();
|
|
107
|
-
expect(result.data.path(0, 'b', 0, 'manufacturer').value).toBe('BEECH');
|
|
108
|
-
});
|
|
109
|
-
// having.
|
|
110
|
-
it('model: simple having', async () => {
|
|
111
|
-
const result = await expressionModel
|
|
112
|
-
.loadQuery(`
|
|
113
|
-
query: aircraft->{
|
|
114
|
-
having: aircraft_count >90
|
|
115
|
-
group_by: state
|
|
116
|
-
aggregate: aircraft_count
|
|
117
|
-
order_by: 2
|
|
118
|
-
}
|
|
119
|
-
`)
|
|
120
|
-
.run();
|
|
121
|
-
expect(result.data.path(0, 'aircraft_count').value).toBe(91);
|
|
122
|
-
});
|
|
123
|
-
(0, util_1.testIf)(runtime.supportsNesting)('model: turtle having2', async () => {
|
|
124
|
-
const result = await expressionModel
|
|
125
|
-
.loadQuery(`
|
|
126
|
-
-- hacking a null test for now
|
|
127
|
-
query: aircraft->{
|
|
128
|
-
top: 10
|
|
129
|
-
order_by: 1
|
|
130
|
-
where: region != NULL
|
|
131
|
-
group_by: region
|
|
132
|
-
nest: by_state is {
|
|
133
|
-
top: 10
|
|
134
|
-
order_by: 1 desc
|
|
135
|
-
having: aircraft_count > 50
|
|
136
|
-
group_by: state
|
|
137
|
-
aggregate: aircraft_count
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
`)
|
|
141
|
-
.run();
|
|
142
|
-
expect(result.data.path(0, 'by_state', 0, 'state').value).toBe('VA');
|
|
143
|
-
});
|
|
144
|
-
(0, util_1.testIf)(runtime.supportsNesting)('model: turtle having on main', async () => {
|
|
145
|
-
const result = await expressionModel
|
|
146
|
-
.loadQuery(`
|
|
147
|
-
query: aircraft->{
|
|
148
|
-
order_by: 2 asc
|
|
149
|
-
having: aircraft_count ? >500
|
|
150
|
-
group_by: region
|
|
151
|
-
aggregate: aircraft_count
|
|
152
|
-
nest: by_state is {
|
|
153
|
-
order_by: 2 asc
|
|
154
|
-
having: aircraft_count >45
|
|
155
|
-
group_by: state
|
|
156
|
-
aggregate: aircraft_count
|
|
157
|
-
nest: by_city is {
|
|
158
|
-
order_by: 2 asc
|
|
159
|
-
having: aircraft_count ? >5
|
|
160
|
-
group_by: city
|
|
161
|
-
aggregate: aircraft_count
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
`)
|
|
166
|
-
.run();
|
|
167
|
-
expect(result.data.path(0, 'by_state', 0, 'by_city', 0, 'city').value).toBe('ALBUQUERQUE');
|
|
168
|
-
});
|
|
169
|
-
// bigquery doesn't like to partition by floats,
|
|
170
|
-
(0, util_1.testIf)(runtime.supportsNesting)('model: having float group by partition', async () => {
|
|
171
|
-
await expect(runtime).queryMatches(`${expressionModelText}
|
|
172
|
-
query: aircraft_models->{
|
|
173
|
-
order_by: 1
|
|
174
|
-
where: seats_bucketed > 0
|
|
175
|
-
having: aircraft_model_count > 400
|
|
176
|
-
group_by: seats_bucketed
|
|
177
|
-
aggregate: aircraft_model_count
|
|
178
|
-
nest: foo is {
|
|
179
|
-
group_by: engines
|
|
180
|
-
aggregate: aircraft_model_count
|
|
181
|
-
}
|
|
182
|
-
}`, { aircraft_model_count: 448 });
|
|
183
|
-
});
|
|
184
|
-
it('model: aggregate functions distinct min max', async () => {
|
|
185
|
-
const result = await expressionModel
|
|
186
|
-
.loadQuery(`
|
|
187
|
-
query: aircraft_models->{
|
|
188
|
-
aggregate:
|
|
189
|
-
distinct_seats is count(distinct seats),
|
|
190
|
-
boeing_distinct_seats is count(distinct seats) {?manufacturer ? 'BOEING'},
|
|
191
|
-
min_seats is min(seats),
|
|
192
|
-
cessna_min_seats is min(seats) {? manufacturer ? 'CESSNA'},
|
|
193
|
-
max_seats is max(seats),
|
|
194
|
-
cessna_max_seats is max(seats) {? manufacturer ? 'CESSNA'},
|
|
195
|
-
min_code is min(aircraft_model_code),
|
|
196
|
-
boeing_min_model is min(model) {? manufacturer ? 'BOEING'},
|
|
197
|
-
max_model is max(model),
|
|
198
|
-
boeing_max_model is max(model) {? manufacturer ? 'BOEING'},
|
|
199
|
-
}
|
|
200
|
-
`)
|
|
201
|
-
.run();
|
|
202
|
-
expect(result.data.path(0, 'distinct_seats').value).toBe(187);
|
|
203
|
-
expect(result.data.path(0, 'boeing_distinct_seats').value).toBe(85);
|
|
204
|
-
expect(result.data.path(0, 'min_seats').value).toBe(0);
|
|
205
|
-
expect(result.data.path(0, 'cessna_min_seats').value).toBe(1);
|
|
206
|
-
expect(result.data.path(0, 'max_seats').value).toBe(660);
|
|
207
|
-
expect(result.data.path(0, 'min_code').value).toBe('0030109');
|
|
208
|
-
expect(result.data.path(0, 'cessna_max_seats').value).toBe(14);
|
|
209
|
-
expect(result.data.path(0, 'boeing_min_model').value).toBe('100');
|
|
210
|
-
expect(result.data.path(0, 'max_model').value).toBe('ZWEIFEL PA18');
|
|
211
|
-
expect(result.data.path(0, 'boeing_max_model').value).toBe('YL-15');
|
|
212
|
-
});
|
|
213
|
-
(databaseName !== 'bigquery' ? it.skip : it)('model: dates named', async () => {
|
|
214
|
-
const result = await expressionModel
|
|
215
|
-
.loadQuery(`
|
|
216
|
-
query: table('malloytest.alltypes')->{
|
|
217
|
-
group_by:
|
|
218
|
-
t_date,
|
|
219
|
-
t_date_month is t_date.month,
|
|
220
|
-
t_date_year is t_date.year,
|
|
221
|
-
t_timestamp,
|
|
222
|
-
t_timestamp_date is t_timestamp.day,
|
|
223
|
-
t_timestamp_hour is t_timestamp.hour,
|
|
224
|
-
t_timestamp_minute is t_timestamp.minute,
|
|
225
|
-
t_timestamp_second is t_timestamp.second,
|
|
226
|
-
t_timestamp_month is t_timestamp.month,
|
|
227
|
-
t_timestamp_year is t_timestamp.year,
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
`)
|
|
231
|
-
.run();
|
|
232
|
-
expect(result.data.path(0, 't_date').value).toEqual(new Date('2020-03-02'));
|
|
233
|
-
expect(result.data.path(0, 't_date_month').value).toEqual(new Date('2020-03-01'));
|
|
234
|
-
expect(result.data.path(0, 't_date_year').value).toEqual(new Date('2020-01-01'));
|
|
235
|
-
expect(result.data.path(0, 't_timestamp').value).toEqual(new Date('2020-03-02T12:35:56.000Z'));
|
|
236
|
-
expect(result.data.path(0, 't_timestamp_second').value).toEqual(new Date('2020-03-02T12:35:56.000Z'));
|
|
237
|
-
expect(result.data.path(0, 't_timestamp_minute').value).toEqual(new Date('2020-03-02T12:35:00.000Z'));
|
|
238
|
-
expect(result.data.path(0, 't_timestamp_hour').value).toEqual(new Date('2020-03-02T12:00:00.000Z'));
|
|
239
|
-
expect(result.data.path(0, 't_timestamp_date').value).toEqual(new Date('2020-03-02'));
|
|
240
|
-
expect(result.data.path(0, 't_timestamp_month').value).toEqual(new Date('2020-03-01'));
|
|
241
|
-
expect(result.data.path(0, 't_timestamp_year').value).toEqual(new Date('2020-01-01'));
|
|
242
|
-
});
|
|
243
|
-
it.skip('defines in model', async () => {
|
|
244
|
-
// const result1 = await model.makeQuery(`
|
|
245
|
-
// define a is ('malloytest.alltypes');
|
|
246
|
-
// explore a | reduce x is count(*)
|
|
247
|
-
// `);
|
|
248
|
-
// const result = await model.makeQuery(`
|
|
249
|
-
// define a is ('malloytest.alltypes');
|
|
250
|
-
// explore a | reduce x is count(*)
|
|
251
|
-
// `);
|
|
252
|
-
});
|
|
253
|
-
it('named query metadata undefined', async () => {
|
|
254
|
-
const result = await expressionModel
|
|
255
|
-
.loadQuery(`
|
|
256
|
-
query: aircraft->{
|
|
257
|
-
aggregate: aircraft_count is count()
|
|
258
|
-
}
|
|
259
|
-
`)
|
|
260
|
-
.run();
|
|
261
|
-
// TODO The result explore should really be unnamed. This test currently
|
|
262
|
-
// inspects inner information because we have no way to have unnamed
|
|
263
|
-
// explores today.
|
|
264
|
-
// expect(result.getResultExplore().name).toBe(undefined);
|
|
265
|
-
expect(result._queryResult.queryName).toBe(undefined);
|
|
266
|
-
});
|
|
267
|
-
it('named query metadata named', async () => {
|
|
268
|
-
const result = await expressionModel
|
|
269
|
-
.loadQuery(`
|
|
270
|
-
query: aircraft->by_manufacturer
|
|
271
|
-
`)
|
|
272
|
-
.run();
|
|
273
|
-
expect(result.resultExplore.name).toBe('by_manufacturer');
|
|
274
|
-
});
|
|
275
|
-
it('named query metadata named head of pipeline', async () => {
|
|
276
|
-
const result = await expressionModel
|
|
277
|
-
.loadQuery(`
|
|
278
|
-
query: aircraft->by_manufacturer->{ aggregate: c is count()}
|
|
279
|
-
`)
|
|
280
|
-
.run();
|
|
281
|
-
// TODO Same as above -- this test should check the explore name
|
|
282
|
-
// expect(result.getResultExplore().name).toBe(undefined);
|
|
283
|
-
expect(result._queryResult.queryName).toBe(undefined);
|
|
284
|
-
});
|
|
285
|
-
it('filtered explores basic', async () => {
|
|
286
|
-
const result = await expressionModel
|
|
287
|
-
.loadQuery(`
|
|
288
|
-
source: b is aircraft{ where: aircraft_models.manufacturer ? ~'B%' }
|
|
289
|
-
|
|
290
|
-
query: b->{aggregate: m_count is count(distinct aircraft_models.manufacturer) }
|
|
291
|
-
`)
|
|
292
|
-
.run();
|
|
293
|
-
expect(result.data.path(0, 'm_count').value).toBe(63);
|
|
294
|
-
});
|
|
295
|
-
(0, util_1.testIf)(runtime.supportsNesting)('query with aliasname used twice', async () => {
|
|
296
|
-
const result = await expressionModel
|
|
297
|
-
.loadQuery(`
|
|
298
|
-
query: aircraft->{
|
|
299
|
-
group_by: first is substr(city,1,1)
|
|
300
|
-
aggregate: aircraft_count is count()
|
|
301
|
-
nest: aircraft is {
|
|
302
|
-
group_by: first_two is substr(city,1,2)
|
|
303
|
-
aggregate: aircraft_count is count()
|
|
304
|
-
nest: aircraft is {
|
|
305
|
-
group_by: first_three is substr(city,1,3)
|
|
306
|
-
aggregate: aircraft_count is count()
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
} -> {
|
|
310
|
-
project:
|
|
311
|
-
aircraft.aircraft.first_three
|
|
312
|
-
aircraft_count
|
|
313
|
-
order_by: 2 desc, 1
|
|
314
|
-
}
|
|
315
|
-
`)
|
|
316
|
-
.run();
|
|
317
|
-
expect(result.data.path(0, 'first_three').value).toBe('SAB');
|
|
318
|
-
});
|
|
319
|
-
it.skip('join foreign_key reverse', async () => {
|
|
320
|
-
const result = await expressionModel
|
|
321
|
-
.loadQuery(`
|
|
322
|
-
source: a is table('malloytest.aircraft') {
|
|
323
|
-
primary_key: tail_num
|
|
324
|
-
measure: aircraft_count is count()
|
|
325
|
-
}
|
|
326
|
-
query: table('malloytest.aircraft_models') {
|
|
327
|
-
primary_key: aircraft_model_code
|
|
328
|
-
join_many: a on a.aircraft_model_code
|
|
329
|
-
|
|
330
|
-
some_measures is {
|
|
331
|
-
aggregate: am_count is count()
|
|
332
|
-
aggregate: a.aircraft_count
|
|
333
|
-
}
|
|
334
|
-
} -> some_measure
|
|
335
|
-
`)
|
|
336
|
-
.run();
|
|
337
|
-
expect(result.data.path(0, 'first_three').value).toBe('SAN');
|
|
338
|
-
});
|
|
339
|
-
it('joined filtered explores', async () => {
|
|
340
|
-
const result = await expressionModel
|
|
341
|
-
.loadQuery(`
|
|
342
|
-
source: a_models is table('malloytest.aircraft_models'){
|
|
343
|
-
where: manufacturer ? ~'B%'
|
|
344
|
-
primary_key: aircraft_model_code
|
|
345
|
-
measure:model_count is count()
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
source: aircraft2 is table('malloytest.aircraft'){
|
|
349
|
-
join_one: model is a_models with aircraft_model_code
|
|
350
|
-
measure: aircraft_count is count()
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
query: aircraft2->{
|
|
354
|
-
aggregate:
|
|
355
|
-
model.model_count
|
|
356
|
-
aircraft_count
|
|
357
|
-
}
|
|
358
|
-
`)
|
|
359
|
-
.run();
|
|
360
|
-
expect(result.data.path(0, 'model_count').value).toBe(244);
|
|
361
|
-
expect(result.data.path(0, 'aircraft_count').value).toBe(3599);
|
|
362
|
-
});
|
|
363
|
-
it('joined filtered explores with dependancies', async () => {
|
|
364
|
-
const result = await expressionModel
|
|
365
|
-
.loadQuery(`
|
|
366
|
-
source: bo_models is
|
|
367
|
-
from(
|
|
368
|
-
table('malloytest.aircraft_models') {? manufacturer ? ~ 'BO%' }
|
|
369
|
-
-> { project: aircraft_model_code, manufacturer, seats }
|
|
370
|
-
) {
|
|
371
|
-
primary_key: aircraft_model_code
|
|
372
|
-
measure: bo_count is count()
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
source: b_models is
|
|
376
|
-
from(
|
|
377
|
-
table('malloytest.aircraft_models') {? manufacturer ? ~ 'B%' }
|
|
378
|
-
-> { project: aircraft_model_code, manufacturer, seats }
|
|
379
|
-
) {
|
|
380
|
-
where: bo_models.seats > 200
|
|
381
|
-
primary_key: aircraft_model_code
|
|
382
|
-
measure: b_count is count()
|
|
383
|
-
join_one: bo_models with aircraft_model_code
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
source: models is table('malloytest.aircraft_models') {
|
|
387
|
-
join_one: b_models with aircraft_model_code
|
|
388
|
-
measure: model_count is count()
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
query: models -> {
|
|
392
|
-
aggregate: model_count
|
|
393
|
-
aggregate: b_models.b_count
|
|
394
|
-
-- aggregate: b_models.bo_models.bo_count
|
|
395
|
-
}
|
|
396
|
-
`)
|
|
397
|
-
.run();
|
|
398
|
-
expect(result.data.path(0, 'model_count').value).toBe(60461);
|
|
399
|
-
expect(result.data.path(0, 'b_count').value).toBe(355);
|
|
400
|
-
});
|
|
401
|
-
it('group by explore - simple group by', async () => {
|
|
402
|
-
const result = await expressionModel
|
|
403
|
-
.loadQuery(`
|
|
404
|
-
query: aircraft->{
|
|
405
|
-
group_by: aircraft_models
|
|
406
|
-
aggregate: aircraft_count
|
|
407
|
-
}
|
|
408
|
-
`)
|
|
409
|
-
.run();
|
|
410
|
-
expect(result.data.path(0, 'aircraft_count').value).toBe(58);
|
|
411
|
-
expect(result.data.path(0, 'aircraft_models_id').value).toBe('7102802');
|
|
412
|
-
});
|
|
413
|
-
it('group by explore - pipeline', async () => {
|
|
414
|
-
const result = await expressionModel
|
|
415
|
-
.loadQuery(`
|
|
416
|
-
query: aircraft->{
|
|
417
|
-
group_by: aircraft_models
|
|
418
|
-
aggregate: aircraft_count
|
|
419
|
-
} -> {
|
|
420
|
-
group_by: aircraft_models.manufacturer
|
|
421
|
-
aggregate: aircraft_count is aircraft_count.sum()
|
|
422
|
-
}
|
|
423
|
-
`)
|
|
424
|
-
.run();
|
|
425
|
-
expect(result.data.path(0, 'aircraft_count').value).toBe(1048);
|
|
426
|
-
expect(result.data.path(0, 'manufacturer').value).toBe('CESSNA');
|
|
427
|
-
});
|
|
428
|
-
it('group by explore - pipeline 2 levels', async () => {
|
|
429
|
-
const result = await expressionModel
|
|
430
|
-
.loadQuery(`
|
|
431
|
-
source: f is table('malloytest.flights'){
|
|
432
|
-
join_one: a is table('malloytest.aircraft') {
|
|
433
|
-
join_one: state_facts is table('malloytest.state_facts'){primary_key: state} with state
|
|
434
|
-
} on tail_num = a.tail_num
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
query: f-> {
|
|
438
|
-
group_by: a.state_facts
|
|
439
|
-
aggregate: flight_count is count()
|
|
440
|
-
} -> {
|
|
441
|
-
group_by: state_facts.popular_name
|
|
442
|
-
aggregate: flight_count is flight_count.sum()
|
|
443
|
-
}
|
|
444
|
-
`)
|
|
445
|
-
.run();
|
|
446
|
-
// console.log(result.data.toObject());
|
|
447
|
-
expect(result.data.path(0, 'flight_count').value).toBe(199726);
|
|
448
|
-
expect(result.data.path(0, 'popular_name').value).toBe('Isabella');
|
|
449
|
-
});
|
|
450
|
-
});
|
|
451
|
-
describe.each(runtimes.runtimeList)('%s', (databaseName, runtime) => {
|
|
452
|
-
const sqlEq = (0, util_1.mkSqlEqWith)(runtime, {
|
|
453
|
-
malloy: `+ {
|
|
454
|
-
dimension: friName is 'friday'
|
|
455
|
-
dimension: friDay is 5
|
|
456
|
-
dimension: satName is 'saturday'
|
|
457
|
-
dimension: satDay is 6
|
|
458
|
-
}`,
|
|
459
|
-
});
|
|
460
|
-
describe.skip('alternations with not-eq', () => {
|
|
461
|
-
/*
|
|
462
|
-
Here's the desired truth table ...
|
|
463
|
-
|
|
464
|
-
x x != y | z
|
|
465
|
-
====== ============
|
|
466
|
-
y false
|
|
467
|
-
z false
|
|
468
|
-
^[yz] true
|
|
469
|
-
*/
|
|
470
|
-
test('x not-eq y or z : x eq y', async () => {
|
|
471
|
-
const result = await sqlEq('6 != (6|7)', false);
|
|
472
|
-
expect(result).isSqlEq();
|
|
473
|
-
});
|
|
474
|
-
test('x not-eq y or z : x eq z', async () => {
|
|
475
|
-
const result = await sqlEq('7 != (6|7)', false);
|
|
476
|
-
expect(result).isSqlEq();
|
|
477
|
-
});
|
|
478
|
-
test('x not-eq y or z : else', async () => {
|
|
479
|
-
const result = await sqlEq('5 != (6|7)', true);
|
|
480
|
-
expect(result).isSqlEq();
|
|
481
|
-
});
|
|
482
|
-
/*
|
|
483
|
-
Writing this the old way, should have the same truth table ...
|
|
484
|
-
x != y & != z
|
|
485
|
-
*/
|
|
486
|
-
test('x not-eq y and not-eq z : x eq y', async () => {
|
|
487
|
-
const result = await sqlEq('6 != (6 & !=7)', false);
|
|
488
|
-
expect(result).isSqlEq();
|
|
489
|
-
});
|
|
490
|
-
test('x not-eq y and not-eq z : x eq z', async () => {
|
|
491
|
-
const result = await sqlEq('7 != (6 & != 7)', false);
|
|
492
|
-
expect(result).isSqlEq();
|
|
493
|
-
});
|
|
494
|
-
test('x not-eq y and not-eq z : else', async () => {
|
|
495
|
-
const result = await sqlEq('5 != (6 & !=7)', true);
|
|
496
|
-
expect(result).isSqlEq();
|
|
497
|
-
});
|
|
498
|
-
});
|
|
499
|
-
describe('string literal quoting', () => {
|
|
500
|
-
const dq = '"';
|
|
501
|
-
const tick = "'";
|
|
502
|
-
const back = '\\';
|
|
503
|
-
test('quote single character', async () => {
|
|
504
|
-
expect(await sqlEq(`'${back}x'`, 'x')).isSqlEq();
|
|
505
|
-
});
|
|
506
|
-
test('quote single quote', async () => {
|
|
507
|
-
expect(await sqlEq(`'${back}${tick}'`, tick)).isSqlEq();
|
|
508
|
-
});
|
|
509
|
-
test('quote double quote', async () => {
|
|
510
|
-
await expect(runtime).queryMatches(`sql: x is {connection:"${databaseName}" select:"""SELECT 1 as x"""}
|
|
511
|
-
query: from_sql(x) -> {
|
|
512
|
-
project: double_quote is "${back}${dq}"
|
|
513
|
-
}
|
|
514
|
-
`, { double_quote: '"' });
|
|
515
|
-
});
|
|
516
|
-
test('quote backslash', async () => {
|
|
517
|
-
expect(await sqlEq(`'${back}${back}'`, back)).isSqlEq();
|
|
518
|
-
});
|
|
519
|
-
});
|
|
520
|
-
test('nullish ?? operator', async () => {
|
|
521
|
-
await expect(runtime).queryMatches(`sql: nullTest is { connection: "${databaseName}" select: """
|
|
522
|
-
SELECT '' as null_value, '' as string_value
|
|
523
|
-
UNION ALL SELECT null, 'correct'
|
|
524
|
-
""" }
|
|
525
|
-
query: from_sql(nullTest) -> {
|
|
526
|
-
where: null_value = null
|
|
527
|
-
project:
|
|
528
|
-
found_null is null_value ?? 'correct',
|
|
529
|
-
else_pass is string_value ?? 'incorrect'
|
|
530
|
-
literal_null is null ?? 'correct'
|
|
531
|
-
}`, { found_null: 'correct', else_pass: 'correct', literal_null: 'correct' });
|
|
532
|
-
});
|
|
533
|
-
test('dimension expressions expanded with parens properly', async () => {
|
|
534
|
-
await expect(runtime).queryMatches(`
|
|
535
|
-
sql: tbl is { connection: "${databaseName}" select: """SELECT 1 as n"""}
|
|
536
|
-
query: from_sql(tbl) + {
|
|
537
|
-
dimension: fot is (false) or (true)
|
|
538
|
-
} -> {
|
|
539
|
-
project:
|
|
540
|
-
no_paren is false and fot
|
|
541
|
-
paren is false and (fot)
|
|
542
|
-
}
|
|
543
|
-
`, { paren: false, no_paren: false });
|
|
544
|
-
});
|
|
545
|
-
});
|
|
546
|
-
afterAll(async () => {
|
|
547
|
-
await runtimes.closeAll();
|
|
548
|
-
});
|
|
549
|
-
};
|
|
550
|
-
exports.exprSharedTests = exprSharedTests;
|
|
551
|
-
//# sourceMappingURL=expr.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"expr.js","sourceRoot":"","sources":["../../../src/databases/shared/expr.ts"],"names":[],"mappings":"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"}
|