Skip to content

Commit 647e60c

Browse files
committed
Improve BaseIcebergMaterializedViewTest code style
- Avoid reassigning variable in test. Mutable variable asserted on is more error-prone than asserting directly without assigning to a variable. The latter approach is equally (if not more) readable, if formatted properly. - Update test queries to follow SQL code style.
1 parent 7b1a99c commit 647e60c

File tree

1 file changed

+77
-98
lines changed

1 file changed

+77
-98
lines changed

plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/BaseIcebergMaterializedViewTest.java

Lines changed: 77 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import io.trino.spi.connector.SchemaTableName;
2121
import io.trino.sql.tree.ExplainType;
2222
import io.trino.testing.AbstractTestQueryFramework;
23-
import io.trino.testing.MaterializedResult;
2423
import io.trino.testing.MaterializedRow;
2524
import io.trino.transaction.TransactionId;
2625
import io.trino.transaction.TransactionManager;
@@ -298,58 +297,42 @@ public void testCreateRefreshSelect()
298297
// 4. Select the data from refreshed materialized view, verify the number of rows in the result
299298
// 5. Ensure that the plan uses the storage table
300299
// 6. In some cases validate the result data
301-
MaterializedResult baseResult = computeActual("SELECT * from materialized_view_no_part");
302-
assertEquals(baseResult.getRowCount(), 6);
303-
String plan = getExplainPlan("SELECT * from materialized_view_no_part", ExplainType.Type.IO);
304-
assertThat(plan).contains("base_table1");
300+
assertEquals(computeActual("SELECT * FROM materialized_view_no_part").getRowCount(), 6);
301+
assertThat(getExplainPlan("SELECT * FROM materialized_view_no_part", ExplainType.Type.IO))
302+
.contains("base_table1");
305303
assertUpdate("REFRESH MATERIALIZED VIEW materialized_view_no_part", 6);
306-
MaterializedResult viewResult = computeActual("SELECT * from materialized_view_no_part");
307-
assertEquals(viewResult.getRowCount(), 6);
308-
plan = getExplainPlan("SELECT * from materialized_view_no_part", ExplainType.Type.IO);
309-
assertThat(plan).doesNotContain("base_table1");
310-
311-
baseResult = computeActual("SELECT * from materialized_view_agg");
312-
assertEquals(baseResult.getRowCount(), 3);
313-
plan = getExplainPlan("SELECT * from materialized_view_agg", ExplainType.Type.IO);
314-
assertThat(plan).contains("base_table1");
304+
assertEquals(computeActual("SELECT * FROM materialized_view_no_part").getRowCount(), 6);
305+
assertThat(getExplainPlan("SELECT * FROM materialized_view_no_part", ExplainType.Type.IO)).doesNotContain("base_table1");
306+
307+
assertEquals(computeActual("SELECT * FROM materialized_view_agg").getRowCount(), 3);
308+
assertThat(getExplainPlan("SELECT * FROM materialized_view_agg", ExplainType.Type.IO))
309+
.contains("base_table1");
315310
assertUpdate("REFRESH MATERIALIZED VIEW materialized_view_agg", 3);
316-
viewResult = computeActual("SELECT * from materialized_view_agg");
317-
assertEquals(viewResult.getRowCount(), 3);
318-
plan = getExplainPlan("SELECT * from materialized_view_agg", ExplainType.Type.IO);
319-
assertThat(plan).doesNotContain("base_table1");
320-
assertQuery(session, "SELECT * from materialized_view_agg", "VALUES (DATE '2019-09-10', 2)," +
311+
assertEquals(computeActual("SELECT * FROM materialized_view_agg").getRowCount(), 3);
312+
assertThat(getExplainPlan("SELECT * FROM materialized_view_agg", ExplainType.Type.IO))
313+
.doesNotContain("base_table1");
314+
assertQuery(session, "SELECT * FROM materialized_view_agg", "VALUES (DATE '2019-09-10', 2)," +
321315
"(DATE '2019-09-08', 1), (DATE '2019-09-09', 3)");
322316

323-
baseResult = computeActual("SELECT * from materialized_view_part");
324-
assertEquals(baseResult.getRowCount(), 3);
325-
plan = getExplainPlan("SELECT * from materialized_view_part", ExplainType.Type.IO);
326-
assertThat(plan).contains("base_table1");
317+
assertEquals(computeActual("SELECT * FROM materialized_view_part").getRowCount(), 3);
318+
assertThat(getExplainPlan("SELECT * FROM materialized_view_part", ExplainType.Type.IO))
319+
.contains("base_table1");
327320
assertUpdate("REFRESH MATERIALIZED VIEW materialized_view_part", 3);
328-
viewResult = computeActual("SELECT * from materialized_view_part");
329-
assertEquals(viewResult.getRowCount(), 3);
330-
plan = getExplainPlan("SELECT * from materialized_view_part", ExplainType.Type.IO);
331-
assertThat(plan).doesNotContain("base_table1");
332-
333-
baseResult = computeActual("SELECT * from materialized_view_join");
334-
assertEquals(baseResult.getRowCount(), 5);
335-
plan = getExplainPlan("SELECT * from materialized_view_join", ExplainType.Type.IO);
336-
assertThat(plan).contains("base_table1", "base_table2");
321+
assertEquals(computeActual("SELECT * FROM materialized_view_part").getRowCount(), 3);
322+
assertThat(getExplainPlan("SELECT * FROM materialized_view_part", ExplainType.Type.IO)).doesNotContain("base_table1");
323+
324+
assertEquals(computeActual("SELECT * FROM materialized_view_join").getRowCount(), 5);
325+
assertThat(getExplainPlan("SELECT * FROM materialized_view_join", ExplainType.Type.IO)).contains("base_table1", "base_table2");
337326
assertUpdate("REFRESH MATERIALIZED VIEW materialized_view_join", 5);
338-
viewResult = computeActual("SELECT * from materialized_view_join");
339-
assertEquals(viewResult.getRowCount(), 5);
340-
plan = getExplainPlan("SELECT * from materialized_view_join", ExplainType.Type.IO);
341-
assertThat(plan).doesNotContain("base_table1", "base_table2");
342-
343-
baseResult = computeActual("SELECT * from materialized_view_join_part");
344-
assertEquals(baseResult.getRowCount(), 4);
345-
plan = getExplainPlan("SELECT * from materialized_view_join_part", ExplainType.Type.IO);
346-
assertThat(plan).contains("base_table1", "base_table2");
327+
assertEquals(computeActual("SELECT * FROM materialized_view_join").getRowCount(), 5);
328+
assertThat(getExplainPlan("SELECT * FROM materialized_view_join", ExplainType.Type.IO)).doesNotContain("base_table1", "base_table2");
329+
330+
assertEquals(computeActual("SELECT * FROM materialized_view_join_part").getRowCount(), 4);
331+
assertThat(getExplainPlan("SELECT * FROM materialized_view_join_part", ExplainType.Type.IO)).contains("base_table1", "base_table2");
347332
assertUpdate("REFRESH MATERIALIZED VIEW materialized_view_join_part", 4);
348-
viewResult = computeActual("SELECT * from materialized_view_join_part");
349-
assertEquals(viewResult.getRowCount(), 4);
350-
plan = getExplainPlan("SELECT * from materialized_view_join_part", ExplainType.Type.IO);
351-
assertThat(plan).doesNotContain("base_table1", "base_table2");
352-
assertQuery(session, "SELECT * from materialized_view_join_part", "VALUES (2, 'a', DATE '2019-09-09', 1), " +
333+
assertEquals(computeActual("SELECT * FROM materialized_view_join_part").getRowCount(), 4);
334+
assertThat(getExplainPlan("SELECT * FROM materialized_view_join_part", ExplainType.Type.IO)).doesNotContain("base_table1", "base_table2");
335+
assertQuery(session, "SELECT * FROM materialized_view_join_part", "VALUES (2, 'a', DATE '2019-09-09', 1), " +
353336
"(0, 'a', DATE '2019-09-08', 2), (3, 'a', DATE '2019-09-09', 1), (1, 'a', DATE '2019-09-09', 1)");
354337

355338
assertUpdate("DROP MATERIALIZED VIEW materialized_view_no_part");
@@ -370,43 +353,43 @@ public void testDetectStaleness()
370353
assertUpdate("INSERT INTO base_table4 VALUES ('a', 0, DATE '2019-09-08'), ('a', 1, DATE '2019-09-08'), ('a', 0, DATE '2019-09-09')", 3);
371354

372355
// A partitioned materialized view with grouping and aggregation
373-
assertUpdate("CREATE MATERIALIZED VIEW materialized_view_part_stale WITH (partitioning = ARRAY['_date']) as select _date, count(_date) as num_dates from base_table3 group by 1");
356+
assertUpdate("CREATE MATERIALIZED VIEW materialized_view_part_stale WITH (partitioning = ARRAY['_date']) AS SELECT _date, count(_date) AS num_dates FROM base_table3 GROUP BY 1");
374357
// A non-partitioned join materialized view
375358
assertUpdate("CREATE MATERIALIZED VIEW materialized_view_join_stale as " +
376-
"select t2._bigint, _varchar, t1._date from base_table3 t1, base_table4 t2 where t1._date = t2._date");
359+
"SELECT t2._bigint, _varchar, t1._date FROM base_table3 t1, base_table4 t2 WHERE t1._date = t2._date");
377360
// A partitioned join materialized view
378361
assertUpdate("CREATE MATERIALIZED VIEW materialized_view_join_part_stale WITH (partitioning = ARRAY['_date', '_bigint']) as " +
379-
"select t1._bigint, _varchar, t2._date, sum(1) as my_sum from base_table3 t1, base_table4 t2 where t1._date = t2._date group by 1, 2, 3 order by 1, 2");
362+
"SELECT t1._bigint, _varchar, t2._date, sum(1) AS my_sum FROM base_table3 t1, base_table4 t2 WHERE t1._date = t2._date GROUP BY 1, 2, 3 ORDER BY 1, 2");
380363

