Commit f904789a authored by terrymanu's avatar terrymanu
Browse files

for #2084, OrPredicateSegment => OrConditionSegment

parent ed2e0518
Loading
Loading
Loading
Loading
+14 −14
Original line number Diff line number Diff line
@@ -28,7 +28,7 @@ import org.apache.shardingsphere.core.parse.antlr.extractor.util.ExtractorUtils;
import org.apache.shardingsphere.core.parse.antlr.extractor.util.RuleName;
import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.column.ColumnSegment;
import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.condition.AndPredicateSegment;
import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.condition.OrConditionSegment;
import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.condition.OrPredicateSegment;
import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.condition.PredicateSegment;
import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.expr.BetweenValueExpressionSegment;
import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.expr.CompareValueExpressionSegment;
@@ -59,19 +59,19 @@ public final class PredicateExtractor {
     * @param exprNode expression node of AST
     * @return or condition
     */
    public Optional<OrConditionSegment> extract(final Map<ParserRuleContext, Integer> parameterMarkerIndexes, final ParserRuleContext exprNode) {
    public Optional<OrPredicateSegment> extract(final Map<ParserRuleContext, Integer> parameterMarkerIndexes, final ParserRuleContext exprNode) {
        return extractConditionInternal(parameterMarkerIndexes, exprNode);
    }
    
    private Optional<OrConditionSegment> extractConditionInternal(final Map<ParserRuleContext, Integer> parameterMarkerIndexes, final ParserRuleContext exprNode) {
    private Optional<OrPredicateSegment> extractConditionInternal(final Map<ParserRuleContext, Integer> parameterMarkerIndexes, final ParserRuleContext exprNode) {
        Optional<Integer> index = getLogicalOperatorIndex(exprNode);
        if (!index.isPresent()) {
            return extractConditionForParen(parameterMarkerIndexes, exprNode);
        }
        Optional<OrConditionSegment> leftOrCondition = extractConditionInternal(parameterMarkerIndexes, (ParserRuleContext) exprNode.getChild(index.get() - 1));
        Optional<OrConditionSegment> rightOrCondition = extractConditionInternal(parameterMarkerIndexes, (ParserRuleContext) exprNode.getChild(index.get() + 1));
        Optional<OrPredicateSegment> leftOrCondition = extractConditionInternal(parameterMarkerIndexes, (ParserRuleContext) exprNode.getChild(index.get() - 1));
        Optional<OrPredicateSegment> rightOrCondition = extractConditionInternal(parameterMarkerIndexes, (ParserRuleContext) exprNode.getChild(index.get() + 1));
        if (leftOrCondition.isPresent() && rightOrCondition.isPresent()) {
            return Optional.of(mergeCondition(leftOrCondition.get(), rightOrCondition.get(), exprNode.getChild(index.get()).getText()));
            return Optional.of(mergePredicate(leftOrCondition.get(), rightOrCondition.get(), exprNode.getChild(index.get()).getText()));
        }
        return leftOrCondition.isPresent() ? leftOrCondition : rightOrCondition;
    }
@@ -85,7 +85,7 @@ public final class PredicateExtractor {
        return Optional.absent();
    }
    
    private Optional<OrConditionSegment> extractConditionForParen(final Map<ParserRuleContext, Integer> parameterMarkerIndexes, final ParserRuleContext exprNode) {
    private Optional<OrPredicateSegment> extractConditionForParen(final Map<ParserRuleContext, Integer> parameterMarkerIndexes, final ParserRuleContext exprNode) {
        Optional<Integer> index = getLeftParenIndex(exprNode);
        if (index.isPresent()) {
            if (RuleName.EXPR.getName().equals(exprNode.getChild(index.get() + 1).getClass().getSimpleName())) {
@@ -97,7 +97,7 @@ public final class PredicateExtractor {
        if (!predicate.isPresent()) {
            return Optional.absent();
        }
        OrConditionSegment result = new OrConditionSegment();
        OrPredicateSegment result = new OrPredicateSegment();
        AndPredicateSegment newAndPredicate = new AndPredicateSegment();
        newAndPredicate.getPredicates().add(predicate.get());
        result.getAndPredicates().add(newAndPredicate);
@@ -192,14 +192,14 @@ public final class PredicateExtractor {
        return result;
    }
    
    private OrConditionSegment mergeCondition(final OrConditionSegment leftOrCondition, final OrConditionSegment rightOrCondition, final String operator) {
    private OrPredicateSegment mergePredicate(final OrPredicateSegment leftOrPredicate, final OrPredicateSegment rightOrPredicate, final String operator) {
        if (LogicalOperator.isOrOperator(operator)) {
            leftOrCondition.getAndPredicates().addAll(rightOrCondition.getAndPredicates());
            return leftOrCondition;
            leftOrPredicate.getAndPredicates().addAll(rightOrPredicate.getAndPredicates());
            return leftOrPredicate;
        }
        OrConditionSegment result = new OrConditionSegment();
        for (AndPredicateSegment each : leftOrCondition.getAndPredicates()) {
            for (AndPredicateSegment eachRightOr : rightOrCondition.getAndPredicates()) {
        OrPredicateSegment result = new OrPredicateSegment();
        for (AndPredicateSegment each : leftOrPredicate.getAndPredicates()) {
            for (AndPredicateSegment eachRightOr : rightOrPredicate.getAndPredicates()) {
                AndPredicateSegment tempList = new AndPredicateSegment();
                tempList.getPredicates().addAll(each.getPredicates());
                tempList.getPredicates().addAll(eachRightOr.getPredicates());
+5 −5
Original line number Diff line number Diff line
@@ -23,7 +23,7 @@ import org.apache.shardingsphere.core.parse.antlr.extractor.api.OptionalSQLSegme
import org.apache.shardingsphere.core.parse.antlr.extractor.util.ExtractorUtils;
import org.apache.shardingsphere.core.parse.antlr.extractor.util.RuleName;
import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.WhereSegment;
import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.condition.OrConditionSegment;
import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.condition.OrPredicateSegment;

import java.util.Collection;
import java.util.Map;
@@ -45,9 +45,9 @@ public final class WhereExtractor implements OptionalSQLSegmentExtractor {
        Optional<ParserRuleContext> whereNode = ExtractorUtils.findFirstChildNodeNoneRecursive(ancestorNode, RuleName.WHERE_CLAUSE);
        if (whereNode.isPresent()) {
            setPropertiesForRevert(result, parameterMarkerIndexes, whereNode.get());
            Optional<OrConditionSegment> orConditionSegment = extractOrConditionSegment(parameterMarkerIndexes, whereNode.get());
            Optional<OrPredicateSegment> orConditionSegment = extractOrConditionSegment(parameterMarkerIndexes, whereNode.get());
            if (orConditionSegment.isPresent()) {
                result.getConditions().getAndPredicates().addAll(orConditionSegment.get().getAndPredicates());
                result.getOrPredicate().getAndPredicates().addAll(orConditionSegment.get().getAndPredicates());
            }
        }
        return Optional.of(result);
@@ -68,8 +68,8 @@ public final class WhereExtractor implements OptionalSQLSegmentExtractor {
        whereSegment.setWhereParameterEndIndex(whereParameterStartIndex + questionNodes.size() - 1);
    }
    
    private Optional<OrConditionSegment> extractOrConditionSegment(final Map<ParserRuleContext, Integer> parameterMarkerIndexes, final ParserRuleContext whereNode) {
    private Optional<OrPredicateSegment> extractOrConditionSegment(final Map<ParserRuleContext, Integer> parameterMarkerIndexes, final ParserRuleContext whereNode) {
        Optional<ParserRuleContext> exprNode = ExtractorUtils.findFirstChildNode((ParserRuleContext) whereNode.getChild(1), RuleName.EXPR);
        return exprNode.isPresent() ? predicateExtractor.extract(parameterMarkerIndexes, exprNode.get()) : Optional.<OrConditionSegment>absent();
        return exprNode.isPresent() ? predicateExtractor.extract(parameterMarkerIndexes, exprNode.get()) : Optional.<OrPredicateSegment>absent();
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -44,7 +44,7 @@ public final class SubqueryConditionExtractor implements OptionalSQLSegmentExtra
        for (ParserRuleContext each : suQueryNodes) {
            Optional<WhereSegment> condition = selectWhereExtractor.extract(each, parameterMarkerIndexes);
            if (condition.isPresent()) {
                result.getOrConditions().add(condition.get().getConditions());
                result.getOrPredicates().add(condition.get().getOrPredicate());
            }
        }
        return Optional.of(result);
+6 −6
Original line number Diff line number Diff line
@@ -23,7 +23,7 @@ import org.apache.shardingsphere.core.metadata.table.ShardingTableMetaData;
import org.apache.shardingsphere.core.metadata.table.TableMetaData;
import org.apache.shardingsphere.core.parse.antlr.filler.api.SQLSegmentFiller;
import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.condition.AndPredicateSegment;
import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.condition.OrConditionSegment;
import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.condition.OrPredicateSegment;
import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.condition.PredicateSegment;
import org.apache.shardingsphere.core.parse.antlr.sql.statement.SQLStatement;
import org.apache.shardingsphere.core.parse.antlr.sql.statement.dml.SelectStatement;
@@ -47,18 +47,18 @@ import java.util.Set;
 * @author duhongjun
 */
@RequiredArgsConstructor
public class EncryptOrConditionFiller implements SQLSegmentFiller<OrConditionSegment> {
public class EncryptOrConditionFiller implements SQLSegmentFiller<OrPredicateSegment> {
    
    private final EncryptRule encryptRule;
    
    private final ShardingTableMetaData shardingTableMetaData;
    
    @Override
    public void fill(final OrConditionSegment sqlSegment, final SQLStatement sqlStatement) {
    public void fill(final OrPredicateSegment sqlSegment, final SQLStatement sqlStatement) {
        Map<String, String> columnNameToTable = new HashMap<>();
        Map<String, Integer> columnNameCount = new HashMap<>();
        fillColumnTableMap(sqlStatement, columnNameToTable, columnNameCount);
        filterCondition(sqlStatement, sqlSegment);
        filterPredicate(sqlStatement, sqlSegment);
    }
    
    private void fillColumnTableMap(final SQLStatement sqlStatement, final Map<String, String> columnNameToTable, final Map<String, Integer> columnNameCount) {
@@ -80,10 +80,10 @@ public class EncryptOrConditionFiller implements SQLSegmentFiller<OrConditionSeg
        }
    }
    
    private OrCondition filterCondition(final SQLStatement sqlStatement, final OrConditionSegment orCondition) {
    private OrCondition filterPredicate(final SQLStatement sqlStatement, final OrPredicateSegment orPredicate) {
        OrCondition result = new OrCondition();
        Set<Integer> filledConditionStopIndexes = new HashSet<>();
        for (AndPredicateSegment each : orCondition.getAndPredicates()) {
        for (AndPredicateSegment each : orPredicate.getAndPredicates()) {
            for (PredicateSegment predicate : each.getPredicates()) {
                if (null == predicate.getColumn()) {
                    continue;
+1 −1
Original line number Diff line number Diff line
@@ -43,7 +43,7 @@ public class EncryptWhereFiller implements SQLSegmentFiller<WhereSegment>, Encry
    
    @Override
    public void fill(final WhereSegment sqlSegment, final SQLStatement sqlStatement) {
        new EncryptOrConditionFiller(encryptRule, shardingTableMetaData).fill(sqlSegment.getConditions(), sqlStatement);
        new EncryptOrConditionFiller(encryptRule, shardingTableMetaData).fill(sqlSegment.getOrPredicate(), sqlStatement);
        sqlStatement.setParametersIndex(sqlSegment.getParameterCount());
        if (sqlStatement instanceof DeleteStatement) {
            DeleteStatement deleteStatement = (DeleteStatement) sqlStatement;
Loading