This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new 5274490187a refactor: optimize push-down for projections. (#20841)
5274490187a is described below
commit 5274490187a64c7acd705dea527254b1b48f71a3
Author: boyjoy1127 <[email protected]>
AuthorDate: Thu Sep 8 08:32:13 2022 +0800
refactor: optimize push-down for projections. (#20841)
---
.../advanced/AdvancedFederationExecutor.java | 2 +-
.../optimizer/ShardingSphereOptimizer.java | 8 ++---
.../translatable/TranslatableProjectRule.java | 23 +++++++++----
.../translatable/TranslatableTableScan.java | 38 +++++++++++++++++++---
.../planner/QueryOptimizePlannerFactory.java | 29 +----------------
.../optimizer/ShardingSphereOptimizerTest.java | 38 +++++++++++-----------
6 files changed, 74 insertions(+), 64 deletions(-)
diff --git
a/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-executor/shardingsphere-sql-federation-advanced-executor/src/main/java/org/apache/shardingsphere/sqlfederation/advanced/AdvancedFederationExecutor.java
b/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-executor/shardingsphere-sql-federation-advanced-executor/src/main/java/org/apache/shardingsphere/sqlfederation/advanced/AdvancedFederationExecutor.java
index bfe11fffb1f..fbe3bde0fcb 100644
---
a/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-executor/shardingsphere-sql-federation-advanced-executor/src/main/java/org/apache/shardingsphere/sqlfederation/advanced/AdvancedFederationExecutor.java
+++
b/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-executor/shardingsphere-sql-federation-advanced-executor/src/main/java/org/apache/shardingsphere/sqlfederation/advanced/AdvancedFederationExecutor.java
@@ -134,7 +134,7 @@ public final class AdvancedFederationExecutor implements
SQLFederationExecutor {
SqlValidator validator =
OptimizerPlannerContextFactory.createValidator(catalogReader,
relDataTypeFactory, connectionConfig);
SqlToRelConverter converter =
OptimizerPlannerContextFactory.createConverter(catalogReader, validator,
relDataTypeFactory);
RelNode bestPlan =
- new ShardingSphereOptimizer(converter,
QueryOptimizePlannerFactory.createHepPlannerWithoutCalc(),
QueryOptimizePlannerFactory.createHepPlannerWithCalc()).optimize(sqlStatement);
+ new ShardingSphereOptimizer(converter,
QueryOptimizePlannerFactory.createHepPlanner()).optimize(sqlStatement);
Bindable<Object[]> executablePlan =
EnumerableInterpretable.toBindable(Collections.emptyMap(), null,
(EnumerableRel) bestPlan, EnumerableRel.Prefer.ARRAY);
return executablePlan.bind(new CommonExecuteDataContext(validator,
converter, parameters));
}
diff --git
a/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/ShardingSphereOptimizer.java
b/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/ShardingSphereOptimizer.java
index cb65bcffe98..2cf78ec2ce8 100644
---
a/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/ShardingSphereOptimizer.java
+++
b/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/ShardingSphereOptimizer.java
@@ -34,9 +34,7 @@ public final class ShardingSphereOptimizer {
private final SqlToRelConverter converter;
- private final RelOptPlanner hepPlannerWithoutCalc;
-
- private final RelOptPlanner hepPlannerWithCalc;
+ private final RelOptPlanner hepPlanner;
/**
* Optimize query execution plan.
@@ -47,9 +45,9 @@ public final class ShardingSphereOptimizer {
public RelNode optimize(final SQLStatement sqlStatement) {
SqlNode sqlNode = SQLNodeConverterEngine.convert(sqlStatement);
RelNode logicPlan = converter.convertQuery(sqlNode, true, true).rel;
- RelNode ruleBasedPlan = optimizeWithRBO(logicPlan,
hepPlannerWithoutCalc);
+ RelNode ruleBasedPlan = optimizeWithRBO(logicPlan, hepPlanner);
RelNode costBasedPlan = optimizeWithCBO(ruleBasedPlan, converter);
- return optimizeWithRBO(costBasedPlan, hepPlannerWithCalc);
+ return costBasedPlan;
}
private static RelNode optimizeWithRBO(final RelNode logicPlan, final
RelOptPlanner hepPlanner) {
diff --git
a/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/translatable/TranslatableProjectRule.java
b/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/translatable/TranslatableProjectRule.java
index 4d4fddbc0c2..56739774bf5 100644
---
a/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/translatable/TranslatableProjectRule.java
+++
b/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/translatable/TranslatableProjectRule.java
@@ -19,12 +19,14 @@ package
org.apache.shardingsphere.sqlfederation.optimizer.metadata.translatable;
import org.apache.calcite.plan.RelOptRule;
import org.apache.calcite.plan.RelOptRuleCall;
+import org.apache.calcite.rel.RelNode;
import org.apache.calcite.rel.core.RelFactories;
import org.apache.calcite.rel.logical.LogicalProject;
import org.apache.calcite.rex.RexInputRef;
import org.apache.calcite.rex.RexNode;
import org.apache.calcite.tools.RelBuilderFactory;
+import java.util.LinkedList;
import java.util.List;
/**
@@ -43,22 +45,31 @@ public class TranslatableProjectRule extends RelOptRule {
LogicalProject project = call.rel(0);
TranslatableTableScan scan = call.rel(1);
int[] fields = getProjectFields(project.getProjects());
- if (fields == null) {
+ List expressions = project.getProjects();
+ int number = project.getProjects().size();
+ if (fields.length == 0) {
return;
+ } else if (fields.length == number) {
+ call.transformTo(new TranslatableTableScan(scan.getCluster(),
scan.getTable(), scan.getTranslatableTable(), scan.getFilters(), fields));
+ } else {
+ TranslatableTableScan tableScan = new
TranslatableTableScan(scan.getCluster(), scan.getTable(),
scan.getTranslatableTable(), scan.getFilters(), fields, number, expressions);
+ RelNode logicalProject = LogicalProject.create(tableScan,
project.getHints(), project.getProjects(), project.getRowType());
+ call.transformTo(logicalProject);
}
- call.transformTo(new TranslatableTableScan(scan.getCluster(),
scan.getTable(), scan.getTranslatableTable(), scan.getFilters(), fields));
}
private int[] getProjectFields(final List<RexNode> rexNodes) {
- final int[] result = new int[rexNodes.size()];
+ List<Integer> rexInputRefs = new LinkedList<>();
for (int index = 0; index < rexNodes.size(); index++) {
RexNode exp = rexNodes.get(index);
if (exp instanceof RexInputRef) {
- result[index] = ((RexInputRef) exp).getIndex();
- } else {
- return null;
+ rexInputRefs.add(((RexInputRef) exp).getIndex());
}
}
+ int[] result = new int[rexInputRefs.size()];
+ for (int index = 0; index < rexInputRefs.size(); index++) {
+ result[index] = rexInputRefs.get(index);
+ }
return result;
}
}
diff --git
a/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/translatable/TranslatableTableScan.java
b/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/translatable/TranslatableTableScan.java
index 21a9068f1fd..5d6c4a4f4d5 100644
---
a/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/translatable/TranslatableTableScan.java
+++
b/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/translatable/TranslatableTableScan.java
@@ -46,6 +46,7 @@ import org.apache.calcite.rex.RexNode;
import org.apache.calcite.sql.SqlKind;
import org.codehaus.groovy.runtime.InvokerHelper;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -61,11 +62,26 @@ public class TranslatableTableScan extends TableScan
implements EnumerableRel {
private final List<RexNode> filters;
+ private final int number;
+
+ private final List<RexNode> expressions;
+
public TranslatableTableScan(final RelOptCluster cluster, final
RelOptTable table, final FederationTranslatableTable translatableTable, final
int[] fields) {
super(cluster, cluster.traitSetOf(EnumerableConvention.INSTANCE),
ImmutableList.of(), table);
this.translatableTable = translatableTable;
this.fields = fields;
+ this.number = fields.length;
+ this.filters = null;
+ this.expressions = new ArrayList<>();
+ }
+
+ public TranslatableTableScan(final RelOptCluster cluster, final
RelOptTable table, final FederationTranslatableTable translatableTable, final
int[] fields, final int number) {
+ super(cluster, cluster.traitSetOf(EnumerableConvention.INSTANCE),
ImmutableList.of(), table);
+ this.translatableTable = translatableTable;
+ this.fields = fields;
+ this.number = number;
this.filters = null;
+ this.expressions = new ArrayList<>();
}
public TranslatableTableScan(final RelOptCluster cluster, final
RelOptTable table, final FederationTranslatableTable translatableTable,
@@ -73,18 +89,30 @@ public class TranslatableTableScan extends TableScan
implements EnumerableRel {
super(cluster, cluster.traitSetOf(EnumerableConvention.INSTANCE),
ImmutableList.of(), table);
this.translatableTable = translatableTable;
this.fields = fields;
+ this.number = fields.length;
+ this.filters = filters;
+ this.expressions = new ArrayList<>();
+ }
+
+ public TranslatableTableScan(final RelOptCluster cluster, final
RelOptTable table, final FederationTranslatableTable translatableTable,
+ final List<RexNode> filters, final int[]
fields, final int number, final List<RexNode> expressions) {
+ super(cluster, cluster.traitSetOf(EnumerableConvention.INSTANCE),
ImmutableList.of(), table);
+ this.translatableTable = translatableTable;
+ this.fields = fields;
+ this.number = number;
this.filters = filters;
+ this.expressions = expressions;
}
@Override
public RelNode copy(final RelTraitSet traitSet, final List<RelNode>
inputs) {
- return new TranslatableTableScan(getCluster(), table,
translatableTable, fields);
+ return new TranslatableTableScan(getCluster(), table,
translatableTable, fields, number);
}
@Override
public String toString() {
if (null != filters) {
- String[] filterValues = new String[fields.length];
+ String[] filterValues = new String[number];
addFilter(filters, filterValues);
return "TranslatableTableScan{translatableTable=" +
translatableTable + ", fields=" + Arrays.toString(fields) + ", filters=" +
Arrays.toString(filterValues) + '}';
}
@@ -94,7 +122,7 @@ public class TranslatableTableScan extends TableScan
implements EnumerableRel {
@Override
public RelWriter explainTerms(final RelWriter relWriter) {
if (null != filters) {
- String[] filterValues = new String[fields.length];
+ String[] filterValues = new String[number];
addFilter(filters, filterValues);
return super.explainTerms(relWriter).item("fields",
Primitive.asList(fields)).item("filters", Primitive.asList(filterValues));
}
@@ -120,7 +148,7 @@ public class TranslatableTableScan extends TableScan
implements EnumerableRel {
@Override
public RelOptCost computeSelfCost(final RelOptPlanner planner, final
RelMetadataQuery mq) {
- return super.computeSelfCost(planner, mq).multiplyBy(((double)
fields.length + 2D) / ((double) table.getRowType().getFieldCount() + 2D));
+ return super.computeSelfCost(planner, mq).multiplyBy(((double) number
+ 2D) / ((double) table.getRowType().getFieldCount() + 2D));
}
/**
@@ -133,7 +161,7 @@ public class TranslatableTableScan extends TableScan
implements EnumerableRel {
public Result implement(final EnumerableRelImplementor implementor, final
Prefer pref) {
PhysType physType = PhysTypeImpl.of(implementor.getTypeFactory(),
getRowType(), pref.preferArray());
if (null != filters) {
- String[] filterValues = new String[fields.length];
+ String[] filterValues = new String[number];
addFilter(filters, filterValues);
return implementor.result(physType,
Blocks.toBlock(Expressions.call(table.getExpression(FederationTranslatableTable.class),
"projectAndFilter", implementor.getRootExpression(),
Expressions.constant(filterValues), Expressions.constant(fields))));
diff --git
a/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/planner/QueryOptimizePlannerFactory.java
b/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/planner/QueryOptimizePlannerFactory.java
index 614aece877d..ff03cd52a00 100644
---
a/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/planner/QueryOptimizePlannerFactory.java
+++
b/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/planner/QueryOptimizePlannerFactory.java
@@ -57,32 +57,6 @@ public final class QueryOptimizePlannerFactory {
return result;
}
- /**
- * Create new instance of hep planner without calc rules.
- *
- * @return hep planner instance
- */
- public static RelOptPlanner createHepPlannerWithoutCalc() {
- HepProgramBuilder builder = new HepProgramBuilder();
-
builder.addGroupBegin().addRuleCollection(getFilterRules()).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
-
builder.addGroupBegin().addRuleCollection(getProjectRules()).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
-
builder.addGroupBegin().addRuleInstance(CoreRules.PROJECT_MERGE).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
- builder.addMatchLimit(DEFAULT_MATCH_LIMIT);
- return new HepPlanner(builder.build());
- }
-
- /**
- * Create new instance of hep planner with calc rules.
- *
- * @return hep planner instance
- */
- public static RelOptPlanner createHepPlannerWithCalc() {
- HepProgramBuilder builder = new HepProgramBuilder();
-
builder.addGroupBegin().addRuleCollection(getCalcRules()).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
- builder.addMatchLimit(DEFAULT_MATCH_LIMIT);
- return new HepPlanner(builder.build());
- }
-
/**
* Create new instance of hep planner.
*
@@ -90,9 +64,8 @@ public final class QueryOptimizePlannerFactory {
*/
public static RelOptPlanner createHepPlanner() {
HepProgramBuilder builder = new HepProgramBuilder();
-
builder.addGroupBegin().addRuleCollection(getSubQueryRules()).addGroupEnd().addMatchOrder(HepMatchOrder.DEPTH_FIRST);
-
builder.addGroupBegin().addRuleCollection(getProjectRules()).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
builder.addGroupBegin().addRuleCollection(getFilterRules()).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
+
builder.addGroupBegin().addRuleCollection(getProjectRules()).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
builder.addGroupBegin().addRuleCollection(getCalcRules()).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
builder.addMatchLimit(DEFAULT_MATCH_LIMIT);
return new HepPlanner(builder.build());
diff --git
a/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/test/java/org/apache/shardingsphere/sqlfederation/optimizer/ShardingSphereOptimizerTest.java
b/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/test/java/org/apache/shardingsphere/sqlfederation/optimizer/ShardingSphereOptimizerTest.java
index bbfdde7a33f..5774fa2b6b8 100644
---
a/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/test/java/org/apache/shardingsphere/sqlfederation/optimizer/ShardingSphereOptimizerTest.java
+++
b/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/test/java/org/apache/shardingsphere/sqlfederation/optimizer/ShardingSphereOptimizerTest.java
@@ -100,7 +100,7 @@ public final class ShardingSphereOptimizerTest {
tables.put("t_user_info", createUserInfoTableMetaData());
ShardingSphereSchema schema = new ShardingSphereSchema(tables,
Collections.emptyMap());
SqlToRelConverter converter = createSqlToRelConverter(schema);
- optimizer = new ShardingSphereOptimizer(converter,
QueryOptimizePlannerFactory.createHepPlannerWithoutCalc(),
QueryOptimizePlannerFactory.createHepPlannerWithCalc());
+ optimizer = new ShardingSphereOptimizer(converter,
QueryOptimizePlannerFactory.createHepPlanner());
}
private ShardingSphereTable createOrderTableMetaData() {
@@ -132,10 +132,10 @@ public final class ShardingSphereOptimizerTest {
String actual = optimizer.optimize(sqlStatement).explain();
String expected = "EnumerableCalc(expr#0..4=[{inputs}],
proj#0..1=[{exprs}], user_id0=[$t3])" + LINE_SEPARATOR
+ " EnumerableHashJoin(condition=[=($2, $4)],
joinType=[inner])" + LINE_SEPARATOR
- + " EnumerableCalc(expr#0..2=[{inputs}],
expr#3=[CAST($t1):VARCHAR], proj#0..1=[{exprs}], user_id0=[$t3])" +
LINE_SEPARATOR
- + " TranslatableTableScan(table=[[federate_jdbc,
t_order_federate]], fields=[[0, 1, 2]])" + LINE_SEPARATOR
- + " EnumerableCalc(expr#0..1=[{inputs}],
expr#2=[CAST($t0):VARCHAR], user_id=[$t0], user_id0=[$t2])" + LINE_SEPARATOR
- + " TranslatableTableScan(table=[[federate_jdbc,
t_user_info]], fields=[[0, 1]], filters=[[13, null]])" + LINE_SEPARATOR;
+ + " EnumerableCalc(expr#0..1=[{inputs}],
expr#2=[CAST($t1):VARCHAR], proj#0..2=[{exprs}])" + LINE_SEPARATOR
+ + " TranslatableTableScan(table=[[federate_jdbc,
t_order_federate]], fields=[[0, 1]])" + LINE_SEPARATOR
+ + " EnumerableCalc(expr#0=[{inputs}],
expr#1=[CAST($t0):VARCHAR], proj#0..1=[{exprs}])" + LINE_SEPARATOR
+ + " TranslatableTableScan(table=[[federate_jdbc,
t_user_info]], fields=[[0]], filters=[[13, null]])" + LINE_SEPARATOR;
assertThat(actual, is(expected));
}
@@ -164,10 +164,10 @@ public final class ShardingSphereOptimizerTest {
String actual = optimizer.optimize(sqlStatement).explain();
String expected = "EnumerableCalc(expr#0..4=[{inputs}],
proj#0..1=[{exprs}], user_id0=[$t3])" + LINE_SEPARATOR
+ " EnumerableHashJoin(condition=[=($2, $4)],
joinType=[inner])" + LINE_SEPARATOR
- + " EnumerableCalc(expr#0..2=[{inputs}],
expr#3=[CAST($t1):VARCHAR], proj#0..1=[{exprs}], user_id0=[$t3])" +
LINE_SEPARATOR
- + " TranslatableTableScan(table=[[federate_jdbc,
t_order_federate]], fields=[[0, 1, 2]])" + LINE_SEPARATOR
- + " EnumerableCalc(expr#0..1=[{inputs}],
expr#2=[CAST($t0):VARCHAR], user_id=[$t0], user_id0=[$t2])" + LINE_SEPARATOR
- + " TranslatableTableScan(table=[[federate_jdbc,
t_user_info]], fields=[[0, 1]])" + LINE_SEPARATOR;
+ + " EnumerableCalc(expr#0..1=[{inputs}],
expr#2=[CAST($t1):VARCHAR], proj#0..2=[{exprs}])" + LINE_SEPARATOR
+ + " TranslatableTableScan(table=[[federate_jdbc,
t_order_federate]], fields=[[0, 1]])" + LINE_SEPARATOR
+ + " EnumerableCalc(expr#0=[{inputs}],
expr#1=[CAST($t0):VARCHAR], proj#0..1=[{exprs}])" + LINE_SEPARATOR
+ + " TranslatableTableScan(table=[[federate_jdbc,
t_user_info]], fields=[[0]])" + LINE_SEPARATOR;
assertThat(actual, is(expected));
}
@@ -178,10 +178,10 @@ public final class ShardingSphereOptimizerTest {
String actual = optimizer.optimize(sqlStatement).explain();
String expected = "EnumerableCalc(expr#0..4=[{inputs}],
proj#0..1=[{exprs}], user_id0=[$t3])" + LINE_SEPARATOR
+ " EnumerableHashJoin(condition=[=($2, $4)],
joinType=[inner])" + LINE_SEPARATOR
- + " EnumerableCalc(expr#0..2=[{inputs}],
expr#3=[CAST($t1):VARCHAR], proj#0..1=[{exprs}], user_id0=[$t3])" +
LINE_SEPARATOR
- + " TranslatableTableScan(table=[[federate_jdbc,
t_order_federate]], fields=[[0, 1, 2]])" + LINE_SEPARATOR
- + " EnumerableCalc(expr#0..1=[{inputs}],
expr#2=[CAST($t0):VARCHAR], user_id=[$t0], user_id0=[$t2])" + LINE_SEPARATOR
- + " TranslatableTableScan(table=[[federate_jdbc,
t_user_info]], fields=[[0, 1]])" + LINE_SEPARATOR;
+ + " EnumerableCalc(expr#0..1=[{inputs}],
expr#2=[CAST($t1):VARCHAR], proj#0..2=[{exprs}])" + LINE_SEPARATOR
+ + " TranslatableTableScan(table=[[federate_jdbc,
t_order_federate]], fields=[[0, 1]])" + LINE_SEPARATOR
+ + " EnumerableCalc(expr#0=[{inputs}],
expr#1=[CAST($t0):VARCHAR], proj#0..1=[{exprs}])" + LINE_SEPARATOR
+ + " TranslatableTableScan(table=[[federate_jdbc,
t_user_info]], fields=[[0]])" + LINE_SEPARATOR;
assertThat(actual, is(expected));
}
@@ -192,10 +192,10 @@ public final class ShardingSphereOptimizerTest {
String actual = optimizer.optimize(sqlStatement).explain();
String expected = "EnumerableCalc(expr#0..4=[{inputs}],
proj#0..1=[{exprs}], user_id0=[$t3])" + LINE_SEPARATOR
+ " EnumerableHashJoin(condition=[=($2, $4)],
joinType=[inner])" + LINE_SEPARATOR
- + " EnumerableCalc(expr#0..2=[{inputs}],
expr#3=[CAST($t1):VARCHAR], proj#0..1=[{exprs}], user_id0=[$t3])" +
LINE_SEPARATOR
- + " TranslatableTableScan(table=[[federate_jdbc,
t_order_federate]], fields=[[0, 1, 2]])" + LINE_SEPARATOR
- + " EnumerableCalc(expr#0..1=[{inputs}],
expr#2=[CAST($t0):VARCHAR], user_id=[$t0], user_id0=[$t2])" + LINE_SEPARATOR
- + " TranslatableTableScan(table=[[federate_jdbc,
t_user_info]], fields=[[0, 1]], filters=[[13, null]])" + LINE_SEPARATOR;
+ + " EnumerableCalc(expr#0..1=[{inputs}],
expr#2=[CAST($t1):VARCHAR], proj#0..2=[{exprs}])" + LINE_SEPARATOR
+ + " TranslatableTableScan(table=[[federate_jdbc,
t_order_federate]], fields=[[0, 1]])" + LINE_SEPARATOR
+ + " EnumerableCalc(expr#0=[{inputs}],
expr#1=[CAST($t0):VARCHAR], proj#0..1=[{exprs}])" + LINE_SEPARATOR
+ + " TranslatableTableScan(table=[[federate_jdbc,
t_user_info]], fields=[[0]], filters=[[13, null]])" + LINE_SEPARATOR;
assertThat(actual, is(expected));
}
@@ -259,8 +259,8 @@ public final class ShardingSphereOptimizerTest {
String actual = optimizer.optimize(sqlStatement).explain();
String expected = "EnumerableUnion(all=[false])" + LINE_SEPARATOR
+ " TranslatableTableScan(table=[[federate_jdbc,
t_order_federate]], fields=[[0, 1]])" + LINE_SEPARATOR
- + " EnumerableCalc(expr#0..1=[{inputs}],
expr#2=['1':VARCHAR], EXPR$0=[$t2], user_id=[$t0])" + LINE_SEPARATOR
- + " TranslatableTableScan(table=[[federate_jdbc,
t_user_info]], fields=[[0, 1]], filters=[[null, before]])" + LINE_SEPARATOR;
+ + " EnumerableCalc(expr#0=[{inputs}], expr#1=['1':VARCHAR],
EXPR$0=[$t1], user_id=[$t0])" + LINE_SEPARATOR
+ + " TranslatableTableScan(table=[[federate_jdbc,
t_user_info]], fields=[[0]], filters=[[null, before]])" + LINE_SEPARATOR;
assertThat(actual, is(expected));
}
}