381364
// Ensure that when data is inserted into base table, materialized view is rendered stale. Note that, currently updates and deletes to/from iceberg tables is not supported.
382365
assertUpdate("REFRESH MATERIALIZED VIEW materialized_view_part_stale", 2);
383366
assertUpdate("REFRESH MATERIALIZED VIEW materialized_view_join_stale", 4);
384367
assertUpdate("REFRESH MATERIALIZED VIEW materialized_view_join_part_stale", 3);
385368

386369
assertUpdate("INSERT INTO base_table3 VALUES (3, DATE '2019-09-09'), (4, DATE '2019-09-10'), (5, DATE '2019-09-10')", 3);
387-
String plan = getExplainPlan("SELECT * from materialized_view_part_stale", ExplainType.Type.IO);
388-
assertThat(plan).contains("base_table3");
370+
assertThat(getExplainPlan("SELECT * FROM materialized_view_part_stale", ExplainType.Type.IO))
371+
.contains("base_table3");
389372

390-
plan = getExplainPlan("SELECT * from materialized_view_join_stale", ExplainType.Type.IO);
391373
Condition<String> containsTable3 = new Condition<>(p -> p.contains("base_table3"), "base_table3");
392374
Condition<String> containsTable4 = new Condition<>(p -> p.contains("base_table4"), "base_table4");
393-
assertThat(plan).is(anyOf(containsTable3, containsTable4));
375+
assertThat(getExplainPlan("SELECT * FROM materialized_view_join_stale", ExplainType.Type.IO))
376+
.is(anyOf(containsTable3, containsTable4));
394377

