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

refactor PredicateExtractor

parent 9813b34c
Loading
Loading
Loading
Loading
+30 −44
Original line number Diff line number Diff line
@@ -78,36 +78,29 @@ public final class PredicateExtractor implements OptionalSQLSegmentExtractor {
        if (index > 0) {
            Optional<OrConditionSegment> leftOrCondition = extractCondition(questionNodeIndexMap, (ParserRuleContext) exprNode.getChild(index - 1));
            Optional<OrConditionSegment> rightOrCondition = extractCondition(questionNodeIndexMap, (ParserRuleContext) exprNode.getChild(index + 1));
            return mergeCondition(leftOrCondition, rightOrCondition, exprNode.getChild(index).getText());
        } else {
            return extractConditionForParen(questionNodeIndexMap, exprNode);
        }
    }
    
    private Optional<OrConditionSegment> mergeCondition(final Optional<OrConditionSegment> leftOrCondition, final Optional<OrConditionSegment> rightOrCondition, final String operator) {
        if (!leftOrCondition.isPresent() && !rightOrCondition.isPresent()) {
            return Optional.absent();
            if (leftOrCondition.isPresent() && rightOrCondition.isPresent()) {
                return Optional.of(mergeCondition(leftOrCondition.get(), rightOrCondition.get(), exprNode.getChild(index).getText()));
            }
        if (leftOrCondition.isPresent() && !rightOrCondition.isPresent()) {
            return leftOrCondition;
            return leftOrCondition.isPresent() ? leftOrCondition : rightOrCondition;
        }
        if (rightOrCondition.isPresent() && !leftOrCondition.isPresent()) {
            return rightOrCondition;
        return extractConditionForParen(questionNodeIndexMap, exprNode);
    }
    
    private OrConditionSegment mergeCondition(final OrConditionSegment leftOrCondition, final OrConditionSegment rightOrCondition, final String operator) {
        if (LogicalOperator.isOrOperator(operator)) {
            leftOrCondition.get().getAndConditions().addAll(rightOrCondition.get().getAndConditions());
            leftOrCondition.getAndConditions().addAll(rightOrCondition.getAndConditions());
            return leftOrCondition;
        }
        OrConditionSegment result = new OrConditionSegment();
        for (AndConditionSegment each : leftOrCondition.get().getAndConditions()) {
            for (AndConditionSegment eachRightOr : rightOrCondition.get().getAndConditions()) {
        for (AndConditionSegment each : leftOrCondition.getAndConditions()) {
            for (AndConditionSegment eachRightOr : rightOrCondition.getAndConditions()) {
                AndConditionSegment tempList = new AndConditionSegment();
                tempList.getConditions().addAll(each.getConditions());
                tempList.getConditions().addAll(eachRightOr.getConditions());
                result.getAndConditions().add(tempList);
            }
        }
        return Optional.of(result);
        return result;
    }
    
    private Optional<OrConditionSegment> extractConditionForParen(final Map<ParserRuleContext, Integer> questionNodeIndexMap, final ParserRuleContext exprNode) {
@@ -126,15 +119,15 @@ public final class PredicateExtractor implements OptionalSQLSegmentExtractor {
            return Optional.absent();
        }
        Optional<ConditionSegment> condition = buildCondition(questionNodeIndexMap, exprNode);
        if (condition.isPresent()) {
        if (!condition.isPresent()) {
            return Optional.absent();
        }
        OrConditionSegment result = new OrConditionSegment();
        AndConditionSegment newAndCondition = new AndConditionSegment();
        newAndCondition.getConditions().add(condition.get());
        result.getAndConditions().add(newAndCondition);
        return Optional.of(result);
    }
        return Optional.absent();
    }
    
    private Optional<ConditionSegment> buildCondition(final Map<ParserRuleContext, Integer> questionNodeIndexMap, final ParserRuleContext exprNode) {
        Optional<ConditionSegment> result = buildEqualCondition(questionNodeIndexMap, exprNode);
@@ -146,13 +139,7 @@ public final class PredicateExtractor implements OptionalSQLSegmentExtractor {
    
    private Optional<ConditionSegment> buildEqualCondition(final Map<ParserRuleContext, Integer> questionNodeIndexMap, final ParserRuleContext exprNode) {
        Optional<ParserRuleContext> comparisionNode = ExtractorUtils.findFirstChildNode(exprNode, RuleName.COMPARISON_OPERATOR);
        if (!comparisionNode.isPresent()) {
            return Optional.absent();
        }
        if (!Symbol.EQ.getLiterals().equalsIgnoreCase(comparisionNode.get().getText())) {
            return Optional.absent();
        }
        if (3 != comparisionNode.get().getParent().getChildCount()) {
        if (!comparisionNode.isPresent() || !isValidEqualCondition(comparisionNode.get())) {
            return Optional.absent();
        }
        Optional<ParserRuleContext> leftNode = ExtractorUtils.findFirstChildNode((ParserRuleContext) comparisionNode.get().parent.getChild(0), RuleName.COLUMN_NAME);
@@ -161,22 +148,21 @@ public final class PredicateExtractor implements OptionalSQLSegmentExtractor {
            return Optional.absent();
        }
        if (leftNode.isPresent() && rightNode.isPresent()) {
            Optional<ColumnSegment> column = buildColumn(leftNode.get());
            Optional<ColumnSegment> leftColumn = buildColumn(leftNode.get());
            Optional<ColumnSegment> rightColumn = buildColumn(rightNode.get());
            return Optional.of(new ConditionSegment(column.get(), ShardingOperator.EQUAL, rightColumn.get()));
            Preconditions.checkState(leftColumn.isPresent() && rightColumn.isPresent());
            return Optional.of(new ConditionSegment(leftColumn.get(), ShardingOperator.EQUAL, rightColumn.get()));
        }
        Optional<ColumnSegment> column = buildColumn(exprNode);
        ParserRuleContext valueNode;
        if (leftNode.isPresent()) {
            valueNode = (ParserRuleContext) comparisionNode.get().parent.getChild(2);
        } else {
            valueNode = (ParserRuleContext) comparisionNode.get().parent.getChild(0);
        }
        Preconditions.checkState(column.isPresent());
        ParserRuleContext valueNode = leftNode.isPresent() ? (ParserRuleContext) comparisionNode.get().parent.getChild(2) : (ParserRuleContext) comparisionNode.get().parent.getChild(0);
        Optional<ExpressionSegment> sqlExpression = buildExpression(questionNodeIndexMap, valueNode);
        if (!sqlExpression.isPresent()) {
            return Optional.absent();
        return sqlExpression.isPresent()
                ? Optional.of(new ConditionSegment(column.get(), ShardingOperator.EQUAL, new EqualsValueExpressionSegment(sqlExpression.get()))) : Optional.<ConditionSegment>absent();
    }
        return Optional.of(new ConditionSegment(column.get(), ShardingOperator.EQUAL, new EqualsValueExpressionSegment(sqlExpression.get())));
    
    private boolean isValidEqualCondition(final ParserRuleContext comparisionNode) {
        return Symbol.EQ.getLiterals().equalsIgnoreCase(comparisionNode.getText()) && 3 == comparisionNode.getParent().getChildCount();
    }
    
    private Optional<ExpressionSegment> buildExpression(final Map<ParserRuleContext, Integer> questionNodeIndexMap, final ParserRuleContext valueNode) {