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 1d233ad4df0 Remove SQLFederationDeciderContext (#25508)
1d233ad4df0 is described below
commit 1d233ad4df01481ebcb6eced67925cbaba9dfee5
Author: Liang Zhang <[email protected]>
AuthorDate: Mon May 8 01:05:01 2023 +0800
Remove SQLFederationDeciderContext (#25508)
* Remove SQLFederationDeciderContext
---
.../decider/ShardingSQLFederationDecider.java | 27 +++---
.../decider/ShardingSQLFederationDeciderTest.java | 95 ++++++++--------------
.../binder/decider/SQLFederationDecideEngine.java | 11 ++-
.../infra/binder/decider/SQLFederationDecider.java | 11 ++-
.../decider/SQLFederationDeciderContext.java | 37 ---------
.../decider/SQLFederationDeciderMatchFixture.java | 9 +-
.../SQLFederationDeciderNotMatchFixture.java | 8 +-
.../single/decider/SingleSQLFederationDecider.java | 65 +++++++--------
.../decider/SingleSQLFederationDeciderTest.java | 49 ++++-------
9 files changed, 123 insertions(+), 189 deletions(-)
diff --git
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDecider.java
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDecider.java
index 9f4123ba70a..5f4c25f62fe 100644
---
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDecider.java
+++
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDecider.java
@@ -18,9 +18,9 @@
package org.apache.shardingsphere.sharding.decider;
import org.apache.shardingsphere.infra.binder.decider.SQLFederationDecider;
-import
org.apache.shardingsphere.infra.binder.decider.SQLFederationDeciderContext;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
+import org.apache.shardingsphere.infra.datanode.DataNode;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
import org.apache.shardingsphere.sharding.constant.ShardingOrder;
@@ -30,6 +30,7 @@ import
org.apache.shardingsphere.sharding.route.engine.condition.engine.Sharding
import org.apache.shardingsphere.sharding.rule.ShardingRule;
import java.util.Collection;
+import java.util.HashSet;
import java.util.List;
/**
@@ -38,33 +39,33 @@ import java.util.List;
public final class ShardingSQLFederationDecider implements
SQLFederationDecider<ShardingRule> {
@Override
- public void decide(final SQLFederationDeciderContext deciderContext, final
SelectStatementContext selectStatementContext, final List<Object> parameters,
- final ShardingSphereRuleMetaData globalRuleMetaData,
final ShardingSphereDatabase database, final ShardingRule rule) {
+ public boolean decide(final SelectStatementContext selectStatementContext,
final List<Object> parameters,
+ final ShardingSphereRuleMetaData globalRuleMetaData,
final ShardingSphereDatabase database, final ShardingRule rule, final
Collection<DataNode> includedDataNodes) {
Collection<String> tableNames =
rule.getShardingLogicTableNames(selectStatementContext.getTablesContext().getTableNames());
if (tableNames.isEmpty()) {
- return;
+ return false;
}
- addTableDataNodes(deciderContext, rule, tableNames);
+ includedDataNodes.addAll(getTableDataNodes(rule, tableNames));
ShardingConditions shardingConditions =
getMergedShardingConditions(selectStatementContext, parameters,
globalRuleMetaData, database, rule);
if (shardingConditions.isNeedMerge() &&
shardingConditions.isSameShardingCondition()) {
- return;
+ return false;
}
if (selectStatementContext.isContainsSubquery() ||
selectStatementContext.isContainsHaving()
|| selectStatementContext.isContainsCombine() ||
selectStatementContext.isContainsPartialDistinctAggregation()) {
- deciderContext.setUseSQLFederation(true);
- return;
+ return true;
}
if (!selectStatementContext.isContainsJoinQuery() ||
rule.isAllTablesInSameDataSource(tableNames)) {
- return;
+ return false;
}
- boolean allBindingTables = tableNames.size() > 1 &&
rule.isAllBindingTables(database, selectStatementContext, tableNames);
- deciderContext.setUseSQLFederation(tableNames.size() > 1 &&
!allBindingTables);
+ return tableNames.size() <= 1 || !rule.isAllBindingTables(database,
selectStatementContext, tableNames);
}
- private void addTableDataNodes(final SQLFederationDeciderContext
deciderContext, final ShardingRule rule, final Collection<String> tableNames) {
+ private Collection<DataNode> getTableDataNodes(final ShardingRule rule,
final Collection<String> tableNames) {
+ Collection<DataNode> result = new HashSet<>();
for (String each : tableNames) {
- rule.findTableRule(each).ifPresent(optional ->
deciderContext.getDataNodes().addAll(optional.getActualDataNodes()));
+ rule.findTableRule(each).ifPresent(optional ->
result.addAll(optional.getActualDataNodes()));
}
+ return result;
}
private ShardingConditions getMergedShardingConditions(final
SQLStatementContext<?> sqlStatementContext, final List<Object> parameters,
diff --git
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDeciderTest.java
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDeciderTest.java
index d00b23ea06d..6466af9bd83 100644
---
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDeciderTest.java
+++
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDeciderTest.java
@@ -17,7 +17,6 @@
package org.apache.shardingsphere.sharding.decider;
-import
org.apache.shardingsphere.infra.binder.decider.SQLFederationDeciderContext;
import
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
import org.apache.shardingsphere.infra.database.DefaultDatabase;
import
org.apache.shardingsphere.infra.database.type.dialect.PostgreSQLDatabaseType;
@@ -30,7 +29,9 @@ import org.apache.shardingsphere.sharding.rule.TableRule;
import org.junit.jupiter.api.Test;
import java.util.Arrays;
+import java.util.Collection;
import java.util.Collections;
+import java.util.HashSet;
import java.util.Optional;
import static org.hamcrest.MatcherAssert.assertThat;
@@ -45,114 +46,92 @@ class ShardingSQLFederationDeciderTest {
@Test
void assertDecideWhenNotContainsShardingTable() {
- ShardingSQLFederationDecider federationDecider = new
ShardingSQLFederationDecider();
- SelectStatementContext select = createStatementContext();
ShardingRule rule = mock(ShardingRule.class);
when(rule.getShardingLogicTableNames(Arrays.asList("t_order",
"t_order_item"))).thenReturn(Collections.emptyList());
- SQLFederationDeciderContext actual = new SQLFederationDeciderContext();
- federationDecider.decide(actual, select,
- Collections.emptyList(),
mock(ShardingSphereRuleMetaData.class), mock(ShardingSphereDatabase.class),
rule);
- assertTrue(actual.getDataNodes().isEmpty());
- assertFalse(actual.isUseSQLFederation());
+ Collection<DataNode> includedDataNodes = new HashSet<>();
+ assertFalse(new ShardingSQLFederationDecider().decide(
+ createStatementContext(), Collections.emptyList(),
mock(ShardingSphereRuleMetaData.class), mock(ShardingSphereDatabase.class),
rule, includedDataNodes));
+ assertTrue(includedDataNodes.isEmpty());
}
@Test
void assertDecideWhenContainsSameShardingCondition() {
SelectStatementContext select = createStatementContext();
when(select.isContainsSubquery()).thenReturn(true);
- SQLFederationDeciderContext deciderContext = new
SQLFederationDeciderContext();
- new ShardingSQLFederationDecider().decide(deciderContext,
- select, Collections.emptyList(),
mock(ShardingSphereRuleMetaData.class), createDatabase(), createShardingRule());
- assertThat(deciderContext.getDataNodes().size(), is(4));
+ Collection<DataNode> includedDataNodes = new HashSet<>();
+ assertTrue(new ShardingSQLFederationDecider().decide(select,
Collections.emptyList(), mock(ShardingSphereRuleMetaData.class),
createDatabase(), createShardingRule(), includedDataNodes));
+ assertThat(includedDataNodes.size(), is(4));
}
@Test
void assertDecideWhenContainsSubquery() {
SelectStatementContext select = createStatementContext();
when(select.isContainsSubquery()).thenReturn(true);
- SQLFederationDeciderContext actual = new SQLFederationDeciderContext();
- ShardingSQLFederationDecider federationDecider = new
ShardingSQLFederationDecider();
- federationDecider.decide(actual, select, Collections.emptyList(),
- mock(ShardingSphereRuleMetaData.class), createDatabase(),
createShardingRule());
- assertThat(actual.getDataNodes().size(), is(4));
- assertTrue(actual.isUseSQLFederation());
+ Collection<DataNode> includedDataNodes = new HashSet<>();
+ assertTrue(new ShardingSQLFederationDecider().decide(select,
Collections.emptyList(), mock(ShardingSphereRuleMetaData.class),
createDatabase(), createShardingRule(), includedDataNodes));
+ assertThat(includedDataNodes.size(), is(4));
}
@Test
void assertDecideWhenContainsHaving() {
SelectStatementContext select = createStatementContext();
when(select.isContainsHaving()).thenReturn(true);
- SQLFederationDeciderContext actual = new SQLFederationDeciderContext();
- ShardingSQLFederationDecider federationDecider = new
ShardingSQLFederationDecider();
- federationDecider.decide(actual, select, Collections.emptyList(),
- mock(ShardingSphereRuleMetaData.class), createDatabase(),
createShardingRule());
- assertThat(actual.getDataNodes().size(), is(4));
- assertTrue(actual.isUseSQLFederation());
+ Collection<DataNode> includedDataNodes = new HashSet<>();
+ assertTrue(new ShardingSQLFederationDecider().decide(select,
Collections.emptyList(), mock(ShardingSphereRuleMetaData.class),
createDatabase(), createShardingRule(), includedDataNodes));
+ assertThat(includedDataNodes.size(), is(4));
}
@Test
void assertDecideWhenContainsCombine() {
SelectStatementContext select = createStatementContext();
when(select.isContainsCombine()).thenReturn(true);
- SQLFederationDeciderContext actual = new SQLFederationDeciderContext();
- ShardingSQLFederationDecider federationDecider = new
ShardingSQLFederationDecider();
- federationDecider.decide(actual, select, Collections.emptyList(),
- mock(ShardingSphereRuleMetaData.class), createDatabase(),
createShardingRule());
- assertThat(actual.getDataNodes().size(), is(4));
- assertTrue(actual.isUseSQLFederation());
+ Collection<DataNode> includedDataNodes = new HashSet<>();
+ assertTrue(new ShardingSQLFederationDecider().decide(select,
Collections.emptyList(), mock(ShardingSphereRuleMetaData.class),
createDatabase(), createShardingRule(), includedDataNodes));
+ assertThat(includedDataNodes.size(), is(4));
}
@Test
void assertDecideWhenContainsPartialDistinctAggregation() {
SelectStatementContext select = createStatementContext();
when(select.isContainsPartialDistinctAggregation()).thenReturn(true);
- SQLFederationDeciderContext actual = new SQLFederationDeciderContext();
- ShardingSQLFederationDecider federationDecider = new
ShardingSQLFederationDecider();
- federationDecider.decide(actual, select, Collections.emptyList(),
- mock(ShardingSphereRuleMetaData.class), createDatabase(),
createShardingRule());
- assertThat(actual.getDataNodes().size(), is(4));
- assertTrue(actual.isUseSQLFederation());
+ Collection<DataNode> includedDataNodes = new HashSet<>();
+ assertTrue(new ShardingSQLFederationDecider().decide(select,
Collections.emptyList(), mock(ShardingSphereRuleMetaData.class),
createDatabase(), createShardingRule(), includedDataNodes));
+ assertThat(includedDataNodes.size(), is(4));
}
@Test
void assertDecideWhenAllTablesInSameDataSource() {
SelectStatementContext select = createStatementContext();
when(select.isContainsJoinQuery()).thenReturn(true);
- SQLFederationDeciderContext actual = new SQLFederationDeciderContext();
- ShardingSQLFederationDecider federationDecider = new
ShardingSQLFederationDecider();
ShardingRule shardingRule = createShardingRule();
when(shardingRule.isAllTablesInSameDataSource(Arrays.asList("t_order",
"t_order_item"))).thenReturn(true);
- federationDecider.decide(actual, select, Collections.emptyList(),
mock(ShardingSphereRuleMetaData.class), createDatabase(), shardingRule);
- assertThat(actual.getDataNodes().size(), is(4));
- assertFalse(actual.isUseSQLFederation());
+ Collection<DataNode> includedDataNodes = new HashSet<>();
+ assertFalse(new ShardingSQLFederationDecider().decide(select,
Collections.emptyList(), mock(ShardingSphereRuleMetaData.class),
createDatabase(), shardingRule, includedDataNodes));
+ assertThat(includedDataNodes.size(), is(4));
}
@Test
void assertDecideWhenAllTablesIsBindingTables() {
SelectStatementContext select = createStatementContext();
when(select.isContainsJoinQuery()).thenReturn(true);
- SQLFederationDeciderContext actual = new SQLFederationDeciderContext();
- ShardingSQLFederationDecider federationDecider = new
ShardingSQLFederationDecider();
ShardingRule shardingRule = createShardingRule();
ShardingSphereDatabase database = createDatabase();
when(shardingRule.isAllBindingTables(database, select,
Arrays.asList("t_order", "t_order_item"))).thenReturn(true);
- federationDecider.decide(actual, select, Collections.emptyList(),
mock(ShardingSphereRuleMetaData.class), database, shardingRule);
- assertThat(actual.getDataNodes().size(), is(4));
- assertFalse(actual.isUseSQLFederation());
+ Collection<DataNode> includedDataNodes = new HashSet<>();
+ assertFalse(new ShardingSQLFederationDecider().decide(select,
Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), database,
shardingRule, includedDataNodes));
+ assertThat(includedDataNodes.size(), is(4));
}
@Test
void assertDecideWhenAllTablesIsNotBindingTables() {
SelectStatementContext select = createStatementContext();
when(select.isContainsJoinQuery()).thenReturn(true);
- SQLFederationDeciderContext actual = new SQLFederationDeciderContext();
- ShardingSQLFederationDecider federationDecider = new
ShardingSQLFederationDecider();
ShardingRule shardingRule = createShardingRule();
ShardingSphereDatabase database = createDatabase();
when(shardingRule.isAllBindingTables(database, select,
Arrays.asList("t_order", "t_order_item"))).thenReturn(false);
- federationDecider.decide(actual, select, Collections.emptyList(),
mock(ShardingSphereRuleMetaData.class), database, shardingRule);
- assertThat(actual.getDataNodes().size(), is(4));
- assertTrue(actual.isUseSQLFederation());
+ Collection<DataNode> includedDataNodes = new HashSet<>();
+ assertTrue(new ShardingSQLFederationDecider().decide(select,
Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), database,
shardingRule, includedDataNodes));
+ assertThat(includedDataNodes.size(), is(4));
}
@Test
@@ -160,30 +139,28 @@ class ShardingSQLFederationDeciderTest {
SelectStatementContext select = createStatementContext();
when(select.isContainsJoinQuery()).thenReturn(true);
when(select.getPaginationContext().isHasPagination()).thenReturn(true);
- SQLFederationDeciderContext actual = new SQLFederationDeciderContext();
- ShardingSQLFederationDecider federationDecider = new
ShardingSQLFederationDecider();
ShardingRule shardingRule = createShardingRule();
ShardingSphereDatabase database = createDatabase();
when(shardingRule.isAllBindingTables(database, select,
Arrays.asList("t_order", "t_order_item"))).thenReturn(false);
- federationDecider.decide(actual, select, Collections.emptyList(),
mock(ShardingSphereRuleMetaData.class), database, shardingRule);
- assertThat(actual.getDataNodes().size(), is(4));
- assertTrue(actual.isUseSQLFederation());
+ Collection<DataNode> includedDataNodes = new HashSet<>();
+ assertTrue(new ShardingSQLFederationDecider().decide(select,
Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), database,
shardingRule, includedDataNodes));
+ assertThat(includedDataNodes.size(), is(4));
}
- private static SelectStatementContext createStatementContext() {
+ private SelectStatementContext createStatementContext() {
SelectStatementContext result = mock(SelectStatementContext.class,
RETURNS_DEEP_STUBS);
when(result.getTablesContext().getTableNames()).thenReturn(Arrays.asList("t_order",
"t_order_item"));
when(result.getDatabaseType()).thenReturn(new
PostgreSQLDatabaseType());
return result;
}
- private static ShardingSphereDatabase createDatabase() {
+ private ShardingSphereDatabase createDatabase() {
ShardingSphereDatabase result = mock(ShardingSphereDatabase.class);
when(result.getName()).thenReturn(DefaultDatabase.LOGIC_NAME);
return result;
}
- private static ShardingRule createShardingRule() {
+ private ShardingRule createShardingRule() {
ShardingRule result = mock(ShardingRule.class);
when(result.getShardingLogicTableNames(Arrays.asList("t_order",
"t_order_item"))).thenReturn(Arrays.asList("t_order", "t_order_item"));
TableRule tableRule = mock(TableRule.class);
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 f5e498e1280..3719c5e906c 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
@@ -21,6 +21,7 @@ import
org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
+import org.apache.shardingsphere.infra.datanode.DataNode;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
import
org.apache.shardingsphere.infra.metadata.database.schema.util.SystemSchemaUtils;
@@ -28,6 +29,7 @@ import
org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import org.apache.shardingsphere.infra.util.spi.type.ordered.OrderedSPILoader;
import java.util.Collection;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@@ -67,13 +69,14 @@ public final class SQLFederationDecideEngine {
if (isFederationDisabled || !(sqlStatementContext instanceof
SelectStatementContext)) {
return false;
}
- SQLFederationDeciderContext context = new
SQLFederationDeciderContext();
+ Collection<DataNode> includedDataNodes = new HashSet<>();
for (Entry<ShardingSphereRule, SQLFederationDecider> entry :
deciders.entrySet()) {
- if (!context.isUseSQLFederation()) {
- entry.getValue().decide(context, (SelectStatementContext)
sqlStatementContext, parameters, globalRuleMetaData, database, entry.getKey());
+ boolean isUseSQLFederation =
entry.getValue().decide((SelectStatementContext) sqlStatementContext,
parameters, globalRuleMetaData, database, entry.getKey(), includedDataNodes);
+ if (isUseSQLFederation) {
+ return true;
}
}
- return context.isUseSQLFederation();
+ return false;
}
private boolean isQuerySystemSchema(final SQLStatementContext<?>
sqlStatementContext, final ShardingSphereDatabase database) {
diff --git
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/decider/SQLFederationDecider.java
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/decider/SQLFederationDecider.java
index d845cbe058e..cb49fd45ab8 100644
---
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/decider/SQLFederationDecider.java
+++
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/decider/SQLFederationDecider.java
@@ -18,12 +18,14 @@
package org.apache.shardingsphere.infra.binder.decider;
import
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
+import org.apache.shardingsphere.infra.datanode.DataNode;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import org.apache.shardingsphere.infra.util.spi.annotation.SingletonSPI;
import org.apache.shardingsphere.infra.util.spi.type.ordered.OrderedSPI;
+import java.util.Collection;
import java.util.List;
/**
@@ -35,15 +37,16 @@ import java.util.List;
public interface SQLFederationDecider<T extends ShardingSphereRule> extends
OrderedSPI<T> {
/**
- * Judge whether to use sql federation engine.
+ * Judge whether to use SQL federation.
*
- * @param deciderContext decider context
* @param selectStatementContext select statement context
* @param parameters parameters
* @param globalRuleMetaData global rule meta data
* @param database database
* @param rule rule
+ * @param includedDataNodes included data nodes
+ * @return use SQL federation or not
*/
- void decide(SQLFederationDeciderContext deciderContext,
SelectStatementContext selectStatementContext,
- List<Object> parameters, ShardingSphereRuleMetaData
globalRuleMetaData, ShardingSphereDatabase database, T rule);
+ boolean decide(SelectStatementContext selectStatementContext, List<Object>
parameters,
+ ShardingSphereRuleMetaData globalRuleMetaData,
ShardingSphereDatabase database, T rule, Collection<DataNode>
includedDataNodes);
}
diff --git
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/decider/SQLFederationDeciderContext.java
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/decider/SQLFederationDeciderContext.java
deleted file mode 100644
index 6852319ec1e..00000000000
---
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/decider/SQLFederationDeciderContext.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * 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.binder.decider;
-
-import lombok.Getter;
-import lombok.Setter;
-import org.apache.shardingsphere.infra.datanode.DataNode;
-
-import java.util.Collection;
-import java.util.LinkedHashSet;
-
-/**
- * SQL federation decider context.
- */
-@Getter
-public final class SQLFederationDeciderContext {
-
- private final Collection<DataNode> dataNodes = new LinkedHashSet<>();
-
- @Setter
- private boolean useSQLFederation;
-}
diff --git
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/decider/fixture/decider/SQLFederationDeciderMatchFixture.java
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/decider/fixture/decider/SQLFederationDeciderMatchFixture.java
index 69dc5970f70..95c881dcdb8 100644
---
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/decider/fixture/decider/SQLFederationDeciderMatchFixture.java
+++
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/decider/fixture/decider/SQLFederationDeciderMatchFixture.java
@@ -18,20 +18,21 @@
package org.apache.shardingsphere.infra.binder.decider.fixture.decider;
import org.apache.shardingsphere.infra.binder.decider.SQLFederationDecider;
-import
org.apache.shardingsphere.infra.binder.decider.SQLFederationDeciderContext;
import
org.apache.shardingsphere.infra.binder.decider.fixture.rule.SQLFederationDeciderRuleMatchFixture;
import
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
+import org.apache.shardingsphere.infra.datanode.DataNode;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
+import java.util.Collection;
import java.util.List;
public final class SQLFederationDeciderMatchFixture implements
SQLFederationDecider<SQLFederationDeciderRuleMatchFixture> {
@Override
- public void decide(final SQLFederationDeciderContext deciderContext, final
SelectStatementContext selectStatementContext, final List<Object> parameters,
- final ShardingSphereRuleMetaData globalRuleMetaData,
final ShardingSphereDatabase database, final
SQLFederationDeciderRuleMatchFixture rule) {
- deciderContext.setUseSQLFederation(true);
+ public boolean decide(final SelectStatementContext selectStatementContext,
final List<Object> parameters, final ShardingSphereRuleMetaData
globalRuleMetaData,
+ final ShardingSphereDatabase database, final
SQLFederationDeciderRuleMatchFixture rule, final Collection<DataNode>
includedDataNodes) {
+ return true;
}
@Override
diff --git
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/decider/fixture/decider/SQLFederationDeciderNotMatchFixture.java
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/decider/fixture/decider/SQLFederationDeciderNotMatchFixture.java
index ffc6f4ce981..48c9cc85ef7 100644
---
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/decider/fixture/decider/SQLFederationDeciderNotMatchFixture.java
+++
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/decider/fixture/decider/SQLFederationDeciderNotMatchFixture.java
@@ -18,19 +18,21 @@
package org.apache.shardingsphere.infra.binder.decider.fixture.decider;
import org.apache.shardingsphere.infra.binder.decider.SQLFederationDecider;
-import
org.apache.shardingsphere.infra.binder.decider.SQLFederationDeciderContext;
import
org.apache.shardingsphere.infra.binder.decider.fixture.rule.SQLFederationDeciderRuleNotMatchFixture;
import
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
+import org.apache.shardingsphere.infra.datanode.DataNode;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
+import java.util.Collection;
import java.util.List;
public final class SQLFederationDeciderNotMatchFixture implements
SQLFederationDecider<SQLFederationDeciderRuleNotMatchFixture> {
@Override
- public void decide(final SQLFederationDeciderContext deciderContext, final
SelectStatementContext selectStatementContext, final List<Object> parameters,
- final ShardingSphereRuleMetaData globalRuleMetaData,
final ShardingSphereDatabase database, final
SQLFederationDeciderRuleNotMatchFixture rule) {
+ public boolean decide(final SelectStatementContext selectStatementContext,
final List<Object> parameters, final ShardingSphereRuleMetaData
globalRuleMetaData,
+ final ShardingSphereDatabase database, final
SQLFederationDeciderRuleNotMatchFixture rule, final Collection<DataNode>
includedDataNodes) {
+ return false;
}
@Override
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 22a7f45db57..dac5367f0cc 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
@@ -18,7 +18,6 @@
package org.apache.shardingsphere.single.decider;
import org.apache.shardingsphere.infra.binder.decider.SQLFederationDecider;
-import
org.apache.shardingsphere.infra.binder.decider.SQLFederationDeciderContext;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
import org.apache.shardingsphere.infra.binder.type.IndexAvailable;
@@ -34,6 +33,7 @@ import org.apache.shardingsphere.single.rule.SingleRule;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
import java.util.Collection;
+import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Optional;
@@ -44,45 +44,21 @@ import java.util.Optional;
public final class SingleSQLFederationDecider implements
SQLFederationDecider<SingleRule> {
@Override
- public void decide(final SQLFederationDeciderContext deciderContext, final
SelectStatementContext selectStatementContext, final List<Object> parameters,
- final ShardingSphereRuleMetaData globalRuleMetaData,
final ShardingSphereDatabase database, final SingleRule rule) {
+ public boolean decide(final SelectStatementContext selectStatementContext,
final List<Object> parameters,
+ final ShardingSphereRuleMetaData globalRuleMetaData,
final ShardingSphereDatabase database, final SingleRule rule, final
Collection<DataNode> includedDataNodes) {
Collection<QualifiedTable> singleTableNames =
getSingleTableNames(selectStatementContext, database, rule);
if (singleTableNames.isEmpty()) {
- return;
- }
- if (containsView(database, singleTableNames)) {
- deciderContext.setUseSQLFederation(true);
- return;
- }
-
deciderContext.setUseSQLFederation(!isAllTablesInSameDataSource(deciderContext,
rule, singleTableNames));
- addTableDataNodes(deciderContext, rule, 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 boolean isAllTablesInSameDataSource(final
SQLFederationDeciderContext deciderContext, final SingleRule rule, final
Collection<QualifiedTable> singleTableNames) {
- if (!rule.isSingleTablesInSameDataSource(singleTableNames)) {
return false;
}
- QualifiedTable sampleTable = singleTableNames.iterator().next();
- Optional<DataNode> dataNode =
rule.findSingleTableDataNode(sampleTable.getSchemaName(),
sampleTable.getTableName());
- if (!dataNode.isPresent()) {
+ if (containsView(database, singleTableNames)) {
return true;
}
- for (DataNode each : deciderContext.getDataNodes()) {
- if
(!each.getDataSourceName().equalsIgnoreCase(dataNode.get().getDataSourceName()))
{
- return false;
- }
- }
- return true;
+ boolean isAllTablesInSameDataSource =
isAllTablesInSameDataSource(includedDataNodes, rule, singleTableNames);
+ includedDataNodes.addAll(getTableDataNodes(rule, singleTableNames));
+ return !isAllTablesInSameDataSource;
}
- private Collection<QualifiedTable> getSingleTableNames(final
SQLStatementContext<?> sqlStatementContext,
- final
ShardingSphereDatabase database, final SingleRule rule) {
+ 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());
if (result.isEmpty() && sqlStatementContext instanceof IndexAvailable)
{
@@ -110,6 +86,31 @@ public final class SingleSQLFederationDecider implements
SQLFederationDecider<Si
return false;
}
+ private boolean isAllTablesInSameDataSource(final Collection<DataNode>
includedDataNodes, final SingleRule rule, final Collection<QualifiedTable>
singleTableNames) {
+ if (!rule.isSingleTablesInSameDataSource(singleTableNames)) {
+ return false;
+ }
+ QualifiedTable sampleTable = singleTableNames.iterator().next();
+ Optional<DataNode> dataNode =
rule.findSingleTableDataNode(sampleTable.getSchemaName(),
sampleTable.getTableName());
+ if (!dataNode.isPresent()) {
+ return true;
+ }
+ for (DataNode each : includedDataNodes) {
+ if
(!each.getDataSourceName().equalsIgnoreCase(dataNode.get().getDataSourceName()))
{
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private Collection<DataNode> getTableDataNodes(final SingleRule rule,
final Collection<QualifiedTable> singleTableNames) {
+ Collection<DataNode> result = new HashSet<>();
+ for (QualifiedTable each : singleTableNames) {
+ rule.findSingleTableDataNode(each.getSchemaName(),
each.getTableName()).ifPresent(result::add);
+ }
+ return result;
+ }
+
@Override
public int getOrder() {
return SingleOrder.ORDER;
diff --git
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/decider/SingleSQLFederationDeciderTest.java
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/decider/SingleSQLFederationDeciderTest.java
index 6da43c6f676..72e57550f23 100644
---
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/decider/SingleSQLFederationDeciderTest.java
+++
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/decider/SingleSQLFederationDeciderTest.java
@@ -17,7 +17,6 @@
package org.apache.shardingsphere.single.decider;
-import
org.apache.shardingsphere.infra.binder.decider.SQLFederationDeciderContext;
import
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
import org.apache.shardingsphere.infra.database.DefaultDatabase;
import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
@@ -32,6 +31,7 @@ import org.junit.jupiter.api.Test;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
+import java.util.HashSet;
import java.util.Optional;
import static org.hamcrest.MatcherAssert.assertThat;
@@ -47,13 +47,10 @@ class SingleSQLFederationDeciderTest {
@Test
void assertDecideWhenNotContainsSingleTable() {
- SingleSQLFederationDecider federationDecider = new
SingleSQLFederationDecider();
SelectStatementContext select = createStatementContext();
- SQLFederationDeciderContext actual = new SQLFederationDeciderContext();
- federationDecider.decide(actual, select, Collections.emptyList(),
- mock(ShardingSphereRuleMetaData.class), createDatabase(),
mock(SingleRule.class));
- assertTrue(actual.getDataNodes().isEmpty());
- assertFalse(actual.isUseSQLFederation());
+ Collection<DataNode> includedDataNodes = new HashSet<>();
+ assertFalse(new SingleSQLFederationDecider().decide(select,
Collections.emptyList(), mock(ShardingSphereRuleMetaData.class),
createDatabase(), mock(SingleRule.class), includedDataNodes));
+ assertTrue(includedDataNodes.isEmpty());
}
@Test
@@ -62,12 +59,9 @@ class SingleSQLFederationDeciderTest {
SingleRule rule = createSingleRule(qualifiedTables);
when(rule.isSingleTablesInSameDataSource(qualifiedTables)).thenReturn(true);
SelectStatementContext select = createStatementContext();
- SQLFederationDeciderContext actual = new SQLFederationDeciderContext();
- SingleSQLFederationDecider federationDecider = new
SingleSQLFederationDecider();
- federationDecider.decide(actual, select, Collections.emptyList(),
- mock(ShardingSphereRuleMetaData.class), createDatabase(),
rule);
- assertThat(actual.getDataNodes().size(), is(2));
- assertFalse(actual.isUseSQLFederation());
+ Collection<DataNode> includedDataNodes = new HashSet<>();
+ assertFalse(new SingleSQLFederationDecider().decide(select,
Collections.emptyList(), mock(ShardingSphereRuleMetaData.class),
createDatabase(), rule, includedDataNodes));
+ assertThat(includedDataNodes.size(), is(2));
}
@Test
@@ -76,12 +70,9 @@ class SingleSQLFederationDeciderTest {
SingleRule rule = createSingleRule(qualifiedTables);
when(rule.isSingleTablesInSameDataSource(qualifiedTables)).thenReturn(false);
SelectStatementContext select = createStatementContext();
- SQLFederationDeciderContext actual = new SQLFederationDeciderContext();
- SingleSQLFederationDecider federationDecider = new
SingleSQLFederationDecider();
- federationDecider.decide(actual, select, Collections.emptyList(),
- mock(ShardingSphereRuleMetaData.class), createDatabase(),
rule);
- assertThat(actual.getDataNodes().size(), is(2));
- assertTrue(actual.isUseSQLFederation());
+ Collection<DataNode> includedDataNodes = new HashSet<>();
+ assertTrue(new SingleSQLFederationDecider().decide(select,
Collections.emptyList(), mock(ShardingSphereRuleMetaData.class),
createDatabase(), rule, includedDataNodes));
+ assertThat(includedDataNodes.size(), is(2));
}
@Test
@@ -90,13 +81,9 @@ class SingleSQLFederationDeciderTest {
SingleRule rule = createSingleRule(qualifiedTables);
when(rule.isSingleTablesInSameDataSource(qualifiedTables)).thenReturn(true);
SelectStatementContext select = createStatementContext();
- SQLFederationDeciderContext actual = new SQLFederationDeciderContext();
- actual.getDataNodes().add(new DataNode("ds_0", "t_user"));
- SingleSQLFederationDecider federationDecider = new
SingleSQLFederationDecider();
- federationDecider.decide(actual, select, Collections.emptyList(),
- mock(ShardingSphereRuleMetaData.class), createDatabase(),
rule);
- assertThat(actual.getDataNodes().size(), is(3));
- assertFalse(actual.isUseSQLFederation());
+ Collection<DataNode> includedDataNodes = new
HashSet<>(Collections.singleton(new DataNode("ds_0", "t_user")));
+ assertFalse(new SingleSQLFederationDecider().decide(select,
Collections.emptyList(), mock(ShardingSphereRuleMetaData.class),
createDatabase(), rule, includedDataNodes));
+ assertThat(includedDataNodes.size(), is(3));
}
@Test
@@ -105,13 +92,9 @@ class SingleSQLFederationDeciderTest {
SingleRule rule = createSingleRule(qualifiedTables);
when(rule.isSingleTablesInSameDataSource(qualifiedTables)).thenReturn(true);
SelectStatementContext select = createStatementContext();
- SQLFederationDeciderContext actual = new SQLFederationDeciderContext();
- actual.getDataNodes().add(new DataNode("ds_1", "t_user"));
- SingleSQLFederationDecider federationDecider = new
SingleSQLFederationDecider();
- federationDecider.decide(actual, select, Collections.emptyList(),
- mock(ShardingSphereRuleMetaData.class), createDatabase(),
rule);
- assertThat(actual.getDataNodes().size(), is(3));
- assertTrue(actual.isUseSQLFederation());
+ Collection<DataNode> includedDataNodes = new
HashSet<>(Collections.singleton(new DataNode("ds_1", "t_user")));
+ assertTrue(new SingleSQLFederationDecider().decide(select,
Collections.emptyList(), mock(ShardingSphereRuleMetaData.class),
createDatabase(), rule, includedDataNodes));
+ assertThat(includedDataNodes.size(), is(3));
}
private SingleRule createSingleRule(final Collection<QualifiedTable>
qualifiedTables) {