Loading sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/context/GroupByContext.java +9 −1 Original line number Diff line number Diff line Loading @@ -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; Loading sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/context/OrderByContext.java +3 −1 Original line number Diff line number Diff line Loading @@ -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; /** Loading @@ -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; Loading sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/select/AbstractSelectParser.java +1 −9 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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(); Loading Loading @@ -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() { Loading sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/rewrite/DerivedUtils.java +28 −38 Original line number Diff line number Diff line Loading @@ -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"; /** * 追加派生列. * Loading @@ -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( Loading @@ -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 + " "); } } } Loading sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/parsing/AbstractBaseParseTest.java +2 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/context/GroupByContext.java +9 −1 Original line number Diff line number Diff line Loading @@ -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; Loading
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/context/OrderByContext.java +3 −1 Original line number Diff line number Diff line Loading @@ -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; /** Loading @@ -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; Loading
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/select/AbstractSelectParser.java +1 −9 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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(); Loading Loading @@ -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() { Loading
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/rewrite/DerivedUtils.java +28 −38 Original line number Diff line number Diff line Loading @@ -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"; /** * 追加派生列. * Loading @@ -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( Loading @@ -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 + " "); } } } Loading
sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/parsing/AbstractBaseParseTest.java +2 −1 Original line number Diff line number Diff line Loading @@ -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