This is an automated email from the ASF dual-hosted git repository.
jianglongtao 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 5d13926 Add FilterableTableScanContext (#12662)
5d13926 is described below
commit 5d139268b1c916292bb3175e05f6d2205cee14ce
Author: Liang Zhang <[email protected]>
AuthorDate: Thu Sep 23 22:10:56 2021 +0800
Add FilterableTableScanContext (#12662)
* Fix javadoc
* Refactor FederateExecutionContextGenerator
* Rename FederationSQLGenerator
* Refactor FederationSQLGenerator
* For javadoc
* Refactor FederateExecutionContextGenerator
* Refactor FederateExecutionContextGenerator
* Add RelNodeScanContext
* Refactor FederateExecutionContextGenerator
* Refactor FederationSQLGenerator
* Rename FederationRowEnumerator
* For code style
* Adjust param order
* For javadoc
* For javadoc
* Rename FilterableTableScanContext
---
.../sql/federate/execute/FederationExecutor.java | 12 ++---
.../FilterableTableScanContext.java} | 32 ++---------
.../customized/CustomizedFederationExecutor.java | 4 +-
.../original/OriginalFederationExecutor.java | 24 ++++-----
.../federate/schema/row/FederateRowExecutor.java | 38 ++++++-------
...numerator.java => FederationRowEnumerator.java} | 7 ++-
.../schema/table/AbstractFederationTable.java | 2 +-
.../schema/table/FederationFilterableTable.java | 8 ++-
.../FederateExecutionContextGenerator.java | 44 ++++++++-------
.../table/generator/FederationSQLGenerator.java | 63 ++++++++++++++++++++++
.../statement/ShardingSpherePreparedStatement.java | 2 +-
.../core/statement/ShardingSphereStatement.java | 2 +-
.../statement/FederatePrepareStatementTest.java | 7 ++-
.../backend/communication/ProxySQLExecutor.java | 2 +-
14 files changed, 146 insertions(+), 101 deletions(-)
diff --git
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/FederationExecutor.java
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/FederationExecutor.java
index fd0d030..053efd5 100644
---
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/FederationExecutor.java
+++
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/FederationExecutor.java
@@ -37,20 +37,20 @@ public interface FederationExecutor {
/**
* Execute query.
*
- * @param executionContext execution context
- * @param callback callback
* @param prepareEngine prepare engine
- * @return execute result
+ * @param callback callback
+ * @param executionContext execution context
+ * @return query results
* @throws SQLException SQL exception
*/
- List<QueryResult> executeQuery(ExecutionContext executionContext,
JDBCExecutorCallback<? extends ExecuteResult> callback,
-
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine)
throws SQLException;
+ List<QueryResult>
executeQuery(DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection>
prepareEngine,
+ JDBCExecutorCallback<? extends
ExecuteResult> callback, ExecutionContext executionContext) throws SQLException;
/**
* Get result set.
*
* @return result set
- * @throws SQLException sql exception
+ * @throws SQLException SQL exception
*/
ResultSet getResultSet() throws SQLException;
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/execute/FilterableTableScanContext.java
similarity index 51%
rename from
shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/generator/FederateExecutionSQLGenerator.java
rename to
shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/FilterableTableScanContext.java
index 7e42717..3fea691 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/execute/FilterableTableScanContext.java
@@ -15,47 +15,25 @@
* limitations under the License.
*/
-package
org.apache.shardingsphere.infra.executor.sql.federate.schema.table.generator;
+package org.apache.shardingsphere.infra.executor.sql.federate.execute;
+import lombok.Getter;
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;
import java.util.List;
-import java.util.stream.Collectors;
/**
- * Federate execution sql generator.
+ * Filterable table scan context.
*/
@RequiredArgsConstructor
-public final class FederateExecutionSQLGenerator {
+@Getter
+public final class FilterableTableScanContext {
private final DataContext root;
private final List<RexNode> filters;
private final int[] projects;
-
- private final List<String> columnNames;
-
- private final QuoteCharacter quoteCharacter;
-
- /**
- * Generate sql.
- *
- * @param table table
- * @return sql
- */
- 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
actualColumnNames.stream().map(quoteCharacter::wrap).collect(Collectors.joining(",
"));
- }
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/customized/CustomizedFederationExecutor.java
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/customized/CustomizedFederationExecutor.java
index a1954c3..6dd5753 100644
---
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/customized/CustomizedFederationExecutor.java
+++
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/customized/CustomizedFederationExecutor.java
@@ -51,8 +51,8 @@ public final class CustomizedFederationExecutor implements
FederationExecutor {
}
@Override
- public List<QueryResult> executeQuery(final ExecutionContext
executionContext, final JDBCExecutorCallback<? extends ExecuteResult> callback,
- final
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine)
throws SQLException {
+ public List<QueryResult> executeQuery(final
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine,
+ final JDBCExecutorCallback<? extends
ExecuteResult> callback, final ExecutionContext executionContext) throws
SQLException {
// TODO
return Collections.emptyList();
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/original/OriginalFederationExecutor.java
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/original/OriginalFederationExecutor.java
index d1712c4..9c05e18 100644
---
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/original/OriginalFederationExecutor.java
+++
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/original/OriginalFederationExecutor.java
@@ -73,31 +73,31 @@ public final class OriginalFederationExecutor implements
FederationExecutor {
}
@Override
- public List<QueryResult> executeQuery(final ExecutionContext
executionContext, final JDBCExecutorCallback<? extends ExecuteResult> callback,
- final
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine)
throws SQLException {
- ResultSet resultSet = execute(executionContext, callback,
prepareEngine);
+ public List<QueryResult> executeQuery(final
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine,
+ final JDBCExecutorCallback<? extends
ExecuteResult> callback, final ExecutionContext executionContext) throws
SQLException {
+ ResultSet resultSet = execute(prepareEngine, callback,
executionContext);
return Collections.singletonList(new JDBCStreamQueryResult(resultSet));
}
- private ResultSet execute(final ExecutionContext executionContext, final
JDBCExecutorCallback<? extends ExecuteResult> callback,
- final
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine)
throws SQLException {
+ private ResultSet execute(final
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine,
+ final JDBCExecutorCallback<? extends
ExecuteResult> callback, final ExecutionContext executionContext) throws
SQLException {
SQLUnit sqlUnit =
executionContext.getExecutionUnits().iterator().next().getSqlUnit();
- PreparedStatement preparedStatement =
createConnection(executionContext, callback,
prepareEngine).prepareStatement(SQLUtil.trimSemicolon(sqlUnit.getSql()));
+ PreparedStatement preparedStatement = createConnection(prepareEngine,
callback,
executionContext).prepareStatement(SQLUtil.trimSemicolon(sqlUnit.getSql()));
setParameters(preparedStatement, sqlUnit.getParameters());
this.statement = preparedStatement;
return preparedStatement.executeQuery();
}
- private Connection createConnection(final ExecutionContext
executionContext, final JDBCExecutorCallback<? extends ExecuteResult> callback,
- final
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine)
throws SQLException {
+ private Connection createConnection(final
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine,
+ final JDBCExecutorCallback<? extends
ExecuteResult> callback, final ExecutionContext executionContext) throws
SQLException {
Connection result = DriverManager.getConnection(CONNECTION_URL,
optimizerContext.getProps());
- addSchema(result.unwrap(CalciteConnection.class), executionContext,
callback, prepareEngine);
+ addSchema(result.unwrap(CalciteConnection.class), prepareEngine,
callback, executionContext);
return result;
}
- private void addSchema(final CalciteConnection connection, final
ExecutionContext executionContext, final JDBCExecutorCallback<? extends
ExecuteResult> callback,
- final
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine)
throws SQLException {
- FederateRowExecutor executor = new FederateRowExecutor(jdbcExecutor,
executionContext, callback, prepareEngine, props,
optimizerContext.getDatabaseType().getQuoteCharacter());
+ private void addSchema(final CalciteConnection connection, final
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine,
+ final JDBCExecutorCallback<? extends ExecuteResult>
callback, final ExecutionContext executionContext) throws SQLException {
+ FederateRowExecutor executor = new FederateRowExecutor(prepareEngine,
jdbcExecutor, callback, props, executionContext,
optimizerContext.getDatabaseType().getQuoteCharacter());
FederateLogicSchema logicSchema = new
FederateLogicSchema(optimizerContext.getMetaData().getSchemas().get(schema),
executor);
connection.getRootSchema().add(schema, logicSchema);
connection.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 ee3b932..dd15dbc 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
@@ -17,9 +17,6 @@
package org.apache.shardingsphere.infra.executor.sql.federate.schema.row;
-import lombok.RequiredArgsConstructor;
-import org.apache.calcite.DataContext;
-import org.apache.calcite.rex.RexNode;
import
org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
import org.apache.shardingsphere.infra.exception.ShardingSphereException;
import
org.apache.shardingsphere.infra.executor.kernel.model.ExecutionGroupContext;
@@ -29,8 +26,8 @@ import
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.J
import
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutorCallback;
import
org.apache.shardingsphere.infra.executor.sql.execute.result.ExecuteResult;
import
org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResult;
+import
org.apache.shardingsphere.infra.executor.sql.federate.execute.FilterableTableScanContext;
import
org.apache.shardingsphere.infra.executor.sql.federate.schema.table.generator.FederateExecutionContextGenerator;
-import
org.apache.shardingsphere.infra.executor.sql.federate.schema.table.generator.FederateExecutionSQLGenerator;
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.FederationTableMetaData;
@@ -39,43 +36,42 @@ import
org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Collection;
-import java.util.List;
import java.util.stream.Collectors;
/**
* Federate row executor.
*/
-@RequiredArgsConstructor
public final class FederateRowExecutor {
- private final JDBCExecutor jdbcExecutor;
+ private final DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection>
prepareEngine;
- private final ExecutionContext routeExecutionContext;
+ private final JDBCExecutor jdbcExecutor;
private final JDBCExecutorCallback<? extends ExecuteResult> callback;
- private final DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection>
prepareEngine;
-
private final ConfigurationProperties props;
- private final QuoteCharacter quoteCharacter;
+ private final FederateExecutionContextGenerator executionContextGenerator;
+
+ public FederateRowExecutor(final
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine,
+ final JDBCExecutor jdbcExecutor, final
JDBCExecutorCallback<? extends ExecuteResult> callback,
+ final ConfigurationProperties props, final
ExecutionContext routeExecutionContext, final QuoteCharacter quoteCharacter) {
+ this.jdbcExecutor = jdbcExecutor;
+ this.callback = callback;
+ this.prepareEngine = prepareEngine;
+ this.props = props;
+ executionContextGenerator = new
FederateExecutionContextGenerator(routeExecutionContext, quoteCharacter);
+ }
/**
* Execute.
*
* @param tableMetaData federation table meta data
- * @param root root
- * @param filters filters
- * @param projects projects
+ * @param scanContext rel node scan context
* @return query results
*/
- public Collection<QueryResult> execute(final FederationTableMetaData
tableMetaData, final DataContext root, final List<RexNode> filters, final int[]
projects) {
- FederateExecutionContextGenerator generator = new
FederateExecutionContextGenerator(tableMetaData.getName(),
- routeExecutionContext, new FederateExecutionSQLGenerator(root,
filters, projects, tableMetaData.getColumnNames(), quoteCharacter));
- return execute(generator.generate());
- }
-
- private Collection<QueryResult> execute(final ExecutionContext context) {
+ public Collection<QueryResult> execute(final FederationTableMetaData
tableMetaData, final FilterableTableScanContext scanContext) {
+ ExecutionContext context =
executionContextGenerator.generate(tableMetaData, scanContext);
try {
ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext =
prepareEngine.prepare(context.getRouteContext(), context.getExecutionUnits());
ExecuteProcessEngine.initialize(context.getLogicSQL(),
executionGroupContext, props);
diff --git
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/row/FederateRowEnumerator.java
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/row/FederationRowEnumerator.java
similarity index 93%
rename from
shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/row/FederateRowEnumerator.java
rename to
shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/row/FederationRowEnumerator.java
index 20ef504..e544604 100644
---
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/row/FederateRowEnumerator.java
+++
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/row/FederationRowEnumerator.java
@@ -27,10 +27,9 @@ import java.util.Iterator;
import java.util.LinkedList;
/**
- * Federate row enumerator.
- *
+ * Federation row enumerator.
*/
-public final class FederateRowEnumerator implements Enumerator<Object[]> {
+public final class FederationRowEnumerator implements Enumerator<Object[]> {
private final Collection<QueryResult> queryResults = new LinkedList<>();
@@ -40,7 +39,7 @@ public final class FederateRowEnumerator implements
Enumerator<Object[]> {
private Object[] currentRow;
- public FederateRowEnumerator(final Collection<QueryResult> queryResults) {
+ public FederationRowEnumerator(final Collection<QueryResult> queryResults)
{
this.queryResults.addAll(queryResults);
iterator = this.queryResults.iterator();
currentResultSet = iterator.next();
diff --git
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/AbstractFederationTable.java
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/AbstractFederationTable.java
index 44fcade..db11b86 100644
---
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/AbstractFederationTable.java
+++
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/AbstractFederationTable.java
@@ -27,7 +27,7 @@ import
org.apache.shardingsphere.infra.executor.sql.federate.schema.row.Federate
import
org.apache.shardingsphere.infra.optimize.core.metadata.FederationTableMetaData;
/**
- * Abstract Federation table.
+ * Abstract federation table.
*/
@RequiredArgsConstructor
@Getter(AccessLevel.PROTECTED)
diff --git
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/FederationFilterableTable.java
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/FederationFilterableTable.java
index b09b29b..315e280 100644
---
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/FederationFilterableTable.java
+++
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/FederationFilterableTable.java
@@ -23,10 +23,13 @@ import org.apache.calcite.linq4j.Enumerable;
import org.apache.calcite.linq4j.Enumerator;
import org.apache.calcite.rex.RexNode;
import org.apache.calcite.schema.ProjectableFilterableTable;
-import
org.apache.shardingsphere.infra.executor.sql.federate.schema.row.FederateRowEnumerator;
+import
org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResult;
+import
org.apache.shardingsphere.infra.executor.sql.federate.execute.FilterableTableScanContext;
import
org.apache.shardingsphere.infra.executor.sql.federate.schema.row.FederateRowExecutor;
+import
org.apache.shardingsphere.infra.executor.sql.federate.schema.row.FederationRowEnumerator;
import
org.apache.shardingsphere.infra.optimize.core.metadata.FederationTableMetaData;
+import java.util.Collection;
import java.util.List;
/**
@@ -40,11 +43,12 @@ public final class FederationFilterableTable extends
AbstractFederationTable imp
@Override
public Enumerable<Object[]> scan(final DataContext root, final
List<RexNode> filters, final int[] projects) {
+ Collection<QueryResult> queryResults =
getExecutor().execute(getMetaData(), new FilterableTableScanContext(root,
filters, projects));
return new AbstractEnumerable<Object[]>() {
@Override
public Enumerator<Object[]> enumerator() {
- return new
FederateRowEnumerator(getExecutor().execute(getMetaData(), root, filters,
projects));
+ return new FederationRowEnumerator(queryResults);
}
};
}
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 4bb9526..3b23847 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
@@ -21,50 +21,56 @@ 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.executor.sql.federate.execute.FilterableTableScanContext;
+import
org.apache.shardingsphere.infra.optimize.core.metadata.FederationTableMetaData;
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 org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashSet;
+import java.util.stream.Collectors;
/**
- * Federate table execution context generator.
+ * Federate execution context generator.
*/
@RequiredArgsConstructor
public final class FederateExecutionContextGenerator {
- private final String tableName;
-
private final ExecutionContext routeExecutionContext;
- private final FederateExecutionSQLGenerator generator;
+ private final QuoteCharacter quoteCharacter;
/**
- * Create execution context.
- *
- * @return execution context
+ * Generate execution context.
+ *
+ * @param tableMetaData table meta data
+ * @param scanContext filterable table scan context
+ * @return generated execution context
*/
- public ExecutionContext generate() {
- RouteContext filteredRouteContext = new
RouteContextFilter().filter(tableName, routeExecutionContext.getRouteContext());
- return new ExecutionContext(routeExecutionContext.getLogicSQL(),
getExecutionUnits(filteredRouteContext.getRouteUnits()), filteredRouteContext);
+ public ExecutionContext generate(final FederationTableMetaData
tableMetaData, final FilterableTableScanContext scanContext) {
+ RouteContext filteredRouteContext = new
RouteContextFilter().filter(tableMetaData.getName(),
routeExecutionContext.getRouteContext());
+ return new ExecutionContext(routeExecutionContext.getLogicSQL(),
generate(filteredRouteContext.getRouteUnits(), tableMetaData, scanContext,
quoteCharacter), filteredRouteContext);
}
- private Collection<ExecutionUnit> getExecutionUnits(final
Collection<RouteUnit> routeUnits) {
+ private Collection<ExecutionUnit> generate(final Collection<RouteUnit>
routeUnits,
+ final FederationTableMetaData
tableMetaData, final FilterableTableScanContext scanContext, final
QuoteCharacter quoteCharacter) {
Collection<ExecutionUnit> result = new LinkedHashSet<>();
+ FederationSQLGenerator sqlGenerator = new
FederationSQLGenerator(tableMetaData, scanContext, quoteCharacter);
for (RouteUnit each: routeUnits) {
- fillExecutionUnits(result, each);
+ result.addAll(generate(each, sqlGenerator));
}
return result;
}
- private void fillExecutionUnits(final Collection<ExecutionUnit>
executionUnits, final RouteUnit routeUnit) {
- for (RouteMapper each : routeUnit.getTableMappers()) {
- if (each.getLogicName().equalsIgnoreCase(tableName)) {
- executionUnits.add(new
ExecutionUnit(routeUnit.getDataSourceMapper().getActualName(),
- new SQLUnit(generator.generate(each.getActualName()),
Collections.emptyList(), Collections.singletonList(each))));
- }
- }
+ private Collection<ExecutionUnit> generate(final RouteUnit routeUnit,
final FederationSQLGenerator sqlGenerator) {
+ return routeUnit.getTableMappers().stream().map(each ->
generate(routeUnit, each, sqlGenerator)).collect(Collectors.toList());
+ }
+
+ private ExecutionUnit generate(final RouteUnit routeUnit, final
RouteMapper tableMapper, final FederationSQLGenerator sqlGenerator) {
+ String sql = sqlGenerator.generate(tableMapper.getActualName());
+ return new
ExecutionUnit(routeUnit.getDataSourceMapper().getActualName(), new SQLUnit(sql,
Collections.emptyList(), Collections.singletonList(tableMapper)));
}
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/generator/FederationSQLGenerator.java
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/generator/FederationSQLGenerator.java
new file mode 100644
index 0000000..af5feac
--- /dev/null
+++
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/generator/FederationSQLGenerator.java
@@ -0,0 +1,63 @@
+/*
+ * 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.executor.sql.federate.schema.table.generator;
+
+import lombok.RequiredArgsConstructor;
+import
org.apache.shardingsphere.infra.executor.sql.federate.execute.FilterableTableScanContext;
+import
org.apache.shardingsphere.infra.optimize.core.metadata.FederationTableMetaData;
+import org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.stream.Collectors;
+
+/**
+ * Federation SQL generator.
+ */
+@RequiredArgsConstructor
+public final class FederationSQLGenerator {
+
+ private final FederationTableMetaData tableMetaData;
+
+ private final FilterableTableScanContext scanContext;
+
+ private final QuoteCharacter quoteCharacter;
+
+ /**
+ * Generate SQL.
+ *
+ * @param actualTableName actual table name
+ * @return generated SQL
+ */
+ public String generate(final String actualTableName) {
+ String projections = getQuotedProjections(tableMetaData, scanContext,
quoteCharacter);
+ String table = getQuotedTable(actualTableName, quoteCharacter);
+ // TODO generate SQL with filters
+ return String.format("SELECT %s FROM %s", projections, table);
+ }
+
+ private String getQuotedProjections(final FederationTableMetaData
tableMetaData, final FilterableTableScanContext scanContext, final
QuoteCharacter quoteCharacter) {
+ Collection<String> actualColumnNames = null ==
scanContext.getProjects()
+ ? tableMetaData.getColumnNames() :
Arrays.stream(scanContext.getProjects()).mapToObj(tableMetaData.getColumnNames()::get).collect(Collectors.toList());
+ return
actualColumnNames.stream().map(quoteCharacter::wrap).collect(Collectors.joining(",
"));
+ }
+
+ private String getQuotedTable(final String actualTableName, final
QuoteCharacter quoteCharacter) {
+ return quoteCharacter.wrap(actualTableName);
+ }
+}
diff --git
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
index fc9fac5..c468d86 100644
---
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
+++
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
@@ -229,7 +229,7 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
}
PreparedStatementExecuteQueryCallback callback = new
PreparedStatementExecuteQueryCallback(metaDataContexts.getMetaData(connection.getSchemaName()).getResource().getDatabaseType(),
sqlStatement,
SQLExecutorExceptionHandler.isExceptionThrown());
- return federationExecutor.executeQuery(executionContext, callback,
createDriverExecutionPrepareEngine());
+ return
federationExecutor.executeQuery(createDriverExecutionPrepareEngine(), callback,
executionContext);
}
private DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection>
createDriverExecutionPrepareEngine() {
diff --git
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
index f819c2b..d84e7a7 100644
---
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
+++
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
@@ -180,7 +180,7 @@ public final class ShardingSphereStatement extends
AbstractStatementAdapter {
}
StatementExecuteQueryCallback callback = new
StatementExecuteQueryCallback(metaDataContexts.getMetaData(connection.getSchemaName()).getResource().getDatabaseType(),
executionContext.getSqlStatementContext().getSqlStatement(),
SQLExecutorExceptionHandler.isExceptionThrown());
- return federationExecutor.executeQuery(executionContext, callback,
createDriverExecutionPrepareEngine());
+ return
federationExecutor.executeQuery(createDriverExecutionPrepareEngine(), callback,
executionContext);
}
private DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection>
createDriverExecutionPrepareEngine() {
diff --git
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/test/java/org/apache/shardingsphere/driver/jdbc/core/statement/FederatePrepareStatementTest.java
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/test/java/org/apache/shardingsphere/driver/jdbc/core/statement/FederatePrepareStatementTest.java
index 39e6689..aeaebf1 100644
---
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/test/java/org/apache/shardingsphere/driver/jdbc/core/statement/FederatePrepareStatementTest.java
+++
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/test/java/org/apache/shardingsphere/driver/jdbc/core/statement/FederatePrepareStatementTest.java
@@ -30,18 +30,18 @@ import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
public final class FederatePrepareStatementTest extends
AbstractShardingSphereDataSourceForFederateTest {
-
+
private static final String
SELECT_SQL_BY_ID_ACROSS_SINGLE_AND_SHARDING_TABLES_ALIAS =
"select o.*, i.* from t_order_federate o,
t_order_item_federate_sharding i "
+ "where o.order_id = i.item_id AND i.order_id = ?";
-
+
private static final String
SELECT_SQL_BY_ID_ACROSS_SINGLE_AND_SHARDING_TABLES_REWRITE =
"select t_order_federate.*, t_order_item_federate_sharding.* "
+ "from t_order_federate, t_order_item_federate_sharding "
+ "where t_order_federate.order_id =
t_order_item_federate_sharding.item_id "
+ "AND t_order_item_federate_sharding.remarks =
't_order_item_federate_sharding' "
+ "AND t_order_item_federate_sharding.user_id = ?";
-
+
@Test
public void
assertQueryWithFederateInSingleAndShardingTableWithAliasByExecuteQuery() throws
SQLException {
assertQueryWithFederateInSingleAndShardingTableWithAlias(true);
@@ -101,5 +101,4 @@ public final class FederatePrepareStatementTest extends
AbstractShardingSphereDa
assertThat(resultSet1.getInt(5), is(10000));
assertFalse(resultSet1.next());
}
-
}
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/ProxySQLExecutor.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/ProxySQLExecutor.java
index e5ca404..e738321 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/ProxySQLExecutor.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/ProxySQLExecutor.java
@@ -159,7 +159,7 @@ public final class ProxySQLExecutor {
executionContext.getSqlStatementContext().getSqlStatement(),
databaseCommunicationEngine, isReturnGeneratedKeys, isExceptionThrown, true);
backendConnection.setFederationExecutor(federationExecutor);
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection>
prepareEngine = createDriverExecutionPrepareEngine(isReturnGeneratedKeys,
metaData);
- return federationExecutor.executeQuery(executionContext, callback,
prepareEngine).stream().map(each -> (ExecuteResult)
each).collect(Collectors.toList());
+ return federationExecutor.executeQuery(prepareEngine, callback,
executionContext).stream().map(each -> (ExecuteResult)
each).collect(Collectors.toList());
}
private DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection>
createDriverExecutionPrepareEngine(final boolean isReturnGeneratedKeys, final
MetaDataContexts metaData) {