Unverified Commit c8977c0a authored by 张亮's avatar 张亮 Committed by GitHub
Browse files

Merge pull request #1697 from tristaZero/dev

Optimize for distinct supporting
parents c26cb251 4ae16b8d
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -62,10 +62,10 @@ public final class QueryRow {
        if (distinctColumnIndexes.isEmpty()) {
            return rowData.equals(queryRow.getRowData());
        }
        return distinctColumnIndexes.equals(queryRow.getDistinctColumnIndexes()) && isEqualByPart(queryRow);
        return distinctColumnIndexes.equals(queryRow.getDistinctColumnIndexes()) && isEqualPartly(queryRow);
    }
    
    private boolean isEqualByPart(final QueryRow queryRow) {
    private boolean isEqualPartly(final QueryRow queryRow) {
        for (int i = 0; i < distinctColumnIndexes.size(); i++) {
            if (!rowData.get(i).equals(queryRow.getRowData().get(i))) {
                return false;
+2 −2
Original line number Diff line number Diff line
@@ -69,8 +69,8 @@ public final class DQLMergeEngine implements MergeEngine {
        if (!selectStatement.getAggregationDistinctSelectItems().isEmpty()) {
            return getDividedQueryResults(new AggregationDistinctQueryResult(queryResults, selectStatement));
        }
        if (!selectStatement.getDistinctSelectItems().isEmpty()) {
            return getDividedQueryResults(new DistinctQueryResult(queryResults, new ArrayList<>(selectStatement.getDistinctSelectItems().get(0).getDistinctColumnLabels())));
        if (selectStatement.getDistinctSelectItem().isPresent()) {
            return getDividedQueryResults(new DistinctQueryResult(queryResults, new ArrayList<>(selectStatement.getDistinctSelectItem().get().getDistinctColumnLabels())));
        }
        return queryResults;
    }
+2 −2
Original line number Diff line number Diff line
@@ -32,8 +32,8 @@ import io.shardingsphere.core.parsing.parser.sql.SQLStatement;
import io.shardingsphere.core.parsing.parser.sql.dql.select.SelectStatement;
import io.shardingsphere.core.rule.ShardingRule;

import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;

/**
@@ -68,7 +68,7 @@ public final class SelectClauseFiller implements SQLStatementFiller<SelectClause
        Iterator<ExpressionSegment> expressionIterator = selectClauseSegment.getExpressions().iterator();
        ExpressionSegment firstExpression = expressionIterator.next();
        ExpressionFiller expressionFiller = new ExpressionFiller();
        Set<String> distinctColumnNames = new HashSet<>();
        Set<String> distinctColumnNames = new LinkedHashSet<>();
        DistinctSelectItem distinctSelectItem = null;
        int offset = 0;
        if (firstExpression instanceof StarExpressionSegment) {
+16 −14
Original line number Diff line number Diff line
@@ -17,15 +17,7 @@

package io.shardingsphere.core.parsing.parser.clause;

import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.google.common.base.Optional;

import io.shardingsphere.core.constant.AggregationType;
import io.shardingsphere.core.parsing.lexer.LexerEngine;
import io.shardingsphere.core.parsing.lexer.token.DefaultKeyword;
@@ -47,6 +39,15 @@ import io.shardingsphere.core.rule.ShardingRule;
import io.shardingsphere.core.util.SQLUtil;
import lombok.Getter;

import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Select list clause parser.
 *
@@ -117,8 +118,8 @@ public abstract class SelectListClauseParser implements SQLClauseParser {
    
    private void reviseDistinctSelectItems(final SelectStatement selectStatement, final Collection<SelectItem> selectItems) {
        for (SelectItem each : selectItems) {
            if (!(selectStatement.getDistinctSelectItems().isEmpty() || each instanceof StarSelectItem)) {
                selectStatement.getDistinctSelectItems().get(0).getDistinctColumnNames().add(each.getAlias().isPresent() ? each.getAlias().get() : each.getExpression());
            if (selectStatement.getDistinctSelectItem().isPresent() && !(each instanceof StarSelectItem)) {
                selectStatement.getDistinctSelectItem().get().getDistinctColumnNames().add(each.getAlias().isPresent() ? each.getAlias().get() : each.getExpression());
            }
        }
    }
@@ -137,11 +138,12 @@ public abstract class SelectListClauseParser implements SQLClauseParser {
        lexerEngine.nextToken();
        String distinctColumnName = lexerEngine.getCurrentToken().getLiterals();
        if (Symbol.STAR == lexerEngine.getCurrentToken().getType()) {
            return new DistinctSelectItem(Collections.<String>emptyList(), aliasExpressionParser.parseSelectItemAlias());
            return new DistinctSelectItem(Collections.<String>emptySet(), aliasExpressionParser.parseSelectItemAlias());
        }
        lexerEngine.nextToken();
        distinctColumnName = SQLUtil.getExactlyValue(distinctColumnName + parseRestSelectItem(selectStatement));
        return new DistinctSelectItem(Collections.singletonList(distinctColumnName), aliasExpressionParser.parseSelectItemAlias());
        Set<String> distinctColumnNames = new LinkedHashSet<>();
        distinctColumnNames.add(SQLUtil.getExactlyValue(distinctColumnName + parseRestSelectItem(selectStatement)));
        return new DistinctSelectItem(distinctColumnNames, aliasExpressionParser.parseSelectItemAlias());
    }
    
    private boolean isStarSelectItem() {
@@ -201,7 +203,7 @@ public abstract class SelectListClauseParser implements SQLClauseParser {
    
    private SelectItem getAggregationDistinctSelectItem(final SelectStatement selectStatement, final AggregationType aggregationType, final int beginPosition, final String innerExpression) {
        Optional<String> alias = aliasExpressionParser.parseSelectItemAlias();
        Optional<String> autoAlias = Optional.<String>absent();
        Optional<String> autoAlias = Optional.absent();
        if (!alias.isPresent()) {
            autoAlias = Optional.of(DerivedAlias.AGGREGATION_DISTINCT_DERIVED.getDerivedAlias(selectStatement.getAggregationDistinctSelectItems().size()));
            alias = autoAlias;
+0 −4
Original line number Diff line number Diff line
@@ -19,9 +19,7 @@ package io.shardingsphere.core.parsing.parser.context.selectitem;

import com.google.common.base.Optional;
import io.shardingsphere.core.constant.AggregationType;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.ToString;

/**
 * Aggregation distinct select item.
@@ -29,8 +27,6 @@ import lombok.ToString;
 * @author panjuan
 */
@Getter
@EqualsAndHashCode(callSuper = true)
@ToString
public final class AggregationDistinctSelectItem extends AggregationSelectItem {
    
    private final String distinctColumnName;
Loading