This is an automated email from the ASF dual-hosted git repository.
sunnianjun 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 7dda3775394 Reduce SQLFederationDeciderContext usage scope (#25504)
7dda3775394 is described below
commit 7dda3775394ea47925c3dd36dce02b480ee8dc33
Author: Liang Zhang <[email protected]>
AuthorDate: Sun May 7 13:36:56 2023 +0800
Reduce SQLFederationDeciderContext usage scope (#25504)
---
.../binder/decider/SQLFederationDecideEngine.java | 23 +++++++++----------
.../engine/SQLFederationDecideEngineTest.java | 19 +++++-----------
.../statement/ShardingSpherePreparedStatement.java | 26 ++++++++++------------
.../core/statement/ShardingSphereStatement.java | 24 +++++++++-----------
.../single/decider/SingleSQLFederationDecider.java | 8 +++----
.../proxy/backend/connector/DatabaseConnector.java | 8 +++----
.../handler/distsql/rul/sql/PreviewHandler.java | 15 ++++++++-----
7 files changed, 56 insertions(+), 67 deletions(-)
diff --git
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/decider/SQLFederationDecideEngine.java
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/decider/SQLFederationDecideEngine.java
index 7f954b7da1d..f5e498e1280 100644
---
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/decider/SQLFederationDecideEngine.java
+++
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/decider/SQLFederationDecideEngine.java
@@ -48,33 +48,32 @@ public final class SQLFederationDecideEngine {
}
/**
- * Decide.
+ * Decide use SQL federation or not.
*
* @param sqlStatementContext SQL statement context
* @param parameters SQL parameters
- * @param globalRuleMetaData global rule meta data
* @param database ShardingSphere database
- * @return SQL federation decider context
+ * @param globalRuleMetaData global rule meta data
+ * @return use SQL federation or not
*/
@SuppressWarnings({"unchecked", "rawtypes"})
- public SQLFederationDeciderContext decide(final SQLStatementContext<?>
sqlStatementContext,
- final List<Object> parameters,
final ShardingSphereRuleMetaData globalRuleMetaData, final
ShardingSphereDatabase database) {
- SQLFederationDeciderContext result = new SQLFederationDeciderContext();
+ public boolean decide(final SQLStatementContext<?> sqlStatementContext,
final List<Object> parameters,
+ final ShardingSphereDatabase database, final
ShardingSphereRuleMetaData globalRuleMetaData) {
// TODO BEGIN: move this logic to SQLFederationDecider implement class
when we remove sql federation type
if (isQuerySystemSchema(sqlStatementContext, database)) {
- result.setUseSQLFederation(true);
- return result;
+ return true;
}
// TODO END
if (isFederationDisabled || !(sqlStatementContext instanceof
SelectStatementContext)) {
- return result;
+ return false;
}
+ SQLFederationDeciderContext context = new
SQLFederationDeciderContext();
for (Entry<ShardingSphereRule, SQLFederationDecider> entry :
deciders.entrySet()) {
- if (!result.isUseSQLFederation()) {
- entry.getValue().decide(result, (SelectStatementContext)
sqlStatementContext, parameters, globalRuleMetaData, database, entry.getKey());
+ if (!context.isUseSQLFederation()) {
+ entry.getValue().decide(context, (SelectStatementContext)
sqlStatementContext, parameters, globalRuleMetaData, database, entry.getKey());
}
}
- return result;
+ return context.isUseSQLFederation();
}
private boolean isQuerySystemSchema(final SQLStatementContext<?>
sqlStatementContext, final ShardingSphereDatabase database) {
diff --git
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/decider/engine/SQLFederationDecideEngineTest.java
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/decider/engine/SQLFederationDecideEngineTest.java
index 5a0ff9cdd0a..99117c6550d 100644
---
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/decider/engine/SQLFederationDecideEngineTest.java
+++
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/decider/engine/SQLFederationDecideEngineTest.java
@@ -18,7 +18,6 @@
package org.apache.shardingsphere.infra.binder.decider.engine;
import
org.apache.shardingsphere.infra.binder.decider.SQLFederationDecideEngine;
-import
org.apache.shardingsphere.infra.binder.decider.SQLFederationDeciderContext;
import
org.apache.shardingsphere.infra.binder.decider.fixture.rule.SQLFederationDeciderRuleMatchFixture;
import
org.apache.shardingsphere.infra.binder.decider.fixture.rule.SQLFederationDeciderRuleNotMatchFixture;
import
org.apache.shardingsphere.infra.binder.statement.CommonSQLStatementContext;
@@ -57,8 +56,7 @@ class SQLFederationDecideEngineTest {
when(sqlStatementContext.getTablesContext().getSchemaNames()).thenReturn(Collections.singletonList("information_schema"));
ShardingSphereDatabase database = new
ShardingSphereDatabase(DefaultDatabase.LOGIC_NAME,
mock(DatabaseType.class),
mock(ShardingSphereResourceMetaData.class, RETURNS_DEEP_STUBS),
mock(ShardingSphereRuleMetaData.class), Collections.emptyMap());
- SQLFederationDeciderContext actual =
engine.decide(sqlStatementContext, Collections.emptyList(),
mock(ShardingSphereRuleMetaData.class), database);
- assertTrue(actual.isUseSQLFederation());
+ assertTrue(engine.decide(sqlStatementContext, Collections.emptyList(),
database, mock(ShardingSphereRuleMetaData.class)));
}
@Test
@@ -67,8 +65,7 @@ class SQLFederationDecideEngineTest {
SQLFederationDecideEngine engine = new
SQLFederationDecideEngine(rules, new ConfigurationProperties(new Properties()));
ShardingSphereDatabase database = new
ShardingSphereDatabase(DefaultDatabase.LOGIC_NAME,
mock(DatabaseType.class),
mock(ShardingSphereResourceMetaData.class, RETURNS_DEEP_STUBS), new
ShardingSphereRuleMetaData(rules), Collections.emptyMap());
- SQLFederationDeciderContext actual =
engine.decide(mock(CommonSQLStatementContext.class), Collections.emptyList(),
mock(ShardingSphereRuleMetaData.class), database);
- assertFalse(actual.isUseSQLFederation());
+ assertFalse(engine.decide(mock(CommonSQLStatementContext.class),
Collections.emptyList(), database, mock(ShardingSphereRuleMetaData.class)));
}
@Test
@@ -78,8 +75,7 @@ class SQLFederationDecideEngineTest {
new ConfigurationProperties(PropertiesBuilder.build(new
Property(ConfigurationPropertyKey.SQL_FEDERATION_TYPE.getKey(), "ORIGINAL"))));
ShardingSphereDatabase database = new
ShardingSphereDatabase(DefaultDatabase.LOGIC_NAME,
mock(DatabaseType.class),
mock(ShardingSphereResourceMetaData.class, RETURNS_DEEP_STUBS), new
ShardingSphereRuleMetaData(rules), Collections.emptyMap());
- SQLFederationDeciderContext actual =
engine.decide(mock(CommonSQLStatementContext.class), Collections.emptyList(),
mock(ShardingSphereRuleMetaData.class), database);
- assertFalse(actual.isUseSQLFederation());
+ assertFalse(engine.decide(mock(CommonSQLStatementContext.class),
Collections.emptyList(), database, mock(ShardingSphereRuleMetaData.class)));
}
@Test
@@ -89,8 +85,7 @@ class SQLFederationDecideEngineTest {
new ConfigurationProperties(PropertiesBuilder.build(new
Property(ConfigurationPropertyKey.SQL_FEDERATION_TYPE.getKey(), "ORIGINAL"))));
ShardingSphereDatabase database = new
ShardingSphereDatabase(DefaultDatabase.LOGIC_NAME,
mock(DatabaseType.class),
mock(ShardingSphereResourceMetaData.class, RETURNS_DEEP_STUBS), new
ShardingSphereRuleMetaData(rules), Collections.emptyMap());
- SQLFederationDeciderContext actual =
engine.decide(mock(SelectStatementContext.class, RETURNS_DEEP_STUBS),
Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), database);
- assertTrue(actual.isUseSQLFederation());
+ assertTrue(engine.decide(mock(SelectStatementContext.class,
RETURNS_DEEP_STUBS), Collections.emptyList(), database,
mock(ShardingSphereRuleMetaData.class)));
}
@Test
@@ -100,8 +95,7 @@ class SQLFederationDecideEngineTest {
new ConfigurationProperties(PropertiesBuilder.build(new
Property(ConfigurationPropertyKey.SQL_FEDERATION_TYPE.getKey(), "ORIGINAL"))));
ShardingSphereDatabase database = new
ShardingSphereDatabase(DefaultDatabase.LOGIC_NAME,
mock(DatabaseType.class),
mock(ShardingSphereResourceMetaData.class, RETURNS_DEEP_STUBS), new
ShardingSphereRuleMetaData(rules), Collections.emptyMap());
- SQLFederationDeciderContext actual =
engine.decide(mock(SelectStatementContext.class, RETURNS_DEEP_STUBS),
Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), database);
- assertFalse(actual.isUseSQLFederation());
+ assertFalse(engine.decide(mock(SelectStatementContext.class,
RETURNS_DEEP_STUBS), Collections.emptyList(), database,
mock(ShardingSphereRuleMetaData.class)));
}
@Test
@@ -111,7 +105,6 @@ class SQLFederationDecideEngineTest {
new ConfigurationProperties(PropertiesBuilder.build(new
Property(ConfigurationPropertyKey.SQL_FEDERATION_TYPE.getKey(), "ORIGINAL"))));
ShardingSphereDatabase database = new
ShardingSphereDatabase(DefaultDatabase.LOGIC_NAME,
mock(DatabaseType.class),
mock(ShardingSphereResourceMetaData.class, RETURNS_DEEP_STUBS), new
ShardingSphereRuleMetaData(rules), Collections.emptyMap());
- SQLFederationDeciderContext actual =
engine.decide(mock(SelectStatementContext.class, RETURNS_DEEP_STUBS),
Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), database);
- assertTrue(actual.isUseSQLFederation());
+ assertTrue(engine.decide(mock(SelectStatementContext.class,
RETURNS_DEEP_STUBS), Collections.emptyList(), database,
mock(ShardingSphereRuleMetaData.class)));
}
}
diff --git
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
index 3351bb49664..78998eb5ce3 100644
---
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
+++
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
@@ -32,10 +32,8 @@ import
org.apache.shardingsphere.driver.jdbc.core.resultset.ShardingSphereResult
import
org.apache.shardingsphere.driver.jdbc.core.resultset.ShardingSphereResultSetUtils;
import
org.apache.shardingsphere.driver.jdbc.core.statement.metadata.ShardingSphereParameterMetaData;
import
org.apache.shardingsphere.driver.jdbc.exception.syntax.EmptySQLException;
-import org.apache.shardingsphere.infra.session.query.QueryContext;
import org.apache.shardingsphere.infra.binder.SQLStatementContextFactory;
import org.apache.shardingsphere.infra.binder.aware.ParameterAware;
-import
org.apache.shardingsphere.infra.binder.decider.SQLFederationDeciderContext;
import
org.apache.shardingsphere.infra.binder.decider.SQLFederationDecideEngine;
import
org.apache.shardingsphere.infra.binder.segment.insert.keygen.GeneratedKeyContext;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
@@ -80,11 +78,12 @@ import
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRule
import org.apache.shardingsphere.infra.parser.SQLParserEngine;
import org.apache.shardingsphere.infra.route.context.RouteContext;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
-import
org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
import
org.apache.shardingsphere.infra.rule.identifier.type.ColumnContainedRule;
+import
org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
import
org.apache.shardingsphere.infra.rule.identifier.type.MutableDataNodeRule;
import org.apache.shardingsphere.infra.rule.identifier.type.RawExecutionRule;
import
org.apache.shardingsphere.infra.rule.identifier.type.StorageConnectorReusableRule;
+import org.apache.shardingsphere.infra.session.query.QueryContext;
import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
import org.apache.shardingsphere.parser.rule.SQLParserRule;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
@@ -165,7 +164,7 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
private String trafficInstanceId;
- private SQLFederationDeciderContext deciderContext;
+ private boolean useFederation;
public ShardingSpherePreparedStatement(final ShardingSphereConnection
connection, final String sql) throws SQLException {
this(connection, sql, ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY, ResultSet.HOLD_CURSORS_OVER_COMMIT, false, null);
@@ -260,9 +259,9 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
JDBCExecutionUnit executionUnit =
createTrafficExecutionUnit(trafficInstanceId, queryContext);
return executor.getTrafficExecutor().execute(executionUnit,
(statement, sql) -> ((PreparedStatement) statement).executeQuery());
}
- deciderContext = decide(queryContext,
- metaDataContexts.getMetaData().getGlobalRuleMetaData(),
metaDataContexts.getMetaData().getProps(),
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()));
- if (deciderContext.isUseSQLFederation()) {
+ useFederation = decide(queryContext,
+
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()),
metaDataContexts.getMetaData().getGlobalRuleMetaData(),
metaDataContexts.getMetaData().getProps());
+ if (useFederation) {
return executeFederationQuery(queryContext);
}
executionContext = createExecutionContext(queryContext);
@@ -284,9 +283,8 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
return result;
}
- private static SQLFederationDeciderContext decide(final QueryContext
queryContext,
- final
ShardingSphereRuleMetaData globalRuleMetaData, final ConfigurationProperties
props, final ShardingSphereDatabase database) {
- return new
SQLFederationDecideEngine(database.getRuleMetaData().getRules(),
props).decide(queryContext.getSqlStatementContext(),
queryContext.getParameters(), globalRuleMetaData, database);
+ private boolean decide(final QueryContext queryContext, final
ShardingSphereDatabase database, final ShardingSphereRuleMetaData
globalRuleMetaData, final ConfigurationProperties props) {
+ return new
SQLFederationDecideEngine(database.getRuleMetaData().getRules(),
props).decide(queryContext.getSqlStatementContext(),
queryContext.getParameters(), database, globalRuleMetaData);
}
private JDBCExecutionUnit createTrafficExecutionUnit(final String
trafficInstanceId, final QueryContext queryContext) throws SQLException {
@@ -427,9 +425,9 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
JDBCExecutionUnit executionUnit =
createTrafficExecutionUnit(trafficInstanceId, queryContext);
return executor.getTrafficExecutor().execute(executionUnit,
(statement, sql) -> ((PreparedStatement) statement).execute());
}
- deciderContext = decide(queryContext,
- metaDataContexts.getMetaData().getGlobalRuleMetaData(),
metaDataContexts.getMetaData().getProps(),
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()));
- if (deciderContext.isUseSQLFederation()) {
+ useFederation = decide(queryContext,
+
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()),
metaDataContexts.getMetaData().getGlobalRuleMetaData(),
metaDataContexts.getMetaData().getProps());
+ if (useFederation) {
ResultSet resultSet = executeFederationQuery(queryContext);
return null != resultSet;
}
@@ -540,7 +538,7 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
if (null != trafficInstanceId) {
return executor.getTrafficExecutor().getResultSet();
}
- if (null != deciderContext && deciderContext.isUseSQLFederation()) {
+ if (useFederation) {
return executor.getFederationExecutor().getResultSet();
}
if (executionContext.getSqlStatementContext() instanceof
SelectStatementContext ||
executionContext.getSqlStatementContext().getSqlStatement() instanceof
DALStatement) {
diff --git
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
index 2462ee03ffc..370c498efec 100644
---
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
+++
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
@@ -32,9 +32,7 @@ import
org.apache.shardingsphere.driver.jdbc.core.resultset.GeneratedKeysResultS
import
org.apache.shardingsphere.driver.jdbc.core.resultset.ShardingSphereResultSet;
import
org.apache.shardingsphere.driver.jdbc.exception.syntax.EmptySQLException;
import
org.apache.shardingsphere.driver.jdbc.exception.transaction.JDBCTransactionAcrossDatabasesException;
-import org.apache.shardingsphere.infra.session.query.QueryContext;
import org.apache.shardingsphere.infra.binder.SQLStatementContextFactory;
-import
org.apache.shardingsphere.infra.binder.decider.SQLFederationDeciderContext;
import
org.apache.shardingsphere.infra.binder.decider.SQLFederationDecideEngine;
import
org.apache.shardingsphere.infra.binder.segment.insert.keygen.GeneratedKeyContext;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
@@ -80,6 +78,7 @@ import
org.apache.shardingsphere.infra.rule.identifier.type.ColumnContainedRule;
import
org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
import
org.apache.shardingsphere.infra.rule.identifier.type.MutableDataNodeRule;
import org.apache.shardingsphere.infra.rule.identifier.type.RawExecutionRule;
+import org.apache.shardingsphere.infra.session.query.QueryContext;
import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
import org.apache.shardingsphere.parser.rule.SQLParserRule;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
@@ -140,7 +139,7 @@ public final class ShardingSphereStatement extends
AbstractStatementAdapter {
private String trafficInstanceId;
- private SQLFederationDeciderContext deciderContext;
+ private boolean useFederation;
public ShardingSphereStatement(final ShardingSphereConnection connection) {
this(connection, ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY, ResultSet.HOLD_CURSORS_OVER_COMMIT);
@@ -176,9 +175,9 @@ public final class ShardingSphereStatement extends
AbstractStatementAdapter {
JDBCExecutionUnit executionUnit =
createTrafficExecutionUnit(trafficInstanceId, queryContext);
return executor.getTrafficExecutor().execute(executionUnit,
Statement::executeQuery);
}
- deciderContext = decide(queryContext,
- metaDataContexts.getMetaData().getGlobalRuleMetaData(),
metaDataContexts.getMetaData().getProps(),
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()));
- if (deciderContext.isUseSQLFederation()) {
+ useFederation = decide(queryContext,
+
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()),
metaDataContexts.getMetaData().getGlobalRuleMetaData(),
metaDataContexts.getMetaData().getProps());
+ if (useFederation) {
return executeFederationQuery(queryContext);
}
executionContext = createExecutionContext(queryContext);
@@ -198,9 +197,8 @@ public final class ShardingSphereStatement extends
AbstractStatementAdapter {
return result;
}
- private static SQLFederationDeciderContext decide(final QueryContext
queryContext,
- final
ShardingSphereRuleMetaData globalRuleMetaData, final ConfigurationProperties
props, final ShardingSphereDatabase database) {
- return new
SQLFederationDecideEngine(database.getRuleMetaData().getRules(),
props).decide(queryContext.getSqlStatementContext(),
queryContext.getParameters(), globalRuleMetaData, database);
+ private boolean decide(final QueryContext queryContext, final
ShardingSphereDatabase database, final ShardingSphereRuleMetaData
globalRuleMetaData, final ConfigurationProperties props) {
+ return new
SQLFederationDecideEngine(database.getRuleMetaData().getRules(),
props).decide(queryContext.getSqlStatementContext(),
queryContext.getParameters(), database, globalRuleMetaData);
}
private Optional<String> getInstanceIdAndSet(final QueryContext
queryContext) {
@@ -466,9 +464,9 @@ public final class ShardingSphereStatement extends
AbstractStatementAdapter {
JDBCExecutionUnit executionUnit =
createTrafficExecutionUnit(trafficInstanceId, queryContext);
return executor.getTrafficExecutor().execute(executionUnit,
trafficCallback);
}
- deciderContext = decide(queryContext,
- metaDataContexts.getMetaData().getGlobalRuleMetaData(),
metaDataContexts.getMetaData().getProps(),
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()));
- if (deciderContext.isUseSQLFederation()) {
+ useFederation = decide(queryContext,
+
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()),
metaDataContexts.getMetaData().getGlobalRuleMetaData(),
metaDataContexts.getMetaData().getProps());
+ if (useFederation) {
ResultSet resultSet = executeFederationQuery(queryContext);
return null != resultSet;
}
@@ -625,7 +623,7 @@ public final class ShardingSphereStatement extends
AbstractStatementAdapter {
if (null != trafficInstanceId) {
return executor.getTrafficExecutor().getResultSet();
}
- if (null != deciderContext && deciderContext.isUseSQLFederation()) {
+ if (useFederation) {
return executor.getFederationExecutor().getResultSet();
}
if (executionContext.getSqlStatementContext() instanceof
SelectStatementContext ||
executionContext.getSqlStatementContext().getSqlStatement() instanceof
DALStatement) {
diff --git
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/decider/SingleSQLFederationDecider.java
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/decider/SingleSQLFederationDecider.java
index 1a2084f31f4..4a5766b3b5d 100644
---
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/decider/SingleSQLFederationDecider.java
+++
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/decider/SingleSQLFederationDecider.java
@@ -58,13 +58,13 @@ public final class SingleSQLFederationDecider implements
SQLFederationDecider<Si
addTableDataNodes(deciderContext, rule, singleTableNames);
}
- private static void addTableDataNodes(final SQLFederationDeciderContext
deciderContext, final SingleRule rule, final Collection<QualifiedTable>
singleTableNames) {
+ private void addTableDataNodes(final SQLFederationDeciderContext
deciderContext, final SingleRule rule, final Collection<QualifiedTable>
singleTableNames) {
for (QualifiedTable each : singleTableNames) {
rule.findSingleTableDataNode(each.getSchemaName(),
each.getTableName()).ifPresent(optional ->
deciderContext.getDataNodes().add(optional));
}
}
- private static boolean isAllTablesInSameDataSource(final
SQLFederationDeciderContext deciderContext, final SingleRule rule, final
Collection<QualifiedTable> singleTableNames) {
+ private boolean isAllTablesInSameDataSource(final
SQLFederationDeciderContext deciderContext, final SingleRule rule, final
Collection<QualifiedTable> singleTableNames) {
if (!rule.isSingleTablesInSameDataSource(singleTableNames)) {
return false;
}
@@ -81,7 +81,7 @@ public final class SingleSQLFederationDecider implements
SQLFederationDecider<Si
return true;
}
- private static Collection<QualifiedTable> getSingleTableNames(final
SQLStatementContext<?> sqlStatementContext,
+ private Collection<QualifiedTable> getSingleTableNames(final
SQLStatementContext<?> sqlStatementContext,
final
ShardingSphereDatabase database, final SingleRule rule) {
DatabaseType databaseType = sqlStatementContext.getDatabaseType();
Collection<QualifiedTable> result = getQualifiedTables(database,
databaseType, sqlStatementContext.getTablesContext().getTables());
@@ -91,7 +91,7 @@ public final class SingleSQLFederationDecider implements
SQLFederationDecider<Si
return rule.getSingleTableNames(result);
}
- private static Collection<QualifiedTable> getQualifiedTables(final
ShardingSphereDatabase database, final DatabaseType databaseType, final
Collection<SimpleTableSegment> tableSegments) {
+ private Collection<QualifiedTable> getQualifiedTables(final
ShardingSphereDatabase database, final DatabaseType databaseType, final
Collection<SimpleTableSegment> tableSegments) {
Collection<QualifiedTable> result = new LinkedList<>();
String schemaName =
DatabaseTypeEngine.getDefaultSchemaName(databaseType, database.getName());
for (SimpleTableSegment each : tableSegments) {
diff --git
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnector.java
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnector.java
index 5b5ae52925d..22e875c0d9f 100644
---
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnector.java
+++
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnector.java
@@ -19,9 +19,7 @@ package org.apache.shardingsphere.proxy.backend.connector;
import com.google.common.base.Preconditions;
import org.apache.shardingsphere.dialect.SQLExceptionTransformEngine;
-import org.apache.shardingsphere.infra.session.query.QueryContext;
import org.apache.shardingsphere.infra.binder.aware.CursorDefinitionAware;
-import
org.apache.shardingsphere.infra.binder.decider.SQLFederationDeciderContext;
import
org.apache.shardingsphere.infra.binder.decider.SQLFederationDecideEngine;
import
org.apache.shardingsphere.infra.binder.segment.insert.keygen.GeneratedKeyContext;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
@@ -52,6 +50,7 @@ import
org.apache.shardingsphere.infra.metadata.database.schema.util.SystemSchem
import
org.apache.shardingsphere.infra.rule.identifier.type.ColumnContainedRule;
import
org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
import
org.apache.shardingsphere.infra.rule.identifier.type.MutableDataNodeRule;
+import org.apache.shardingsphere.infra.session.query.QueryContext;
import
org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
import org.apache.shardingsphere.mode.manager.ContextManager;
import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
@@ -198,9 +197,8 @@ public final class DatabaseConnector implements
DatabaseBackendHandler {
@Override
public ResponseHeader execute() throws SQLException {
MetaDataContexts metaDataContexts =
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
- SQLFederationDeciderContext deciderContext = new
SQLFederationDecideEngine(database.getRuleMetaData().getRules(),
metaDataContexts.getMetaData().getProps())
- .decide(queryContext.getSqlStatementContext(),
queryContext.getParameters(),
metaDataContexts.getMetaData().getGlobalRuleMetaData(), database);
- if (deciderContext.isUseSQLFederation()) {
+ if (new
SQLFederationDecideEngine(database.getRuleMetaData().getRules(),
metaDataContexts.getMetaData().getProps())
+ .decide(queryContext.getSqlStatementContext(),
queryContext.getParameters(), database,
metaDataContexts.getMetaData().getGlobalRuleMetaData())) {
prepareFederationExecutor();
ResultSet resultSet = doExecuteFederation(queryContext,
metaDataContexts);
return processExecuteFederation(resultSet, metaDataContexts);
diff --git
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/sql/PreviewHandler.java
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/sql/PreviewHandler.java
index c362c174bb1..e43e918a7fe 100644
---
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/sql/PreviewHandler.java
+++
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/sql/PreviewHandler.java
@@ -22,10 +22,8 @@ import com.google.common.base.Strings;
import
org.apache.shardingsphere.dialect.exception.syntax.database.NoDatabaseSelectedException;
import
org.apache.shardingsphere.dialect.exception.syntax.database.UnknownDatabaseException;
import
org.apache.shardingsphere.distsql.parser.statement.rul.sql.PreviewStatement;
-import org.apache.shardingsphere.infra.session.query.QueryContext;
import org.apache.shardingsphere.infra.binder.SQLStatementContextFactory;
import org.apache.shardingsphere.infra.binder.aware.CursorDefinitionAware;
-import
org.apache.shardingsphere.infra.binder.decider.SQLFederationDeciderContext;
import
org.apache.shardingsphere.infra.binder.decider.SQLFederationDecideEngine;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import
org.apache.shardingsphere.infra.binder.statement.ddl.CursorStatementContext;
@@ -49,6 +47,7 @@ import
org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.Statemen
import
org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
+import org.apache.shardingsphere.infra.session.query.QueryContext;
import
org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
import org.apache.shardingsphere.mode.manager.ContextManager;
import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
@@ -107,10 +106,8 @@ public final class PreviewHandler extends
SQLRULBackendHandler<PreviewStatement>
ShardingSphereDatabase database =
ProxyContext.getInstance().getDatabase(getConnectionSession().getDatabaseName());
ShardingSpherePreconditions.checkState(database.isComplete(), () ->
new RuleNotExistedException(getConnectionSession().getDatabaseName()));
ConfigurationProperties props =
metaDataContexts.getMetaData().getProps();
- SQLFederationDeciderContext deciderContext = new
SQLFederationDecideEngine(database.getRuleMetaData().getRules(), props)
- .decide(queryContext.getSqlStatementContext(),
queryContext.getParameters(),
-
metaDataContexts.getMetaData().getGlobalRuleMetaData(),
metaDataContexts.getMetaData().getDatabase(getConnectionSession().getDatabaseName()));
- Collection<ExecutionUnit> executionUnits =
deciderContext.isUseSQLFederation() ? getFederationExecutionUnits(queryContext,
databaseName, metaDataContexts)
+ Collection<ExecutionUnit> executionUnits =
isUseFederation(queryContext, database, metaDataContexts, props)
+ ? getFederationExecutionUnits(queryContext, databaseName,
metaDataContexts)
: kernelProcessor.generateExecutionContext(queryContext,
database, globalRuleMetaData, props,
getConnectionSession().getConnectionContext()).getExecutionUnits();
return
executionUnits.stream().map(this::buildRow).collect(Collectors.toList());
}
@@ -125,6 +122,12 @@ public final class PreviewHandler extends
SQLRULBackendHandler<PreviewStatement>
((CursorDefinitionAware)
sqlStatementContext).setUpCursorDefinition(cursorStatementContext);
}
+ private boolean isUseFederation(final QueryContext queryContext, final
ShardingSphereDatabase database, final MetaDataContexts metaDataContexts, final
ConfigurationProperties props) {
+ SQLFederationDecideEngine engine = new
SQLFederationDecideEngine(database.getRuleMetaData().getRules(), props);
+ return engine.decide(queryContext.getSqlStatementContext(),
queryContext.getParameters(),
+
metaDataContexts.getMetaData().getDatabase(getConnectionSession().getDatabaseName()),
metaDataContexts.getMetaData().getGlobalRuleMetaData());
+ }
+
private LocalDataQueryResultRow buildRow(final ExecutionUnit unit) {
return new LocalDataQueryResultRow(unit.getDataSourceName(),
unit.getSqlUnit().getSql());
}