@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.
Files changed (84) hide show
  1. package/README.md +213 -1
  2. package/dist/api.spec.d.ts +1 -1
  3. package/dist/api.spec.js +6 -13
  4. package/dist/api.spec.js.map +1 -1
  5. package/dist/databases/all/db_index.spec.js +21 -41
  6. package/dist/databases/all/db_index.spec.js.map +1 -1
  7. package/dist/databases/all/expr.spec.js +262 -339
  8. package/dist/databases/all/expr.spec.js.map +1 -1
  9. package/dist/databases/all/functions.spec.js +37 -35
  10. package/dist/databases/all/functions.spec.js.map +1 -1
  11. package/dist/databases/all/join.spec.js +125 -169
  12. package/dist/databases/all/join.spec.js.map +1 -1
  13. package/dist/databases/all/nomodel.spec.js +335 -594
  14. package/dist/databases/all/nomodel.spec.js.map +1 -1
  15. package/dist/databases/all/orderby.spec.js +82 -128
  16. package/dist/databases/all/orderby.spec.js.map +1 -1
  17. package/dist/databases/all/sql_expressions.spec.js +27 -43
  18. package/dist/databases/all/sql_expressions.spec.js.map +1 -1
  19. package/dist/databases/all/time.spec.js +63 -103
  20. package/dist/databases/all/time.spec.js.map +1 -1
  21. package/dist/databases/bigquery/double_truncation.spec.js +1 -1
  22. package/dist/databases/bigquery/handexpr.spec.js +12 -12
  23. package/dist/databases/bigquery/injestion_time_partitioning.spec.js +22 -22
  24. package/dist/databases/bigquery/joined_filters.spec.js +3 -3
  25. package/dist/databases/bigquery/json.spec.d.ts +1 -1
  26. package/dist/databases/bigquery/json.spec.js +25 -45
  27. package/dist/databases/bigquery/json.spec.js.map +1 -1
  28. package/dist/databases/bigquery/malloy_query.spec.d.ts +1 -1
  29. package/dist/databases/bigquery/malloy_query.spec.js +47 -48
  30. package/dist/databases/bigquery/malloy_query.spec.js.map +1 -1
  31. package/dist/databases/bigquery/time.spec.js +9 -13
  32. package/dist/databases/bigquery/time.spec.js.map +1 -1
  33. package/dist/databases/bigquery/wildcard_table_names.spec.js +19 -19
  34. package/dist/databases/bigquery-duckdb/nested_source_table.spec.js +53 -87
  35. package/dist/databases/bigquery-duckdb/nested_source_table.spec.js.map +1 -1
  36. package/dist/databases/bigquery-postgres/multi_connection.spec.js +5 -20
  37. package/dist/databases/bigquery-postgres/multi_connection.spec.js.map +1 -1
  38. package/dist/databases/bigquery-postgres/streaming.spec.js +6 -6
  39. package/dist/databases/bigquery-postgres/streaming.spec.js.map +1 -1
  40. package/dist/databases/duckdb/duckdb.spec.js +24 -33
  41. package/dist/databases/duckdb/duckdb.spec.js.map +1 -1
  42. package/dist/databases/postgres/postgres.spec.js +46 -67
  43. package/dist/databases/postgres/postgres.spec.js.map +1 -1
  44. package/dist/jestMatcher.spec.d.ts +1 -0
  45. package/dist/jestMatcher.spec.js +81 -0
  46. package/dist/jestMatcher.spec.js.map +1 -0
  47. package/dist/render/render.spec.js +10 -12
  48. package/dist/render/render.spec.js.map +1 -1
  49. package/dist/tags.spec.js +22 -2
  50. package/dist/tags.spec.js.map +1 -1
  51. package/dist/util/db-jest-matchers.d.ts +17 -6
  52. package/dist/util/db-jest-matchers.js +81 -20
  53. package/dist/util/db-jest-matchers.js.map +1 -1
  54. package/dist/util/index.d.ts +1 -2
  55. package/dist/util/index.js +11 -13
  56. package/dist/util/index.js.map +1 -1
  57. package/package.json +6 -6
  58. package/src/api.spec.ts +7 -16
  59. package/src/databases/all/db_index.spec.ts +22 -48
  60. package/src/databases/all/expr.spec.ts +273 -431
  61. package/src/databases/all/functions.spec.ts +37 -35
  62. package/src/databases/all/join.spec.ts +130 -196
  63. package/src/databases/all/nomodel.spec.ts +333 -689
  64. package/src/databases/all/orderby.spec.ts +87 -161
  65. package/src/databases/all/sql_expressions.spec.ts +29 -49
  66. package/src/databases/all/time.spec.ts +73 -130
  67. package/src/databases/bigquery/double_truncation.spec.ts +1 -1
  68. package/src/databases/bigquery/handexpr.spec.ts +12 -12
  69. package/src/databases/bigquery/injestion_time_partitioning.spec.ts +22 -22
  70. package/src/databases/bigquery/joined_filters.spec.ts +3 -3
  71. package/src/databases/bigquery/json.spec.ts +25 -49
  72. package/src/databases/bigquery/malloy_query.spec.ts +47 -54
  73. package/src/databases/bigquery/time.spec.ts +13 -17
  74. package/src/databases/bigquery/wildcard_table_names.spec.ts +19 -19
  75. package/src/databases/bigquery-duckdb/nested_source_table.spec.ts +56 -98
  76. package/src/databases/bigquery-postgres/multi_connection.spec.ts +5 -23
  77. package/src/databases/bigquery-postgres/streaming.spec.ts +12 -6
  78. package/src/databases/duckdb/duckdb.spec.ts +31 -43
  79. package/src/databases/postgres/postgres.spec.ts +54 -84
  80. package/src/jestMatcher.spec.ts +88 -0
  81. package/src/render/render.spec.ts +10 -12
  82. package/src/tags.spec.ts +22 -2
  83. package/src/util/db-jest-matchers.ts +106 -32
  84. package/src/util/index.ts +16 -14