395-
plan = getExplainPlan("SELECT * from materialized_view_join_part_stale", ExplainType.Type.IO);
396-
assertThat(plan).is(anyOf(containsTable3, containsTable4));
378+
assertThat(getExplainPlan("SELECT * FROM materialized_view_join_part_stale", ExplainType.Type.IO))
379+
.is(anyOf(containsTable3, containsTable4));
397380

398381
assertUpdate("REFRESH MATERIALIZED VIEW materialized_view_part_stale", 3);
399382
assertUpdate("REFRESH MATERIALIZED VIEW materialized_view_join_stale", 5);
400383
assertUpdate("REFRESH MATERIALIZED VIEW materialized_view_join_part_stale", 4);
401384

402-
plan = getExplainPlan("SELECT * from materialized_view_part_stale", ExplainType.Type.IO);
403-
assertThat(plan).doesNotContain("base_table3");
385+
assertThat(getExplainPlan("SELECT * FROM materialized_view_part_stale", ExplainType.Type.IO))
386+
.doesNotContain("base_table3");
404387

405-
plan = getExplainPlan("SELECT * from materialized_view_join_stale", ExplainType.Type.IO);
406-
assertThat(plan).doesNotContain("base_table3", "base_table4");
388+
assertThat(getExplainPlan("SELECT * FROM materialized_view_join_stale", ExplainType.Type.IO))
389+
.doesNotContain("base_table3", "base_table4");
407390

