Commit 3e58d4cf authored by terrymanu's avatar terrymanu
Browse files

for #2084, split OrPredicateFiller & WhereFiller

parent 32942aaf
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@ import java.util.Map;
 * Predicate extractor.
 *
 * @author duhongjun
 * @author zhangliang
 */
public final class PredicateExtractor implements OptionalSQLSegmentExtractor {
    
@@ -55,8 +56,14 @@ public final class PredicateExtractor implements OptionalSQLSegmentExtractor {
    private final ColumnExtractor columnExtractor = new ColumnExtractor();
    
    @Override
    public Optional<OrPredicateSegment> extract(final ParserRuleContext exprNode, final Map<ParserRuleContext, Integer> parameterMarkerIndexes) {
        return extractRecursiveWithLogicalOperation(exprNode, parameterMarkerIndexes);
    public Optional<OrPredicateSegment> extract(final ParserRuleContext ancestorNode, final Map<ParserRuleContext, Integer> parameterMarkerIndexes) {
        Optional<ParserRuleContext> whereNode = ExtractorUtils.findFirstChildNode(ancestorNode, RuleName.WHERE_CLAUSE);
        if (!whereNode.isPresent()) {
            return Optional.absent();
        }
        Optional<ParserRuleContext> exprNode = ExtractorUtils.findFirstChildNode((ParserRuleContext) whereNode.get().getChild(1), RuleName.EXPR);
        Preconditions.checkState(exprNode.isPresent());
        return extractRecursiveWithLogicalOperation(exprNode.get(), parameterMarkerIndexes);
    }
    
    private Optional<OrPredicateSegment> extractRecursiveWithLogicalOperation(final ParserRuleContext exprNode, final Map<ParserRuleContext, Integer> parameterMarkerIndexes) {
+0 −12
Original line number Diff line number Diff line
@@ -23,7 +23,6 @@ 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.predicate.OrPredicateSegment;

import java.util.Collection;
import java.util.Map;
@@ -36,18 +35,12 @@ import java.util.Map;
 */
public final class WhereExtractor implements OptionalSQLSegmentExtractor {
    
    private final PredicateExtractor predicateExtractor = new PredicateExtractor();
    
    @Override
    public Optional<WhereSegment> extract(final ParserRuleContext ancestorNode, final Map<ParserRuleContext, Integer> parameterMarkerIndexes) {
        WhereSegment result = new WhereSegment(parameterMarkerIndexes.size());
        Optional<ParserRuleContext> whereNode = ExtractorUtils.findFirstChildNode(ancestorNode, RuleName.WHERE_CLAUSE);
        if (whereNode.isPresent()) {
            setPropertiesForRevert(result, whereNode.get(), parameterMarkerIndexes);
            Optional<OrPredicateSegment> orConditionSegment = extractOrConditionSegment(whereNode.get(), parameterMarkerIndexes);
            if (orConditionSegment.isPresent()) {
                result.getOrPredicate().getAndPredicates().addAll(orConditionSegment.get().getAndPredicates());
            }
        }
        return Optional.of(result);
    }
@@ -66,9 +59,4 @@ public final class WhereExtractor implements OptionalSQLSegmentExtractor {
        whereSegment.setWhereParameterStartIndex(whereParameterStartIndex);
        whereSegment.setWhereParameterEndIndex(whereParameterStartIndex + parameterMarkerNodes.size() - 1);
    }
    
    private Optional<OrPredicateSegment> extractOrConditionSegment(final ParserRuleContext whereNode, final Map<ParserRuleContext, Integer> parameterMarkerIndexes) {
        Optional<ParserRuleContext> exprNode = ExtractorUtils.findFirstChildNode((ParserRuleContext) whereNode.getChild(1), RuleName.EXPR);
        return exprNode.isPresent() ? predicateExtractor.extract(exprNode.get(), parameterMarkerIndexes) : Optional.<OrPredicateSegment>absent();
    }
}
+6 −6
Original line number Diff line number Diff line
@@ -20,10 +20,10 @@ package org.apache.shardingsphere.core.parse.antlr.extractor.impl.dml.select;
import com.google.common.base.Optional;
import org.antlr.v4.runtime.ParserRuleContext;
import org.apache.shardingsphere.core.parse.antlr.extractor.api.OptionalSQLSegmentExtractor;
import org.apache.shardingsphere.core.parse.antlr.extractor.impl.dml.WhereExtractor;
import org.apache.shardingsphere.core.parse.antlr.extractor.impl.dml.PredicateExtractor;
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.predicate.OrPredicateSegment;
import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.predicate.SubqueryPredicateSegment;

import java.util.Collection;
@@ -36,16 +36,16 @@ import java.util.Map;
 */
public final class SubqueryPredicateExtractor implements OptionalSQLSegmentExtractor {
    
    private final WhereExtractor whereExtractor = new WhereExtractor();
    private final PredicateExtractor predicateExtractor = new PredicateExtractor();
    
    @Override
    public Optional<SubqueryPredicateSegment> extract(final ParserRuleContext ancestorNode, final Map<ParserRuleContext, Integer> parameterMarkerIndexes) {
        Collection<ParserRuleContext> subqueryNodes = ExtractorUtils.getAllDescendantNodes(ancestorNode, RuleName.SUBQUERY);
        SubqueryPredicateSegment result = new SubqueryPredicateSegment();
        for (ParserRuleContext each : subqueryNodes) {
            Optional<WhereSegment> whereSegment = whereExtractor.extract(each, parameterMarkerIndexes);
            if (whereSegment.isPresent()) {
                result.getOrPredicates().add(whereSegment.get().getOrPredicate());
            Optional<OrPredicateSegment> orPredicateSegment = predicateExtractor.extract(each, parameterMarkerIndexes);
            if (orPredicateSegment.isPresent()) {
                result.getOrPredicates().add(orPredicateSegment.get());
            }
        }
        return Optional.of(result);
+7 −5
Original line number Diff line number Diff line
@@ -18,10 +18,12 @@
package org.apache.shardingsphere.core.parse.antlr.filler.encrypt.dml;

import com.google.common.base.Optional;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
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.EncryptRuleAwareFiller;
import org.apache.shardingsphere.core.parse.antlr.filler.api.SQLSegmentFiller;
import org.apache.shardingsphere.core.parse.antlr.filler.api.ShardingTableMetaDataAwareFiller;
import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.predicate.AndPredicateSegment;
import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.predicate.OrPredicateSegment;
import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.predicate.PredicateSegment;
@@ -42,12 +44,12 @@ import java.util.HashSet;
 *
 * @author duhongjun
 */
@RequiredArgsConstructor
public final class EncryptOrPredicateFiller implements SQLSegmentFiller<OrPredicateSegment> {
@Setter
public final class EncryptOrPredicateFiller implements SQLSegmentFiller<OrPredicateSegment>, EncryptRuleAwareFiller, ShardingTableMetaDataAwareFiller {
    
    private final EncryptRule encryptRule;
    private EncryptRule encryptRule;
    
    private final ShardingTableMetaData shardingTableMetaData;
    private ShardingTableMetaData shardingTableMetaData;
    
    @Override
    public void fill(final OrPredicateSegment sqlSegment, final SQLStatement sqlStatement) {
+1 −12
Original line number Diff line number Diff line
@@ -17,31 +17,20 @@

package org.apache.shardingsphere.core.parse.antlr.filler.encrypt.dml;

import lombok.Setter;
import org.apache.shardingsphere.core.metadata.table.ShardingTableMetaData;
import org.apache.shardingsphere.core.parse.antlr.filler.api.EncryptRuleAwareFiller;
import org.apache.shardingsphere.core.parse.antlr.filler.api.SQLSegmentFiller;
import org.apache.shardingsphere.core.parse.antlr.filler.api.ShardingTableMetaDataAwareFiller;
import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.WhereSegment;
import org.apache.shardingsphere.core.parse.antlr.sql.statement.SQLStatement;
import org.apache.shardingsphere.core.parse.antlr.sql.statement.dml.DeleteStatement;
import org.apache.shardingsphere.core.rule.EncryptRule;

/**
 * Where filler for encrypt.
 *
 * @author duhongjun
 */
@Setter
public final class EncryptWhereFiller implements SQLSegmentFiller<WhereSegment>, EncryptRuleAwareFiller, ShardingTableMetaDataAwareFiller {
    
    private EncryptRule encryptRule;
    
    private ShardingTableMetaData shardingTableMetaData;
public final class EncryptWhereFiller implements SQLSegmentFiller<WhereSegment> {
    
    @Override
    public void fill(final WhereSegment sqlSegment, final SQLStatement sqlStatement) {
        new EncryptOrPredicateFiller(encryptRule, shardingTableMetaData).fill(sqlSegment.getOrPredicate(), sqlStatement);
        sqlStatement.setParametersIndex(sqlSegment.getParameterCount());
        if (sqlStatement instanceof DeleteStatement) {
            DeleteStatement deleteStatement = (DeleteStatement) sqlStatement;
Loading