Commit 4cd5a8a3 authored by terrymanu's avatar terrymanu
Browse files

refactor ExpressionWithAliasSegment

parent ec82c41f
Loading
Loading
Loading
Loading
+14 −29
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import io.shardingsphere.core.parsing.antlr.extractor.util.RuleName;
import io.shardingsphere.core.parsing.antlr.sql.segment.column.ColumnSegment;
import io.shardingsphere.core.parsing.antlr.sql.segment.expr.CommonExpressionSegment;
import io.shardingsphere.core.parsing.antlr.sql.segment.expr.ExpressionSegment;
import io.shardingsphere.core.parsing.antlr.sql.segment.expr.ExpressionWithAliasSegment;
import io.shardingsphere.core.parsing.antlr.sql.segment.expr.FunctionExpressionSegment;
import io.shardingsphere.core.parsing.antlr.sql.segment.expr.PropertyExpressionSegment;
import io.shardingsphere.core.parsing.antlr.sql.segment.expr.StarExpressionSegment;
@@ -52,7 +53,7 @@ public final class ExpressionExtractor implements OptionalSQLSegmentExtractor {
            return Optional.of(getStarExpressionSegment(expressionNode, firstChildText));
        }
        Optional<ParserRuleContext> subqueryNode = ExtractorUtils.findFirstChildNode(expressionNode, RuleName.SUBQUERY);
        return subqueryNode.isPresent() ? subqueryExtractor.extract(subqueryNode.get()) : Optional.of(fillForPropertyOrFunction(expressionNode));
        return subqueryNode.isPresent() ? subqueryExtractor.extract(subqueryNode.get()) : Optional.of(getExpressionWithAliasSegment(expressionNode));
    }
    
    private ExpressionSegment getStarExpressionSegment(final ParserRuleContext expressionNode, final String text) {
@@ -63,15 +64,16 @@ public final class ExpressionExtractor implements OptionalSQLSegmentExtractor {
        return result;
    }
    
    private ExpressionSegment fillForPropertyOrFunction(final ParserRuleContext expressionNode) {
    private ExpressionWithAliasSegment getExpressionWithAliasSegment(final ParserRuleContext expressionNode) {
        ExpressionWithAliasSegment result;
        Optional<ParserRuleContext> functionNode = ExtractorUtils.findFirstChildNode(expressionNode, RuleName.FUNCTION_CALL);
        if (functionNode.isPresent()) {
            return getFunctionExpressionSegment(expressionNode, functionNode.get());
            result = getFunctionExpressionSegment(expressionNode, functionNode.get());
        } else if (RuleName.COLUMN_NAME.getName().equals(expressionNode.getChild(0).getClass().getSimpleName())) {
            result = getPropertyExpressionSegment(expressionNode);
        } else {
            result = new CommonExpressionSegment(expressionNode.getStart().getStartIndex(), expressionNode.getStop().getStopIndex());
        }
        if (RuleName.COLUMN_NAME.getName().equals(expressionNode.getChild(0).getClass().getSimpleName())) {
            return getPropertyExpressionSegment(expressionNode);
        }
        CommonExpressionSegment result = new CommonExpressionSegment(expressionNode.getStart().getStartIndex(), expressionNode.getStop().getStopIndex());
        Optional<String> alias = getAlias(expressionNode);
        if (alias.isPresent()) {
            result.setAlias(alias.get());
@@ -79,22 +81,11 @@ public final class ExpressionExtractor implements OptionalSQLSegmentExtractor {
        return result;
    }
    
    private ExpressionSegment getFunctionExpressionSegment(final ParserRuleContext expressionNode, final ParserRuleContext functionNode) {
    private ExpressionWithAliasSegment getFunctionExpressionSegment(final ParserRuleContext expressionNode, final ParserRuleContext functionNode) {
        String functionName = functionNode.getChild(0).getText();
        int startIndex = ((TerminalNode) functionNode.getChild(1)).getSymbol().getStartIndex();
        boolean hasDistinct = hasDistinct(expressionNode);
        int distinctColumnNameStartPosition = hasDistinct ? calculateDistinctColumnNamePosition(functionNode) : -1;
        FunctionExpressionSegment result = new FunctionExpressionSegment(functionName, 
                functionNode.getStart().getStartIndex(), startIndex, functionNode.getStop().getStopIndex(), hasDistinct, distinctColumnNameStartPosition);
        Optional<String> alias = getAlias(expressionNode);
        if (alias.isPresent()) {
            result.setAlias(alias.get());
        }
        return result;
    }
    
    private boolean hasDistinct(final ParserRuleContext expressionNode) {
        return ExtractorUtils.findFirstChildNode(expressionNode, RuleName.DISTINCT).isPresent();
        int distinctColumnNameStartPosition = ExtractorUtils.findFirstChildNode(expressionNode, RuleName.DISTINCT).isPresent() ? calculateDistinctColumnNamePosition(functionNode) : -1;
        return new FunctionExpressionSegment(functionName, functionNode.getStart().getStartIndex(), startIndex, functionNode.getStop().getStopIndex(), distinctColumnNameStartPosition);
    }
    
    private int calculateDistinctColumnNamePosition(final ParserRuleContext functionNode) {
@@ -108,17 +99,11 @@ public final class ExpressionExtractor implements OptionalSQLSegmentExtractor {
        return -1;
    }
    
    private ExpressionSegment getPropertyExpressionSegment(final ParserRuleContext expressionNode) {
    private ExpressionWithAliasSegment getPropertyExpressionSegment(final ParserRuleContext expressionNode) {
        ParserRuleContext columnNode = (ParserRuleContext) expressionNode.getChild(0);
        Optional<ColumnSegment> columnSegment = new ColumnSegmentExtractor(new HashMap<String, String>()).extract(columnNode);
        Preconditions.checkState(columnSegment.isPresent());
        PropertyExpressionSegment result = new PropertyExpressionSegment(
                columnSegment.get().getOwner(), columnSegment.get().getName(), columnNode.getStart().getStartIndex(), columnNode.getStop().getStopIndex());
        Optional<String> alias = getAlias(expressionNode);
        if (alias.isPresent()) {
            result.setAlias(alias.get());
        }
        return result;
        return new PropertyExpressionSegment(columnSegment.get().getOwner(), columnSegment.get().getName(), columnNode.getStart().getStartIndex(), columnNode.getStop().getStopIndex());
    }
    
    private Optional<String> getAlias(final ParserRuleContext expressionNode) {
+2 −2
Original line number Diff line number Diff line
@@ -101,7 +101,7 @@ public final class ExpressionFiller implements SQLStatementFiller {
    private void fillFunctionExpression(final FunctionExpressionSegment functionSegment, final SelectStatement selectStatement, final String sql) {
        AggregationType aggregationType = null;
        for (AggregationType eachType : AggregationType.values()) {
            if (eachType.name().equalsIgnoreCase(functionSegment.getName())) {
            if (eachType.name().equalsIgnoreCase(functionSegment.getFunctionName())) {
                aggregationType = eachType;
                break;
            }
@@ -109,7 +109,7 @@ public final class ExpressionFiller implements SQLStatementFiller {
        String innerExpression = sql.substring(functionSegment.getInnerExpressionStartIndex(), functionSegment.getInnerExpressionEndIndex() + 1);
        String functionExpression = sql.substring(functionSegment.getFunctionStartIndex(), functionSegment.getInnerExpressionEndIndex() + 1);
        if (null != aggregationType) {
            if (functionSegment.isHasDistinct()) {
            if (functionSegment.hasDistinct()) {
                String columnName = sql.substring(functionSegment.getDistinctColumnNameStartPosition(), functionSegment.getInnerExpressionEndIndex());
                selectStatement.getItems().add(new AggregationDistinctSelectItem(aggregationType, innerExpression, functionSegment.getAlias(), columnName));
                Optional<String> autoAlias = Optional.absent();
+1 −1
Original line number Diff line number Diff line
@@ -102,7 +102,7 @@ public final class SelectClauseFiller implements SQLStatementFiller<SelectClause
        if (expressionSegment instanceof FunctionExpressionSegment) {
            FunctionExpressionSegment functionExpressionSegment = (FunctionExpressionSegment) expressionSegment;
            Optional<String> alias = functionExpressionSegment.getAlias();
            if (functionExpressionSegment.isHasDistinct() && !alias.isPresent()) {
            if (functionExpressionSegment.hasDistinct() && !alias.isPresent()) {
                ((FunctionExpressionSegment) expressionSegment).setAlias(DerivedAlias.AGGREGATION_DISTINCT_DERIVED.getDerivedAlias(offset));
                return offset + 1;
            }
+1 −13
Original line number Diff line number Diff line
@@ -17,7 +17,6 @@

package io.shardingsphere.core.parsing.antlr.sql.segment.expr;

import com.google.common.base.Optional;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
@@ -30,24 +29,13 @@ import lombok.Setter;
@RequiredArgsConstructor
@Getter
@Setter
public final class CommonExpressionSegment implements ExpressionSegment {
public final class CommonExpressionSegment extends ExpressionWithAliasSegment {
    
    private final int startPosition;
    
    private final int endPosition;
    
    private String alias;
    
    private int index = -1;
    
    private Number value = -1;
    
    /**
     * Get alias.
     *
     * @return alias
     */
    public Optional<String> getAlias() {
        return Optional.fromNullable(alias);
    }
}
+41 −0
Original line number Diff line number Diff line
/*
 * Copyright 2016-2018 shardingsphere.io.
 * <p>
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * </p>
 */

package io.shardingsphere.core.parsing.antlr.sql.segment.expr;

import com.google.common.base.Optional;
import lombok.Setter;

/**
 * Expression with Alias segment.
 * 
 * @author zhangliang
 */
@Setter
public abstract class ExpressionWithAliasSegment implements ExpressionSegment {
    
    private String alias;
    
    /**
     * Get alias.
     * 
     * @return alias
     */
    public final Optional<String> getAlias() {
        return Optional.fromNullable(alias);
    }
}
Loading