408-
plan = getExplainPlan("SELECT * from materialized_view_join_part_stale", ExplainType.Type.IO);
409-
assertThat(plan).doesNotContain("base_table3", "base_table4");
391+
assertThat(getExplainPlan("SELECT * FROM materialized_view_join_part_stale", ExplainType.Type.IO))
392+
.doesNotContain("base_table3", "base_table4");
410393

411394
assertUpdate("DROP TABLE IF EXISTS base_table3");
412395
assertUpdate("DROP TABLE IF EXISTS base_table4");
@@ -421,30 +404,30 @@ public void testSqlFeatures()
421404
String schema = getSession().getSchema().orElseThrow();
422405

423406
// Materialized views to test SQL features
424-
assertUpdate("CREATE MATERIALIZED VIEW materialized_view_window WITH (partitioning = ARRAY['_date']) as select _date, " +
425-
"sum(_bigint) OVER (partition by _date order by _date) as sum_ints from base_table1");
407+
assertUpdate("CREATE MATERIALIZED VIEW materialized_view_window WITH (partitioning = ARRAY['_date']) AS SELECT _date, " +
408+
"sum(_bigint) OVER (PARTITION BY _date ORDER BY _date) as sum_ints from base_table1");
426409
assertUpdate("REFRESH MATERIALIZED VIEW materialized_view_window", 6);
427-
assertUpdate("CREATE MATERIALIZED VIEW materialized_view_union WITH (partitioning = ARRAY['_date']) as " +
428-
"select _date, count(_date) as num_dates from base_table1 group by 1 union " +
410+
assertUpdate("CREATE MATERIALIZED VIEW materialized_view_union WITH (partitioning = ARRAY['_date']) AS " +
411+
"select _date, count(_date) as num_dates from base_table1 group by 1 UNION " +
429412
"select _date, count(_date) as num_dates from base_table2 group by 1");
430413
assertUpdate("REFRESH MATERIALIZED VIEW materialized_view_union", 5);
431-
assertUpdate("CREATE MATERIALIZED VIEW materialized_view_subquery WITH (partitioning = ARRAY['_date']) as " +
432-
"select _date, count(_date) as num_dates from base_table1 where _date = (select max(_date) from base_table2) group by 1");
414+
assertUpdate("CREATE MATERIALIZED VIEW materialized_view_subquery WITH (partitioning = ARRAY['_date']) AS " +
415+
"SELECT _date, count(_date) AS num_dates FROM base_table1 WHERE _date = (select max(_date) FROM base_table2) GROUP BY 1");
433416
assertUpdate("REFRESH MATERIALIZED VIEW materialized_view_subquery", 1);
434417

435418
// This set of tests intend to test various SQL features in the context of materialized views. It also tests commands pertaining to materialized views.
436-
String plan = getExplainPlan("SELECT * from materialized_view_window", ExplainType.Type.IO);
437-
assertThat(plan).doesNotContain("base_table1");
438-
plan = getExplainPlan("SELECT * from materialized_view_union", ExplainType.Type.IO);
439-
assertThat(plan).doesNotContain("base_table1");
440-
plan = getExplainPlan("SELECT * from materialized_view_subquery", ExplainType.Type.IO);
441-
assertThat(plan).doesNotContain("base_table1");
419+
assertThat(getExplainPlan("SELECT * FROM materialized_view_window", ExplainType.Type.IO))
420+
.doesNotContain("base_table1");
421+
assertThat(getExplainPlan("SELECT * FROM materialized_view_union", ExplainType.Type.IO))
422+
.doesNotContain("base_table1");
423+
assertThat(getExplainPlan("SELECT * FROM materialized_view_subquery", ExplainType.Type.IO))
424+
.doesNotContain("base_table1");
442425

443426
String qualifiedMaterializedViewName = "iceberg." + schema + ".materialized_view_window";
444-
assertQueryFails("show create view materialized_view_window",
427+
assertQueryFails("SHOW CREATE VIEW materialized_view_window",
445428
"line 1:1: Relation '" + qualifiedMaterializedViewName + "' is a materialized view, not a view");
446429

447-
assertThat((String) computeScalar("show create materialized view materialized_view_window"))
430+
assertThat((String) computeScalar("SHOW CREATE MATERIALIZED VIEW materialized_view_window"))
448431
.matches("\\QCREATE MATERIALIZED VIEW " + qualifiedMaterializedViewName + "\n" +
449432
"WITH (\n" +
450433
" format = 'ORC',\n" +
@@ -462,16 +445,11 @@ public void testSqlFeatures()
462445
assertQueryFails("INSERT INTO materialized_view_window VALUES (0, '2019-09-08'), (1, DATE '2019-09-09'), (2, DATE '2019-09-09')",
463446
"Inserting into materialized views is not supported");
464447

465-
MaterializedResult result = computeActual("explain (type logical) refresh materialized view materialized_view_window");
466-
assertEquals(result.getRowCount(), 1);
467-
result = computeActual("explain (type distributed) refresh materialized view materialized_view_window");
468-
assertEquals(result.getRowCount(), 1);
469-
result = computeActual("explain (type validate) refresh materialized view materialized_view_window");
470-
assertEquals(result.getRowCount(), 1);
471-
result = computeActual("explain (type io) refresh materialized view materialized_view_window");
472-
assertEquals(result.getRowCount(), 1);
473-
result = computeActual("explain analyze refresh materialized view materialized_view_window");
474-
assertEquals(result.getRowCount(), 1);
448+
computeScalar("EXPLAIN (TYPE LOGICAL) REFRESH MATERIALIZED VIEW materialized_view_window");
449+
computeScalar("EXPLAIN (TYPE DISTRIBUTED) REFRESH MATERIALIZED VIEW materialized_view_window");
450+
computeScalar("EXPLAIN (TYPE VALIDATE) REFRESH MATERIALIZED VIEW materialized_view_window");
451+
computeScalar("EXPLAIN (TYPE IO) REFRESH MATERIALIZED VIEW materialized_view_window");
452+
computeScalar("EXPLAIN ANALYZE REFRESH MATERIALIZED VIEW materialized_view_window");
475453

476454
assertUpdate("DROP MATERIALIZED VIEW materialized_view_window");
477455
assertUpdate("DROP MATERIALIZED VIEW materialized_view_union");
@@ -486,11 +464,12 @@ public void testReplace()
486464
assertUpdate("REFRESH MATERIALIZED VIEW materialized_view_replace", 3);
487465

488466
assertUpdate("CREATE OR REPLACE MATERIALIZED VIEW materialized_view_replace as select sum(1) as num_rows from base_table2");
489-
String plan = getExplainPlan("SELECT * from materialized_view_replace", ExplainType.Type.IO);
490-
assertThat(plan).contains("base_table2");
467+
assertThat(getExplainPlan("SELECT * FROM materialized_view_replace", ExplainType.Type.IO))
468+
.contains("base_table2");
491469
assertUpdate("REFRESH MATERIALIZED VIEW materialized_view_replace", 1);
492-
MaterializedResult viewResult = computeActual("SELECT * from materialized_view_replace");
493-
assertEquals(viewResult.getRowCount(), 1);
470+
computeScalar("SELECT * FROM materialized_view_replace");
471+
assertThat(query("SELECT * FROM materialized_view_replace"))
472+
.matches("VALUES BIGINT '3'");
494473

495474
assertUpdate("DROP MATERIALIZED VIEW materialized_view_replace");
496475
}
@@ -537,24 +516,24 @@ public void testNestedMaterializedViews()
537516
assertUpdate("CREATE MATERIALIZED VIEW materialized_view_level2 WITH (partitioning = ARRAY['_date']) as select _date, num_dates from materialized_view_level1");
538517

539518
// Unrefreshed 2nd level materialized view .. resolves to base table
540-
String plan = getExplainPlan("select * from materialized_view_level2", ExplainType.Type.IO);
541-
assertThat(plan).contains("base_table5");
542-
assertUpdate("refresh materialized view materialized_view_level2", 2);
543-
plan = getExplainPlan("select * from materialized_view_level2", ExplainType.Type.IO);
519+
assertThat(getExplainPlan("SELECT * FROM materialized_view_level2", ExplainType.Type.IO))
520+
.contains("base_table5");
521+
assertUpdate("REFRESH MATERIALIZED VIEW materialized_view_level2", 2);
544522

545523
// Refreshed 2nd level materialized view .. resolves to storage table
546-
assertThat(plan).doesNotContain("base_table5");
524+
assertThat(getExplainPlan("SELECT * FROM materialized_view_level2", ExplainType.Type.IO))
525+
.doesNotContain("base_table5");
547526

548527
// Re-refreshing 2nd level materialized view is a no-op
549-
assertUpdate("refresh materialized view materialized_view_level2", 0);
528+
assertUpdate("REFRESH MATERIALIZED VIEW materialized_view_level2", 0);
550529

551530
// Insert into the base table
552531
assertUpdate("INSERT INTO base_table5 VALUES (3, DATE '2019-09-09'), (4, DATE '2019-09-10'), (5, DATE '2019-09-10')", 3);
553-
assertUpdate("refresh materialized view materialized_view_level2", 3);
532+
assertUpdate("REFRESH MATERIALIZED VIEW materialized_view_level2", 3);
554533

555534
// Refreshing the 2nd level (outer-most) materialized view does not refresh the 1st level (inner) materialized view.
556-
plan = getExplainPlan("select * from materialized_view_level1", ExplainType.Type.IO);
557-
assertThat(plan).contains("base_table5");
535+
assertThat(getExplainPlan("SELECT * FROM materialized_view_level1", ExplainType.Type.IO))
536+
.contains("base_table5");
558537

559538
assertUpdate("DROP TABLE IF EXISTS base_table5");
560539
assertUpdate("DROP MATERIALIZED VIEW materialized_view_level1");

0 commit comments

Comments
 (0)