提交 01e2e827 编写于 作者: T terrymanu

for #2441, add interface IgnoreForSingleRoute

上级 a58b6afd
......@@ -102,7 +102,7 @@ public abstract class BaseShardingEngine {
}
private Collection<RouteUnit> rewriteAndConvert(final List<Object> parameters, final SQLRouteResult sqlRouteResult) {
SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule, sqlRouteResult.getSqlStatement(), parameters);
SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule, sqlRouteResult.getSqlStatement(), parameters, sqlRouteResult.getRoutingResult().isSingleRouting());
ShardingSQLRewriter shardingSQLRewriter = new ShardingSQLRewriter(shardingRule, databaseType, sqlRouteResult, sqlRouteResult.getOptimizeResult());
EncryptSQLRewriter encryptSQLRewriter = new EncryptSQLRewriter(shardingRule.getEncryptRule().getEncryptorEngine(), sqlRouteResult.getSqlStatement(), sqlRouteResult.getOptimizeResult());
rewriteEngine.init(shardingSQLRewriter, encryptSQLRewriter);
......
......@@ -62,10 +62,10 @@ public final class SQLRewriteEngine {
private final BaseSQLRewriter baseSQLRewriter;
public SQLRewriteEngine(final ShardingRule shardingRule, final SQLStatement sqlStatement, final List<Object> parameters) {
public SQLRewriteEngine(final ShardingRule shardingRule, final SQLStatement sqlStatement, final List<Object> parameters, final boolean isSingleRoute) {
baseRule = shardingRule;
this.sqlStatement = sqlStatement;
sqlTokens = createSQLTokens(shardingRule, sqlStatement);
sqlTokens = createSQLTokens(shardingRule, sqlStatement, isSingleRoute);
sqlBuilder = new SQLBuilder();
parameterBuilder = new ParameterBuilder(parameters);
baseSQLRewriter = new BaseSQLRewriter(sqlStatement, sqlTokens);
......@@ -74,7 +74,7 @@ public final class SQLRewriteEngine {
public SQLRewriteEngine(final EncryptRule encryptRule, final SQLStatement sqlStatement, final List<Object> parameters) {
baseRule = encryptRule;
this.sqlStatement = sqlStatement;
sqlTokens = createSQLTokens(encryptRule, sqlStatement);
sqlTokens = createSQLTokens(encryptRule, sqlStatement, true);
sqlBuilder = new SQLBuilder();
parameterBuilder = new ParameterBuilder(parameters);
baseSQLRewriter = new BaseSQLRewriter(sqlStatement, sqlTokens);
......@@ -83,23 +83,23 @@ public final class SQLRewriteEngine {
public SQLRewriteEngine(final SQLStatement sqlStatement) {
baseRule = null;
this.sqlStatement = sqlStatement;
sqlTokens = createSQLTokens(null, sqlStatement);
sqlTokens = createSQLTokens(null, sqlStatement, true);
sqlBuilder = new SQLBuilder();
parameterBuilder = new ParameterBuilder(Collections.emptyList());
baseSQLRewriter = new BaseSQLRewriter(sqlStatement, sqlTokens);
}
private List<SQLToken> createSQLTokens(final BaseRule baseRule, final SQLStatement sqlStatement) {
private List<SQLToken> createSQLTokens(final BaseRule baseRule, final SQLStatement sqlStatement, final boolean isSingleRoute) {
List<SQLToken> result = new LinkedList<>(sqlStatement.getSQLTokens());
result.addAll(new BaseTokenGenerateEngine().generateSQLTokens(sqlStatement, baseRule));
result.addAll(new BaseTokenGenerateEngine().generateSQLTokens(sqlStatement, baseRule, isSingleRoute));
if (baseRule instanceof ShardingRule) {
ShardingRule shardingRule = (ShardingRule) baseRule;
result.addAll(new ShardingTokenGenerateEngine().generateSQLTokens(sqlStatement, shardingRule));
result.addAll(new EncryptTokenGenerateEngine().generateSQLTokens(sqlStatement, shardingRule.getEncryptRule()));
result.addAll(new ShardingTokenGenerateEngine().generateSQLTokens(sqlStatement, shardingRule, isSingleRoute));
result.addAll(new EncryptTokenGenerateEngine().generateSQLTokens(sqlStatement, shardingRule.getEncryptRule(), isSingleRoute));
} else if (baseRule instanceof EncryptRule) {
result.addAll(new EncryptTokenGenerateEngine().generateSQLTokens(sqlStatement, (EncryptRule) baseRule));
result.addAll(new EncryptTokenGenerateEngine().generateSQLTokens(sqlStatement, (EncryptRule) baseRule, isSingleRoute));
} else {
result.addAll(new MasterSlaveTokenGenerateEngine().generateSQLTokens(sqlStatement, null));
result.addAll(new MasterSlaveTokenGenerateEngine().generateSQLTokens(sqlStatement, null, isSingleRoute));
}
Collections.sort(result);
return result;
......
......@@ -21,6 +21,7 @@ import com.google.common.base.Optional;
import org.apache.shardingsphere.core.parse.sql.statement.SQLStatement;
import org.apache.shardingsphere.core.parse.sql.token.SQLToken;
import org.apache.shardingsphere.core.rewrite.token.generator.CollectionSQLTokenGenerator;
import org.apache.shardingsphere.core.rewrite.token.generator.IgnoreForSingleRoute;
import org.apache.shardingsphere.core.rewrite.token.generator.OptionalSQLTokenGenerator;
import org.apache.shardingsphere.core.rewrite.token.generator.SQLTokenGenerator;
import org.apache.shardingsphere.core.rule.BaseRule;
......@@ -43,12 +44,16 @@ public abstract class SQLTokenGenerateEngine<T extends BaseRule> {
*
* @param sqlStatement SQL statement
* @param rule rule
* @param isSingleRoute is single route
* @return SQL tokens
*/
@SuppressWarnings("unchecked")
public final List<SQLToken> generateSQLTokens(final SQLStatement sqlStatement, final T rule) {
public final List<SQLToken> generateSQLTokens(final SQLStatement sqlStatement, final T rule, final boolean isSingleRoute) {
List<SQLToken> result = new LinkedList<>();
for (SQLTokenGenerator each : getSQLTokenGenerators()) {
if (isSingleRoute && each instanceof IgnoreForSingleRoute) {
continue;
}
if (each instanceof OptionalSQLTokenGenerator) {
Optional<? extends SQLToken> sqlToken = ((OptionalSQLTokenGenerator) each).generateSQLToken(sqlStatement, rule);
if (sqlToken.isPresent()) {
......@@ -60,5 +65,6 @@ public abstract class SQLTokenGenerateEngine<T extends BaseRule> {
}
return result;
}
protected abstract Collection<SQLTokenGenerator> getSQLTokenGenerators();
}
/*
* 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.core.rewrite.token.generator;
/**
* Ignore for single route.
*
* @author zhangliang
*/
public interface IgnoreForSingleRoute {
}
......@@ -30,7 +30,7 @@ import org.apache.shardingsphere.core.rule.ShardingRule;
*
* @author panjuan
*/
public final class OffsetTokenGenerator implements OptionalSQLTokenGenerator<ShardingRule> {
public final class OffsetTokenGenerator implements OptionalSQLTokenGenerator<ShardingRule>, IgnoreForSingleRoute {
@Override
public Optional<OffsetToken> generateSQLToken(final SQLStatement sqlStatement, final ShardingRule shardingRule) {
......
......@@ -30,7 +30,7 @@ import org.apache.shardingsphere.core.rule.ShardingRule;
*
* @author panjuan
*/
public final class RowCountTokenGenerator implements OptionalSQLTokenGenerator<ShardingRule> {
public final class RowCountTokenGenerator implements OptionalSQLTokenGenerator<ShardingRule>, IgnoreForSingleRoute {
@Override
public Optional<RowCountToken> generateSQLToken(final SQLStatement sqlStatement, final ShardingRule shardingRule) {
......
......@@ -538,7 +538,7 @@ public final class ShardingSQLRewriterTest {
routeResult = new SQLRouteResult(selectStatement);
routeResult.setRoutingResult(new RoutingResult());
selectStatement.setLogicSQL("SELECT table_x.id, x.name FROM table_x x, table_y y WHERE table_x.id=? AND x.name=?");
SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule, routeResult.getSqlStatement(), parameters);
SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule, routeResult.getSqlStatement(), parameters, routeResult.getRoutingResult().isSingleRouting());
rewriteEngine.init(
new ShardingSQLRewriter(shardingRule, DatabaseType.MySQL, routeResult, null),
new EncryptSQLRewriter(shardingRule.getEncryptRule().getEncryptorEngine(), routeResult.getSqlStatement(), routeResult.getOptimizeResult()));
......@@ -901,7 +901,7 @@ public final class ShardingSQLRewriterTest {
}
private SQLRewriteEngine createSQLRewriteEngine(final DatabaseType databaseType, final List<Object> parameters) {
SQLRewriteEngine result = new SQLRewriteEngine(shardingRule, routeResult.getSqlStatement(), parameters);
SQLRewriteEngine result = new SQLRewriteEngine(shardingRule, routeResult.getSqlStatement(), parameters, routeResult.getRoutingResult().isSingleRouting());
result.init(
new ShardingSQLRewriter(shardingRule, databaseType, routeResult, routeResult.getOptimizeResult()),
new EncryptSQLRewriter(shardingRule.getEncryptRule().getEncryptorEngine(), routeResult.getSqlStatement(), routeResult.getOptimizeResult()));
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册