use of org.apache.calcite.plan.RelOptCluster in project calcite by apache.
the class TraitPropagationTest method run.
// Created so that we can control when the TraitDefs are defined (e.g.
// before the cluster is created).
private static RelNode run(PropAction action, RuleSet rules) throws Exception {
FrameworkConfig config = Frameworks.newConfigBuilder().ruleSets(rules).build();
final Properties info = new Properties();
final Connection connection = DriverManager.getConnection("jdbc:calcite:", info);
final CalciteServerStatement statement = connection.createStatement().unwrap(CalciteServerStatement.class);
final CalcitePrepare.Context prepareContext = statement.createPrepareContext();
final JavaTypeFactory typeFactory = prepareContext.getTypeFactory();
CalciteCatalogReader catalogReader = new CalciteCatalogReader(prepareContext.getRootSchema(), prepareContext.getDefaultSchemaPath(), typeFactory, prepareContext.config());
final RexBuilder rexBuilder = new RexBuilder(typeFactory);
final RelOptPlanner planner = new VolcanoPlanner(config.getCostFactory(), config.getContext());
// set up rules before we generate cluster
planner.clearRelTraitDefs();
planner.addRelTraitDef(RelCollationTraitDef.INSTANCE);
planner.addRelTraitDef(ConventionTraitDef.INSTANCE);
planner.clear();
for (RelOptRule r : rules) {
planner.addRule(r);
}
final RelOptCluster cluster = RelOptCluster.create(planner, rexBuilder);
return action.apply(cluster, catalogReader, prepareContext.getRootSchema().plus());
}
use of org.apache.calcite.plan.RelOptCluster in project calcite by apache.
the class VolcanoPlannerTest method testRemoveSingleReformed.
/**
* Previously, this didn't work because ReformedRemoveSingleRule uses a
* pattern which spans calling conventions.
*/
// broken, because ReformedSingleRule matches child traits strictly
@Ignore
@Test
public void testRemoveSingleReformed() {
VolcanoPlanner planner = new VolcanoPlanner();
planner.ambitious = true;
planner.addRelTraitDef(ConventionTraitDef.INSTANCE);
planner.addRule(new PhysLeafRule());
planner.addRule(new ReformedRemoveSingleRule());
RelOptCluster cluster = newCluster(planner);
NoneLeafRel leafRel = new NoneLeafRel(cluster, "a");
NoneSingleRel singleRel = new NoneSingleRel(cluster, leafRel);
RelNode convertedRel = planner.changeTraits(singleRel, cluster.traitSetOf(PHYS_CALLING_CONVENTION));
planner.setRoot(convertedRel);
RelNode result = planner.chooseDelegate().findBestExp();
assertTrue(result instanceof PhysLeafRel);
PhysLeafRel resultLeaf = (PhysLeafRel) result;
assertEquals("c", resultLeaf.label);
}
use of org.apache.calcite.plan.RelOptCluster in project calcite by apache.
the class VolcanoPlannerTest method testListener.
/**
* Tests whether planner correctly notifies listeners of events.
*/
@Ignore
@Test
public void testListener() {
TestListener listener = new TestListener();
VolcanoPlanner planner = new VolcanoPlanner();
planner.addListener(listener);
planner.addRelTraitDef(ConventionTraitDef.INSTANCE);
planner.addRule(new PhysLeafRule());
RelOptCluster cluster = newCluster(planner);
NoneLeafRel leafRel = new NoneLeafRel(cluster, "a");
RelNode convertedRel = planner.changeTraits(leafRel, cluster.traitSetOf(PHYS_CALLING_CONVENTION));
planner.setRoot(convertedRel);
RelNode result = planner.chooseDelegate().findBestExp();
assertTrue(result instanceof PhysLeafRel);
List<RelOptListener.RelEvent> eventList = listener.getEventList();
// add node
checkEvent(eventList, 0, RelOptListener.RelEquivalenceEvent.class, leafRel, null);
// internal subset
checkEvent(eventList, 1, RelOptListener.RelEquivalenceEvent.class, null, null);
// before rule
checkEvent(eventList, 2, RelOptListener.RuleAttemptedEvent.class, leafRel, PhysLeafRule.class);
// before rule
checkEvent(eventList, 3, RelOptListener.RuleProductionEvent.class, result, PhysLeafRule.class);
// result of rule
checkEvent(eventList, 4, RelOptListener.RelEquivalenceEvent.class, result, null);
// after rule
checkEvent(eventList, 5, RelOptListener.RuleProductionEvent.class, result, PhysLeafRule.class);
// after rule
checkEvent(eventList, 6, RelOptListener.RuleAttemptedEvent.class, leafRel, PhysLeafRule.class);
// choose plan
checkEvent(eventList, 7, RelOptListener.RelChosenEvent.class, result, null);
// finish choosing plan
checkEvent(eventList, 8, RelOptListener.RelChosenEvent.class, null, null);
}
use of org.apache.calcite.plan.RelOptCluster in project calcite by apache.
the class VolcanoPlannerTest method testTransformSingleReformed.
/**
* Tests transformation of a single+leaf from NONE to PHYS. In the past,
* this one didn't work due to the definition of ReformedSingleRule.
*/
// broken, because ReformedSingleRule matches child traits strictly
@Ignore
@Test
public void testTransformSingleReformed() {
VolcanoPlanner planner = new VolcanoPlanner();
planner.addRelTraitDef(ConventionTraitDef.INSTANCE);
planner.addRule(new PhysLeafRule());
planner.addRule(new ReformedSingleRule());
RelOptCluster cluster = newCluster(planner);
NoneLeafRel leafRel = new NoneLeafRel(cluster, "a");
NoneSingleRel singleRel = new NoneSingleRel(cluster, leafRel);
RelNode convertedRel = planner.changeTraits(singleRel, cluster.traitSetOf(PHYS_CALLING_CONVENTION));
planner.setRoot(convertedRel);
RelNode result = planner.chooseDelegate().findBestExp();
assertTrue(result instanceof PhysSingleRel);
}
use of org.apache.calcite.plan.RelOptCluster in project calcite by apache.
the class VolcanoPlannerTest method testSubsetRule.
/**
* Tests a rule that is fired once per subset (whereas most rules are fired
* once per rel in a set or rel in a subset)
*/
@Test
public void testSubsetRule() {
VolcanoPlanner planner = new VolcanoPlanner();
planner.addRelTraitDef(ConventionTraitDef.INSTANCE);
planner.addRule(new PhysLeafRule());
planner.addRule(new GoodSingleRule());
final List<String> buf = new ArrayList<>();
planner.addRule(new SubsetRule(buf));
RelOptCluster cluster = newCluster(planner);
NoneLeafRel leafRel = new NoneLeafRel(cluster, "a");
NoneSingleRel singleRel = new NoneSingleRel(cluster, leafRel);
RelNode convertedRel = planner.changeTraits(singleRel, cluster.traitSetOf(PHYS_CALLING_CONVENTION));
planner.setRoot(convertedRel);
RelNode result = planner.chooseDelegate().findBestExp();
assertTrue(result instanceof PhysSingleRel);
assertThat(sort(buf), equalTo(sort("NoneSingleRel:Subset#0.NONE", "PhysSingleRel:Subset#0.NONE", "PhysSingleRel:Subset#0.PHYS")));
}
Aggregations