@malloydata/malloy-tests 0.0.95-dev231019211822 → 0.0.95
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/README.md +213 -1
- package/dist/api.spec.d.ts +1 -1
- package/dist/api.spec.js +6 -13
- package/dist/api.spec.js.map +1 -1
- package/dist/databases/all/db_index.spec.js +21 -41
- package/dist/databases/all/db_index.spec.js.map +1 -1
- package/dist/databases/all/expr.spec.js +262 -339
- package/dist/databases/all/expr.spec.js.map +1 -1
- package/dist/databases/all/functions.spec.js +37 -35
- package/dist/databases/all/functions.spec.js.map +1 -1
- package/dist/databases/all/join.spec.js +125 -169
- package/dist/databases/all/join.spec.js.map +1 -1
- package/dist/databases/all/nomodel.spec.js +335 -594
- package/dist/databases/all/nomodel.spec.js.map +1 -1
- package/dist/databases/all/orderby.spec.js +82 -128
- package/dist/databases/all/orderby.spec.js.map +1 -1
- package/dist/databases/all/sql_expressions.spec.js +27 -43
- package/dist/databases/all/sql_expressions.spec.js.map +1 -1
- package/dist/databases/all/time.spec.js +63 -103
- package/dist/databases/all/time.spec.js.map +1 -1
- package/dist/databases/bigquery/double_truncation.spec.js +1 -1
- package/dist/databases/bigquery/handexpr.spec.js +12 -12
- package/dist/databases/bigquery/injestion_time_partitioning.spec.js +22 -22
- package/dist/databases/bigquery/joined_filters.spec.js +3 -3
- package/dist/databases/bigquery/json.spec.d.ts +1 -1
- package/dist/databases/bigquery/json.spec.js +25 -45
- package/dist/databases/bigquery/json.spec.js.map +1 -1
- package/dist/databases/bigquery/malloy_query.spec.d.ts +1 -1
- package/dist/databases/bigquery/malloy_query.spec.js +47 -48
- package/dist/databases/bigquery/malloy_query.spec.js.map +1 -1
- package/dist/databases/bigquery/time.spec.js +9 -13
- package/dist/databases/bigquery/time.spec.js.map +1 -1
- package/dist/databases/bigquery/wildcard_table_names.spec.js +19 -19
- package/dist/databases/bigquery-duckdb/nested_source_table.spec.js +53 -87
- package/dist/databases/bigquery-duckdb/nested_source_table.spec.js.map +1 -1
- package/dist/databases/bigquery-postgres/multi_connection.spec.js +5 -20
- package/dist/databases/bigquery-postgres/multi_connection.spec.js.map +1 -1
- package/dist/databases/bigquery-postgres/streaming.spec.js +6 -6
- package/dist/databases/bigquery-postgres/streaming.spec.js.map +1 -1
- package/dist/databases/duckdb/duckdb.spec.js +24 -33
- package/dist/databases/duckdb/duckdb.spec.js.map +1 -1
- package/dist/databases/postgres/postgres.spec.js +46 -67
- package/dist/databases/postgres/postgres.spec.js.map +1 -1
- 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/render/render.spec.js +10 -12
- package/dist/render/render.spec.js.map +1 -1
- package/dist/tags.spec.js +22 -2
- package/dist/tags.spec.js.map +1 -1
- package/dist/util/db-jest-matchers.d.ts +17 -6
- package/dist/util/db-jest-matchers.js +81 -20
- package/dist/util/db-jest-matchers.js.map +1 -1
- package/dist/util/index.d.ts +1 -2
- package/dist/util/index.js +11 -13
- package/dist/util/index.js.map +1 -1
- package/package.json +6 -6
- package/src/api.spec.ts +7 -16
- package/src/databases/all/db_index.spec.ts +22 -48
- package/src/databases/all/expr.spec.ts +273 -431
- package/src/databases/all/functions.spec.ts +37 -35
- package/src/databases/all/join.spec.ts +130 -196
- package/src/databases/all/nomodel.spec.ts +333 -689
- package/src/databases/all/orderby.spec.ts +87 -161
- package/src/databases/all/sql_expressions.spec.ts +29 -49
- package/src/databases/all/time.spec.ts +73 -130
- package/src/databases/bigquery/double_truncation.spec.ts +1 -1
- package/src/databases/bigquery/handexpr.spec.ts +12 -12
- package/src/databases/bigquery/injestion_time_partitioning.spec.ts +22 -22
- package/src/databases/bigquery/joined_filters.spec.ts +3 -3
- package/src/databases/bigquery/json.spec.ts +25 -49
- package/src/databases/bigquery/malloy_query.spec.ts +47 -54
- package/src/databases/bigquery/time.spec.ts +13 -17
- package/src/databases/bigquery/wildcard_table_names.spec.ts +19 -19
- package/src/databases/bigquery-duckdb/nested_source_table.spec.ts +56 -98
- package/src/databases/bigquery-postgres/multi_connection.spec.ts +5 -23
- package/src/databases/bigquery-postgres/streaming.spec.ts +12 -6
- package/src/databases/duckdb/duckdb.spec.ts +31 -43
- package/src/databases/postgres/postgres.spec.ts +54 -84
- package/src/jestMatcher.spec.ts +88 -0
- package/src/render/render.spec.ts +10 -12
- package/src/tags.spec.ts +22 -2
- package/src/util/db-jest-matchers.ts +106 -32
- package/src/util/index.ts +16 -14
|
@@ -24,12 +24,13 @@
|
|
|
24
24
|
/* eslint-disable no-console */
|
|
25
25
|
|
|
26
26
|
import {RuntimeList, allDatabases} from '../../runtimes';
|
|
27
|
-
import {databasesFromEnvironmentOr} from '../../util';
|
|
27
|
+
import {databasesFromEnvironmentOr, testIf} from '../../util';
|
|
28
28
|
import '../../util/db-jest-matchers';
|
|
29
29
|
|
|
30
30
|
const runtimes = new RuntimeList(databasesFromEnvironmentOr(allDatabases));
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
function modelText(connectionName: string) {
|
|
32
|
+
return `
|
|
33
|
+
source: aircraft_models is ${connectionName}.table('malloytest.aircraft_models') extend {
|
|
33
34
|
primary_key: aircraft_model_code
|
|
34
35
|
measure: model_count is count()
|
|
35
36
|
view: manufacturer_models is {
|
|
@@ -42,7 +43,7 @@ const joinModelText = `
|
|
|
42
43
|
}
|
|
43
44
|
}
|
|
44
45
|
|
|
45
|
-
source: aircraft is table('malloytest.aircraft') extend {
|
|
46
|
+
source: aircraft is ${connectionName}.table('malloytest.aircraft') extend {
|
|
46
47
|
primary_key: tail_num
|
|
47
48
|
measure: aircraft_count is count()
|
|
48
49
|
}
|
|
@@ -52,11 +53,7 @@ const joinModelText = `
|
|
|
52
53
|
with manufacturer
|
|
53
54
|
}
|
|
54
55
|
`;
|
|
55
|
-
|
|
56
|
-
// const models = new Map<string, malloy.ModelMaterializer>();
|
|
57
|
-
// runtimes.runtimeMap.forEach((runtime, key) => {
|
|
58
|
-
// models.set(key, runtime.loadModel(joinModelText));
|
|
59
|
-
// });
|
|
56
|
+
}
|
|
60
57
|
|
|
61
58
|
afterAll(async () => {
|
|
62
59
|
await runtimes.closeAll();
|
|
@@ -64,107 +61,79 @@ afterAll(async () => {
|
|
|
64
61
|
|
|
65
62
|
describe('join expression tests', () => {
|
|
66
63
|
runtimes.runtimeMap.forEach((runtime, database) => {
|
|
64
|
+
const joinModelText = modelText(database);
|
|
65
|
+
const joinModel = runtime.loadModel(joinModelText);
|
|
67
66
|
it(`model source refine join - ${database}`, async () => {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
aircraft_count
|
|
79
|
-
aircraft_models.model_count
|
|
80
|
-
}
|
|
81
|
-
`
|
|
82
|
-
)
|
|
83
|
-
.run();
|
|
84
|
-
expect(result.data.value[0]['model_count']).toBe(1416);
|
|
67
|
+
await expect(`
|
|
68
|
+
source: a2 is aircraft extend {
|
|
69
|
+
join_one: aircraft_models with aircraft_model_code
|
|
70
|
+
}
|
|
71
|
+
run: a2 -> {
|
|
72
|
+
aggregate:
|
|
73
|
+
aircraft_count
|
|
74
|
+
aircraft_models.model_count
|
|
75
|
+
}
|
|
76
|
+
`).malloyResultMatches(joinModel, {model_count: 1416});
|
|
85
77
|
});
|
|
86
78
|
|
|
87
79
|
it(`model source refine in query join - ${database}`, async () => {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
aircraft_models.model_count
|
|
98
|
-
}
|
|
99
|
-
`
|
|
100
|
-
)
|
|
101
|
-
.run();
|
|
102
|
-
expect(result.data.value[0]['model_count']).toBe(1416);
|
|
80
|
+
await expect(`
|
|
81
|
+
run: aircraft extend {
|
|
82
|
+
join_one: aircraft_models with aircraft_model_code
|
|
83
|
+
} -> {
|
|
84
|
+
aggregate:
|
|
85
|
+
aircraft_count
|
|
86
|
+
aircraft_models.model_count
|
|
87
|
+
}
|
|
88
|
+
`).malloyResultMatches(joinModel, {model_count: 1416});
|
|
103
89
|
});
|
|
104
90
|
|
|
105
91
|
it(`model: join fact table query - ${database}`, async () => {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
limit: 1
|
|
122
|
-
}
|
|
123
|
-
`
|
|
124
|
-
)
|
|
125
|
-
.run();
|
|
126
|
-
expect(result.data.value[0]['num_models']).toBe(1147);
|
|
92
|
+
await expect(`
|
|
93
|
+
run: aircraft_models extend {
|
|
94
|
+
join_one: am_facts is
|
|
95
|
+
aircraft_models->{
|
|
96
|
+
group_by: m is manufacturer
|
|
97
|
+
aggregate: num_models is count()
|
|
98
|
+
} with manufacturer
|
|
99
|
+
} -> {
|
|
100
|
+
select:
|
|
101
|
+
manufacturer
|
|
102
|
+
am_facts.num_models
|
|
103
|
+
order_by: 2 desc
|
|
104
|
+
limit: 1
|
|
105
|
+
}
|
|
106
|
+
`).malloyResultMatches(joinModel, {num_models: 1147});
|
|
127
107
|
});
|
|
128
108
|
|
|
129
109
|
it(`model: source based on query - ${database}`, async () => {
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
`
|
|
134
|
-
run:
|
|
135
|
-
aircraft_models-> {
|
|
110
|
+
await expect(`
|
|
111
|
+
run: aircraft_models
|
|
112
|
+
-> {
|
|
136
113
|
group_by: m is manufacturer
|
|
137
114
|
aggregate: num_models is count()
|
|
115
|
+
} -> {
|
|
116
|
+
select:
|
|
117
|
+
m
|
|
118
|
+
num_models
|
|
119
|
+
order_by: 2 desc
|
|
120
|
+
limit: 1
|
|
138
121
|
}
|
|
139
|
-
|
|
140
|
-
select:
|
|
141
|
-
m
|
|
142
|
-
num_models
|
|
143
|
-
order_by: 2 desc
|
|
144
|
-
limit: 1
|
|
145
|
-
}
|
|
146
|
-
`
|
|
147
|
-
)
|
|
148
|
-
.run();
|
|
149
|
-
expect(result.data.value[0]['num_models']).toBe(1147);
|
|
122
|
+
`).malloyResultMatches(joinModel, {num_models: 1147});
|
|
150
123
|
});
|
|
151
124
|
|
|
152
125
|
it(`model: funnel - merge two queries - ${database}`, async () => {
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
group_by: m is manufacturer
|
|
159
|
-
aggregate: num_models is count()
|
|
160
|
-
} extend {
|
|
126
|
+
await expect(`
|
|
127
|
+
run: aircraft_models->{
|
|
128
|
+
group_by: m is manufacturer
|
|
129
|
+
aggregate: num_models is count()
|
|
130
|
+
} extend {
|
|
161
131
|
join_one: seats is
|
|
162
132
|
aircraft_models->{
|
|
163
133
|
group_by: m is manufacturer
|
|
164
134
|
aggregate: total_seats is seats.sum()
|
|
165
135
|
} with m
|
|
166
|
-
}
|
|
167
|
-
-> {
|
|
136
|
+
} -> {
|
|
168
137
|
select:
|
|
169
138
|
m
|
|
170
139
|
num_models
|
|
@@ -172,83 +141,66 @@ describe('join expression tests', () => {
|
|
|
172
141
|
order_by: 2 desc
|
|
173
142
|
limit: 1
|
|
174
143
|
}
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
expect(result.data.value[0]['total_seats']).toBe(252771);
|
|
144
|
+
`).malloyResultMatches(joinModel, {
|
|
145
|
+
num_models: 1147,
|
|
146
|
+
total_seats: 252771,
|
|
147
|
+
});
|
|
180
148
|
});
|
|
181
149
|
|
|
182
150
|
it(`model: modeled funnel - ${database}`, async () => {
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
}
|
|
198
|
-
`
|
|
199
|
-
)
|
|
200
|
-
.run();
|
|
201
|
-
expect(result.data.value[0]['num_models']).toBe(1147);
|
|
202
|
-
expect(result.data.value[0]['total_seats']).toBe(252771);
|
|
151
|
+
await expect(`
|
|
152
|
+
run: aircraft_models-> manufacturer_models extend {
|
|
153
|
+
join_one: seats is aircraft_models->manufacturer_seats with manufacturer
|
|
154
|
+
} -> {
|
|
155
|
+
select:
|
|
156
|
+
manufacturer,
|
|
157
|
+
num_models,
|
|
158
|
+
seats.total_seats
|
|
159
|
+
order_by: 2 desc
|
|
160
|
+
limit: 1
|
|
161
|
+
}
|
|
162
|
+
`).malloyResultMatches(joinModel, {
|
|
163
|
+
num_models: 1147,
|
|
164
|
+
total_seats: 252771,
|
|
165
|
+
});
|
|
203
166
|
});
|
|
204
167
|
|
|
205
168
|
it(`model: modeled funnel2 - ${database}`, async () => {
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
)
|
|
220
|
-
.run();
|
|
221
|
-
expect(result.data.value[0]['num_models']).toBe(1147);
|
|
222
|
-
expect(result.data.value[0]['total_seats']).toBe(252771);
|
|
169
|
+
await expect(`
|
|
170
|
+
run: funnel->{
|
|
171
|
+
select:
|
|
172
|
+
manufacturer
|
|
173
|
+
num_models
|
|
174
|
+
seats.total_seats
|
|
175
|
+
order_by: 2 desc
|
|
176
|
+
limit: 1
|
|
177
|
+
}
|
|
178
|
+
`).malloyResultMatches(joinModel, {
|
|
179
|
+
num_models: 1147,
|
|
180
|
+
total_seats: 252771,
|
|
181
|
+
});
|
|
223
182
|
});
|
|
224
183
|
|
|
225
184
|
it(`model: double_pipe - ${database}`, async () => {
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
select: f_sum2 is f_sum+1
|
|
237
|
-
}
|
|
238
|
-
`
|
|
239
|
-
)
|
|
240
|
-
.run();
|
|
241
|
-
expect(result.data.value[0]['f_sum2']).toBe(60462);
|
|
185
|
+
await expect(`
|
|
186
|
+
run: aircraft_models->{
|
|
187
|
+
group_by: manufacturer
|
|
188
|
+
aggregate: f is count()
|
|
189
|
+
}->{
|
|
190
|
+
aggregate: f_sum is f.sum()
|
|
191
|
+
}->{
|
|
192
|
+
select: f_sum2 is f_sum+1
|
|
193
|
+
}
|
|
194
|
+
`).malloyResultMatches(joinModel, {f_sum2: 60462});
|
|
242
195
|
});
|
|
243
196
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
`
|
|
197
|
+
testIf(runtime.supportsNesting)(
|
|
198
|
+
`model: unnest is left join - ${database}`,
|
|
199
|
+
async () => {
|
|
200
|
+
await expect(`
|
|
249
201
|
// produce a table with 4 rows that has a nested element
|
|
250
|
-
query: a_states is table('malloytest.state_facts')-> {
|
|
251
|
-
|
|
202
|
+
query: a_states is ${database}.table('malloytest.state_facts')-> {
|
|
203
|
+
where: state ? ~ 'A%'
|
|
252
204
|
group_by: state
|
|
253
205
|
nest: somthing is {group_by: state}
|
|
254
206
|
}
|
|
@@ -256,7 +208,7 @@ describe('join expression tests', () => {
|
|
|
256
208
|
// join the 4 rows and reference the
|
|
257
209
|
// nested column. should return all the rows.
|
|
258
210
|
// If the unnest is an inner join, we'll get back just 4 rows.
|
|
259
|
-
run: table('malloytest.state_facts') {
|
|
211
|
+
run: ${database}.table('malloytest.state_facts') extend {
|
|
260
212
|
join_one: a_states is a_states with state
|
|
261
213
|
}
|
|
262
214
|
-> {
|
|
@@ -265,73 +217,55 @@ describe('join expression tests', () => {
|
|
|
265
217
|
nest: a is {
|
|
266
218
|
group_by: a_states.somthing.state
|
|
267
219
|
}
|
|
220
|
+
limit: 5
|
|
268
221
|
}
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
// console.log(result.data.toObject());
|
|
273
|
-
expect(result.data.rowCount).toBeGreaterThan(4);
|
|
274
|
-
});
|
|
222
|
+
`).malloyResultMatches(joinModel, [{}, {}, {}, {}, {}]);
|
|
223
|
+
}
|
|
224
|
+
);
|
|
275
225
|
|
|
276
|
-
// not sure how to solve this one yet
|
|
226
|
+
// not sure how to solve this one yet, just check for > 4 rows
|
|
277
227
|
it(`All joins at the same level - ${database}`, async () => {
|
|
278
|
-
|
|
279
|
-
.
|
|
280
|
-
|
|
281
|
-
source: flights is table('malloytest.flights') extend {
|
|
282
|
-
join_one: aircraft is table('malloytest.aircraft')
|
|
228
|
+
await expect(`
|
|
229
|
+
source: flights is ${database}.table('malloytest.flights') extend {
|
|
230
|
+
join_one: aircraft is ${database}.table('malloytest.aircraft')
|
|
283
231
|
on tail_num = aircraft.tail_num
|
|
284
|
-
join_one: aircraft_models is table('malloytest.aircraft_models')
|
|
232
|
+
join_one: aircraft_models is ${database}.table('malloytest.aircraft_models')
|
|
285
233
|
on aircraft.aircraft_model_code = aircraft_models.aircraft_model_code
|
|
286
234
|
}
|
|
287
235
|
|
|
288
236
|
run: flights -> {
|
|
289
237
|
group_by: aircraft_models.seats
|
|
290
238
|
aggregate: flight_count is count()
|
|
239
|
+
limit: 5
|
|
291
240
|
}
|
|
292
|
-
|
|
293
|
-
)
|
|
294
|
-
.run();
|
|
295
|
-
// console.log(result.data.toObject());
|
|
296
|
-
expect(result.data.rowCount).toBeGreaterThan(4);
|
|
241
|
+
`).malloyResultMatches(joinModel, [{}, {}, {}, {}, {}]);
|
|
297
242
|
});
|
|
298
243
|
|
|
299
244
|
it(`join issue440 - ${database}`, async () => {
|
|
300
|
-
|
|
301
|
-
.
|
|
302
|
-
`
|
|
303
|
-
source: aircraft_models is table('malloytest.aircraft_models')
|
|
245
|
+
await expect(`
|
|
246
|
+
source: aircraft_models is ${database}.table('malloytest.aircraft_models')
|
|
304
247
|
|
|
305
|
-
source: aircraft is table('malloytest.aircraft')
|
|
248
|
+
source: aircraft is ${database}.table('malloytest.aircraft')
|
|
306
249
|
|
|
307
|
-
source: flights is table('malloytest.flights') extend {
|
|
250
|
+
source: flights is ${database}.table('malloytest.flights') extend {
|
|
308
251
|
join_one: aircraft on aircraft.tail_num = tail_num
|
|
309
252
|
join_one: aircraft_models on aircraft_models.aircraft_model_code = aircraft.aircraft_model_code
|
|
310
253
|
}
|
|
311
254
|
|
|
312
255
|
run: flights-> {
|
|
313
256
|
group_by: testingtwo is aircraft_models.model
|
|
257
|
+
limit: 5
|
|
314
258
|
}
|
|
315
|
-
`
|
|
316
|
-
)
|
|
317
|
-
.run();
|
|
318
|
-
// console.log(result.data.toObject());
|
|
319
|
-
expect(result.data.rowCount).toBeGreaterThan(4);
|
|
259
|
+
`).malloyResultMatches(runtime, [{}, {}, {}, {}, {}]);
|
|
320
260
|
});
|
|
321
261
|
|
|
322
262
|
it(`join issue1092 - ${database}`, async () => {
|
|
323
|
-
|
|
324
|
-
.
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
}
|
|
330
|
-
`
|
|
331
|
-
)
|
|
332
|
-
.run();
|
|
333
|
-
// console.log(result.data.toObject());
|
|
334
|
-
expect(result.data.rowCount).toBe(1);
|
|
263
|
+
await expect(`
|
|
264
|
+
run: ${database}.table('malloytest.state_facts') -> {
|
|
265
|
+
extend: {join_one: sf is ${database}.table('malloytest.state_facts') on sf.state = state}
|
|
266
|
+
aggregate: x is sf.births.sum() { where: state = 'CA' }
|
|
267
|
+
}
|
|
268
|
+
`).malloyResultMatches(runtime, [{}]);
|
|
335
269
|
});
|
|
336
270
|
});
|
|
337
271
|
});
|