Skip to content
This repository was archived by the owner on Apr 4, 2019. It is now read-only.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -36,6 +37,8 @@ class MaterializationActor {

final Map<MaterializationKey, Materialization> keyMap = Maps.newHashMap();

final Map<MaterializationKey, Prepare.Materialization> keyPrepareMap = Maps.newHashMap();

final Map<QueryKey, MaterializationKey> keyBySql = Maps.newHashMap();

final Map<TileKey, MaterializationKey> keyByTile = Maps.newHashMap();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ public class MaterializationService {
private static final ThreadLocal<MaterializationService> THREAD_INSTANCE =
new ThreadLocal<MaterializationService>() {
@Override protected MaterializationService initialValue() {
return new MaterializationService();
return null;
}
};

Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -307,9 +312,13 @@ public List<Prepare.Materialization> 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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
4 changes: 4 additions & 0 deletions core/src/main/java/org/apache/calcite/prepare/Prepare.java
Original file line number Diff line number Diff line change
Expand Up @@ -580,6 +580,10 @@ public void materialize(RelNode queryRel,
this.starRelOptTable = starRelOptTable;
assert starRelOptTable.unwrap(StarTable.class) != null;
}

public boolean isStarTableIdentified() {
return !(starRelOptTable == null);
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down