提交 0134fa1b 编写于 作者: H haocao

Refactor parsing test cases for group by and aggregation.

上级 164140e3
......@@ -20,6 +20,7 @@ package com.dangdang.ddframe.rdb.sharding.parsing.parser.context.selectitem;
import com.dangdang.ddframe.rdb.sharding.constant.AggregationType;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.IndexColumn;
import com.google.common.base.Optional;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
......@@ -33,6 +34,7 @@ import java.util.List;
* @author zhangliang
*/
@Getter
@EqualsAndHashCode
@ToString
public final class AggregationSelectItem implements SelectItem, IndexColumn {
......
......@@ -51,6 +51,7 @@ import javax.xml.bind.JAXBException;
import java.io.File;
import java.util.*;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public abstract class AbstractBaseParseTest {
......@@ -64,11 +65,11 @@ public abstract class AbstractBaseParseTest {
private final Conditions expectedConditions;
private final Iterator<OrderBy> orderByList;
private final Iterator<OrderBy> orderByColumns;
private final Iterator<GroupBy> groupByList;
private final Iterator<GroupBy> groupByColumns;
private final Iterator<AggregationSelectItem> aggregationColumns;
private final Iterator<AggregationSelectItem> aggregationSelectItems;
private final Limit limit;
......@@ -78,9 +79,9 @@ public abstract class AbstractBaseParseTest {
this.expectedSQL = expectedSQL;
this.expectedTables = expectedTables;
this.expectedConditions = expectedConditions;
this.orderByList = expectedSQLStatement.getOrderByList().iterator();
this.groupByList = expectedSQLStatement.getGroupByList().iterator();
this.aggregationColumns = expectedSQLStatement.getAggregationSelectItems().iterator();
this.orderByColumns = expectedSQLStatement.getOrderByList().iterator();
this.groupByColumns = expectedSQLStatement.getGroupByList().iterator();
this.aggregationSelectItems = expectedSQLStatement.getAggregationSelectItems().iterator();
this.limit = expectedSQLStatement.getLimit();
}
......@@ -158,16 +159,17 @@ public abstract class AbstractBaseParseTest {
}
result[4] = conditions;
}
SQLStatement selectStatement = new SelectStatement();
final SelectStatement selectStatement = new SelectStatement();
if (null != assertObj.getOrderByColumns()) {
selectStatement.getOrderByList().addAll(Lists.transform(assertObj.getOrderByColumns(), new Function<com.dangdang.ddframe.rdb.sharding.parsing.jaxb.OrderByColumn, OrderBy>() {
List<OrderBy> orderBys = Lists.transform(assertObj.getOrderByColumns(), new Function<com.dangdang.ddframe.rdb.sharding.parsing.jaxb.OrderByColumn, OrderBy>() {
@Override
public OrderBy apply(final com.dangdang.ddframe.rdb.sharding.parsing.jaxb.OrderByColumn input) {
return Strings.isNullOrEmpty(input.getName()) ? new OrderBy(input.getIndex(), OrderType.valueOf(input.getOrderByType().toUpperCase()))
return Strings.isNullOrEmpty(input.getName()) ? new OrderBy(input.getIndex(), OrderType.valueOf(input.getOrderByType().toUpperCase()))
: new OrderBy(input.getOwner(), input.getName(), OrderType.valueOf(input.getOrderByType().toUpperCase()), Optional.fromNullable(input.getAlias()));
}
}));
});
selectStatement.getOrderByList().addAll(orderBys);
}
if (null != assertObj.getGroupByColumns()) {
selectStatement.getGroupByList().addAll(Lists.transform(assertObj.getGroupByColumns(), new Function<com.dangdang.ddframe.rdb.sharding.parsing.jaxb.GroupByColumn, GroupBy>() {
......@@ -179,24 +181,25 @@ public abstract class AbstractBaseParseTest {
}
}));
}
if (null != assertObj.getAggregationColumns()) {
selectStatement.getAggregationSelectItems().addAll(Lists.transform(assertObj.getAggregationColumns(),
new Function<com.dangdang.ddframe.rdb.sharding.parsing.jaxb.AggregationColumn, AggregationSelectItem>() {
if (null != assertObj.getAggregationSelectItems()) {
List<AggregationSelectItem> selectItems = Lists.transform(assertObj.getAggregationSelectItems(),
new Function<com.dangdang.ddframe.rdb.sharding.parsing.jaxb.AggregationSelectItem, AggregationSelectItem>() {
@Override
public AggregationSelectItem apply(final com.dangdang.ddframe.rdb.sharding.parsing.jaxb.AggregationColumn input) {
AggregationSelectItem result = new AggregationSelectItem(input.getExpression(), Optional.fromNullable(input.getAlias()), -1,
public AggregationSelectItem apply(final com.dangdang.ddframe.rdb.sharding.parsing.jaxb.AggregationSelectItem input) {
AggregationSelectItem result = new AggregationSelectItem(input.getExpression(), Optional.fromNullable(input.getAlias()), -1,
AggregationType.valueOf(input.getAggregationType().toUpperCase()));
if (null != input.getIndex()) {
result.setColumnIndex(input.getIndex());
}
for (com.dangdang.ddframe.rdb.sharding.parsing.jaxb.AggregationColumn each : input.getDerivedColumns()) {
result.getDerivedAggregationSelectItems().add(new AggregationSelectItem(each.getExpression(), Optional.fromNullable(each.getAlias()), -1,
for (com.dangdang.ddframe.rdb.sharding.parsing.jaxb.AggregationSelectItem each : input.getDerivedColumns()) {
result.getDerivedAggregationSelectItems().add(new AggregationSelectItem(each.getExpression(), Optional.fromNullable(each.getAlias()), -1,
AggregationType.valueOf(each.getAggregationType().toUpperCase())));
}
return result;
}
}));
});
selectStatement.getItems().addAll(selectItems);
}
if (null != assertObj.getLimit()) {
selectStatement.setLimit(new Limit(
......@@ -209,5 +212,31 @@ public abstract class AbstractBaseParseTest {
protected final void assertSQLStatement(final SQLStatement actual) {
assertTrue(new ReflectionEquals(expectedTables).matches(actual.getTables()));
assertTrue(new ReflectionEquals(expectedConditions).matches(actual.getConditions()));
assertOrderBy(actual);
for (GroupBy each : actual.getGroupByList()) {
assertTrue(new ReflectionEquals(groupByColumns.next()).matches(each));
}
assertFalse(groupByColumns.hasNext());
// assertAggregationSelectItem(actual);
// assertTrue(new ReflectionEquals(limit).matches(actual.getLimit()));
}
private void assertOrderBy(final SQLStatement actual) {
for (OrderBy each : actual.getOrderByList()) {
assertTrue(new ReflectionEquals(orderByColumns.next()).matches(each));
}
assertFalse(orderByColumns.hasNext());
}
private void assertAggregationSelectItem(final SQLStatement actual) {
for (AggregationSelectItem each : actual.getAggregationSelectItems()) {
AggregationSelectItem expected = aggregationSelectItems.next();
assertTrue(new ReflectionEquals(expected).matches(each));
//assertThat(each, new ReflectionEquals(expected, "derivedColumns"));
// for (int i = 0; i < each.getDerivedColumns().size(); i++) {
// assertThat(each.getDerivedColumns().get(i), new ReflectionEquals(expected.getDerivedColumns().get(i)));
// }
}
assertFalse(aggregationSelectItems.hasNext());
}
}
......@@ -17,21 +17,20 @@
package com.dangdang.ddframe.rdb.sharding.parsing.jaxb;
import java.util.ArrayList;
import java.util.List;
import lombok.Getter;
import lombok.Setter;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import lombok.Getter;
import lombok.Setter;
import java.util.ArrayList;
import java.util.List;
@Getter
@Setter
@XmlAccessorType(XmlAccessType.FIELD)
public final class AggregationColumn {
public final class AggregationSelectItem {
@XmlAttribute
private String expression;
......@@ -49,5 +48,5 @@ public final class AggregationColumn {
private Integer index;
@XmlElement(name = "derived-column")
private List<AggregationColumn> derivedColumns = new ArrayList<>(2);
private List<AggregationSelectItem> derivedColumns = new ArrayList<>(2);
}
......@@ -55,9 +55,9 @@ public final class Assert {
@XmlElement(name = "group-by-column")
private List<GroupByColumn> groupByColumns;
@XmlElementWrapper(name = "aggregation-columns")
@XmlElement(name = "aggregation-column")
private List<AggregationColumn> aggregationColumns;
@XmlElementWrapper(name = "aggregation-select-items")
@XmlElement(name = "aggregation-select-item")
private List<AggregationSelectItem> aggregationSelectItems;
@XmlElement
private Limit limit;
......
......@@ -4,31 +4,31 @@
<tables>
<table name="order"/>
</tables>
<aggregation-columns>
<aggregation-column expression="COUNT(MAX(*))" aggregation-type="COUNT" alias="c" index="1" />
<aggregation-column expression="MAX(MIN(date))" aggregation-type="MAX" index="3" />
<aggregation-column expression="MIN(time)" aggregation-type="MIN" alias="Time" index="4" />
</aggregation-columns>
<aggregation-select-items>
<aggregation-select-item expression="COUNT(MAX(*))" aggregation-type="COUNT" alias="c" index="1" />
<aggregation-select-item expression="MAX(MIN(date))" aggregation-type="MAX" index="3" />
<aggregation-select-item expression="MIN(time)" aggregation-type="MIN" alias="Time" index="4" />
</aggregation-select-items>
</assert>
<assert id="assertSelectWithAvg" sql="SELECT AVG(MAX(date)) date, AVG(DISTINCT time), order_id FROM order" expected-sql="SELECT AVG(MAX(date)) date, AVG(DISTINCT time), order_id , COUNT(MAX(date)) AS sharding_gen_1 , SUM(MAX(date)) AS sharding_gen_2 , COUNT(DISTINCT time) AS sharding_gen_3 , SUM(DISTINCT time) AS sharding_gen_4 FROM [Token(order)]">
<tables>
<table name="order"/>
</tables>
<aggregation-columns>
<aggregation-column expression="AVG(MAX(date))" aggregation-type="AVG" alias="date" index="1">
<aggregation-select-items>
<aggregation-select-item expression="AVG(MAX(date))" aggregation-type="AVG" alias="date" index="1">
<derived-column expression="COUNT(MAX(date))" aggregation-type="COUNT" alias="sharding_gen_1"/>
<derived-column expression="SUM(MAX(date))" aggregation-type="SUM" alias="sharding_gen_2" />
</aggregation-column>
<aggregation-column expression="COUNT(MAX(date))" aggregation-type="COUNT" alias="sharding_gen_1" />
<aggregation-column expression="SUM(MAX(date))" aggregation-type="SUM" alias="sharding_gen_2" />
<aggregation-column expression="AVG(DISTINCT time)" aggregation-type="AVG" index="2">
</aggregation-select-item>
<aggregation-select-item expression="COUNT(MAX(date))" aggregation-type="COUNT" alias="sharding_gen_1" />
<aggregation-select-item expression="SUM(MAX(date))" aggregation-type="SUM" alias="sharding_gen_2" />
<aggregation-select-item expression="AVG(DISTINCT time)" aggregation-type="AVG" index="2">
<derived-column expression="COUNT(DISTINCT time)" aggregation-type="COUNT" alias="sharding_gen_3" />
<derived-column expression="SUM(DISTINCT time)" aggregation-type="SUM" alias="sharding_gen_4" />
</aggregation-column>
<aggregation-column expression="COUNT(DISTINCT time)" aggregation-type="COUNT" alias="sharding_gen_3" />
<aggregation-column expression="SUM(DISTINCT time)" aggregation-type="SUM" alias="sharding_gen_4" />
</aggregation-columns>
</aggregation-select-item>
<aggregation-select-item expression="COUNT(DISTINCT time)" aggregation-type="COUNT" alias="sharding_gen_3" />
<aggregation-select-item expression="SUM(DISTINCT time)" aggregation-type="SUM" alias="sharding_gen_4" />
</aggregation-select-items>
</assert>
<assert id="assertSelectWithAggregateAndGroupBy" sql="SELECT order_id, MAX(date) FROM order GROUP BY order_id" expected-sql="SELECT order_id, MAX(date) FROM [Token(order)] GROUP BY order_id">
......@@ -36,11 +36,11 @@
<table name="order"/>
</tables>
<group-by-columns>
<group-by-column name="order_id" order-by-type="ASC" />
<group-by-column name="order_id" alias="GROUP_BY_DERIVED_0" order-by-type="ASC" />
</group-by-columns>
<aggregation-columns>
<aggregation-column expression="MAX(date)" aggregation-type="MAX" index="2" />
</aggregation-columns>
<aggregation-select-items>
<aggregation-select-item expression="MAX(date)" aggregation-type="MAX" index="2" />
</aggregation-select-items>
</assert>
<assert id="assertSelectWithUnsupportedFunction" sql="SELECT id, BIT_OR(date) FROM order" expected-sql="SELECT id, BIT_OR(date) FROM [Token(order)]">
......@@ -54,8 +54,8 @@
<tables>
<table name="order"/>
</tables>
<aggregation-columns>
<aggregation-column expression="COUNT(time)" aggregation-type="COUNT" index="2" />
</aggregation-columns>
<aggregation-select-items>
<aggregation-select-item expression="COUNT(time)" aggregation-type="COUNT" index="2" />
</aggregation-select-items>
</assert>
</asserts>
......@@ -5,26 +5,26 @@
<table name="order" alias="o" />
</tables>
<group-by-columns>
<group-by-column owner="o" name="state" alias="sharding_gen_1" order-by-type="ASC" />
<group-by-column owner="o" name="state" alias="GROUP_BY_DERIVED_0" order-by-type="ASC" />
</group-by-columns>
</assert>
<assert id="assertSelectWithGroupBy" sql="SELECT o.state FROM order o GROUP BY o.state" expected-sql="SELECT o.state FROM [Token(order)] o GROUP BY o.state">
<tables>
<table name="order" alias="o" />
</tables>
<group-by-columns>
<group-by-column owner="o" name="state" order-by-type="ASC" />
</group-by-columns>
</assert>
<!---->
<!--<assert id="assertSelectWithGroupBy" sql="SELECT o.state FROM order o GROUP BY o.state" expected-sql="SELECT o.state FROM [Token(order)] o GROUP BY o.state">-->
<!--<tables>-->
<!--<table name="order" alias="o" />-->
<!--</tables>-->
<!--<group-by-columns>-->
<!--<group-by-column owner="o" name="state" order-by-type="ASC" />-->
<!--</group-by-columns>-->
<!--</assert>-->
<!---->
<assert id="assertSelectWithGroupByAndOrderByAndDirectiveColumn" sql="SELECT o.order_id orderId FROM order o GROUP BY o.state ASC, o.order_id DESC" expected-sql="SELECT o.order_id orderId , o.state AS sharding_gen_1 , o.order_id AS sharding_gen_2 FROM [Token(order)] o GROUP BY o.state ASC, o.order_id DESC">
<tables>
<table name="order" alias="o" />
</tables>
<group-by-columns>
<group-by-column owner="o" name="state" alias="sharding_gen_1" order-by-type="ASC" />
<group-by-column owner="o" name="order_id" alias="sharding_gen_2" order-by-type="DESC" />
<group-by-column owner="o" name="state" alias="GROUP_BY_DERIVED_0" order-by-type="ASC" />
<group-by-column owner="o" name="order_id" alias="GROUP_BY_DERIVED_1" order-by-type="DESC" />
</group-by-columns>
</assert>
</asserts>
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册