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 <[email protected]>
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);
}
}