Commit 750cbf19 authored by terrymanu's avatar terrymanu
Browse files

refactor derived column to rewrite module

parent 2db83d8a
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -40,11 +40,19 @@ public final class GroupByContext implements IndexColumn {
    
    private final OrderType orderByType;
    
    private final Optional<String> alias;
    @Setter
    private Optional<String> alias;
    
    @Setter
    private int columnIndex;
    
    public GroupByContext(final Optional<String> owner, final String name, final OrderType orderByType, Optional<String> alias) {
        this.owner = owner;
        this.name = name;
        this.orderByType = orderByType;
        this.alias = alias;
    }
    
    @Override
    public Optional<String> getColumnLabel() {
        return alias;
+3 −1
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import com.dangdang.ddframe.rdb.sharding.constant.OrderType;
import com.google.common.base.Optional;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

/**
@@ -41,7 +42,8 @@ public final class OrderByContext implements IndexColumn {
    
    private final OrderType orderByType;
    
    private final Optional<String> alias;
    @Setter
    private Optional<String> alias;
    
    private int columnIndex;
    
+1 −9
Original line number Diff line number Diff line
@@ -50,8 +50,6 @@ import java.util.List;
@Getter(AccessLevel.PROTECTED)
public abstract class AbstractSelectParser implements SQLStatementParser {
    
    private static final String SHARDING_GEN_ALIAS = "sharding_gen_%s";
    
    private SQLParser sqlParser;
    
    private final SelectSQLContext sqlContext;
@@ -59,8 +57,6 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
    @Setter
    private int parametersIndex;
    
    private int derivedColumnOffset;
    
    public AbstractSelectParser(final SQLParser sqlParser) {
        this.sqlParser = sqlParser;
        sqlContext = new SelectSQLContext();
@@ -256,11 +252,7 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
                return Optional.of(rawName);
            }
        }
        return Optional.of(generateDerivedColumnAlias());
    }
    
    private String generateDerivedColumnAlias() {
        return String.format(SHARDING_GEN_ALIAS, ++derivedColumnOffset);
        return Optional.absent();
    }
    
    public final void parseFrom() {
+28 −38
Original line number Diff line number Diff line
@@ -37,6 +37,10 @@ public final class DerivedUtils {
    
    private static final String DERIVED_SUM_ALIAS = "AVG_DERIVED_SUM_%s";
    
    private static final String ORDER_BY_DERIVED_ALIAS = "ORDER_BY_DERIVED_%s";
    
    private static final String GROUP_BY_DERIVED_ALIAS = "GROUP_BY_DERIVED_%s";
    
    /**
     * 追加派生列.
     *
@@ -55,9 +59,10 @@ public final class DerivedUtils {
    private static void appendAvgDerivedColumns(final SelectSQLContext selectSQLContext, final ItemsToken itemsToken) {
        int derivedColumnOffset = 0;
        for (SelectItemContext each : selectSQLContext.getItemContexts()) {
            if (each instanceof AggregationSelectItemContext) {
            if (!(each instanceof AggregationSelectItemContext) || AggregationType.AVG != ((AggregationSelectItemContext) each).getAggregationType()) {
                continue;
            }
            AggregationSelectItemContext aggregationSelectItemContext = (AggregationSelectItemContext) each;
                if (AggregationType.AVG.equals(aggregationSelectItemContext.getAggregationType())) {
            AggregationSelectItemContext countSelectItemContext = new AggregationSelectItemContext(
                    aggregationSelectItemContext.getInnerExpression(), Optional.of(String.format(DERIVED_COUNT_ALIAS, derivedColumnOffset)), -1, AggregationType.COUNT);
            AggregationSelectItemContext sumSelectItemContext = new AggregationSelectItemContext(
@@ -70,42 +75,27 @@ public final class DerivedUtils {
            derivedColumnOffset++;
        }
    }
        }
    }
    
    private static void appendOrderByDerivedColumns(final SelectSQLContext selectSQLContext, final ItemsToken itemsToken) {
        int derivedColumnOffset = 0;
        for (OrderByContext each : selectSQLContext.getOrderByContexts()) {
            if (!each.getIndex().isPresent()) {
                boolean found = false;
            if (!each.getIndex().isPresent() && !each.getAlias().isPresent() && !selectSQLContext.isContainStar()) {
                String orderByExpression = each.getOwner().isPresent() ? each.getOwner().get() + "." + each.getName().get() : each.getName().get();
                for (SelectItemContext context : selectSQLContext.getItemContexts()) {
                    if (context.getExpression().equalsIgnoreCase(orderByExpression) || orderByExpression.equalsIgnoreCase(context.getAlias().orNull())) {
                        found = true;
                        break;
                    }
                }
                // TODO 需重构,目前的做法是通过补列有别名则补列,如果不包含select item则生成别名,进而补列,这里逻辑不直观
                if (!found && each.getAlias().isPresent()) {
                    itemsToken.getItems().add(orderByExpression + " AS " + each.getAlias().get() + " ");
                }
                String alias = String.format(ORDER_BY_DERIVED_ALIAS, derivedColumnOffset++);
                each.setAlias(Optional.of(alias));
                itemsToken.getItems().add(orderByExpression + " AS " + alias + " ");
            }
        }
    }
    
    private static void appendGroupByDerivedColumns(final SelectSQLContext selectSQLContext, final ItemsToken itemsToken) {
        int derivedColumnOffset = 0;
        for (GroupByContext each : selectSQLContext.getGroupByContexts()) {
            boolean found = false;
            if (!each.getAlias().isPresent() && !selectSQLContext.isContainStar()) {
                String groupByExpression = each.getOwner().isPresent() ? each.getOwner().get() + "." + each.getName() : each.getName();
            for (SelectItemContext context : selectSQLContext.getItemContexts()) {
                if ((!context.getAlias().isPresent() && context.getExpression().equalsIgnoreCase(groupByExpression))
                        || (context.getAlias().isPresent() && context.getAlias().get().equalsIgnoreCase(groupByExpression))) {
                    found = true;
                    break;
                }
            }
            // TODO 需重构,目前的做法是通过补列有别名则补列,如果不包含select item则生成别名,进而补列,这里逻辑不直观
            if (!found && each.getAlias().isPresent()) {
                itemsToken.getItems().add(groupByExpression + " AS " + each.getAlias().get() + " ");
                String alias = String.format(GROUP_BY_DERIVED_ALIAS, derivedColumnOffset++);
                each.setAlias(Optional.of(alias));
                itemsToken.getItems().add(groupByExpression + " AS " + alias + " ");
            }
        }
    }
+2 −1
Original line number Diff line number Diff line
@@ -166,8 +166,9 @@ public abstract class AbstractBaseParseTest {
                
                @Override
                public GroupByContext apply(final com.dangdang.ddframe.rdb.sharding.parsing.jaxb.GroupByColumn input) {
                    return new GroupByContext(
                    GroupByContext groupByContext = new GroupByContext(
                            Optional.fromNullable(input.getOwner()), input.getName(), OrderType.valueOf(input.getOrderByType().toUpperCase()), Optional.fromNullable(input.getAlias()));
                    return groupByContext;
                }
            }));
        }
Loading