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);
}
}