Commit c0c2b1f6 authored by terrymanu's avatar terrymanu
Browse files

for #2084, refactor ColumnSelectItemExtractor

parent fc40839c
Loading
Loading
Loading
Loading
+10 −4
Original line number Diff line number Diff line
@@ -18,27 +18,33 @@
package org.apache.shardingsphere.core.parse.antlr.extractor.impl.dml.select.item;

import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
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.common.column.ColumnExtractor;
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.item.ColumnSelectItemSegment;

/**
 * Column select item segment extractor.
 * Column select item extractor.
 *
 * @author zhangliang
 */
public final class ColumnSelectItemExtractor implements OptionalSQLSegmentExtractor {
    
    private final ColumnExtractor columnExtractor = new ColumnExtractor();
    
    @Override
    public Optional<ColumnSelectItemSegment> extract(final ParserRuleContext expressionNode) {
        if (!RuleName.COLUMN_NAME.getName().equals(expressionNode.getChild(0).getClass().getSimpleName())) {
            return Optional.absent();
        }
        ParserRuleContext columnNode = (ParserRuleContext) expressionNode.getChild(0);
        ColumnSelectItemSegment result = new ColumnSelectItemSegment(columnNode.getStart().getStartIndex(), columnNode.getText());
        Optional<ParserRuleContext> aliasNode = ExtractorUtils.findFirstChildNode(expressionNode, RuleName.ALIAS);
        Optional<ColumnSegment> columnSegment = columnExtractor.extract((ParserRuleContext) expressionNode.getChild(0));
        Preconditions.checkState(columnSegment.isPresent());
        ColumnSelectItemSegment result = new ColumnSelectItemSegment(columnSegment.get());
        Optional<ParserRuleContext> aliasNode = ExtractorUtils.findFirstChildNodeNoneRecursive(expressionNode, RuleName.ALIAS);
        if (aliasNode.isPresent()) {
            result.setAlias(aliasNode.get().getText());
        }
+2 −2
Original line number Diff line number Diff line
@@ -25,7 +25,7 @@ import org.apache.shardingsphere.core.parse.antlr.extractor.util.RuleName;
import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.item.ExpressionSelectItemSegment;

/**
 * Expression select item segment extractor.
 * Expression select item extractor.
 *
 * @author zhangliang
 */
@@ -35,7 +35,7 @@ public final class ExpressionSelectItemExtractor implements OptionalSQLSegmentEx
    public Optional<ExpressionSelectItemSegment> extract(final ParserRuleContext expressionNode) {
        // TODO parse table inside expression
        ExpressionSelectItemSegment result = new ExpressionSelectItemSegment(expressionNode.getText(), expressionNode.getStart().getStartIndex(), expressionNode.getStop().getStopIndex());
        Optional<ParserRuleContext> aliasNode = ExtractorUtils.findFirstChildNode(expressionNode, RuleName.ALIAS);
        Optional<ParserRuleContext> aliasNode = ExtractorUtils.findFirstChildNodeNoneRecursive(expressionNode, RuleName.ALIAS);
        if (aliasNode.isPresent()) {
            result.setAlias(aliasNode.get().getText());
        }
+3 −6
Original line number Diff line number Diff line
@@ -31,7 +31,7 @@ import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.item.Expressio
import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.item.SelectItemSegment;

/**
 * Function select item segment extractor.
 * Function select item extractor.
 *
 * @author zhangliang
 */
@@ -40,10 +40,7 @@ public final class FunctionSelectItemExtractor implements OptionalSQLSegmentExtr
    @Override
    public Optional<SelectItemSegment> extract(final ParserRuleContext expressionNode) {
        Optional<ParserRuleContext> functionNode = ExtractorUtils.findFirstChildNode(expressionNode, RuleName.FUNCTION_CALL);
        if (!functionNode.isPresent()) {
            return Optional.absent();
        }
        return Optional.of(extractFunctionSelectItemSegment(expressionNode, functionNode.get()));
        return functionNode.isPresent() ? Optional.of(extractFunctionSelectItemSegment(expressionNode, functionNode.get())) : Optional.<SelectItemSegment>absent();
    }
    
    private SelectItemSegment extractFunctionSelectItemSegment(final ParserRuleContext expressionNode, final ParserRuleContext functionNode) {
@@ -51,7 +48,7 @@ public final class FunctionSelectItemExtractor implements OptionalSQLSegmentExtr
        Optional<AggregationType> aggregationType = findAggregationType(functionName);
        AliasAvailable result = aggregationType.isPresent() ? extractAggregationSelectItemSegment(aggregationType.get(), functionNode)
                : new ExpressionSelectItemSegment(functionNode.getText(), functionNode.getStart().getStartIndex(), functionNode.getStop().getStopIndex());
        Optional<ParserRuleContext> aliasNode = ExtractorUtils.findFirstChildNode(expressionNode, RuleName.ALIAS);
        Optional<ParserRuleContext> aliasNode = ExtractorUtils.findFirstChildNodeNoneRecursive(expressionNode, RuleName.ALIAS);
        if (aliasNode.isPresent()) {
            result.setAlias(aliasNode.get().getText());
        }
+3 −0
Original line number Diff line number Diff line
@@ -18,7 +18,9 @@
package org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.column;

import com.google.common.base.Optional;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
import org.apache.shardingsphere.core.parse.antlr.constant.QuoteCharacter;
import org.apache.shardingsphere.core.parse.antlr.sql.OwnerAvailable;
import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.expr.SQLRightValueExpressionSegment;
@@ -42,6 +44,7 @@ public class ColumnSegment implements SQLRightValueExpressionSegment, OwnerAvail
    
    private String owner;
    
    @Setter(AccessLevel.PROTECTED)
    private QuoteCharacter ownerQuoteCharacter = QuoteCharacter.NONE;
    
    public ColumnSegment(final int startIndex, final String name) {
+6 −2
Original line number Diff line number Diff line
@@ -31,8 +31,12 @@ public final class ColumnSelectItemSegment extends ColumnSegment implements Sele
    
    private String alias;
    
    public ColumnSelectItemSegment(final int startIndex, final String name) {
        super(startIndex, name);
    public ColumnSelectItemSegment(final ColumnSegment columnSegment) {
        super(columnSegment.getStartIndex(), columnSegment.getName());
        if (columnSegment.getOwner().isPresent()) {
            setOwner(columnSegment.getOwner().get());
            setOwnerQuoteCharacter(columnSegment.getOwnerQuoteCharacter());
        }
    }
    
    @Override