Skip to content

Commit 9d3f7e4

Browse files
authored
Use SQLRouteExecutor to refactor SQL route engine (#8009)
* For code format * Use SQLRouteExecutor to refactor SQL route engine
1 parent e240277 commit 9d3f7e4

File tree

12 files changed

+150
-65
lines changed

12 files changed

+150
-65
lines changed

shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-rewrite/src/test/java/org/apache/shardingsphere/encrypt/rewrite/parameterized/EncryptSQLRewriterParameterizedTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ protected Collection<SQLRewriteUnit> createSQLRewriteUnits() throws IOException
8282
getTestParameters().getInputParameters(), sqlStatementParserEngine.parse(getTestParameters().getInputSQL(), false));
8383
LogicSQL logicSQL = new LogicSQL(sqlStatementContext, getTestParameters().getInputSQL(), getTestParameters().getInputParameters());
8484
ShardingSphereSchema schema = new ShardingSphereSchema("sharding_db", Collections.emptyList(), rules, Collections.emptyMap(), metaData);
85-
RouteContext routeContext = new SQLRouteEngine(props, rules).route(logicSQL, schema);
85+
RouteContext routeContext = new SQLRouteEngine(rules, props).route(logicSQL, schema);
8686
SQLRewriteResult sqlRewriteResult = new SQLRewriteEntry(metaData.getSchemaMetaData().getConfiguredSchemaMetaData(),
8787
props, rules).rewrite(getTestParameters().getInputSQL(), getTestParameters().getInputParameters(), sqlStatementContext, routeContext);
8888
return sqlRewriteResult instanceof GenericSQLRewriteResult

shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/main/java/org/apache/shardingsphere/sharding/metadata/ShardingTableAddressingMetaDataDecorator.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,13 @@ public void decorate(final ShardingRule rule, final TableAddressingMetaData meta
3838
}
3939

4040
private void decorate(final TableRule tableRule, final TableAddressingMetaData metaData) {
41+
boolean found = false;
4142
for (String each : tableRule.getActualDataNodes().stream().map(DataNode::getTableName).collect(Collectors.toSet())) {
42-
metaData.getTableDataSourceNamesMapper().remove(each);
43+
found = null != metaData.getTableDataSourceNamesMapper().remove(each) || found;
44+
}
45+
if (found) {
46+
metaData.getTableDataSourceNamesMapper().put(tableRule.getLogicTable(), new LinkedList<>(tableRule.getActualDatasourceNames()));
4347
}
44-
metaData.getTableDataSourceNamesMapper().put(tableRule.getLogicTable(), new LinkedList<>(tableRule.getActualDatasourceNames()));
4548
}
4649

4750
@Override

shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-rewrite/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/MixSQLRewriterParameterizedTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ protected Collection<SQLRewriteUnit> createSQLRewriteUnits() throws IOException
8989
getTestParameters().getInputParameters(), sqlStatementParserEngine.parse(getTestParameters().getInputSQL(), false));
9090
LogicSQL logicSQL = new LogicSQL(sqlStatementContext, getTestParameters().getInputSQL(), getTestParameters().getInputParameters());
9191
ShardingSphereSchema schema = new ShardingSphereSchema("sharding_db", Collections.emptyList(), rules, Collections.emptyMap(), metaData);
92-
RouteContext routeContext = new SQLRouteEngine(props, rules).route(logicSQL, schema);
92+
RouteContext routeContext = new SQLRouteEngine(rules, props).route(logicSQL, schema);
9393
SQLRewriteResult sqlRewriteResult = new SQLRewriteEntry(metaData.getSchemaMetaData().getConfiguredSchemaMetaData(),
9494
props, rules).rewrite(getTestParameters().getInputSQL(), getTestParameters().getInputParameters(), sqlStatementContext, routeContext);
9595
return sqlRewriteResult instanceof GenericSQLRewriteResult

shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-rewrite/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/ShardingSQLRewriterParameterizedTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ protected Collection<SQLRewriteUnit> createSQLRewriteUnits() throws IOException
8989
getTestParameters().getInputParameters(), sqlStatementParserEngine.parse(getTestParameters().getInputSQL(), false));
9090
LogicSQL logicSQL = new LogicSQL(sqlStatementContext, getTestParameters().getInputSQL(), getTestParameters().getInputParameters());
9191
ShardingSphereSchema schema = new ShardingSphereSchema("sharding_db", Collections.emptyList(), rules, Collections.emptyMap(), metaData);
92-
RouteContext routeContext = new SQLRouteEngine(props, rules).route(logicSQL, schema);
92+
RouteContext routeContext = new SQLRouteEngine(rules, props).route(logicSQL, schema);
9393
SQLRewriteResult sqlRewriteResult = new SQLRewriteEntry(metaData.getSchemaMetaData().getConfiguredSchemaMetaData(),
9494
props, rules).rewrite(getTestParameters().getInputSQL(), getTestParameters().getInputParameters(), sqlStatementContext, routeContext);
9595
return sqlRewriteResult instanceof GenericSQLRewriteResult

shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/standard/AbstractSQLRouteTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ protected final RouteContext assertRoute(final String sql, final List<Object> pa
6262
metaData.getSchemaMetaData().getConfiguredSchemaMetaData(), parameters, sqlStatementParserEngine.parse(sql, false));
6363
LogicSQL logicSQL = new LogicSQL(sqlStatementContext, sql, parameters);
6464
ShardingSphereSchema schema = new ShardingSphereSchema("sharding_db", Collections.emptyList(), Collections.singleton(shardingRule), Collections.emptyMap(), metaData);
65-
RouteContext result = new SQLRouteEngine(props, Collections.singletonList(shardingRule)).route(logicSQL, schema);
65+
RouteContext result = new SQLRouteEngine(Collections.singletonList(shardingRule), props).route(logicSQL, schema);
6666
assertThat(result.getRouteUnits().size(), is(1));
6767
return result;
6868
}

shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/logic/LogicSchemaMetaDataLoader.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,8 @@ public Optional<PhysicalTableMetaData> load(final DatabaseType databaseType, fin
136136
return load(databaseType, dataSourceMap, tableName, props);
137137
}
138138

