You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by pa...@apache.org on 2021/09/05 07:00:46 UTC

[shardingsphere] branch master updated: optimize federate generate sql with quote character (#12177)

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

panjuan 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 145b281  optimize federate generate sql with quote character (#12177)
145b281 is described below

commit 145b28162a1442a6a3b1e49c43d4d268283ec5ce
Author: Zhengqiang Duan <du...@apache.org>
AuthorDate: Sun Sep 5 15:00:14 2021 +0800

    optimize federate generate sql with quote character (#12177)
    
    * optimize federate generate sql with quote character
    
    * optimize calcite generate sql case sensitive logic
    
    * optimize logic with quote character
    
    * rename method
    
    * delete useless method
---
 .../infra/binder/segment/table/TablesContext.java   | 21 +++++++++++----------
 .../sql/federate/execute/FederateJDBCExecutor.java  |  2 +-
 .../federate/schema/row/FederateRowExecutor.java    |  5 ++++-
 .../FederateExecutionContextGenerator.java          |  8 ++++----
 .../generator/FederateExecutionSQLGenerator.java    | 10 ++++++++--
 .../optimize/context/OptimizeContextFactory.java    |  1 +
 .../core/metadata/FederateSchemaMetadata.java       |  5 ++---
 .../type/AlterTableStatementFederateRefresher.java  |  4 ++--
 .../type/CreateTableStatementFederateRefresher.java |  2 +-
 9 files changed, 34 insertions(+), 24 deletions(-)

diff --git a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/table/TablesContext.java b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/table/TablesContext.java
index 23b09d9..d1e525f 100644
--- a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/table/TablesContext.java
+++ b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/table/TablesContext.java
@@ -30,6 +30,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedList;
+import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.TreeMap;
@@ -85,9 +86,9 @@ public final class TablesContext {
             return columns.stream().collect(Collectors.toMap(ColumnSegment::getQualifiedName, each -> tableName, (oldValue, currentValue) -> oldValue));
         }
         Map<String, String> result = new HashMap<>(columns.size(), 1);
-        Map<String, String> ownerColumnNames = columns.stream().filter(each -> each.getOwner().isPresent()).collect(Collectors.toMap(each 
-            -> each.getOwner().get().getIdentifier().getValue(), ColumnSegment::getQualifiedName, (oldValue, currentValue) -> oldValue, () -> new TreeMap<>(String.CASE_INSENSITIVE_ORDER)));
-        result.putAll(findTableNameFromSQL(ownerColumnNames));
+        Map<String, List<ColumnSegment>> ownerColumns = columns.stream().filter(each -> each.getOwner().isPresent()).collect(Collectors.groupingBy(each
+            -> each.getOwner().map(optional -> optional.getIdentifier().getValue()).orElse(null), () -> new TreeMap<>(String.CASE_INSENSITIVE_ORDER), Collectors.toList()));
+        result.putAll(findTableNameFromSQL(ownerColumns));
         Collection<String> columnNames = columns.stream().filter(each -> !each.getOwner().isPresent()).map(each -> each.getIdentifier().getValue()).collect(Collectors.toSet());
         result.putAll(findTableNameFromMetaData(columnNames, schema));
         return result;
@@ -124,18 +125,18 @@ public final class TablesContext {
         return Optional.empty();
     }
     
-    private Map<String, String> findTableNameFromSQL(final Map<String, String> ownerColumnNames) {
-        if (ownerColumnNames.isEmpty()) {
+    private Map<String, String> findTableNameFromSQL(final Map<String, List<ColumnSegment>> ownerColumns) {
+        if (ownerColumns.isEmpty()) {
             return Collections.emptyMap();
         }
-        Map<String, String> result = new HashMap<>(ownerColumnNames.size(), 1);
+        Map<String, String> result = new HashMap<>();
         for (String each : uniqueTables.keySet()) {
-            if (ownerColumnNames.containsKey(each)) {
-                result.put(ownerColumnNames.get(each), each);
+            if (ownerColumns.containsKey(each)) {
+                ownerColumns.get(each).stream().map(ColumnSegment::getQualifiedName).forEach(column -> result.put(column, each));
             }
             Optional<String> alias = uniqueTables.get(each).getAlias();
-            if (alias.isPresent() && ownerColumnNames.containsKey(alias.get())) {
-                result.put(ownerColumnNames.get(alias.get()), each);
+            if (alias.isPresent() && ownerColumns.containsKey(alias.get())) {
+                ownerColumns.get(alias.get()).stream().map(ColumnSegment::getQualifiedName).forEach(column -> result.put(column, each));
             }
         }
         return result;
diff --git a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/FederateJDBCExecutor.java b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/FederateJDBCExecutor.java
index 58c1ae2..eeae82d 100644
--- a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/FederateJDBCExecutor.java
+++ b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/FederateJDBCExecutor.java
@@ -125,7 +125,7 @@ public final class FederateJDBCExecutor implements FederateExecutor {
     
     private void addSchema(final CalciteConnection calciteConnection, final ExecutionContext executionContext, final JDBCExecutorCallback<? extends ExecuteResult> callback, 
                            final DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine) throws SQLException {
-        FederateRowExecutor executor = new FederateRowExecutor(props, jdbcExecutor, executionContext, callback, prepareEngine);
+        FederateRowExecutor executor = new FederateRowExecutor(props, jdbcExecutor, executionContext, callback, prepareEngine, factory.getDatabaseType().getQuoteCharacter());
         FederateLogicSchema logicSchema = new FederateLogicSchema(factory.getSchemaMetadatas().getSchemaMetadataBySchemaName(schema), executor);
         calciteConnection.getRootSchema().add(schema, logicSchema);
         calciteConnection.setSchema(schema);
diff --git a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/row/FederateRowExecutor.java b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/row/FederateRowExecutor.java
index b6d96a6..10fb346 100644
--- a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/row/FederateRowExecutor.java
+++ b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/row/FederateRowExecutor.java
@@ -34,6 +34,7 @@ import org.apache.shardingsphere.infra.executor.sql.federate.schema.table.genera
 import org.apache.shardingsphere.infra.executor.sql.prepare.driver.DriverExecutionPrepareEngine;
 import org.apache.shardingsphere.infra.executor.sql.process.ExecuteProcessEngine;
 import org.apache.shardingsphere.infra.optimize.core.metadata.FederateTableMetadata;
+import org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter;
 
 import java.sql.Connection;
 import java.sql.SQLException;
@@ -57,6 +58,8 @@ public final class FederateRowExecutor {
     
     private final DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine;
     
+    private final QuoteCharacter quoteCharacter;
+    
     /**
      * Execute.
      *
@@ -68,7 +71,7 @@ public final class FederateRowExecutor {
      */
     public Collection<QueryResult> execute(final FederateTableMetadata metadata, final DataContext root, final List<RexNode> filters, final int[] projects) {
         FederateExecutionContextGenerator generator = new FederateExecutionContextGenerator(metadata.getName(), routeExecutionContext, 
-                new FederateExecutionSQLGenerator(root, filters, projects, metadata.getColumnNames()));
+                new FederateExecutionSQLGenerator(root, filters, projects, metadata.getColumnNames(), quoteCharacter));
         return execute(generator.generate());
     }
     
diff --git a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/generator/FederateExecutionContextGenerator.java b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/generator/FederateExecutionContextGenerator.java
index 1123188..d5e93e9 100644
--- a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/generator/FederateExecutionContextGenerator.java
+++ b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/generator/FederateExecutionContextGenerator.java
@@ -49,18 +49,18 @@ public final class FederateExecutionContextGenerator {
     public ExecutionContext generate() {
         RouteContext routeContext = getRouteContext(routeExecutionContext.getRouteContext());
         return new ExecutionContext(routeExecutionContext.getLogicSQL(),
-                getExecutionUnits(routeContext.getRouteUnits(), generator), routeContext);
+                getExecutionUnits(routeContext.getRouteUnits()), routeContext);
     }
     
-    private Collection<ExecutionUnit> getExecutionUnits(final Collection<RouteUnit> routeUnits, final FederateExecutionSQLGenerator generator) {
+    private Collection<ExecutionUnit> getExecutionUnits(final Collection<RouteUnit> routeUnits) {
         Collection<ExecutionUnit> result = new LinkedHashSet<>();
         for (RouteUnit each: routeUnits) {
-            fillExecutionUnits(result, generator, each);
+            fillExecutionUnits(result, each);
         }
         return result;
     }
     
-    private void fillExecutionUnits(final Collection<ExecutionUnit> executionUnits, final FederateExecutionSQLGenerator generator, final RouteUnit routeUnit) {
+    private void fillExecutionUnits(final Collection<ExecutionUnit> executionUnits, final RouteUnit routeUnit) {
         for (RouteMapper mapper : routeUnit.getTableMappers()) {
             if (mapper.getLogicName().equalsIgnoreCase(table)) {
                 executionUnits.add(new ExecutionUnit(routeUnit.getDataSourceMapper().getActualName(),
diff --git a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/generator/FederateExecutionSQLGenerator.java b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/generator/FederateExecutionSQLGenerator.java
index 9364dcc..7e42717 100644
--- a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/generator/FederateExecutionSQLGenerator.java
+++ b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/generator/FederateExecutionSQLGenerator.java
@@ -17,10 +17,10 @@
 
 package org.apache.shardingsphere.infra.executor.sql.federate.schema.table.generator;
 
-import com.google.common.base.Joiner;
 import lombok.RequiredArgsConstructor;
 import org.apache.calcite.DataContext;
 import org.apache.calcite.rex.RexNode;
+import org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter;
 
 import java.util.Arrays;
 import java.util.Collection;
@@ -41,6 +41,8 @@ public final class FederateExecutionSQLGenerator {
     
     private final List<String> columnNames;
     
+    private final QuoteCharacter quoteCharacter;
+    
     /**
      * Generate sql.
      *
@@ -49,7 +51,11 @@ public final class FederateExecutionSQLGenerator {
      */
     public String generate(final String table) {
         // TODO generate sql with filters
+        return String.format("SELECT %s FROM %s", getQuotedColumnNames(), quoteCharacter.wrap(table));
+    }
+    
+    private String getQuotedColumnNames() {
         Collection<String> actualColumnNames = null == projects ? columnNames : Arrays.stream(projects).mapToObj(columnNames::get).collect(Collectors.toList());
-        return String.format("SELECT %s FROM %s", Joiner.on(", ").join(actualColumnNames), table);
+        return actualColumnNames.stream().map(quoteCharacter::wrap).collect(Collectors.joining(", "));
     }
 }
diff --git a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/context/OptimizeContextFactory.java b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/context/OptimizeContextFactory.java
index f9722cb..d32001a 100644
--- a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/context/OptimizeContextFactory.java
+++ b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/context/OptimizeContextFactory.java
@@ -71,6 +71,7 @@ public final class OptimizeContextFactory {
     
     private static final String FUN_CAMEL_NAME = CalciteConnectionProperty.FUN.camelName();
     
+    @Getter
     private final DatabaseType databaseType;
     
     @Getter
diff --git a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/FederateSchemaMetadata.java b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/FederateSchemaMetadata.java
index 0b04198..873c825 100644
--- a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/FederateSchemaMetadata.java
+++ b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/FederateSchemaMetadata.java
@@ -46,12 +46,11 @@ public final class FederateSchemaMetadata {
     /**
      * Renew.
      * 
-     * @param tableName table name
      * @param metaData meta data
      */
     @Synchronized
-    public void renew(final String tableName, final TableMetaData metaData) {
-        tables.put(tableName.toLowerCase(), new FederateTableMetadata(tableName, metaData));
+    public void renew(final TableMetaData metaData) {
+        tables.put(metaData.getName().toLowerCase(), new FederateTableMetadata(metaData.getName(), metaData));
     }
     
     /**
diff --git a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/refresher/type/AlterTableStatementFederateRefresher.java b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/refresher/type/AlterTableStatementFederateRefresher.java
index c258a59..e65747f 100644
--- a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/refresher/type/AlterTableStatementFederateRefresher.java
+++ b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/refresher/type/AlterTableStatementFederateRefresher.java
@@ -40,10 +40,10 @@ public final class AlterTableStatementFederateRefresher implements FederateRefre
         String tableName = sqlStatement.getTable().getTableName().getIdentifier().getValue();
         if (sqlStatement.getRenameTable().isPresent()) {
             String renameTableName = sqlStatement.getRenameTable().get().getTableName().getIdentifier().getValue();
-            buildTableMetaData(materials, renameTableName).ifPresent(optional -> schema.renew(renameTableName, optional));
+            buildTableMetaData(materials, renameTableName).ifPresent(schema::renew);
             schema.remove(tableName);
         } else {
-            buildTableMetaData(materials, tableName).ifPresent(optional -> schema.renew(tableName, optional));
+            buildTableMetaData(materials, tableName).ifPresent(schema::renew);
         }
     }
     
diff --git a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/refresher/type/CreateTableStatementFederateRefresher.java b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/refresher/type/CreateTableStatementFederateRefresher.java
index 926eed5..0162bb5 100644
--- a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/refresher/type/CreateTableStatementFederateRefresher.java
+++ b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/refresher/type/CreateTableStatementFederateRefresher.java
@@ -37,6 +37,6 @@ public final class CreateTableStatementFederateRefresher implements FederateRefr
     public void refresh(final FederateSchemaMetadata schema, final Collection<String> logicDataSourceNames,
                         final CreateTableStatement sqlStatement, final SchemaBuilderMaterials materials) throws SQLException {
         String tableName = sqlStatement.getTable().getTableName().getIdentifier().getValue();
-        Optional.ofNullable(TableMetaDataBuilder.load(Collections.singletonList(tableName), materials).get(tableName)).ifPresent(optional -> schema.renew(tableName, optional));
+        Optional.ofNullable(TableMetaDataBuilder.load(Collections.singletonList(tableName), materials).get(tableName)).ifPresent(schema::renew);
     }
 }