15
15
package io .wren .testing ;
16
16
17
17
import com .google .common .collect .ImmutableMap ;
18
+ import com .google .common .io .Resources ;
19
+ import com .google .inject .Key ;
18
20
import io .wren .base .dto .Column ;
21
+ import io .wren .base .dto .JoinType ;
19
22
import io .wren .base .dto .Manifest ;
20
- import io .wren .base .type .BigIntType ;
23
+ import io .wren .base .type .IntegerType ;
24
+ import io .wren .main .connector .duckdb .DuckDBMetadata ;
21
25
import io .wren .main .web .dto .CheckOutputDto ;
22
26
import io .wren .main .web .dto .DeployInputDto ;
23
27
import io .wren .main .web .dto .DryPlanDto ;
30
34
import java .nio .file .Path ;
31
35
import java .util .List ;
32
36
33
- import static io .wren .base .Utils .randomIntString ;
34
37
import static io .wren .base .client .duckdb .FileUtil .ARCHIVED ;
38
+ import static io .wren .base .config .WrenConfig .DataSourceType .DUCKDB ;
39
+ import static io .wren .base .config .WrenConfig .WREN_DATASOURCE_TYPE ;
40
+ import static io .wren .base .config .WrenConfig .WREN_DIRECTORY ;
41
+ import static io .wren .base .config .WrenConfig .WREN_ENABLE_DYNAMIC_FIELDS ;
42
+ import static io .wren .base .dto .Column .caluclatedColumn ;
35
43
import static io .wren .base .dto .Column .column ;
36
44
import static io .wren .base .dto .Manifest .MANIFEST_JSON_CODEC ;
37
45
import static io .wren .base .dto .Model .model ;
46
+ import static io .wren .base .dto .Relationship .relationship ;
38
47
import static io .wren .testing .WebApplicationExceptionAssert .assertWebApplicationException ;
39
- import static java .lang .String .format ;
40
- import static java .lang .System .getenv ;
48
+ import static java .nio .charset .StandardCharsets .UTF_8 ;
41
49
import static java .util .Objects .requireNonNull ;
42
50
import static org .assertj .core .api .Assertions .assertThat ;
43
51
import static org .assertj .core .api .Assertions .assertThatNoException ;
@@ -49,22 +57,23 @@ public class TestMDLResource
49
57
private Path mdlDir ;
50
58
private Manifest initial = Manifest .builder ()
51
59
.setCatalog ("wrenai" )
52
- .setSchema ("tpch_tiny " )
60
+ .setSchema ("tpch " )
53
61
.setModels (List .of (
54
- model ("Orders" , "SELECT * FROM wrenai.tpch_tiny .orders" , List .of (column ("orderkey" , "integer" , null , false , "o_orderkey" )))))
62
+ model ("Orders" , "SELECT * FROM tpch .orders" , List .of (column ("orderkey" , "integer" , null , false , "o_orderkey" )))))
55
63
.build ();
56
64
57
65
private Manifest updated = Manifest .builder ()
58
66
.setCatalog ("wrenai" )
59
- .setSchema ("tpch_tiny " )
67
+ .setSchema ("tpch " )
60
68
.setModels (List .of (
61
- model ("Orders" , "SELECT * FROM wrenai.tpch_tiny .orders" ,
69
+ model ("Orders" , "SELECT * FROM tpch .orders" ,
62
70
List .of (column ("orderkey" , "integer" , null , false , "o_orderkey" ),
63
71
column ("custkey" , "integer" , null , false , "o_custkey" )))))
64
72
.build ();
65
73
66
74
@ Override
67
75
protected TestingWrenServer createWrenServer ()
76
+ throws Exception
68
77
{
69
78
try {
70
79
mdlDir = Files .createTempDirectory ("wrenmdls" );
@@ -76,16 +85,26 @@ protected TestingWrenServer createWrenServer()
76
85
}
77
86
78
87
ImmutableMap .Builder <String , String > properties = ImmutableMap .<String , String >builder ()
79
- .put ("bigquery.project-id" , getenv ("TEST_BIG_QUERY_PROJECT_ID" ))
80
- .put ("bigquery.location" , "asia-east1" )
81
- .put ("bigquery.credentials-key" , getenv ("TEST_BIG_QUERY_CREDENTIALS_BASE64_JSON" ))
82
- .put ("bigquery.metadata.schema.prefix" , format ("test_%s_" , randomIntString ()))
83
- .put ("wren.directory" , mdlDir .toAbsolutePath ().toString ())
84
- .put ("wren.datasource.type" , "bigquery" );
85
-
86
- return TestingWrenServer .builder ()
88
+ .put (WREN_DIRECTORY , mdlDir .toAbsolutePath ().toString ())
89
+ .put (WREN_DATASOURCE_TYPE , DUCKDB .name ())
90
+ .put (WREN_ENABLE_DYNAMIC_FIELDS , "true" );
91
+
92
+ TestingWrenServer testing = TestingWrenServer .builder ()
87
93
.setRequiredConfigs (properties .build ())
88
94
.build ();
95
+ initDuckDB (testing );
96
+ return testing ;
97
+ }
98
+
99
+ protected void initDuckDB (TestingWrenServer wrenServer )
100
+ throws Exception
101
+ {
102
+ ClassLoader classLoader = getClass ().getClassLoader ();
103
+ String initSQL = Resources .toString (requireNonNull (classLoader .getResource ("duckdb/init.sql" )).toURI ().toURL (), UTF_8 );
104
+ initSQL = initSQL .replaceAll ("basePath" , requireNonNull (classLoader .getResource ("tpch/data" )).getPath ());
105
+ DuckDBMetadata metadata = wrenServer .getInstance (Key .get (DuckDBMetadata .class ));
106
+ metadata .setInitSQL (initSQL );
107
+ metadata .reload ();
89
108
}
90
109
91
110
@ Test
@@ -117,9 +136,9 @@ public void testPreview()
117
136
{
118
137
Manifest previewManifest = Manifest .builder ()
119
138
.setCatalog ("wrenai" )
120
- .setSchema ("tpch_tiny " )
139
+ .setSchema ("tpch " )
121
140
.setModels (List .of (
122
- model ("Customer" , "SELECT * FROM wrenai.tpch_tiny .customer" ,
141
+ model ("Customer" , "SELECT * FROM tpch .customer" ,
123
142
List .of (column ("custkey" , "integer" , null , false , "c_custkey" )))))
124
143
.build ();
125
144
@@ -128,7 +147,7 @@ public void testPreview()
128
147
assertThat (testDefault .getData ().size ()).isEqualTo (100 );
129
148
assertThat (testDefault .getColumns ().size ()).isEqualTo (1 );
130
149
assertThat (testDefault .getColumns ().get (0 ).getName ()).isEqualTo ("custkey" );
131
- assertThat (testDefault .getColumns ().get (0 ).getType ()).isEqualTo (BigIntType . BIGINT );
150
+ assertThat (testDefault .getColumns ().get (0 ).getType ()).isEqualTo (IntegerType . INTEGER );
132
151
133
152
PreviewDto testDefaultDto1 = new PreviewDto (previewManifest , "select custkey from Customer limit 200" , null );
134
153
QueryResultDto preview1 = preview (testDefaultDto1 );
@@ -141,68 +160,147 @@ public void testPreview()
141
160
assertThat (preview2 .getColumns ().size ()).isEqualTo (1 );
142
161
143
162
assertWebApplicationException (() -> preview (new PreviewDto (previewManifest , "select orderkey from Orders limit 100" , null )))
144
- .hasErrorMessageMatches (".*Table \" Orders\" must be qualified with a dataset .*" );
163
+ .hasErrorMessageMatches (".*Orders does not exist.* \n .* \n .* \n .*" );
145
164
}
146
165
147
166
@ Test
148
167
public void testDryRunAndDryPlan ()
149
168
{
150
169
Manifest previewManifest = Manifest .builder ()
151
170
.setCatalog ("wrenai" )
152
- .setSchema ("tpch_tiny " )
171
+ .setSchema ("tpch " )
153
172
.setModels (List .of (
154
- model ("Customer" , "SELECT * FROM \" wrenai\" .tpch_tiny.customer" ,
155
- List .of (column ("custkey" , "integer" , null , false , "c_custkey" )))))
173
+ model ("Customer" , "SELECT * FROM tpch.customer" ,
174
+ List .of (column ("custkey" , "integer" , null , false , "c_custkey" ),
175
+ column ("name" , "varchar" , null , false , "c_name" ))),
176
+ model ("Orders" , "SELECT * FROM tpch.orders" ,
177
+ List .of (column ("orderkey" , "integer" , null , false , "o_orderkey" ),
178
+ column ("custkey" , "integer" , null , false , "o_custkey" ),
179
+ column ("customer" , "Customer" , "CustomerOrders" , false ),
180
+ caluclatedColumn ("customer_name" , "varchar" , "customer.name" )),
181
+ "orderkey" )))
182
+ .setRelationships (List .of (relationship ("CustomerOrders" , List .of ("Customer" , "Orders" ), JoinType .ONE_TO_MANY , "Customer.custkey = Orders.custkey" )))
156
183
.build ();
157
184
158
- PreviewDto testDefaultDto1 = new PreviewDto (previewManifest , "select custkey from Customer limit 200" , null );
185
+ PreviewDto testDefaultDto1 = new PreviewDto (previewManifest , "select orderkey from Orders limit 200" , null );
159
186
List <Column > dryRun = dryRun (testDefaultDto1 );
160
187
assertThat (dryRun .size ()).isEqualTo (1 );
161
- assertThat (dryRun .get (0 ).getName ()).isEqualTo ("custkey " );
188
+ assertThat (dryRun .get (0 ).getName ()).isEqualTo ("orderkey " );
162
189
163
- DryPlanDto dryPlanDto = new DryPlanDto (previewManifest , "select custkey from Customer limit 200" , false );
190
+ DryPlanDto dryPlanDto = new DryPlanDto (previewManifest , "select orderkey from Orders limit 200" , false );
164
191
String dryPlan = dryPlan (dryPlanDto );
165
192
assertThat (dryPlan ).isEqualTo ("""
166
193
WITH
167
- `Customer` AS (
168
- SELECT `Customer`.`custkey` `custkey`
194
+ "Orders" AS (
195
+ SELECT
196
+ "Orders"."orderkey" "orderkey"
197
+ , "Orders"."custkey" "custkey"
198
+ FROM
199
+ (
200
+ SELECT
201
+ o_orderkey "orderkey"
202
+ , o_custkey "custkey"
203
+ FROM
204
+ (
205
+ SELECT *
206
+ FROM
207
+ tpch.orders
208
+ ) "Orders"
209
+ ) "Orders"
210
+ )\s
211
+ SELECT orderkey
212
+ FROM
213
+ Orders
214
+ LIMIT 200
215
+ """ );
216
+
217
+ dryPlanDto = new DryPlanDto (previewManifest , "select orderkey from Orders limit 200" , true );
218
+ dryPlan = dryPlan (dryPlanDto );
219
+ assertThat (dryPlan ).isEqualTo ("""
220
+ WITH
221
+ "Orders" AS (
222
+ SELECT
223
+ "Orders"."orderkey" "orderkey"
224
+ , "Orders"."custkey" "custkey"
169
225
FROM
170
226
(
171
- SELECT c_custkey `custkey`
227
+ SELECT
228
+ o_orderkey "orderkey"
229
+ , o_custkey "custkey"
172
230
FROM
173
231
(
174
232
SELECT *
175
233
FROM
176
- `wrenai`.tpch_tiny.customer
177
- ) `Customer`
178
- ) `Customer`
234
+ tpch.orders
235
+ ) "Orders"
236
+ ) "Orders"
179
237
)\s
180
- SELECT custkey
238
+ SELECT orderkey
181
239
FROM
182
- Customer
240
+ Orders
183
241
LIMIT 200
184
242
""" );
185
243
186
- dryPlanDto = new DryPlanDto (previewManifest , "select custkey from Customer limit 200" , true );
244
+ dryPlanDto = new DryPlanDto (previewManifest , "select customer_name from Orders limit 200" , false );
187
245
dryPlan = dryPlan (dryPlanDto );
188
246
assertThat (dryPlan ).isEqualTo ("""
189
247
WITH
190
248
"Customer" AS (
191
- SELECT "Customer"."custkey" "custkey"
249
+ SELECT
250
+ "Customer"."custkey" "custkey"
251
+ , "Customer"."name" "name"
192
252
FROM
193
253
(
194
- SELECT c_custkey "custkey"
254
+ SELECT
255
+ c_custkey "custkey"
256
+ , c_name "name"
195
257
FROM
196
258
(
197
259
SELECT *
198
260
FROM
199
- "wrenai".tpch_tiny .customer
261
+ tpch .customer
200
262
) "Customer"
201
263
) "Customer"
202
264
)\s
203
- SELECT custkey
265
+ , "Orders" AS (
266
+ SELECT
267
+ "Orders"."orderkey" "orderkey"
268
+ , "Orders"."custkey" "custkey"
269
+ , "Orders_relationsub"."customer_name" "customer_name"
270
+ FROM
271
+ ((
272
+ SELECT
273
+ o_orderkey "orderkey"
274
+ , o_custkey "custkey"
275
+ FROM
276
+ (
277
+ SELECT *
278
+ FROM
279
+ tpch.orders
280
+ ) "Orders"
281
+ ) "Orders"
282
+ LEFT JOIN (
283
+ SELECT
284
+ "Orders"."orderkey"
285
+ , "Customer"."name" "customer_name"
286
+ FROM
287
+ ((
288
+ SELECT
289
+ o_orderkey "orderkey"
290
+ , o_custkey "custkey"
291
+ FROM
292
+ (
293
+ SELECT *
294
+ FROM
295
+ tpch.orders
296
+ ) "Orders"
297
+ ) "Orders"
298
+ LEFT JOIN "Customer" ON ("Customer"."custkey" = "Orders"."custkey"))
299
+ ) "Orders_relationsub" ON ("Orders"."orderkey" = "Orders_relationsub"."orderkey"))
300
+ )\s
301
+ SELECT customer_name
204
302
FROM
205
- Customer
303
+ Orders
206
304
LIMIT 200
207
305
""" );
208
306
}
0 commit comments