diff --git a/core/src/main/java/org/apache/calcite/materialize/MaterializationActor.java b/core/src/main/java/org/apache/calcite/materialize/MaterializationActor.java index ede840d88856..9b41fa454e1d 100644 --- a/core/src/main/java/org/apache/calcite/materialize/MaterializationActor.java +++ b/core/src/main/java/org/apache/calcite/materialize/MaterializationActor.java @@ -18,6 +18,7 @@ import org.apache.calcite.jdbc.CalciteRootSchema; import org.apache.calcite.jdbc.CalciteSchema; +import org.apache.calcite.prepare.Prepare; import org.apache.calcite.rel.type.RelDataType; import com.google.common.collect.HashMultimap; @@ -36,6 +37,8 @@ class MaterializationActor { final Map keyMap = Maps.newHashMap(); + final Map keyPrepareMap = Maps.newHashMap(); + final Map keyBySql = Maps.newHashMap(); final Map keyByTile = Maps.newHashMap(); diff --git a/core/src/main/java/org/apache/calcite/materialize/MaterializationService.java b/core/src/main/java/org/apache/calcite/materialize/MaterializationService.java index b594ccacfd75..0942157022c6 100644 --- a/core/src/main/java/org/apache/calcite/materialize/MaterializationService.java +++ b/core/src/main/java/org/apache/calcite/materialize/MaterializationService.java @@ -65,7 +65,7 @@ public class MaterializationService { private static final ThreadLocal THREAD_INSTANCE = new ThreadLocal() { @Override protected MaterializationService initialValue() { - return new MaterializationService(); + return null; } }; @@ -134,14 +134,19 @@ public MaterializationKey defineMaterialization(final CalciteSchema schema, rowType = parse.rowType; } final MaterializationKey key = new MaterializationKey(); + final MaterializationActor.Materialization materialization = new MaterializationActor.Materialization(key, schema.root(), tableEntry, viewSql, rowType); actor.keyMap.put(materialization.key, materialization); actor.keyBySql.put(queryKey, materialization.key); + actor.keyPrepareMap.put(materialization.key, + new Prepare.Materialization(materialization.materializedTable, + materialization.sql)); if (tileKey != null) { actor.keyByTile.put(tileKey, materialization.key); } + return key; } @@ -307,9 +312,13 @@ public List query(CalciteSchema rootSchema) { : actor.keyMap.values()) { if (materialization.rootSchema == rootSchema && materialization.materializedTable != null) { - list.add( - new Prepare.Materialization(materialization.materializedTable, - materialization.sql)); + Prepare.Materialization pm = actor.keyPrepareMap.get(materialization.key); + if (pm == null) { + pm = new Prepare.Materialization(materialization.materializedTable, + materialization.sql); + actor.keyPrepareMap.put(materialization.key, pm); + } + list.add(pm); } } return list; diff --git a/core/src/main/java/org/apache/calcite/prepare/CalcitePrepareImpl.java b/core/src/main/java/org/apache/calcite/prepare/CalcitePrepareImpl.java index d78f1600f258..b0fe79b26956 100644 --- a/core/src/main/java/org/apache/calcite/prepare/CalcitePrepareImpl.java +++ b/core/src/main/java/org/apache/calcite/prepare/CalcitePrepareImpl.java @@ -831,6 +831,13 @@ protected void populateMaterializations(Context context, // REVIEW: initialize queryRel and tableRel inside MaterializationService, // not here? try { + // Optimization. If queryRel and tableRel are both not null + // then materialization has been populated + if (materialization.queryRel != null + && materialization.tableRel != null + && materialization.isStarTableIdentified()) { + return; + } final CalciteSchema schema = materialization.materializedTable.schema; CalciteCatalogReader catalogReader = new CalciteCatalogReader( diff --git a/core/src/main/java/org/apache/calcite/prepare/Prepare.java b/core/src/main/java/org/apache/calcite/prepare/Prepare.java index 5892fa9ae593..338432713a6a 100644 --- a/core/src/main/java/org/apache/calcite/prepare/Prepare.java +++ b/core/src/main/java/org/apache/calcite/prepare/Prepare.java @@ -580,6 +580,10 @@ public void materialize(RelNode queryRel, this.starRelOptTable = starRelOptTable; assert starRelOptTable.unwrap(StarTable.class) != null; } + + public boolean isStarTableIdentified() { + return !(starRelOptTable == null); + } } } diff --git a/core/src/test/java/org/apache/calcite/test/MaterializationTest.java b/core/src/test/java/org/apache/calcite/test/MaterializationTest.java index 52a167894153..bda6ebc3699d 100644 --- a/core/src/test/java/org/apache/calcite/test/MaterializationTest.java +++ b/core/src/test/java/org/apache/calcite/test/MaterializationTest.java @@ -718,6 +718,7 @@ private void checkSatisfiable(RexNode e, String s) { checkNoMaterialize(q, q, JdbcTest.HR_MODEL); } + @Ignore("This is a bug in calcite which is fixed is latest master. Will get it when we sync 1.4") @Test public void testJoinMaterialization() { String q = "select *\n" + "from (select * from \"emps\" where \"empid\" < 300)\n"