未验证 提交 004df46f 编写于 作者: L Liang Zhang 提交者: GitHub

Add ShardingConditionEngine (#7690)

上级 f40a2b4b
......@@ -26,8 +26,9 @@ import org.apache.shardingsphere.infra.sql.LogicSQL;
import org.apache.shardingsphere.sharding.constant.ShardingOrder;
import org.apache.shardingsphere.sharding.route.engine.condition.ShardingCondition;
import org.apache.shardingsphere.sharding.route.engine.condition.ShardingConditions;
import org.apache.shardingsphere.sharding.route.engine.condition.engine.InsertClauseShardingConditionEngine;
import org.apache.shardingsphere.sharding.route.engine.condition.engine.WhereClauseShardingConditionEngine;
import org.apache.shardingsphere.sharding.route.engine.condition.engine.ShardingConditionEngine;
import org.apache.shardingsphere.sharding.route.engine.condition.engine.impl.InsertClauseShardingConditionEngine;
import org.apache.shardingsphere.sharding.route.engine.condition.engine.impl.WhereClauseShardingConditionEngine;
import org.apache.shardingsphere.sharding.route.engine.type.ShardingRouteEngineFactory;
import org.apache.shardingsphere.sharding.route.engine.validator.ShardingStatementValidator;
import org.apache.shardingsphere.sharding.route.engine.validator.ShardingStatementValidatorFactory;
......@@ -61,8 +62,7 @@ public final class ShardingSQLRouter implements SQLRouter<ShardingRule> {
SQLStatement sqlStatement = logicSQL.getSqlStatementContext().getSqlStatement();
Optional<ShardingStatementValidator> validator = ShardingStatementValidatorFactory.newInstance(sqlStatement);
validator.ifPresent(v -> v.preValidate(rule, logicSQL.getSqlStatementContext(), logicSQL.getParameters(), logicSQL.getSchema().getMetaData()));
ShardingConditions shardingConditions = getShardingConditions(
logicSQL.getParameters(), logicSQL.getSqlStatementContext(), logicSQL.getSchema().getMetaData().getRuleSchemaMetaData().getConfiguredSchemaMetaData(), rule);
ShardingConditions shardingConditions = getShardingConditions(logicSQL, rule);
boolean needMergeShardingValues = isNeedMergeShardingValues(logicSQL.getSqlStatementContext(), rule);
if (sqlStatement instanceof DMLStatement && needMergeShardingValues) {
checkSubqueryShardingValues(logicSQL.getSqlStatementContext(), rule, shardingConditions);
......@@ -73,15 +73,22 @@ public final class ShardingSQLRouter implements SQLRouter<ShardingRule> {
return result;
}
private ShardingConditions getShardingConditions(final List<Object> parameters,
final SQLStatementContext<?> sqlStatementContext, final SchemaMetaData schemaMetaData, final ShardingRule rule) {
if (sqlStatementContext.getSqlStatement() instanceof DMLStatement) {
if (sqlStatementContext instanceof InsertStatementContext) {
return new ShardingConditions(new InsertClauseShardingConditionEngine(rule, schemaMetaData).createShardingConditions((InsertStatementContext) sqlStatementContext, parameters));
}
return new ShardingConditions(new WhereClauseShardingConditionEngine(rule, schemaMetaData).createShardingConditions(sqlStatementContext, parameters));
@SuppressWarnings({"rawtypes", "unchecked"})
private ShardingConditions getShardingConditions(final LogicSQL logicSQL, final ShardingRule rule) {
List<ShardingCondition> shardingConditions;
if (logicSQL.getSqlStatementContext().getSqlStatement() instanceof DMLStatement) {
ShardingConditionEngine shardingConditionEngine = createShardingConditionEngine(logicSQL, rule);
shardingConditions = shardingConditionEngine.createShardingConditions(logicSQL.getSqlStatementContext(), logicSQL.getParameters());
} else {
shardingConditions = Collections.emptyList();
}
return new ShardingConditions(Collections.emptyList());
return new ShardingConditions(shardingConditions);
}
private ShardingConditionEngine<?> createShardingConditionEngine(final LogicSQL logicSQL, final ShardingRule rule) {
SchemaMetaData schemaMetaData = logicSQL.getSchema().getMetaData().getRuleSchemaMetaData().getConfiguredSchemaMetaData();
return logicSQL.getSqlStatementContext() instanceof InsertStatementContext
? new InsertClauseShardingConditionEngine(rule, schemaMetaData) : new WhereClauseShardingConditionEngine(rule, schemaMetaData);
}
private boolean isNeedMergeShardingValues(final SQLStatementContext<?> sqlStatementContext, final ShardingRule rule) {
......
/*
* 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.sharding.route.engine.condition.engine;
import org.apache.shardingsphere.sharding.route.engine.condition.ShardingCondition;
import org.apache.shardingsphere.sql.parser.binder.statement.SQLStatementContext;
import java.util.List;
/**
* Sharding condition engine.
*/
public interface ShardingConditionEngine<T extends SQLStatementContext<?>> {
/**
* Create sharding conditions.
*
* @param sqlStatementContext SQL statement context
* @param parameters SQL parameters
* @return sharding conditions
*/
List<ShardingCondition> createShardingConditions(T sqlStatementContext, List<Object> parameters);
}
......@@ -15,13 +15,14 @@
* limitations under the License.
*/
package org.apache.shardingsphere.sharding.route.engine.condition.engine;
package org.apache.shardingsphere.sharding.route.engine.condition.engine.impl;
import com.google.common.base.Preconditions;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.infra.exception.ShardingSphereException;
import org.apache.shardingsphere.sharding.route.engine.condition.ExpressionConditionUtils;
import org.apache.shardingsphere.sharding.route.engine.condition.ShardingCondition;
import org.apache.shardingsphere.sharding.route.engine.condition.engine.ShardingConditionEngine;
import org.apache.shardingsphere.sharding.route.spi.SPITimeService;
import org.apache.shardingsphere.sharding.rule.ShardingRule;
import org.apache.shardingsphere.sharding.strategy.value.ListRouteValue;
......@@ -48,19 +49,13 @@ import java.util.stream.IntStream;
* Sharding condition engine for insert clause.
*/
@RequiredArgsConstructor
public final class InsertClauseShardingConditionEngine {
public final class InsertClauseShardingConditionEngine implements ShardingConditionEngine<InsertStatementContext> {
private final ShardingRule shardingRule;
private final SchemaMetaData schemaMetaData;
/**
* Create sharding conditions.
*
* @param insertStatementContext insert statement context
* @param parameters SQL parameters
* @return sharding conditions
*/
@Override
public List<ShardingCondition> createShardingConditions(final InsertStatementContext insertStatementContext, final List<Object> parameters) {
List<ShardingCondition> result = new LinkedList<>();
String tableName = insertStatementContext.getSqlStatement().getTable().getTableName().getIdentifier().getValue();
......
......@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.apache.shardingsphere.sharding.route.engine.condition.engine;
package org.apache.shardingsphere.sharding.route.engine.condition.engine.impl;
import com.google.common.collect.Range;
import lombok.RequiredArgsConstructor;
......@@ -24,6 +24,7 @@ import org.apache.shardingsphere.sharding.route.engine.condition.AlwaysFalseRout
import org.apache.shardingsphere.sharding.route.engine.condition.AlwaysFalseShardingCondition;
import org.apache.shardingsphere.sharding.route.engine.condition.Column;
import org.apache.shardingsphere.sharding.route.engine.condition.ShardingCondition;
import org.apache.shardingsphere.sharding.route.engine.condition.engine.ShardingConditionEngine;
import org.apache.shardingsphere.sharding.route.engine.condition.generator.ConditionValueGeneratorFactory;
import org.apache.shardingsphere.sharding.rule.ShardingRule;
import org.apache.shardingsphere.sharding.strategy.value.ListRouteValue;
......@@ -56,19 +57,13 @@ import java.util.Optional;
* Sharding condition engine for where clause.
*/
@RequiredArgsConstructor
public final class WhereClauseShardingConditionEngine {
public final class WhereClauseShardingConditionEngine implements ShardingConditionEngine<SQLStatementContext<?>> {
private final ShardingRule shardingRule;
private final SchemaMetaData schemaMetaData;
/**
* Create sharding conditions.
*
* @param sqlStatementContext SQL statement context
* @param parameters SQL parameters
* @return sharding conditions
*/
@Override
public List<ShardingCondition> createShardingConditions(final SQLStatementContext<?> sqlStatementContext, final List<Object> parameters) {
if (!(sqlStatementContext instanceof WhereAvailable)) {
return Collections.emptyList();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册