strongduanmu commented on code in PR #23040:
URL: https://github.com/apache/shardingsphere/pull/23040#discussion_r1065761598
##########
kernel/sql-federation/executor/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/FilterableTableScanExecutor.java:
##########
@@ -117,6 +117,11 @@ public final class FilterableTableScanExecutor implements
TableScanExecutor {
private final EventBusContext eventBusContext;
+ @Override
+ public Enumerable<Object> executeScalar(final ShardingSphereTable table,
final ScanNodeExecutorContext scanContext) {
+ return null;
Review Comment:
Why return null here? Can we return empty Enumerable?
##########
kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/translatable/ParseRexNodeVisitorImpl.java:
##########
@@ -138,9 +144,44 @@ public RexNode visitInput(final InputContext ctx) {
@Override
public RexNode visitInputRef(final InputRefContext ctx) {
+ // 处理inputRef位于cast的场景:CAST($1,INTEGER)。
Review Comment:
Please remove inline doc here.
##########
kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/translatable/ParseRexNodeVisitorImpl.java:
##########
@@ -138,9 +144,44 @@ public RexNode visitInput(final InputContext ctx) {
@Override
public RexNode visitInputRef(final InputRefContext ctx) {
+ // 处理inputRef位于cast的场景:CAST($1,INTEGER)。
Integer index = Integer.valueOf(ctx.INTEGER_().getText());
- RelDataType nonNullableInt =
typeFactory.createSqlType(SqlTypeName.INTEGER);
- return rexBuilder.makeInputRef(nonNullableInt, index);
+ if ((ctx.getParent() instanceof CastContext) &&
"VARCHAR".equals(ctx.getParent().getStop().getText())) {
+ return
rexBuilder.makeInputRef(typeFactory.createJavaType(String.class), index);
+ } else if ((ctx.getParent() instanceof CastContext) &&
"INTEGER".equals(ctx.getParent().getStop().getText())) {
+ return
rexBuilder.makeInputRef(typeFactory.createJavaType(Integer.class), index);
+ } else if ((ctx.getParent() instanceof CastContext) &&
"BIGINT".equals(ctx.getParent().getStop().getText())) {
+ return
rexBuilder.makeInputRef(typeFactory.createJavaType(Long.class), index);
+ }
+ // 处理inputRef的普通场景:$0。
+ if (null != columnMap.get(index)) {
+ Class dataType = getClass(columnMap.get(index));
+ return
rexBuilder.makeInputRef(typeFactory.createJavaType(dataType), index);
+ }
+ // 需要处理关联查询的场景:$cor0.merchant_id。
+ return
rexBuilder.makeInputRef(typeFactory.createJavaType(Integer.class), index);
+ }
+
+ private Class getClass(final int dataType) {
+ // Reference to java.sql.Types
Review Comment:
Please remove inline doc here.
##########
kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/translatable/ParseRexNodeVisitorImpl.java:
##########
@@ -138,9 +144,44 @@ public RexNode visitInput(final InputContext ctx) {
@Override
public RexNode visitInputRef(final InputRefContext ctx) {
+ // 处理inputRef位于cast的场景:CAST($1,INTEGER)。
Integer index = Integer.valueOf(ctx.INTEGER_().getText());
- RelDataType nonNullableInt =
typeFactory.createSqlType(SqlTypeName.INTEGER);
- return rexBuilder.makeInputRef(nonNullableInt, index);
+ if ((ctx.getParent() instanceof CastContext) &&
"VARCHAR".equals(ctx.getParent().getStop().getText())) {
+ return
rexBuilder.makeInputRef(typeFactory.createJavaType(String.class), index);
+ } else if ((ctx.getParent() instanceof CastContext) &&
"INTEGER".equals(ctx.getParent().getStop().getText())) {
+ return
rexBuilder.makeInputRef(typeFactory.createJavaType(Integer.class), index);
+ } else if ((ctx.getParent() instanceof CastContext) &&
"BIGINT".equals(ctx.getParent().getStop().getText())) {
+ return
rexBuilder.makeInputRef(typeFactory.createJavaType(Long.class), index);
+ }
+ // 处理inputRef的普通场景:$0。
+ if (null != columnMap.get(index)) {
+ Class dataType = getClass(columnMap.get(index));
+ return
rexBuilder.makeInputRef(typeFactory.createJavaType(dataType), index);
+ }
+ // 需要处理关联查询的场景:$cor0.merchant_id。
Review Comment:
Please remove inline doc here.
##########
kernel/sql-federation/executor/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/TranslatableTableScanExecutor.java:
##########
@@ -229,26 +327,47 @@ private RelNode createRelNode(final ShardingSphereTable
table, final Translatabl
RelOptCluster relOptCluster =
RelOptCluster.create(SQLFederationPlannerUtil.createVolcanoPlanner(), new
RexBuilder(JAVA_TYPE_FACTORY));
RelBuilder builder =
RelFactories.LOGICAL_BUILDER.create(relOptCluster,
catalogReader).scan(table.getName());
if (null != scanContext.getFilterValues()) {
- builder.filter(createFilters(scanContext.getFilterValues()));
+ builder.filter(createFilters(scanContext.getFilterValues(),
(SQLFederationDataContext) scanContext.getRoot()));
}
if (null != scanContext.getProjects()) {
builder.project(createProjections(scanContext.getProjects(),
builder, table.getColumnNames()));
}
return builder.build();
}
- private Collection<RexNode> createFilters(final String[] filterValues) {
+ private Collection<RexNode> createFilters(final String[] filterValues,
final SQLFederationDataContext context) {
Collection<RexNode> result = new LinkedList<>();
JavaTypeFactory typeFactory = new
JavaTypeFactoryImpl(RelDataTypeSystem.DEFAULT);
RexBuilder rexBuilder = new RexBuilder(typeFactory);
for (String each : filterValues) {
if (!Strings.isNullOrEmpty(each)) {
- result.add(StringToRexNodeUtil.buildRexNode(each, rexBuilder));
+ Map<Integer, Integer> columnMap = extractColumnMap(each);
+ String filterValue = extractFilterValue(each);
+ result.add(StringToRexNodeUtil.buildRexNode(filterValue,
rexBuilder, context.getParameters(), columnMap));
}
}
return result;
}
+ private Map<Integer, Integer> extractColumnMap(final String
filterExpression) {
Review Comment:
Can you give an example of filterExpression? It looks like a json format
value.
##########
kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/translatable/ParseRexNodeVisitorImpl.java:
##########
@@ -138,9 +144,44 @@ public RexNode visitInput(final InputContext ctx) {
@Override
public RexNode visitInputRef(final InputRefContext ctx) {
+ // 处理inputRef位于cast的场景:CAST($1,INTEGER)。
Integer index = Integer.valueOf(ctx.INTEGER_().getText());
- RelDataType nonNullableInt =
typeFactory.createSqlType(SqlTypeName.INTEGER);
- return rexBuilder.makeInputRef(nonNullableInt, index);
+ if ((ctx.getParent() instanceof CastContext) &&
"VARCHAR".equals(ctx.getParent().getStop().getText())) {
+ return
rexBuilder.makeInputRef(typeFactory.createJavaType(String.class), index);
+ } else if ((ctx.getParent() instanceof CastContext) &&
"INTEGER".equals(ctx.getParent().getStop().getText())) {
+ return
rexBuilder.makeInputRef(typeFactory.createJavaType(Integer.class), index);
+ } else if ((ctx.getParent() instanceof CastContext) &&
"BIGINT".equals(ctx.getParent().getStop().getText())) {
+ return
rexBuilder.makeInputRef(typeFactory.createJavaType(Long.class), index);
+ }
+ // 处理inputRef的普通场景:$0。
Review Comment:
Please remove inline doc here.
##########
kernel/sql-federation/executor/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/TranslatableTableScanExecutor.java:
##########
@@ -229,26 +327,47 @@ private RelNode createRelNode(final ShardingSphereTable
table, final Translatabl
RelOptCluster relOptCluster =
RelOptCluster.create(SQLFederationPlannerUtil.createVolcanoPlanner(), new
RexBuilder(JAVA_TYPE_FACTORY));
RelBuilder builder =
RelFactories.LOGICAL_BUILDER.create(relOptCluster,
catalogReader).scan(table.getName());
if (null != scanContext.getFilterValues()) {
- builder.filter(createFilters(scanContext.getFilterValues()));
+ builder.filter(createFilters(scanContext.getFilterValues(),
(SQLFederationDataContext) scanContext.getRoot()));
}
if (null != scanContext.getProjects()) {
builder.project(createProjections(scanContext.getProjects(),
builder, table.getColumnNames()));
}
return builder.build();
}
- private Collection<RexNode> createFilters(final String[] filterValues) {
+ private Collection<RexNode> createFilters(final String[] filterValues,
final SQLFederationDataContext context) {
Collection<RexNode> result = new LinkedList<>();
JavaTypeFactory typeFactory = new
JavaTypeFactoryImpl(RelDataTypeSystem.DEFAULT);
RexBuilder rexBuilder = new RexBuilder(typeFactory);
for (String each : filterValues) {
if (!Strings.isNullOrEmpty(each)) {
- result.add(StringToRexNodeUtil.buildRexNode(each, rexBuilder));
+ Map<Integer, Integer> columnMap = extractColumnMap(each);
+ String filterValue = extractFilterValue(each);
+ result.add(StringToRexNodeUtil.buildRexNode(filterValue,
rexBuilder, context.getParameters(), columnMap));
}
}
return result;
}
+ private Map<Integer, Integer> extractColumnMap(final String
filterExpression) {
+ String columnInformationPattern = "\\{.*}";
+ Matcher matcher =
Pattern.compile(columnInformationPattern).matcher(filterExpression);
Review Comment:
In order to improve performance, can we extract Pattern as a static field?
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]