You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by me...@apache.org on 2021/01/08 09:39:21 UTC

[shardingsphere] branch master updated: add CalciteExecutionContextGenerator CalciteExecutionSQLGenerator (#8951)

This is an automated email from the ASF dual-hosted git repository.

menghaoran 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 d49c1ef  add CalciteExecutionContextGenerator CalciteExecutionSQLGenerator (#8951)
d49c1ef is described below

commit d49c1efae7f207303e8b6197d4b81f09108a78af
Author: Juan Pan(Trista) <pa...@apache.org>
AuthorDate: Fri Jan 8 17:38:57 2021 +0800

    add CalciteExecutionContextGenerator CalciteExecutionSQLGenerator (#8951)
    
    * add CalciteExecutionContextGenerator CalciteExecutionSQLGenerator
    
    * check style
---
 .../ShardingSQLRewriteContextDecorator.java        |  3 +
 .../optimize/schema/CalciteLogicSchemaFactory.java |  1 -
 .../generator/CalciteLogicSchemaGenerator.java     |  3 +-
 .../generator/CalciteLogicTableGenerator.java      |  7 +-
 .../optimize/schema/row/CalciteRowExecutor.java    |  9 ++-
 .../schema/table/AbstractCalciteTable.java         |  2 +
 .../schema/table/CalciteFilterableTable.java       | 13 ++--
 .../execute/CalciteExecutionContextGenerator.java  | 89 ++++++++++++++++++++++
 .../execute/CalciteExecutionSQLGenerator.java      | 44 +++++++++++
 9 files changed, 159 insertions(+), 12 deletions(-)

diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-rewrite/src/main/java/org/apache/shardingsphere/sharding/rewrite/context/ShardingSQLRewriteContextDecorator.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-rewrite/src/main/java/org/apache/shardingsphere/sharding/rewrite/context/ShardingSQLRewriteContextDecorator.java
index 6b043dc..29a9402 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-rewrite/src/main/java/org/apache/shardingsphere/sharding/rewrite/context/ShardingSQLRewriteContextDecorator.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-rewrite/src/main/java/org/apache/shardingsphere/sharding/rewrite/context/ShardingSQLRewriteContextDecorator.java
@@ -37,6 +37,9 @@ public final class ShardingSQLRewriteContextDecorator implements SQLRewriteConte
     @SuppressWarnings("unchecked")
     @Override
     public void decorate(final ShardingRule shardingRule, final ConfigurationProperties props, final SQLRewriteContext sqlRewriteContext, final RouteContext routeContext) {
+        if (routeContext.isToCalcite()) {
+            return;
+        }
         for (ParameterRewriter each : new ShardingParameterRewriterBuilder(shardingRule, routeContext).getParameterRewriters(sqlRewriteContext.getSchema())) {
             if (!sqlRewriteContext.getParameters().isEmpty() && each.isNeedRewrite(sqlRewriteContext.getSqlStatementContext())) {
                 each.rewrite(sqlRewriteContext.getParameterBuilder(), sqlRewriteContext.getSqlStatementContext(), sqlRewriteContext.getParameters());
diff --git a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/schema/CalciteLogicSchemaFactory.java b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/schema/CalciteLogicSchemaFactory.java
index 5b332e5..0d9f8f2 100644
--- a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/schema/CalciteLogicSchemaFactory.java
+++ b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/schema/CalciteLogicSchemaFactory.java
@@ -59,4 +59,3 @@ public final class CalciteLogicSchemaFactory {
         return schemas.get(name).create(executor);
     }
 }
-
diff --git a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/schema/generator/CalciteLogicSchemaGenerator.java b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/schema/generator/CalciteLogicSchemaGenerator.java
index 3752369..3f2ec8a 100644
--- a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/schema/generator/CalciteLogicSchemaGenerator.java
+++ b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/schema/generator/CalciteLogicSchemaGenerator.java
@@ -53,7 +53,8 @@ public final class CalciteLogicSchemaGenerator {
         Map<String, Collection<DataNode>> tableDataNodes = getTableDataNodes(dataNodeRules);
         Map<String, Collection<String>> dataSourceRules = getDataSourceRules(metaData);
         for (Map.Entry<String, Collection<DataNode>> entry : tableDataNodes.entrySet()) {
-            tables.put(entry.getKey(), new CalciteLogicTableGenerator(metaData.getResource().getDataSources(), dataSourceRules, entry.getValue(), metaData.getResource().getDatabaseType()));
+            tables.put(entry.getKey(),
+                    new CalciteLogicTableGenerator(entry.getKey(), metaData.getResource().getDataSources(), dataSourceRules, entry.getValue(), metaData.getResource().getDatabaseType()));
         }
     }
     
diff --git a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/schema/generator/CalciteLogicTableGenerator.java b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/schema/generator/CalciteLogicTableGenerator.java
index f447f04..335a705 100644
--- a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/schema/generator/CalciteLogicTableGenerator.java
+++ b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/schema/generator/CalciteLogicTableGenerator.java
@@ -43,12 +43,15 @@ import java.util.Optional;
  */
 public final class CalciteLogicTableGenerator {
     
+    private final String name;
+    
     private final TableMetaData tableMetaData;
     
     private final RelProtoDataType relProtoDataType;
     
-    public CalciteLogicTableGenerator(final Map<String, DataSource> dataSources, final Map<String, Collection<String>> dataSourceRules,
+    public CalciteLogicTableGenerator(final String name, final Map<String, DataSource> dataSources, final Map<String, Collection<String>> dataSourceRules,
                                       final Collection<DataNode> tableDataNodes, final DatabaseType databaseType) throws SQLException {
+        this.name = name;
         tableMetaData = createTableMetaData(dataSources, dataSourceRules, tableDataNodes, databaseType);
         relProtoDataType = createRelDataType();
     }
@@ -87,6 +90,6 @@ public final class CalciteLogicTableGenerator {
      * @return table
      */
     public Table create(final CalciteRowExecutor executor) {
-        return new CalciteFilterableTable(tableMetaData, relProtoDataType, executor);
+        return new CalciteFilterableTable(name, tableMetaData, relProtoDataType, executor);
     }
 }
diff --git a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/schema/row/CalciteRowExecutor.java b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/schema/row/CalciteRowExecutor.java
index f81b382..b283a13 100644
--- a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/schema/row/CalciteRowExecutor.java
+++ b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/schema/row/CalciteRowExecutor.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.infra.optimize.schema.row;
 
+import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.exception.ShardingSphereException;
 import org.apache.shardingsphere.infra.executor.kernel.model.ExecutionGroup;
@@ -52,18 +53,20 @@ public final class CalciteRowExecutor {
     
     private final JDBCExecutor jdbcExecutor;
     
-    private final ExecutionContext executionContext;
+    @Getter
+    private final ExecutionContext initialExecutionContext;
     
     private final JDBCExecutorCallback<? extends ExecuteResult> callback;
     
     /**
      * Execute.
      *
+     * @param context context
      * @return a query result list
      */
-    public Collection<QueryResult> execute() {
+    public Collection<QueryResult> execute(final ExecutionContext context) {
         try {
-            Collection<ExecutionGroup<JDBCExecutionUnit>> executionGroups = createExecutionGroups(executionContext);
+            Collection<ExecutionGroup<JDBCExecutionUnit>> executionGroups = createExecutionGroups(context);
             return jdbcExecutor.execute(executionGroups, callback).stream().map(each -> (QueryResult) each).collect(Collectors.toList());
         } catch (final SQLException ex) {
             throw new ShardingSphereException(ex);
diff --git a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/schema/table/AbstractCalciteTable.java b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/schema/table/AbstractCalciteTable.java
index b421683..e325967 100644
--- a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/schema/table/AbstractCalciteTable.java
+++ b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/schema/table/AbstractCalciteTable.java
@@ -34,6 +34,8 @@ import org.apache.shardingsphere.infra.optimize.schema.row.CalciteRowExecutor;
 @RequiredArgsConstructor
 public abstract class AbstractCalciteTable extends AbstractTable {
     
+    private final String name;
+    
     private final TableMetaData tableMetaData;
     
     private final RelProtoDataType relProtoDataType;
diff --git a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/schema/table/CalciteFilterableTable.java b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/schema/table/CalciteFilterableTable.java
index ee0a171..381579f 100644
--- a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/schema/table/CalciteFilterableTable.java
+++ b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/schema/table/CalciteFilterableTable.java
@@ -25,8 +25,10 @@ import org.apache.calcite.rel.type.RelProtoDataType;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.schema.ProjectableFilterableTable;
 import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData;
-import org.apache.shardingsphere.infra.optimize.schema.row.CalciteRowExecutor;
 import org.apache.shardingsphere.infra.optimize.schema.row.CalciteRowEnumerator;
+import org.apache.shardingsphere.infra.optimize.schema.row.CalciteRowExecutor;
+import org.apache.shardingsphere.infra.optimize.schema.table.execute.CalciteExecutionContextGenerator;
+import org.apache.shardingsphere.infra.optimize.schema.table.execute.CalciteExecutionSQLGenerator;
 
 import java.util.List;
 
@@ -36,19 +38,20 @@ import java.util.List;
  */
 public final class CalciteFilterableTable extends AbstractCalciteTable implements ProjectableFilterableTable {
     
-    public CalciteFilterableTable(final TableMetaData tableMetaData, final RelProtoDataType relProtoDataType,
+    public CalciteFilterableTable(final String name, final TableMetaData tableMetaData, final RelProtoDataType relProtoDataType,
                                   final CalciteRowExecutor executor) {
-        super(tableMetaData, relProtoDataType, executor);
+        super(name, tableMetaData, relProtoDataType, executor);
     }
     
     @Override
     public Enumerable<Object[]> scan(final DataContext root, final List<RexNode> filters, final int[] projects) {
-        // TODO : use projects and filters
         return new AbstractEnumerable<Object[]>() {
 
             @Override
             public Enumerator<Object[]> enumerator() {
-                return new CalciteRowEnumerator(getExecutor().execute());
+                CalciteExecutionContextGenerator generator =
+                        new CalciteExecutionContextGenerator(getName(), getExecutor().getInitialExecutionContext(), new CalciteExecutionSQLGenerator(root, filters, projects));
+                return new CalciteRowEnumerator(getExecutor().execute(generator.generate()));
             }
         };
     }
diff --git a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/schema/table/execute/CalciteExecutionContextGenerator.java b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/schema/table/execute/CalciteExecutionContextGenerator.java
new file mode 100644
index 0000000..5a4beb1
--- /dev/null
+++ b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/schema/table/execute/CalciteExecutionContextGenerator.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.optimize.schema.table.execute;
+
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.executor.sql.context.ExecutionContext;
+import org.apache.shardingsphere.infra.executor.sql.context.ExecutionUnit;
+import org.apache.shardingsphere.infra.executor.sql.context.SQLUnit;
+import org.apache.shardingsphere.infra.route.context.RouteContext;
+import org.apache.shardingsphere.infra.route.context.RouteMapper;
+import org.apache.shardingsphere.infra.route.context.RouteUnit;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedHashSet;
+
+/**
+ * Calcite table execution context generator.
+ */
+@RequiredArgsConstructor
+public final class CalciteExecutionContextGenerator {
+    
+    private final String table;
+    
+    private final ExecutionContext initialExecutionContext;
+    
+    private final CalciteExecutionSQLGenerator filter;
+    
+    /**
+     * Create execution context.
+     *
+     * @return execution context
+     */
+    public ExecutionContext generate() {
+        RouteContext routeContext = getRouteContext(initialExecutionContext.getRouteContext());
+        return new ExecutionContext(initialExecutionContext.getSqlStatementContext(),
+                getExecutionUnits(routeContext.getRouteUnits(), filter), routeContext);
+    }
+    
+    private Collection<ExecutionUnit> getExecutionUnits(final Collection<RouteUnit> routeUnits, final CalciteExecutionSQLGenerator filter) {
+        Collection<ExecutionUnit> result = new LinkedHashSet<>();
+        for (RouteUnit each: routeUnits) {
+            for (RouteMapper mapper : each.getTableMappers()) {
+                if (mapper.getLogicName().equals(table)) {
+                    result.add(new ExecutionUnit(each.getDataSourceMapper().getActualName(),
+                            new SQLUnit(filter.generate(mapper.getActualName()), Collections.emptyList(), Collections.singletonList(mapper))));
+                }
+            }
+        }
+        return result;
+    }
+    
+    private RouteContext getRouteContext(final RouteContext routeContext) {
+        RouteContext result = new RouteContext();
+        result.getRouteUnits().addAll(getRouteUnits(routeContext));
+        return result;
+    }
+    
+    private Collection<RouteUnit> getRouteUnits(final RouteContext routeContext) {
+        Collection<RouteUnit> result = new LinkedHashSet<>();
+        for (RouteUnit each : routeContext.getRouteUnits()) {
+            RouteUnit routeUnit = new RouteUnit(each.getDataSourceMapper(), new LinkedHashSet<>());
+            for (RouteMapper mapper : each.getTableMappers()) {
+                if (mapper.getLogicName().equals(table)) {
+                    routeUnit.getTableMappers().add(mapper);
+                }
+            }
+            if (!routeUnit.getTableMappers().isEmpty()) {
+                result.add(routeUnit);
+            }
+        }
+        return result;
+    }
+}
diff --git a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/schema/table/execute/CalciteExecutionSQLGenerator.java b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/schema/table/execute/CalciteExecutionSQLGenerator.java
new file mode 100644
index 0000000..07ae151
--- /dev/null
+++ b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/schema/table/execute/CalciteExecutionSQLGenerator.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.optimize.schema.table.execute;
+
+import org.apache.calcite.DataContext;
+import org.apache.calcite.rex.RexNode;
+
+import java.util.List;
+
+/**
+ * Calcite execution sql generator.
+ */
+public final class CalciteExecutionSQLGenerator {
+
+    public CalciteExecutionSQLGenerator(final DataContext root, final List<RexNode> filters, final int[] projects) {
+        // TODO
+    }
+    
+    /**
+     * Create sql.
+     *
+     * @param table table
+     * @return sql
+     */
+    public String generate(final String table) {
+        // TODO
+        return String.format("SELECT * FROM %s", table);
+    }
+}