@@ -36,12 +36,12 @@ describe('Wildcard BigQuery Tables', () => {
36
36
  if (runtime) {
37
37
  const result = await runtime
38
38
  .loadQuery(`
39
- source: aircraft is table('malloy-data.malloytest.wildcard_aircraft_*') {
39
+ source: aircraft is bigquery.table('malloy-data.malloytest.wildcard_aircraft_*') extend {
40
40
  primary_key: id
41
41
  measure: aircraft_count is count()
42
42
  }
43
43
 
44
- query: aircraft -> {
44
+ run: aircraft -> {
45
45
  aggregate: aircraft_count
46
46
  }
47
47
  `)
@@ -55,13 +55,13 @@ describe('Wildcard BigQuery Tables', () => {
55
55
  if (runtime) {
56
56
  const result = await runtime
57
57
  .loadQuery(`
58
- source: aircraft is table('malloy-data.malloytest.wildcard_aircraft_*') {
58
+ source: aircraft is bigquery.table('malloy-data.malloytest.wildcard_aircraft_*') extend {
59
59
  primary_key: id
60
60
  measure: aircraft_count is count()
61
61
  where: _TABLE_SUFFIX = '01'
62
62
  }
63
63
 
64
- query: aircraft -> {
64
+ run: aircraft -> {
65
65
  aggregate: aircraft_count
66
66
  }
67
67
  `)
@@ -75,14 +75,14 @@ describe('Wildcard BigQuery Tables', () => {
75
75
  if (runtime) {
76
76
  const result = await runtime
77
77
  .loadQuery(`
78
- source: aircraft is table('malloy-data.malloytest.wildcard_aircraft_*') {
78
+ source: aircraft is bigquery.table('malloy-data.malloytest.wildcard_aircraft_*') extend {
79
79
  primary_key: id
80
80
  }
81
81
 
82
- source: state_facts is table('malloy-data.malloytest.state_facts') {
82
+ source: state_facts is bigquery.table('malloy-data.malloytest.state_facts') extend {
83
83
  join_many: aircraft on state = aircraft.state
84
84
  }
85
- query: state_facts -> {
85
+ run: state_facts -> {
86
86
  group_by: aircraft.state
87
87
  aggregate: aircraft_count is aircraft.count()
88
88
  order_by: 1
@@ -108,15 +108,15 @@ describe('Wildcard BigQuery Tables', () => {
108
108
  if (runtime) {
109
109
  const result = await runtime
110
110
  .loadQuery(`
111
- source: aircraft is table('malloy-data.malloytest.wildcard_aircraft_*') {
111
+ source: aircraft is bigquery.table('malloy-data.malloytest.wildcard_aircraft_*') extend {
112
112
  primary_key: id
113
113
  where: _TABLE_SUFFIX = '02'
114
114
  }
115
115
 
116
- source: state_facts is table('malloy-data.malloytest.state_facts') {
116
+ source: state_facts is bigquery.table('malloy-data.malloytest.state_facts') extend {
117
117
  join_many: aircraft on state = aircraft.state
118
118
  }
119
- query: state_facts -> {
119
+ run: state_facts -> {
120
120
  group_by: aircraft.state
121
121
  aggregate: aircraft_count is aircraft.count()
122
122
  order_by: 1
@@ -139,12 +139,12 @@ describe('Wildcard BigQuery Tables', () => {
139
139
  if (runtime) {
140
140
  const result = await runtime
141
141
  .loadQuery(`
142
- source: aircraft is table('malloy-data.malloytest.wildcard_aircraft_*') {
143
- join_many: state_facts is table('malloy-data.malloytest.state_facts')
142
+ source: aircraft is bigquery.table('malloy-data.malloytest.wildcard_aircraft_*') extend {
143
+ join_many: state_facts is bigquery.table('malloy-data.malloytest.state_facts')
144
144
  on state_facts.state = state
145
145
  }
146
146
 
147
- query: aircraft -> {
147
+ run: aircraft -> {
148
148
  group_by: state_facts.state
149
149
  aggregate: aircraft_count is count()
150
150
  where: _TABLE_SUFFIX = '02'
@@ -162,15 +162,15 @@ describe('Wildcard BigQuery Tables', () => {
162
162
  if (runtime) {
163
163
  const result = await runtime
164
164
  .loadQuery(`
165
- source: aircraft is table('malloy-data.malloytest.wildcard_aircraft_*') {
165
+ source: aircraft is bigquery.table('malloy-data.malloytest.wildcard_aircraft_*') extend {
166
166
  primary_key: id
167
167
  where: _TABLE_SUFFIX = '02'
168
168
  }
169
169
 
170
- source: state_facts is table('malloy-data.malloytest.state_facts') {
170
+ source: state_facts is bigquery.table('malloy-data.malloytest.state_facts') extend {
171
171
  join_many: aircraft on state = aircraft.state
172
172
  }
173
- query: state_facts -> {
173
+ run: state_facts -> {
174
174
  group_by: aircraft._TABLE_SUFFIX
175
175
  aggregate: aircraft_count is aircraft.count()
176
176
  order_by: 1
@@ -189,15 +189,15 @@ describe('Wildcard BigQuery Tables', () => {
189
189
  if (runtime) {
190
190
  const result = await runtime
191
191
  .loadQuery(`
192
- source: aircraft is table('malloy-data.malloytest.wildcard_aircraft_*') {
192
+ source: aircraft is bigquery.table('malloy-data.malloytest.wildcard_aircraft_*') extend {
193
193
  primary_key: id
194
194
  where: _TABLE_SUFFIX = '02'
195
195
  }
196
196
 
197
- source: state_facts is table('malloy-data.malloytest.state_facts') {
197
+ source: state_facts is bigquery.table('malloy-data.malloytest.state_facts') extend {
198
198
  join_many: aircraft on state = aircraft.state
199
199
  }
200
- query: state_facts -> {
200
+ run: state_facts -> {
201
201
  group_by: aircraft._TABLE_SUFFIX
202
202
  aggregate: aircraft_count is aircraft.count()
203
203
  where: aircraft._TABLE_SUFFIX = '01'
@@ -32,8 +32,9 @@ const [describe, databases] = (0, util_1.describeIfDatabaseAvailable)([
32
32
  'bigquery',
33
33
  'duckdb',
34
34
  ]);
35
- const modelText = `
36
- source:ga_sessions is table('malloytest.ga_sample'){
35
+ function modelText(databaseName) {
36
+ return `
37
+ source: ga_sessions is ${databaseName}.table('malloytest.ga_sample') extend {
37
38
 
38
39
  measure:
39
40
  user_count is count(fullVisitorId)
@@ -46,41 +47,41 @@ source:ga_sessions is table('malloytest.ga_sample'){
46
47
  hits_count is hits.count()
47
48
  sold_count is hits.count() { where: hits.product.productQuantity > 0 }
48
49
 
49
- query: by_source is {
50
+ view: by_source is {
50
51
  where: trafficSource.\`source\` != '(direct)'
51
52
  group_by: trafficSource.\`source\`
52
53
  aggregate: hits_count
53
54
  limit: 10
54
55
  }
55
- query: by_adContent_bar_chart is {
56
+ view: by_adContent_bar_chart is {
56
57
  group_by: device.browser
57
58
  aggregate: user_count
58
59
  group_by: device.deviceCategory
59
60
  }
60
- query: by_region is {
61
+ view: by_region is {
61
62
  where: geoNetwork.region !~ '%demo%'
62
63
  group_by: geoNetwork.region
63
64
  aggregate: user_count
64
65
  limit: 10
65
66
  }
66
- query: by_device is {
67
+ view: by_device is {
67
68
  group_by: device.browser
68
69
  aggregate: user_count
69
70
  group_by: device.deviceCategory
70
71
  }
71
- query: by_category is {
72
+ view: by_category is {
72
73
  group_by: category is hits.product.v2ProductCategory
73
74
  aggregate: total_productRevenue
74
75
  aggregate: sold_count
75
76
  limit: 10
76
77
  }
77
- query: by_hour_of_day is {
78
+ view: by_hour_of_day is {
78
79
  // group_by: gsession_hour is hour(start_time::timestamp)
79
80
  aggregate: session_count
80
81
  order_by: 1
81
82
  }
82
83
 
83
- query: page_load_times is {
84
+ view: page_load_times is {
84
85
  group_by: hits.page.pageTitle
85
86
  aggregate: hit_count is hits.count()
86
87
  nest: load_bar_chart is {
@@ -90,20 +91,20 @@ source:ga_sessions is table('malloytest.ga_sample'){
90
91
  limit: 10
91
92
  }
92
93
 
93
- query: by_page_title is { where: totals.transactionRevenue > 0
94
+ view: by_page_title is { where: totals.transactionRevenue > 0
94
95
  group_by: hits.page.pageTitle
95
96
  aggregate: hits_count
96
97
  aggregate: sold_count
97
98
  }
98
99
 
99
- query: by_all is {
100
+ view: by_all is {
100
101
  nest: by_source
101
102
  nest: by_adContent_bar_chart
102
103
  nest: by_region
103
104
  nest: by_category
104
105
  }
105
106
 
106
- query: search_index is {
107
+ view: search_index is {
107
108
  index: *, hits.*, customDimensions.* totals.*, trafficSource.*, hits.product.*
108
109
  sample: 1%
109
110
  }
@@ -121,20 +122,14 @@ query: sessions_dashboard is ga_sessions -> {
121
122
  }
122
123
  }
123
124
  `;
125
+ }
124
126
  const runtimes = new runtimes_1.RuntimeList(databases);
125
127
  describe.each(runtimes.runtimeList)('Nested Source Table - %s', (databaseName, runtime) => {
128
+ const gaModel = runtime.loadModel(modelText(databaseName));
126
129
  test(`repeated child of record - ${databaseName}`, async () => {
127
- const result = await runtime
128
- .loadModel(modelText)
129
- .loadQuery(`
130
- query: ga_sessions->by_page_title
131
- `)
132
- .run();
133
- // console.log(result.data.toObject());
134
- // console.log(result.sql);
135
- expect(result.data.path(0, 'pageTitle').value).toBe('Shopping Cart');
130
+ await expect('run: ga_sessions->by_page_title').malloyResultMatches(gaModel, { pageTitle: 'Shopping Cart' });
136
131
  });
137
- // SKIPPED because the tests intermittently fail and lloyd said
132
+ // Tests intermittently fail and lloyd said
138
133
  // "I bet it has to do with my sampling test on indexing. Intermittently
139
134
  // getting different results. I'd comment out the test and I'll take a
140
135
  // look at it when I get back." and that seems reasonable.
@@ -146,31 +141,27 @@ describe.each(runtimes.runtimeList)('Nested Source Table - %s', (databaseName, r
146
141
  //
147
142
  // Expected: "Organic Search"
148
143
  // Received: "Referral"
149
- test.skip(`search_index - ${databaseName}`, async () => {
150
- const result = await runtime
151
- .loadModel(modelText)
152
- .loadQuery(`
153
- query: ga_sessions->search_index -> {
144
+ test(`search_index - ${databaseName}`, async () => {
145
+ await expect(`
146
+ run: ga_sessions->search_index -> {
154
147
  where: fieldName != null
155
148
  select: *
156
149
  order_by: fieldName, weight desc
157
150
  limit: 10
158
151
  }
159
- `)
160
- .run();
161
- // console.log(result.data.toObject());
162
- expect(result.data.path(0, 'fieldName').value).toBe('channelGrouping');
163
- expect(result.data.path(0, 'fieldValue').value).toBe('Organic Search');
164
- // expect(result.data.path(0, "weight").value).toBe(18);
152
+ `).malloyResultMatches(gaModel, {
153
+ fieldName: 'channelGrouping',
154
+ // fieldValue: 'Organic Search',
155
+ // weight: 10,
156
+ });
165
157
  });
166
- test.skip(`manual index - ${databaseName}`, async () => {
158
+ test(`manual index - ${databaseName}`, async () => {
167
159
  let sampleSize = '10';
168
160
  if (databaseName === 'bigquery') {
169
161
  sampleSize = 'false';
170
162
  }
171
- const _result = await runtime
172
- .loadQuery(`
173
- query: table('malloytest.ga_sample')-> {
163
+ await expect(`
164
+ run: ${databaseName}.table('malloytest.ga_sample')-> {
174
165
  index: everything
175
166
  sample: ${sampleSize}
176
167
  }
@@ -182,63 +173,38 @@ describe.each(runtimes.runtimeList)('Nested Source Table - %s', (databaseName, r
182
173
  limit: 100
183
174
  }
184
175
  }
185
- `)
186
- .run();
187
- // console.log(JSON.stringify(result.data.toObject(), null, 2));
188
- // expect(result.data.path(0, "fieldName").value).toBe("channelGrouping");
189
- // expect(result.data.path(0, "fieldValue").value).toBe("Organic Search");
190
- // expect(result.data.path(0, "weight").value).toBe(18);
176
+ `).malloyResultMatches(runtime, {
177
+ // 'top_fields.fieldName': 'channelGrouping',
178
+ // 'top_fields.fieldValue': 'Organic Search',
179
+ // 'top_fields.weight': 18,
180
+ });
191
181
  });
192
182
  test(`autobin - ${databaseName}`, async () => {
193
- const _result = await runtime
194
- .loadQuery(`
195
- source: airports is table('malloytest.airports') + {
196
- measure:
197
- airport_count is count()
198
- query: by_elevation is {
199
- aggregate: bin_size is NULLIF((max(elevation) - min(elevation))/30,0)
200
- nest: data is {
201
- group_by: elevation
202
- aggregate: row_count is count()
203
- }
204
- }
205
- -> {
206
- group_by: elevation is floor(data.elevation/bin_size)*bin_size + bin_size/2
207
- aggregate: airport_count is data.row_count.sum()
208
- order_by: elevation
183
+ await expect(`
184
+ source: airports is ${databaseName}.table('malloytest.airports') extend {
185
+ measure: airport_count is count()
186
+ view: by_elevation is {
187
+ aggregate: bin_size is NULLIF((max(elevation) - min(elevation))/30,0)
188
+ nest: data is {
189
+ group_by: elevation
190
+ aggregate: row_count is count()
209
191
  }
210
192
  }
211
-
212
- query: airports -> {
213
- group_by: state is state
214
- aggregate: airport_count
215
- nest: by_elevation_bar_chart is by_elevation
193
+ -> {
194
+ group_by: elevation is floor(data.elevation/bin_size)*bin_size + bin_size/2
195
+ aggregate: airport_count is data.row_count.sum()
196
+ order_by: elevation
216
197
  }
217
- `)
218
- .run();
219
- // console.log(result.sql);
220
- // console.log(result.data.toObject());
221
- // expect(result.data.path(0, 'fieldName').value).toBe('channelGrouping');
222
- // expect(result.data.path(0, 'fieldValue').value).toBe('Organic Search');
223
- // expect(result.data.path(0, "weight").value).toBe(18);
224
- });
225
- // this really shouldn't be here, we need to be able to test dialect capiblities
226
- // from the connection.
227
- test(`safe_cast - ${databaseName}`, async () => {
228
- const result = await runtime
229
- .loadQuery(`
230
- source: eone is table('malloytest.airports') {}
198
+ }
231
199
 
232
- query: eone -> {
233
- select:
234
- bad_date is '123':::date
235
- bad_number is 'abc':::number
236
- limit: 1
200
+ run: airports -> {
201
+ group_by: state is state
202
+ aggregate: airport_count
203
+ nest: by_elevation_bar_chart is by_elevation
237
204
  }
238
- `)
239
- .run();
240
- expect(result.data.value[0]['bad_date']).toBe(null);
241
- expect(result.data.value[0]['bad_number']).toBe(null);
205
+ `).malloyResultMatches(runtime, {
206
+ // don't know what to expect ...
207
+ });
242
208
  });
243
209
  });
244
210
  afterAll(async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"nested_source_table.spec.js","sourceRoot":"","sources":["../../../src/databases/bigquery-duckdb/nested_source_table.spec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"nested_source_table.spec.js","sourceRoot":"","sources":["../../../src/databases/bigquery-duckdb/nested_source_table.spec.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;;AAEH,8DAA8D;AAC9D,+BAA+B;AAE/B,uCAAqC;AACrC,6CAA2C;AAC3C,qCAAuD;AAEvD,4EAA4E;AAE5E,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,IAAA,kCAA2B,EAAC;IACxD,UAAU;IACV,QAAQ;CACT,CAAC,CAAC;AAEH,SAAS,SAAS,CAAC,YAAoB;IACrC,OAAO;yBACgB,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuFpC,CAAC;AACF,CAAC;AAED,MAAM,QAAQ,GAAG,IAAI,sBAAW,CAAC,SAAS,CAAC,CAAC;AAC5C,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CACjC,0BAA0B,EAC1B,CAAC,YAAY,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC;IAC3D,IAAI,CAAC,8BAA8B,YAAY,EAAE,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,MAAM,CAAC,iCAAiC,CAAC,CAAC,mBAAmB,CACjE,OAAO,EACP,EAAC,SAAS,EAAE,eAAe,EAAC,CAC7B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,2CAA2C;IAC3C,wEAAwE;IACxE,uEAAuE;IACvE,2DAA2D;IAC3D,6DAA6D;IAC7D,kDAAkD;IAClD,kDAAkD;IAClD,EAAE;IACF,6DAA6D;IAC7D,EAAE;IACF,kCAAkC;IAClC,4BAA4B;IAC5B,IAAI,CAAC,kBAAkB,YAAY,EAAE,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,MAAM,CAAC;;;;;;;OAOZ,CAAC,CAAC,mBAAmB,CAAC,OAAO,EAAE;YAC9B,SAAS,EAAE,iBAAiB;YAC5B,gCAAgC;YAChC,cAAc;SACf,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,kBAAkB,YAAY,EAAE,EAAE,KAAK,IAAI,EAAE;QAChD,IAAI,UAAU,GAAG,IAAI,CAAC;QACtB,IAAI,YAAY,KAAK,UAAU,EAAE;YAC/B,UAAU,GAAG,OAAO,CAAC;SACtB;QACD,MAAM,MAAM,CAAC;eACJ,YAAY;;oBAEP,UAAU;;;;;;;;;;OAUvB,CAAC,CAAC,mBAAmB,CAAC,OAAO,EAAE;QAC9B,6CAA6C;QAC7C,6CAA6C;QAC7C,2BAA2B;SAC5B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,aAAa,YAAY,EAAE,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,MAAM,CAAC;8BACW,YAAY;;;;;;;;;;;;;;;;;;;;;OAqBnC,CAAC,CAAC,mBAAmB,CAAC,OAAO,EAAE;QAC9B,gCAAgC;SACjC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CACF,CAAC;AAEF,QAAQ,CAAC,KAAK,IAAI,EAAE;IAClB,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC;AAC5B,CAAC,CAAC,CAAC"}
@@ -73,34 +73,19 @@ describe('Multi-connection', () => {
73
73
  await postgresConnection.close();
74
74
  });
75
75
  const expressionModelText = `
76
- source: default_aircraft is table('malloytest.aircraft'){
77
- measure: aircraft_count is count(tail_num)
78
- }
79
-
80
- source: bigquery_state_facts is table('malloytest.state_facts'){
76
+ source: bigquery_state_facts is bigquery.table('malloytest.state_facts') extend {
81
77
  measure: state_count is count(state)+2
82
78
  }
83
79
 
84
- source: postgres_aircraft is table('postgres:malloytest.aircraft'){
80
+ source: postgres_aircraft is postgres.table('malloytest.aircraft') extend {
85
81
  measure: aircraft_count is count(tail_num)+4
86
82
  }
87
83
  `;
88
84
  const expressionModel = runtime.loadModel(expressionModelText);
89
- it('default query', async () => {
90
- const result = await expressionModel
91
- .loadQuery(`
92
- query: default_aircraft-> {
93
- aggregate: aircraft_count
94
- }
95
- `)
96
- .run();
97
- // console.log(result.sql);
98
- expect(result.data.path(0, 'aircraft_count').value).toBe(3599);
99
- });
100
85
  it('bigquery query', async () => {
101
86
  const result = await expressionModel
102
87
  .loadQuery(`
103
- query: bigquery_state_facts-> {
88
+ run: bigquery_state_facts-> {
104
89
  aggregate: state_count
105
90
  }
106
91
  `)
@@ -111,7 +96,7 @@ source: postgres_aircraft is table('postgres:malloytest.aircraft'){
111
96
  it('postgres query', async () => {
112
97
  const result = await expressionModel
113
98
  .loadQuery(`
114
- query: postgres_aircraft-> {
99
+ run: postgres_aircraft-> {
115
100
  aggregate: aircraft_count
116
101
  }
117
102
  `)
@@ -121,7 +106,7 @@ source: postgres_aircraft is table('postgres:malloytest.aircraft'){
121
106
  it('postgres raw query', async () => {
122
107
  const result = await runtime
123
108
  .loadQuery(`
124
- query: table('postgres:malloytest.airports')->{
109
+ run: postgres.table('malloytest.airports')->{
125
110
  group_by:
126
111
  version is version!()
127
112
  aggregate:
@@ -1 +1 @@
1
- {"version":3,"file":"multi_connection.spec.js","sourceRoot":"","sources":["../../../src/databases/bigquery-postgres/multi_connection.spec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"multi_connection.spec.js","sourceRoot":"","sources":["../../../src/databases/bigquery-postgres/multi_connection.spec.ts"],"names":[],"mappings":"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"}
@@ -48,8 +48,8 @@ describe('Streaming tests', () => {
48
48
  runtimes.runtimeMap.forEach((runtime, databaseName) => {
49
49
  it(`basic stream test - ${databaseName}`, async () => {
50
50
  const stream = runtime
51
- .loadModel("source: airports is table('malloytest.airports') {}")
52
- .loadQuery('query: airports -> { select: code }')
51
+ .loadModel(`source: airports is ${databaseName}.table('malloytest.airports')`)
52
+ .loadQuery('run: airports -> { select: code }')
53
53
  .runStream({ rowLimit: 10 });
54
54
  const rows = [];
55
55
  for await (const row of stream) {
@@ -60,8 +60,8 @@ describe('Streaming tests', () => {
60
60
  });
61
61
  it(`stream to JSON - ${databaseName}`, async () => {
62
62
  const stream = runtime
63
- .loadModel("source: airports is table('malloytest.airports') {}")
64
- .loadQuery('query: airports -> { select: code }')
63
+ .loadModel(`source: airports is ${databaseName}.table('malloytest.airports')`)
64
+ .loadQuery('run: airports -> { select: code }')
65
65
  .runStream({ rowLimit: 1 });
66
66
  const accummulator = new StringAccumulator();
67
67
  const jsonWriter = new malloy_1.JSONWriter(accummulator);
@@ -75,8 +75,8 @@ describe('Streaming tests', () => {
75
75
  });
76
76
  it(`stream to CSV - ${databaseName}`, async () => {
77
77
  const stream = runtime
78
- .loadModel("source: airports is table('malloytest.airports') {}")
79
- .loadQuery('query: airports -> { select: code }')
78
+ .loadModel(`source: airports is ${databaseName}.table('malloytest.airports')`)
79
+ .loadQuery('run: airports -> { select: code }')
80
80
  .runStream({ rowLimit: 1 });
81
81
  const accummulator = new StringAccumulator();
82
82
  const csvWriter = new malloy_1.CSVWriter(accummulator);
@@ -1 +1 @@
1
- {"version":3,"file":"streaming.spec.js","sourceRoot":"","sources":["../../../src/databases/bigquery-postgres/streaming.spec.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;;AAEH,+CAK4B;AAC5B,6CAA2C;AAC3C,qCAAuD;AAEvD,MAAM,iBAAiB;IAAvB;QACS,qBAAgB,GAAG,EAAE,CAAC;IAS/B,CAAC;IAPC,KAAK,CAAC,IAAY;QAChB,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC;IAChC,CAAC;IAED,KAAK;QACH,OAAO;IACT,CAAC;CACF;AAED,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,IAAA,kCAA2B,EAAC;IACxD,UAAU;IACV,UAAU;CACX,CAAC,CAAC;AAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,MAAM,QAAQ,GAAG,IAAI,sBAAW,CAAC,SAAS,CAAC,CAAC;IAE5C,QAAQ,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE;QACpD,EAAE,CAAC,wBAAwB,YAAY,EAAE,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,MAAM,GAAG,OAAO;iBACnB,SAAS,CAAC,qDAAqD,CAAC;iBAChE,SAAS,CAAC,qCAAqC,CAAC;iBAChD,SAAS,CAAC,EAAC,QAAQ,EAAE,EAAE,EAAC,CAAC,CAAC;YAC7B,MAAM,IAAI,GAAiB,EAAE,CAAC;YAC9B,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,MAAM,EAAE;gBAC9B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aAChB;YACD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oBAAoB,YAAY,EAAE,EAAE,KAAK,IAAI,EAAE;YAChD,MAAM,MAAM,GAAG,OAAO;iBACnB,SAAS,CAAC,qDAAqD,CAAC;iBAChE,SAAS,CAAC,qCAAqC,CAAC;iBAChD,SAAS,CAAC,EAAC,QAAQ,EAAE,CAAC,EAAC,CAAC,CAAC;YAC5B,MAAM,YAAY,GAAG,IAAI,iBAAiB,EAAE,CAAC;YAC7C,MAAM,UAAU,GAAG,IAAI,mBAAU,CAAC,YAAY,CAAC,CAAC;YAChD,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACjC,MAAM,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,IAAI,CACxC;;;;;CAKP,CACM,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mBAAmB,YAAY,EAAE,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,MAAM,GAAG,OAAO;iBACnB,SAAS,CAAC,qDAAqD,CAAC;iBAChE,SAAS,CAAC,qCAAqC,CAAC;iBAChD,SAAS,CAAC,EAAC,QAAQ,EAAE,CAAC,EAAC,CAAC,CAAC;YAC5B,MAAM,YAAY,GAAG,IAAI,iBAAiB,EAAE,CAAC;YAC7C,MAAM,SAAS,GAAG,IAAI,kBAAS,CAAC,YAAY,CAAC,CAAC;YAC9C,MAAM,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAChC,MAAM,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"streaming.spec.js","sourceRoot":"","sources":["../../../src/databases/bigquery-postgres/streaming.spec.ts"],"names":[],"mappings":"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"}
@@ -26,20 +26,18 @@ const luxon_1 = require("luxon");
26
26
  const runtimes_1 = require("../../runtimes");
27
27
  require("../../util/db-jest-matchers");
28
28
  const util_1 = require("../../util");
29
+ // TODO identify which tests need to run on wasm and move them into their own file
29
30
  const runtimes = ['duckdb', 'duckdb_wasm'];
30
31
  const [_describe, databases] = (0, util_1.describeIfDatabaseAvailable)(runtimes);
31
32
  const allDucks = new runtimes_1.RuntimeList(databases);
32
33
  describe.each(allDucks.runtimeList)('duckdb:%s', (dbName, runtime) => {
33
34
  it('can open tables with wildcards', async () => {
34
- const result = await runtime
35
- .loadQuery(`
36
- query: table('duckdb:test/data/duckdb/flights/part.*.parquet') -> {
37
- top: 1
38
- group_by: carrier;
39
- }
40
- `)
41
- .run();
42
- expect(result.data.path(0, 'carrier').value).toEqual('AA');
35
+ await expect(`
36
+ run: duckdb.table('test/data/duckdb/flights/part.*.parquet') -> {
37
+ top: 1
38
+ group_by: carrier;
39
+ }
40
+ `).malloyResultMatches(runtime, { carrier: 'AA' });
43
41
  });
44
42
  it('accepts all schema numbers', async () => {
45
43
  const allInts = [
@@ -55,33 +53,28 @@ describe.each(allDucks.runtimeList)('duckdb:%s', (dbName, runtime) => {
55
53
  ];
56
54
  const allFields = allInts.map(intType => `a${intType.toLowerCase()}`);
57
55
  const query = `
58
- sql: allInts is { connection: "${dbName}" select: """
56
+ run: ${dbName}.sql("""
59
57
  SELECT
60
58
  ${allInts
61
59
  .map(intType => `1::${intType} as a${intType.toLowerCase()}`)
62
60
  .join(',\n')}
63
- """}
64
- query: from_sql(allInts) -> {
61
+ """) -> {
65
62
  aggregate:
66
63
  ${allFields
67
64
  .map(fieldType => `sum_${fieldType} is sum(${fieldType})`)
68
65
  .join('\n')}
69
66
  }
70
67
  `;
71
- const result = await runtime.loadQuery(query).run();
72
- for (const fieldType of allFields) {
73
- expect(result.data.path(0, `sum_${fieldType}`).value).toEqual(1);
74
- }
68
+ await expect(query).malloyResultMatches(runtime, allInts.reduce((building, ent) => {
69
+ building[`sum_a${ent.toLowerCase()}`] = 1;
70
+ return building;
71
+ }, {}));
75
72
  });
76
73
  it('can open json files', async () => {
77
- const result = await runtime
78
- .loadQuery(`
79
- query: table('duckdb:test/data/duckdb/test.json') -> {
80
- select: *
81
- }
82
- `)
83
- .run();
84
- expect(result.data.path(0, 'foo').value).toEqual('bar');
74
+ await expect(`
75
+ run: duckdb.table('test/data/duckdb/test.json') -> {
76
+ select: *
77
+ }`).malloyResultMatches(runtime, { foo: 'bar' });
85
78
  });
86
79
  it('supports timezones', async () => {
87
80
  await runtime.connection.runSQL("SET TimeZone='CET'");
@@ -89,7 +82,7 @@ describe.each(allDucks.runtimeList)('duckdb:%s', (dbName, runtime) => {
89
82
  expect(result.rows[0]).toEqual({ "current_setting('TimeZone')": 'CET' });
90
83
  });
91
84
  it('supports varchars with parameters', async () => {
92
- await expect(runtime).queryMatches("run: duckdb.sql(\"SELECT 'a'::VARCHAR as abc, 'a3'::VARCHAR(3) as abc3\")", { abc: 'a', abc3: 'a3' });
85
+ await expect("run: duckdb.sql(\"SELECT 'a'::VARCHAR as abc, 'a3'::VARCHAR(3) as abc3\")").malloyResultMatches(runtime, { abc: 'a', abc3: 'a3' });
93
86
  });
94
87
  describe('time', () => {
95
88
  const zone = 'America/Mexico_City'; // -06:00 no DST
@@ -102,14 +95,12 @@ describe.each(allDucks.runtimeList)('duckdb:%s', (dbName, runtime) => {
102
95
  second: 0,
103
96
  zone,
104
97
  });
105
- // TODO: Investigate why its no working.
106
- test.skip('can use unsupported types', async () => {
107
- await expect(runtime).queryMatches(`sql: timeData is { connection: "duckdb" select: """
108
- SELECT TIMESTAMPTZ '2020-02-20 00:00:00 ${zone}' as t_tstz
109
- """}
110
- query: from_sql(timeData) -> {
111
- select: mex_220 is t_tstz::timestamp
112
- }`, { mex_220: zone_2020.toJSDate() });
98
+ test('can cast TIMESTAMPTZ to timestamp', async () => {
99
+ await expect(`run: duckdb.sql("""
100
+ SELECT TIMESTAMPTZ '2020-02-20 00:00:00 ${zone}' as t_tstz
101
+ """) -> {
102
+ select: mex_220 is t_tstz::timestamp
103
+ }`).malloyResultMatches(runtime, { mex_220: zone_2020.toJSDate() });
113
104
  });
114
105
  });
115
106
  });
@@ -1 +1 @@
1
- {"version":3,"file":"duckdb.spec.js","sourceRoot":"","sources":["../../../src/databases/duckdb/duckdb.spec.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;;AAEH,iCAA+B;AAC/B,6CAA2C;AAC3C,uCAAqC;AACrC,qCAAuD;AAEvD,MAAM,QAAQ,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AAE3C,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,IAAA,kCAA2B,EAAC,QAAQ,CAAC,CAAC;AACrE,MAAM,QAAQ,GAAG,IAAI,sBAAW,CAAC,SAAS,CAAC,CAAC;AAE5C,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;IACnE,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,MAAM,GAAG,MAAM,OAAO;aACzB,SAAS,CACR;;;;;OAKD,CACA;aACA,GAAG,EAAE,CAAC;QACT,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,OAAO,GAAG;YACd,QAAQ;YACR,SAAS;YACT,SAAS;YACT,UAAU;YACV,SAAS;YACT,UAAU;YACV,UAAU;YACV,WAAW;YACX,SAAS;SACV,CAAC;QACF,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACtE,MAAM,KAAK,GAAG;uCACqB,MAAM;;UAEnC,OAAO;aACN,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,OAAO,QAAQ,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;aAC5D,IAAI,CAAC,KAAK,CAAC;;;;UAIZ,SAAS;aACR,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,SAAS,WAAW,SAAS,GAAG,CAAC;aACzD,IAAI,CAAC,IAAI,CAAC;;KAEhB,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC;QACpD,KAAK,MAAM,SAAS,IAAI,SAAS,EAAE;YACjC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;SAClE;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;QACnC,MAAM,MAAM,GAAG,MAAM,OAAO;aACzB,SAAS,CACR;;;;SAIC,CACF;aACA,GAAG,EAAE,CAAC;QACT,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;QAClC,MAAM,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,MAAM,CAC5C,oCAAoC,CACrC,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAC,6BAA6B,EAAE,KAAK,EAAC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAChC,2EAA2E,EAC3E,EAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAC,CACvB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;QACpB,MAAM,IAAI,GAAG,qBAAqB,CAAC,CAAC,gBAAgB;QACpD,MAAM,SAAS,GAAG,gBAAQ,CAAC,UAAU,CAAC;YACpC,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,CAAC;YACR,GAAG,EAAE,EAAE;YACP,IAAI,EAAE,CAAC;YACP,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,CAAC;YACT,IAAI;SACL,CAAC,CAAC;QACH,wCAAwC;QACxC,IAAI,CAAC,IAAI,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;YAChD,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAChC;oDAC4C,IAAI;;;;QAIhD,EACA,EAAC,OAAO,EAAE,SAAS,CAAC,QAAQ,EAAE,EAAC,CAChC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,KAAK,IAAI,EAAE;IAClB,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC;AAC5B,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"duckdb.spec.js","sourceRoot":"","sources":["../../../src/databases/duckdb/duckdb.spec.ts"],"names":[],"mappings":"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"}