Skip to content

Commit

Permalink
[CALCITE-3115] Cannot add JdbcRules which have different JdbcConventi…
Browse files Browse the repository at this point in the history
…on to same VolcanoPlanner's RuleSet (Wenhui Tang, Igor Guzenko)

Close #1397

Co-authored-by: Igor Guzenko <ihor.huzenko.igs@gmail.com>
  • Loading branch information
2 people authored and zabetak committed Sep 2, 2019
1 parent c9520c3 commit 955d4ea
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import org.apache.calcite.rel.core.RelFactories;
import org.apache.calcite.tools.RelBuilderFactory;

import java.util.Locale;
import java.util.Objects;
import java.util.function.Predicate;

Expand All @@ -46,20 +47,20 @@ public abstract class ConverterRule extends RelOptRule {
* @param clazz Type of relational expression to consider converting
* @param in Trait of relational expression to consider converting
* @param out Trait which is converted to
* @param description Description of rule
* @param descriptionPrefix Description prefix of rule
*/
public ConverterRule(Class<? extends RelNode> clazz, RelTrait in,
RelTrait out, String description) {
RelTrait out, String descriptionPrefix) {
this(clazz, (Predicate<RelNode>) r -> true, in, out,
RelFactories.LOGICAL_BUILDER, description);
RelFactories.LOGICAL_BUILDER, descriptionPrefix);
}

@SuppressWarnings("Guava")
@Deprecated // to be removed before 2.0
public <R extends RelNode> ConverterRule(Class<R> clazz,
com.google.common.base.Predicate<? super R> predicate,
RelTrait in, RelTrait out, String description) {
this(clazz, predicate, in, out, RelFactories.LOGICAL_BUILDER, description);
RelTrait in, RelTrait out, String descriptionPrefix) {
this(clazz, predicate, in, out, RelFactories.LOGICAL_BUILDER, descriptionPrefix);
}

/**
Expand All @@ -70,16 +71,14 @@ public <R extends RelNode> ConverterRule(Class<R> clazz,
* @param in Trait of relational expression to consider converting
* @param out Trait which is converted to
* @param relBuilderFactory Builder for relational expressions
* @param description Description of rule
* @param descriptionPrefix Description prefix of rule
*/
public <R extends RelNode> ConverterRule(Class<R> clazz,
Predicate<? super R> predicate, RelTrait in, RelTrait out,
RelBuilderFactory relBuilderFactory, String description) {
RelBuilderFactory relBuilderFactory, String descriptionPrefix) {
super(convertOperand(clazz, predicate, in),
relBuilderFactory,
description == null
? "ConverterRule(in:" + in + ",out:" + out + ")"
: description);
createDescription(descriptionPrefix, in, out));
this.inTrait = Objects.requireNonNull(in);
this.outTrait = Objects.requireNonNull(out);

Expand Down Expand Up @@ -114,6 +113,12 @@ public RelTraitDef getTraitDef() {
return inTrait.getTraitDef();
}

private static String createDescription(String descriptionPrefix,
RelTrait in, RelTrait out) {
return String.format(Locale.ROOT, "%s(in:%s,out:%s)",
Objects.toString(descriptionPrefix, "ConverterRule"), in, out);
}

/** Converts a relational expression to the target trait(s) of this rule.
*
* <p>Returns null if conversion is not possible. */
Expand Down
29 changes: 29 additions & 0 deletions core/src/test/java/org/apache/calcite/test/JdbcAdapterTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,35 @@ public class JdbcAdapterTest {
+ "FROM \"foodmart\".\"sales_fact_1998\"");
}

/**
* Test case for
* <a href="https://issues.apache.org/jira/browse/CALCITE-3115">[CALCITE-3115]
* Cannot add JdbcRules which have different JdbcConvention
* to same VolcanoPlanner's RuleSet.</a>*/
@Test public void testUnionPlan2() {
CalciteAssert.model(JdbcTest.FOODMART_SCOTT_MODEL)
.query("select \"store_name\" from \"foodmart\".\"store\" where \"store_id\" < 10\n"
+ "union all\n"
+ "select ename from SCOTT.emp where empno > 10")
.explainContains("PLAN=EnumerableUnion(all=[true])\n"
+ " JdbcToEnumerableConverter\n"
+ " JdbcProject(store_name=[$3])\n"
+ " JdbcFilter(condition=[<($0, 10)])\n"
+ " JdbcTableScan(table=[[foodmart, store]])\n"
+ " JdbcToEnumerableConverter\n"
+ " JdbcProject(ENAME=[$1])\n"
+ " JdbcFilter(condition=[>($0, 10)])\n"
+ " JdbcTableScan(table=[[SCOTT, EMP]])")
.runs()
.enable(CalciteAssert.DB == CalciteAssert.DatabaseInstance.HSQLDB)
.planHasSql("SELECT \"store_name\"\n"
+ "FROM \"foodmart\".\"store\"\n"
+ "WHERE \"store_id\" < 10")
.planHasSql("SELECT \"ENAME\"\n"
+ "FROM \"SCOTT\".\"EMP\"\n"
+ "WHERE \"EMPNO\" > 10");
}

@Test public void testFilterUnionPlan() {
CalciteAssert.model(JdbcTest.FOODMART_MODEL)
.query("select * from (\n"
Expand Down
9 changes: 9 additions & 0 deletions core/src/test/java/org/apache/calcite/test/JdbcTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,15 @@ public class JdbcTest {
+ " ]\n"
+ "}";

public static final String FOODMART_SCOTT_MODEL = "{\n"
+ " version: '1.0',\n"
+ " schemas: [\n"
+ FOODMART_SCHEMA
+ ",\n"
+ SCOTT_SCHEMA
+ " ]\n"
+ "}";

public static final String START_OF_GROUP_DATA = "(values"
+ "(1,0,1),\n"
+ "(2,0,1),\n"
Expand Down

0 comments on commit 955d4ea

Please sign in to comment.