139-
private Map<String, Collection<String>> loadUnConfiguredSchemaMetaData(final DatabaseType databaseType, final Map<String, DataSource> dataSourceMap,
140-
final Collection<String> excludedTableNames) throws SQLException {
139+
private Map<String, Collection<String>> loadUnConfiguredSchemaMetaData(final DatabaseType databaseType,
140+
final Map<String, DataSource> dataSourceMap, final Collection<String> excludedTableNames) throws SQLException {
141141
Map<String, Collection<String>> result = new HashMap<>(dataSourceMap.size(), 1);
142142
for (Entry<String, DataSource> entry : dataSourceMap.entrySet()) {
143143
Collection<String> tableNames = PhysicalSchemaMetaDataLoader.loadTableNames(entry.getValue(), databaseType, excludedTableNames);

shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/kernel/KernelProcessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public final class KernelProcessor {
4747
*/
4848
public ExecutionContext generateExecutionContext(final LogicSQL logicSQL, final ShardingSphereSchema schema, final ConfigurationProperties props) {
4949
Collection<ShardingSphereRule> rules = schema.getRules();
50-
SQLRouteEngine sqlRouteEngine = new SQLRouteEngine(props, rules);
50+
SQLRouteEngine sqlRouteEngine = new SQLRouteEngine(rules, props);
5151
SQLStatementContext<?> sqlStatementContext = logicSQL.getSqlStatementContext();
5252
RouteContext routeContext = sqlRouteEngine.route(logicSQL, schema);
5353
SQLRewriteEntry rewriteEntry = new SQLRewriteEntry(schema.getMetaData().getSchemaMetaData().getConfiguredSchemaMetaData(), props, rules);

shardingsphere-infra/shardingsphere-infra-route/src/main/java/org/apache/shardingsphere/infra/route/engine/SQLRouteEngine.java

Lines changed: 14 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -17,42 +17,31 @@
1717

1818
package org.apache.shardingsphere.infra.route.engine;
1919

20+
import lombok.RequiredArgsConstructor;
21+
import org.apache.shardingsphere.infra.binder.LogicSQL;
2022
import org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
21-
import org.apache.shardingsphere.infra.route.SQLRouter;
22-
import org.apache.shardingsphere.infra.route.UnconfiguredSchemaSQLRouter;
2323
import org.apache.shardingsphere.infra.route.context.RouteContext;
24+
import org.apache.shardingsphere.infra.route.engine.impl.AllSQLRouteExecutor;
25+
import org.apache.shardingsphere.infra.route.engine.impl.PartialSQLRouteExecutor;
2426
import org.apache.shardingsphere.infra.route.hook.SPIRoutingHook;
2527
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
2628
import org.apache.shardingsphere.infra.schema.ShardingSphereSchema;
27-
import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
28-
import org.apache.shardingsphere.infra.spi.ordered.OrderedSPIRegistry;
29-
import org.apache.shardingsphere.infra.binder.LogicSQL;
29+
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
30+
import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLShowTablesStatement;
3031

3132
import java.util.Collection;
32-
import java.util.Map;
33-
import java.util.Map.Entry;
3433

3534
/**
3635
* SQL route engine.
3736
*/
37+
@RequiredArgsConstructor
3838
public final class SQLRouteEngine {
3939

40-
static {
41-
ShardingSphereServiceLoader.register(SQLRouter.class);
42-
}
40+
private final Collection<ShardingSphereRule> rules;
4341

4442
private final ConfigurationProperties props;
4543

46-
@SuppressWarnings("rawtypes")
47-
private final Map<ShardingSphereRule, SQLRouter> routers;
48-
49-
private final SPIRoutingHook routingHook;
50-
51-
public SQLRouteEngine(final ConfigurationProperties props, final Collection<ShardingSphereRule> rules) {
52-
this.props = props;
53-
routers = OrderedSPIRegistry.getRegisteredServices(rules, SQLRouter.class);
54-
routingHook = new SPIRoutingHook();
55-
}
44+
private final SPIRoutingHook routingHook = new SPIRoutingHook();
5645

5746
/**
5847
* Route SQL.
@@ -64,7 +53,8 @@ public SQLRouteEngine(final ConfigurationProperties props, final Collection<Shar
6453
public RouteContext route(final LogicSQL logicSQL, final ShardingSphereSchema schema) {
6554
routingHook.start(logicSQL.getSql());
6655
try {
67-
RouteContext result = doRoute(logicSQL, schema);
56+
SQLRouteExecutor executor = isNeedAllSchemas(logicSQL.getSqlStatementContext().getSqlStatement()) ? new AllSQLRouteExecutor() : new PartialSQLRouteExecutor(rules, props);
57+
RouteContext result = executor.route(logicSQL, schema);
6858
routingHook.finishSuccess(result, schema.getMetaData().getSchemaMetaData().getConfiguredSchemaMetaData());
6959
return result;
7060
// CHECKSTYLE:OFF
@@ -75,17 +65,8 @@ public RouteContext route(final LogicSQL logicSQL, final ShardingSphereSchema sc
7565
}
7666
}
7767

78-
@SuppressWarnings({"unchecked", "rawtypes"})
79-
private RouteContext doRoute(final LogicSQL logicSQL, final ShardingSphereSchema schema) {
80-
RouteContext result = new RouteContext();
81-
for (Entry<ShardingSphereRule, SQLRouter> entry : routers.entrySet()) {
82-
if (result.getRouteUnits().isEmpty()) {
83-
result = entry.getValue().createRouteContext(logicSQL, schema, entry.getKey(), props);
84-
} else {
85-
entry.getValue().decorateRouteContext(result, logicSQL, schema, entry.getKey(), props);
86-
}
87-
}
88-
new UnconfiguredSchemaSQLRouter().decorate(result, logicSQL, schema);
89-
return result;
68+
// TODO use dynamic config to judge UnconfiguredSchema
69+
private boolean isNeedAllSchemas(final SQLStatement sqlStatement) {
70+
return sqlStatement instanceof MySQLShowTablesStatement;
9071
}
9172
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
package org.apache.shardingsphere.infra.route.engine;
19+
20+
import org.apache.shardingsphere.infra.binder.LogicSQL;
21+
import org.apache.shardingsphere.infra.route.context.RouteContext;
22+
import org.apache.shardingsphere.infra.schema.ShardingSphereSchema;
23+
24+
/**
25+
* SQL route executor.
26+
*/
27+
public interface SQLRouteExecutor {
28+
29+
/**
30+
* Route.
31+
*
32+
* @param logicSQL logic SQL
33+
* @param schema ShardingSphere schema
34+
* @return route context
35+
*/
36+
RouteContext route(LogicSQL logicSQL, ShardingSphereSchema schema);
37+
}
Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -15,40 +15,38 @@
1515
* limitations under the License.
1616
*/
1717

18-
package org.apache.shardingsphere.infra.route;
18+
package org.apache.shardingsphere.infra.route.engine.impl;
1919

20+
import org.apache.shardingsphere.infra.binder.LogicSQL;
2021
import org.apache.shardingsphere.infra.route.context.RouteContext;
2122
import org.apache.shardingsphere.infra.route.context.RouteMapper;
2223
import org.apache.shardingsphere.infra.route.context.RouteUnit;
24+
import org.apache.shardingsphere.infra.route.engine.SQLRouteExecutor;
2325
import org.apache.shardingsphere.infra.schema.ShardingSphereSchema;
24-
import org.apache.shardingsphere.infra.binder.LogicSQL;
25-
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
26-
import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLShowTablesStatement;
2726

27+
import java.util.Collection;
2828
import java.util.Collections;
29+
import java.util.LinkedHashSet;
2930

3031
/**
31-
* Unconfigured schema SQL router.
32+
* All SQL route executor.
3233
*/
33-
public final class UnconfiguredSchemaSQLRouter {
34+
public final class AllSQLRouteExecutor implements SQLRouteExecutor {
3435

35-
/**
36-
* Decorate route context.
37-
*
38-
* @param routeContext route context
39-
* @param logicSQL logic SQL
40-
* @param schema ShardingSphere schema
41-
*/
42-
public void decorate(final RouteContext routeContext, final LogicSQL logicSQL, final ShardingSphereSchema schema) {
43-
if (isNeedUnconfiguredSchema(logicSQL.getSqlStatementContext().getSqlStatement())) {
44-
for (String each : schema.getMetaData().getSchemaMetaData().getUnconfiguredSchemaMetaDataMap().keySet()) {
45-
routeContext.getRouteUnits().add(new RouteUnit(new RouteMapper(each, each), Collections.emptyList()));
46-
}
36+
@Override
37+
public RouteContext route(final LogicSQL logicSQL, final ShardingSphereSchema schema) {
38+
RouteContext result = new RouteContext();
39+
for (String each : getAllDataSourceNames(schema)) {
40+
result.getRouteUnits().add(new RouteUnit(new RouteMapper(each, each), Collections.emptyList()));
4741
}
42+
return result;
4843
}
4944

50-
// TODO use dynamic config to judge UnconfiguredSchema
51-
private boolean isNeedUnconfiguredSchema(final SQLStatement sqlStatement) {
52-
return sqlStatement instanceof MySQLShowTablesStatement;
45+
private Collection<String> getAllDataSourceNames(final ShardingSphereSchema schema) {
46+
Collection<String> result = new LinkedHashSet<>();
47+
for (Collection<String> each : schema.getMetaData().getTableAddressingMetaData().getTableDataSourceNamesMapper().values()) {
48+
result.addAll(each);
49+
}
50+
return result;
5351
}
5452
}

0 commit comments

Comments
 (0)