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]

Reply via email to