@Override protected List<Materialization> getMaterializations() { final List<Prepare.Materialization> materializations = context.config().materializationsEnabled() ? MaterializationService.instance().query(schema) : ImmutableList.of(); for (Prepare.Materialization materialization : materializations) { prepare.populateMaterializations(context, planner, materialization); } return materializations; }
if (materializationKey != null) { final CalciteSchema.TableEntry tableEntry = checkValid(materializationKey); if (tableEntry != null) { return Pair.of(tableEntry, tileKey); for (TileKey tileKey1 : actor.tilesByDimensionality.get(tileKey0)) { assert tileKey1.dimensions.equals(groupSet); if (allSatisfiable(measureList, tileKey1)) { materializationKey = actor.keyByTile.get(tileKey1); if (materializationKey != null) { final CalciteSchema.TableEntry tableEntry = checkValid(materializationKey); if (tableEntry != null) { return Pair.of(tableEntry, tileKey1); && tileKey2.dimensions.contains(groupSet) && !tileKey2.dimensions.equals(groupSet) && allSatisfiable(measureList, tileKey2)) { materializationKey = entry.getValue(); final CalciteSchema.TableEntry tableEntry = checkValid(materializationKey); if (tableEntry != null) { queue.add(Pair.of(tableEntry, tileKey2)); defineMaterialization(schema, newTileKey, sql, schema.path(null), suggestedTableName, tableFactory, true, false); if (materializationKey != null) { final CalciteSchema.TableEntry tableEntry =
/** Used by tests, to ensure that they see their own service. */ public static void setThreadLocal() { THREAD_INSTANCE.set(new MaterializationService()); }
private MaterializedViewTableMacro(CalciteSchema schema, String viewSql, List<String> viewSchemaPath, List<String> viewPath, String suggestedTableName, boolean existing) { super(schema, viewSql, viewSchemaPath != null ? viewSchemaPath : schema.path(null), viewPath, Boolean.TRUE); this.key = Objects.requireNonNull( MaterializationService.instance().defineMaterialization( schema, null, viewSql, schemaPath, suggestedTableName, true, existing)); }
@Override public RelNode toRel(RelOptTable.ToRelContext context, RelOptTable relOptTable) { final CalciteSchema.TableEntry tableEntry = MaterializationService.instance().checkValid(key); if (tableEntry != null) { Table materializeTable = tableEntry.getTable(); if (materializeTable instanceof TranslatableTable) { TranslatableTable table = (TranslatableTable) materializeTable; return table.toRel(context, relOptTable); } } return super.toRel(context, relOptTable); }
/** Called after the constructor has completed and the model has been * loaded. */ void init() { final MaterializationService service = MaterializationService.instance(); for (CalciteSchema.LatticeEntry e : Schemas.getLatticeEntries(rootSchema)) { final Lattice lattice = e.getLattice(); for (Lattice.Tile tile : lattice.computeTiles()) { service.defineTile(lattice, tile.bitSet(), tile.measures, e.schema, true, true); } } }
MaterializationService.instance().defineMaterialization(calciteSchema, null, view.viewSql, view.schema, view.table, tableFactory, true, false); (QuarkTable) tileTEntry.getTable())); final MaterializationService service = MaterializationService.instance(); for (CalciteSchema.LatticeEntry e : Schemas.getLatticeEntries( CalciteSchema.from(queryContext.getRootSchema()))) { service.defineTile(lattice, tile.bitSet(), tile.measures, e.schema, true, true, Util.last(nzTile.tableName), tableFactory);
private void checkTileAlgorithm(String statisticProvider, String expectedExplain) { MaterializationService.setThreadLocal(); MaterializationService.instance().clear(); foodmartLatticeModel(statisticProvider) .query("select distinct t.\"the_year\", t.\"quarter\"\n" + "from \"foodmart\".\"sales_fact_1997\" as s\n" + "join \"foodmart\".\"time_by_day\" as t using (\"time_id\")\n") .enableMaterializations(true) // disable for MySQL; times out running star-join query // disable for H2; it thinks our generated SQL has invalid syntax .enable(CalciteAssert.DB != CalciteAssert.DatabaseInstance.MYSQL && CalciteAssert.DB != CalciteAssert.DatabaseInstance.H2) .explainContains(expectedExplain) .returnsUnordered("the_year=1997; quarter=Q1", "the_year=1997; quarter=Q2", "the_year=1997; quarter=Q3", "the_year=1997; quarter=Q4"); }
/** Test case for * <a href="https://issues.apache.org/jira/browse/CALCITE-761">[CALCITE-761] * Pre-populated materializations</a>. */ @Test public void testPrePopulated() { String q = "select \"deptno\" from \"emps\""; try (TryThreadLocal.Memo ignored = Prepare.THREAD_TRIM.push(true)) { MaterializationService.setThreadLocal(); CalciteAssert.that() .withMaterializations( HR_FKUK_MODEL, builder -> { final Map<String, Object> map = builder.map(); map.put("table", "locations"); String sql = "select `deptno` as `empid`, '' as `name`\n" + "from `emps`"; final String sql2 = sql.replaceAll("`", "\""); map.put("sql", sql2); return ImmutableList.of(map); }) .query(q) .enableMaterializations(true) .explainMatches("", CONTAINS_LOCATIONS) .sameResultWithMaterializationsDisabled(); } }
/** Defines a new materialization. Returns its key. */ public MaterializationKey defineMaterialization(final CalciteSchema schema, TileKey tileKey, String viewSql, List<String> viewSchemaPath, final String suggestedTableName, boolean create, boolean existing) { return defineMaterialization(schema, tileKey, viewSql, viewSchemaPath, suggestedTableName, tableFactory, create, existing); }
/** Called after the constructor has completed and the model has been * loaded. */ void init() { final MaterializationService service = MaterializationService.instance(); for (CalciteSchema.LatticeEntry e : Schemas.getLatticeEntries(rootSchema)) { final Lattice lattice = e.getLattice(); for (Lattice.Tile tile : lattice.computeTiles()) { service.defineTile(lattice, tile.bitSet(), tile.measures, e.schema, true, true); } } }
private void checkTileAlgorithm(String statisticProvider, String expectedExplain) { MaterializationService.setThreadLocal(); MaterializationService.instance().clear(); foodmartLatticeModel(statisticProvider) .query("select distinct t.\"the_year\", t.\"quarter\"\n" + "from \"foodmart\".\"sales_fact_1997\" as s\n" + "join \"foodmart\".\"time_by_day\" as t using (\"time_id\")\n") .enableMaterializations(true) // disable for MySQL; times out running star-join query // disable for H2; it thinks our generated SQL has invalid syntax .enable(CalciteAssert.DB != CalciteAssert.DatabaseInstance.MYSQL && CalciteAssert.DB != CalciteAssert.DatabaseInstance.H2) .explainContains(expectedExplain) .returnsUnordered("the_year=1997; quarter=Q1", "the_year=1997; quarter=Q2", "the_year=1997; quarter=Q3", "the_year=1997; quarter=Q4"); }
/** Test case for * <a href="https://issues.apache.org/jira/browse/CALCITE-761">[CALCITE-761] * Pre-populated materializations</a>. */ @Test public void testPrePopulated() { String q = "select \"deptno\" from \"emps\""; try (TryThreadLocal.Memo ignored = Prepare.THREAD_TRIM.push(true)) { MaterializationService.setThreadLocal(); CalciteAssert.that() .withMaterializations( HR_FKUK_MODEL, builder -> { final Map<String, Object> map = builder.map(); map.put("table", "locations"); String sql = "select `deptno` as `empid`, '' as `name`\n" + "from `emps`"; final String sql2 = sql.replaceAll("`", "\""); map.put("sql", sql2); return ImmutableList.of(map); }) .query(q) .enableMaterializations(true) .explainMatches("", CONTAINS_LOCATIONS) .sameResultWithMaterializationsDisabled(); } }
private MaterializedViewTableMacro(CalciteSchema schema, String viewSql, List<String> viewSchemaPath, List<String> viewPath, String suggestedTableName, boolean existing) { super(schema, viewSql, viewSchemaPath != null ? viewSchemaPath : schema.path(null), viewPath, Boolean.TRUE); this.key = Objects.requireNonNull( MaterializationService.instance().defineMaterialization( schema, null, viewSql, schemaPath, suggestedTableName, true, existing)); }
@Override public RelNode toRel(RelOptTable.ToRelContext context, RelOptTable relOptTable) { final CalciteSchema.TableEntry tableEntry = MaterializationService.instance().checkValid(key); if (tableEntry != null) { Table materializeTable = tableEntry.getTable(); if (materializeTable instanceof TranslatableTable) { TranslatableTable table = (TranslatableTable) materializeTable; return table.toRel(context, relOptTable); } } return super.toRel(context, relOptTable); }
/** Defines a new materialization. Returns its key. */ public MaterializationKey defineMaterialization(final CalciteSchema schema, TileKey tileKey, String viewSql, List<String> viewSchemaPath, final String suggestedTableName, boolean create, boolean existing) { return defineMaterialization(schema, tileKey, viewSql, viewSchemaPath, suggestedTableName, tableFactory, create, existing); }
@Override protected List<Materialization> getMaterializations() { final List<Materialization> materializations = context.config().materializationsEnabled() ? MaterializationService.instance().query(schema) : ImmutableList.<Prepare.Materialization>of(); for (Prepare.Materialization materialization : materializations) { prepare.populateMaterializations(context, planner, materialization); } return materializations; }
/** Retrieves a materialized table that will satisfy an aggregate query on * the star table. * * <p>The current implementation creates a materialization and populates it, * provided that {@link Lattice#auto} is true. * * <p>Future implementations might return materializations at a different * level of aggregation, from which the desired result can be obtained by * rolling up. * * @param planner Current planner * @param groupSet Grouping key * @param measureList Calls to aggregate functions * @return Materialized table */ public Pair<CalciteSchema.TableEntry, TileKey> getAggregate( RelOptPlanner planner, ImmutableBitSet groupSet, List<Lattice.Measure> measureList) { final CalciteConnectionConfig config = planner.getContext().unwrap(CalciteConnectionConfig.class); if (config == null) { return null; } final MaterializationService service = MaterializationService.instance(); boolean create = lattice.auto && config.createMaterializations(); final CalciteSchema schema = starRelOptTable.unwrap(CalciteSchema.class); return service.defineTile(lattice, groupSet, measureList, schema, create, false); } }
/** Checks that a given query CAN NOT use a materialized view with a given * definition. */ private void checkNoMaterialize(String materialize, String query, String model) { try (TryThreadLocal.Memo ignored = Prepare.THREAD_TRIM.push(true)) { MaterializationService.setThreadLocal(); CalciteAssert.that() .withMaterializations(model, "m0", materialize) .query(query) .enableMaterializations(true) .explainContains("EnumerableTableScan(table=[[hr, emps]])"); } }
if (materializationKey != null) { final CalciteSchema.TableEntry tableEntry = checkValid(materializationKey); if (tableEntry != null) { return Pair.of(tableEntry, tileKey); for (TileKey tileKey1 : actor.tilesByDimensionality.get(tileKey0)) { assert tileKey1.dimensions.equals(groupSet); if (allSatisfiable(measureList, tileKey1)) { materializationKey = actor.keyByTile.get(tileKey1); if (materializationKey != null) { final CalciteSchema.TableEntry tableEntry = checkValid(materializationKey); if (tableEntry != null) { return Pair.of(tableEntry, tileKey1); && tileKey2.dimensions.contains(groupSet) && !tileKey2.dimensions.equals(groupSet) && allSatisfiable(measureList, tileKey2)) { materializationKey = entry.getValue(); final CalciteSchema.TableEntry tableEntry = checkValid(materializationKey); if (tableEntry != null) { queue.add(Pair.of(tableEntry, tileKey2)); defineMaterialization(schema, newTileKey, sql, schema.path(null), suggestedTableName, tableFactory, true, false); if (materializationKey != null) { final CalciteSchema.TableEntry tableEntry =