Commit e5a0eecc authored by terrymanu's avatar terrymanu
Browse files

refactor SelectClauseExtractor

parent 9b1579e5
Loading
Loading
Loading
Loading
+15 −18
Original line number Diff line number Diff line
@@ -17,18 +17,16 @@

package io.shardingsphere.core.parsing.antlr.extractor.impl;

import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.TerminalNodeImpl;

import com.google.common.base.Optional;

import io.shardingsphere.core.parsing.antlr.extractor.OptionalSQLSegmentExtractor;
import io.shardingsphere.core.parsing.antlr.extractor.util.ExtractorUtils;
import io.shardingsphere.core.parsing.antlr.extractor.util.RuleName;
import io.shardingsphere.core.parsing.antlr.sql.segment.SelectClauseSegment;
import io.shardingsphere.core.parsing.antlr.sql.segment.expr.ExpressionSegment;
import io.shardingsphere.core.parsing.lexer.token.DefaultKeyword;
import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.TerminalNodeImpl;

/**
 * Select clause extractor.
@@ -38,27 +36,22 @@ import io.shardingsphere.core.parsing.lexer.token.DefaultKeyword;
 */
public final class SelectClauseExtractor implements OptionalSQLSegmentExtractor {
    
    private ExpressionExtractor expressionExtractor = new ExpressionExtractor();
    
    @Override
    public Optional<SelectClauseSegment> extract(final ParserRuleContext ancestorNode) {
        Optional<ParserRuleContext> selectClauseNode = ExtractorUtils.findFirstChildNode(ancestorNode, RuleName.SELECT_CLAUSE);
        if (!selectClauseNode.isPresent()) {
            return Optional.absent();
        }
        boolean hasDistinct = false;
        if (2 < selectClauseNode.get().getChildCount()) {
            if (DefaultKeyword.DISTINCT.name().equalsIgnoreCase(selectClauseNode.get().getChild(1).getText())) {
                hasDistinct = true;
            }
        }
        Optional<ParserRuleContext> selectExpressionNode = ExtractorUtils.findFirstChildNode(selectClauseNode.get(), RuleName.SELECT_EXPRS);
        if (!selectExpressionNode.isPresent()) {
        Optional<ParserRuleContext> selectExpressionsNode = ExtractorUtils.findFirstChildNode(selectClauseNode.get(), RuleName.SELECT_EXPRS);
        if (!selectExpressionsNode.isPresent()) {
            return Optional.absent();
        }
        SelectClauseSegment result = new SelectClauseSegment(selectExpressionNode.get().getStart().getStartIndex(), selectExpressionNode.get().getStop().getStopIndex() + 2);
        result.setHasDistinct(hasDistinct);
        ExpressionExtractor expressionExtractor = new ExpressionExtractor();
        for (int i = 0; i < selectExpressionNode.get().getChildCount(); i++) {
            ParseTree childNode = selectExpressionNode.get().getChild(i);
        SelectClauseSegment result = new SelectClauseSegment(
                selectExpressionsNode.get().getStart().getStartIndex(), selectExpressionsNode.get().getStop().getStopIndex() + 2, hasDistinct(selectClauseNode.get()));
        for (int i = 0; i < selectExpressionsNode.get().getChildCount(); i++) {
            ParseTree childNode = selectExpressionsNode.get().getChild(i);
            if (childNode instanceof TerminalNodeImpl) {
                continue;
            }
@@ -69,4 +62,8 @@ public final class SelectClauseExtractor implements OptionalSQLSegmentExtractor
        }
        return Optional.of(result);
    }
    
    private boolean hasDistinct(final ParserRuleContext selectClauseNode) {
        return selectClauseNode.getChildCount() > 2 && DefaultKeyword.DISTINCT.name().equalsIgnoreCase(selectClauseNode.getChild(1).getText());
    }
}
+2 −4
Original line number Diff line number Diff line
@@ -20,7 +20,6 @@ package io.shardingsphere.core.parsing.antlr.sql.segment;
import io.shardingsphere.core.parsing.antlr.sql.segment.expr.ExpressionSegment;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;

import java.util.Collection;
import java.util.LinkedList;
@@ -39,8 +38,7 @@ public final class SelectClauseSegment implements SQLSegment {
    
    private final int selectListLastPosition;
    
    private final Collection<ExpressionSegment> expressions = new LinkedList<>();
    private final boolean hasDistinct;
    
    @Setter
    private boolean hasDistinct;
    private final Collection<ExpressionSegment> expressions = new LinkedList<>();
}
+1 −1

File changed.

Contains only whitespace changes.