提交 180bb29a 编写于 作者: G gaoht

fix #63 derive column bug

上级 dfb3c5c2
/*
* Copyright 1999-2015 dangdang.com.
* <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 com.dangdang.ddframe.rdb.sharding.parser.result.merger;
import com.google.common.base.Optional;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.ToString;
/**
* 可排序列.
*
* @author gaohongtao.
*/
@ToString
@Getter
@RequiredArgsConstructor
public abstract class AbstractSortableColumn {
private final Optional<String> owner;
private final Optional<String> name;
private final Optional<String> alias;
private final OrderByColumn.OrderByType orderByType;
}
......@@ -20,7 +20,6 @@ package com.dangdang.ddframe.rdb.sharding.parser.result.merger;
import com.dangdang.ddframe.rdb.sharding.parser.result.merger.OrderByColumn.OrderByType;
import com.google.common.base.Optional;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import lombok.ToString;
......@@ -29,27 +28,24 @@ import lombok.ToString;
*
* @author zhangliang
*/
@RequiredArgsConstructor
@Getter
@ToString
public final class GroupByColumn implements IndexColumn {
private final String name;
private final String alias;
private final OrderByType orderByType;
@ToString(callSuper = true)
public final class GroupByColumn extends AbstractSortableColumn implements IndexColumn {
@Setter
private int columnIndex;
public GroupByColumn(final Optional<String> owner, final String name, final Optional<String> alias, final OrderByType orderByType) {
super(owner, Optional.of(name), alias, orderByType);
}
@Override
public Optional<String> getColumnLabel() {
return Optional.of(alias);
return getAlias();
}
@Override
public Optional<String> getColumnName() {
return Optional.of(name);
return getName();
}
}
......@@ -105,7 +105,7 @@ public final class MergeContext {
@Override
public OrderByColumn apply(final GroupByColumn input) {
OrderByColumn result = new OrderByColumn(input.getName(), input.getAlias(), input.getOrderByType());
OrderByColumn result = new OrderByColumn(input.getOwner(), input.getName().get(), input.getAlias(), input.getOrderByType());
result.setColumnIndex(input.getColumnIndex());
return result;
}
......
......@@ -20,9 +20,7 @@ package com.dangdang.ddframe.rdb.sharding.parser.result.merger;
import com.alibaba.druid.sql.ast.SQLOrderingSpecification;
import com.google.common.base.Objects;
import com.google.common.base.Optional;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.ToString;
/**
......@@ -30,31 +28,27 @@ import lombok.ToString;
*
* @author zhangliang
*/
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
@Getter
@ToString
public final class OrderByColumn implements IndexColumn {
private final Optional<String> name;
@ToString(callSuper = true)
public final class OrderByColumn extends AbstractSortableColumn implements IndexColumn {
private final Optional<Integer> index;
private final Optional<String> alias;
private final OrderByType orderByType;
private int columnIndex;
public OrderByColumn(final String name, final String alias, final OrderByType orderByType) {
this(Optional.of(name), Optional.<Integer>absent(), Optional.fromNullable(alias), orderByType);
public OrderByColumn(final Optional<String> owner, final String name, final Optional<String> alias, final OrderByType orderByType) {
super(owner, Optional.of(name), alias, orderByType);
index = Optional.absent();
}
public OrderByColumn(final String name, final OrderByType orderByType) {
this(Optional.of(name), Optional.<Integer>absent(), Optional.<String>absent(), orderByType);
super(Optional.<String>absent(), Optional.of(name), Optional.<String>absent(), orderByType);
index = Optional.absent();
}
public OrderByColumn(final int index, final OrderByType orderByType) {
this(Optional.<String>absent(), Optional.of(index), Optional.<String>absent(), orderByType);
super(Optional.<String>absent(), Optional.<String>absent(), Optional.<String>absent(), orderByType);
this.index = Optional.of(index);
columnIndex = index;
}
......@@ -68,12 +62,12 @@ public final class OrderByColumn implements IndexColumn {
@Override
public Optional<String> getColumnLabel() {
return alias;
return getAlias();
}
@Override
public Optional<String> getColumnName() {
return name;
return getName();
}
/**
......@@ -105,14 +99,14 @@ public final class OrderByColumn implements IndexColumn {
return false;
}
OrderByColumn that = (OrderByColumn) o;
return orderByType == that.orderByType && (columnIndex == that.columnIndex
return getOrderByType() == that.getOrderByType() && (columnIndex == that.columnIndex
|| index.isPresent() && that.index.isPresent() && index.get().equals(that.index.get())
|| name.isPresent() && that.name.isPresent() && name.get().equals(that.name.get())
|| alias.isPresent() && that.alias.isPresent() && alias.get().equals(that.alias.get()));
|| getName().isPresent() && that.getName().isPresent() && getName().get().equals(that.getName().get())
|| getAlias().isPresent() && that.getAlias().isPresent() && getAlias().get().equals(that.getAlias().get()));
}
@Override
public int hashCode() {
return Objects.hashCode(orderByType, columnIndex);
return Objects.hashCode(getOrderByType(), columnIndex);
}
}
......@@ -275,6 +275,10 @@ public final class ParseContext {
return new AggregationColumn(expression, AggregationType.COUNT, Optional.of(generateDerivedColumnAlias()), avgColumn.getOption());
}
private String generateDerivedColumnAlias() {
return String.format(SHARDING_GEN_ALIAS, ++selectItemsCount);
}
private AggregationColumn getDerivedSumColumn(final AggregationColumn avgColumn) {
String expression = avgColumn.getExpression().replaceFirst(AggregationType.AVG.toString(), AggregationType.SUM.toString());
if (avgColumn.getOption().isPresent()) {
......@@ -296,16 +300,20 @@ public final class ParseContext {
/**
* 将排序列加入解析上下文.
*
* @param owner 列拥有者
* @param name 列名称
* @param orderByType 排序类型
*/
public void addOrderByColumn(final String name, final OrderByType orderByType) {
public void addOrderByColumn(final Optional<String> owner, final String name, final OrderByType orderByType) {
String rawName = SQLUtil.getExactlyValue(name);
String alias = null;
if (!containsSelectItem(rawName)) {
alias = generateDerivedColumnAlias();
parsedResult.getMergeContext().getOrderByColumns().add(new OrderByColumn(owner, rawName, getAlias(rawName), orderByType));
}
private Optional<String> getAlias(final String name) {
if (containsSelectItem(name)) {
return Optional.absent();
}
parsedResult.getMergeContext().getOrderByColumns().add(new OrderByColumn(rawName, alias, orderByType));
return Optional.of(generateDerivedColumnAlias());
}
private boolean containsSelectItem(final String selectItem) {
......@@ -315,28 +323,42 @@ public final class ParseContext {
/**
* 将分组列加入解析上下文.
*
* @param owner 列拥有者
* @param name 列名称
* @param alias 列别名
* @param orderByType 排序类型
*/
public void addGroupByColumns(final String name, final String alias, final OrderByType orderByType) {
parsedResult.getMergeContext().getGroupByColumns().add(new GroupByColumn(SQLUtil.getExactlyValue(name), alias, orderByType));
public void addGroupByColumns(final Optional<String> owner, final String name, final OrderByType orderByType) {
String rawName = SQLUtil.getExactlyValue(name);
parsedResult.getMergeContext().getGroupByColumns().add(new GroupByColumn(owner, rawName, getAlias(rawName), orderByType));
}
/**
* 生成补列别名.
*
* @return 补列的别名
*/
public String generateDerivedColumnAlias() {
return String.format(SHARDING_GEN_ALIAS, ++selectItemsCount);
}
/**
* 将当前解析的条件对象归并入解析结果.
*/
public void mergeCurrentConditionContext() {
parsedResult.getConditionContexts().add(currentConditionContext);
if (!parsedResult.getRouteContext().getTables().isEmpty()) {
parsedResult.getConditionContexts().add(currentConditionContext);
return;
}
Optional<SQLParsedResult> target = findValidParseResult();
if (!target.isPresent()) {
parsedResult.getConditionContexts().add(currentConditionContext);
return;
}
parsedResult.getRouteContext().getTables().addAll(target.get().getRouteContext().getTables());
parsedResult.getConditionContexts().addAll(target.get().getConditionContexts());
}
private Optional<SQLParsedResult> findValidParseResult() {
for (ParseContext each : subParseContext) {
each.mergeCurrentConditionContext();
if (each.getParsedResult().getRouteContext().getTables().isEmpty()) {
continue;
}
return Optional.of(each.getParsedResult());
}
return Optional.absent();
}
/**
......
......@@ -32,11 +32,10 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlSelectGroupByExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlOutputVisitor;
import com.dangdang.ddframe.rdb.sharding.parser.result.merger.AbstractSortableColumn;
import com.dangdang.ddframe.rdb.sharding.parser.result.merger.AggregationColumn;
import com.dangdang.ddframe.rdb.sharding.parser.result.merger.AggregationColumn.AggregationType;
import com.dangdang.ddframe.rdb.sharding.parser.result.merger.GroupByColumn;
import com.dangdang.ddframe.rdb.sharding.parser.result.merger.Limit;
import com.dangdang.ddframe.rdb.sharding.parser.result.merger.OrderByColumn;
import com.dangdang.ddframe.rdb.sharding.parser.result.merger.OrderByColumn.OrderByType;
import com.google.common.base.Optional;
import com.google.common.base.Strings;
......@@ -123,9 +122,11 @@ public class MySQLSelectVisitor extends AbstractMySQLVisitor {
if (expr instanceof SQLIntegerExpr) {
getParseContext().addOrderByColumn(((SQLIntegerExpr) expr).getNumber().intValue(), orderByType);
} else if (expr instanceof SQLIdentifierExpr) {
getParseContext().addOrderByColumn(((SQLIdentifierExpr) expr).getName(), orderByType);
getParseContext().addOrderByColumn(Optional.<String>absent(), ((SQLIdentifierExpr) expr).getName(), orderByType);
} else if (expr instanceof SQLPropertyExpr) {
getParseContext().addOrderByColumn(((SQLPropertyExpr) expr).getName(), orderByType);
SQLPropertyExpr sqlPropertyExpr = (SQLPropertyExpr) expr;
getParseContext().addOrderByColumn(Optional.of(sqlPropertyExpr.getOwner().toString()), sqlPropertyExpr.getName(), orderByType);
}
}
return super.visit(x);
......@@ -140,14 +141,13 @@ public class MySQLSelectVisitor extends AbstractMySQLVisitor {
*/
@Override
public boolean visit(final MySqlSelectGroupByExpr x) {
String alias = getParseContext().generateDerivedColumnAlias();
OrderByType orderByType = null == x.getType() ? OrderByType.ASC : OrderByType.valueOf(x.getType());
if (x.getExpr() instanceof SQLPropertyExpr) {
SQLPropertyExpr expr = (SQLPropertyExpr) x.getExpr();
getParseContext().addGroupByColumns(expr.toString(), alias, orderByType);
getParseContext().addGroupByColumns(Optional.of(expr.getOwner().toString()), expr.getName(), orderByType);
} else if (x.getExpr() instanceof SQLIdentifierExpr) {
SQLIdentifierExpr expr = (SQLIdentifierExpr) x.getExpr();
getParseContext().addGroupByColumns(expr.getName(), alias, orderByType);
getParseContext().addGroupByColumns(Optional.<String>absent(), expr.getName(), orderByType);
}
return super.visit(x);
}
......@@ -193,18 +193,25 @@ public class MySQLSelectVisitor extends AbstractMySQLVisitor {
derivedSelectItems.append(", ").append(derivedColumn.getExpression()).append(" AS ").append(derivedColumn.getAlias().get());
}
}
for (GroupByColumn each : getParseContext().getParsedResult().getMergeContext().getGroupByColumns()) {
derivedSelectItems.append(", ").append(each.getName()).append(" AS ").append(each.getAlias());
}
for (OrderByColumn each : getParseContext().getParsedResult().getMergeContext().getOrderByColumns()) {
if (each.getAlias().isPresent()) {
derivedSelectItems.append(", ").append(each.getName().get()).append(" AS ").append(each.getAlias().get());
}
}
appendSortableColumn(derivedSelectItems, getParseContext().getParsedResult().getMergeContext().getGroupByColumns());
appendSortableColumn(derivedSelectItems, getParseContext().getParsedResult().getMergeContext().getOrderByColumns());
if (0 != derivedSelectItems.length()) {
getSQLBuilder().buildSQL(getParseContext().getAutoGenTokenKey(), derivedSelectItems.toString());
}
super.endVisit(x);
stepOutQuery();
}
private void appendSortableColumn(final StringBuilder derivedSelectItems, final List<? extends AbstractSortableColumn> sortableColumns) {
for (AbstractSortableColumn each : sortableColumns) {
if (!each.getAlias().isPresent()) {
continue;
}
derivedSelectItems.append(", ");
if (each.getOwner().isPresent()) {
derivedSelectItems.append(each.getOwner().get()).append(".");
}
derivedSelectItems.append(each.getName().get()).append(" AS ").append(each.getAlias().get());
}
}
}
......@@ -45,7 +45,7 @@ public class GroupByRowTest {
MockResultSet rs = new MockResultSet<>(Arrays.asList(rs1, rs2));
assertThat(rs.next(), is(true));
GroupByColumn groupByColumn = new GroupByColumn("user_id", "", OrderByColumn.OrderByType.ASC);
GroupByColumn groupByColumn = new GroupByColumn(Optional.<String>absent(), "user_id", Optional.<String>absent(), OrderByColumn.OrderByType.ASC);
groupByColumn.setColumnIndex(1);
AggregationColumn aggregationColumn = new AggregationColumn("SUM(0)", AggregationColumn.AggregationType.SUM, Optional.<String>absent(), Optional.<String>absent());
aggregationColumn.setColumnIndex(2);
......
......@@ -159,7 +159,7 @@ public abstract class AbstractBaseParseTest {
@Override
public OrderByColumn apply(final com.dangdang.ddframe.rdb.sharding.parser.jaxb.OrderByColumn input) {
return Strings.isNullOrEmpty(input.getName()) ? new OrderByColumn(input.getIndex(), OrderByType.valueOf(input.getOrderByType().toUpperCase()))
: new OrderByColumn(input.getName(), input.getAlias(), OrderByType.valueOf(input.getOrderByType().toUpperCase()));
: new OrderByColumn(Optional.fromNullable(input.getOwner()), input.getName(), Optional.fromNullable(input.getAlias()), OrderByType.valueOf(input.getOrderByType().toUpperCase()));
}
}));
}
......@@ -168,7 +168,7 @@ public abstract class AbstractBaseParseTest {
@Override
public GroupByColumn apply(final com.dangdang.ddframe.rdb.sharding.parser.jaxb.GroupByColumn input) {
return new GroupByColumn(input.getName(), input.getAlias(), OrderByType.valueOf(input.getOrderByType().toUpperCase()));
return new GroupByColumn(Optional.fromNullable(input.getOwner()), input.getName(), Optional.fromNullable(input.getAlias()), OrderByType.valueOf(input.getOrderByType().toUpperCase()));
}
}));
}
......
......@@ -17,18 +17,21 @@
package com.dangdang.ddframe.rdb.sharding.parser.jaxb;
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 lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@XmlAccessorType(XmlAccessType.FIELD)
public final class GroupByColumn {
@XmlAttribute
private String owner;
@XmlAttribute
private String name;
......
......@@ -17,18 +17,21 @@
package com.dangdang.ddframe.rdb.sharding.parser.jaxb;
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 lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@XmlAccessorType(XmlAccessType.FIELD)
public final class OrderByColumn {
@XmlAttribute
private String owner;
@XmlAttribute
private String name;
......
......@@ -56,8 +56,8 @@ public final class SQLParsedResultTest {
+ "conditionContexts=[ConditionContext(conditions={Condition.Column(columnName=id, tableName=order)=Condition(column=Condition.Column(columnName=id, tableName=order), "
+ "operator=IN, values=[1, 2, 3])})], "
+ "mergeContext=MergeContext("
+ "orderByColumns=[OrderByColumn(name=Optional.of(id), index=Optional.absent(), alias=Optional.of(a), orderByType=DESC, columnIndex=0)], "
+ "groupByColumns=[GroupByColumn(name=id, alias=d, orderByType=ASC, columnIndex=0)], "
+ "orderByColumns=[OrderByColumn(super=AbstractSortableColumn(owner=Optional.absent(), name=Optional.of(id), alias=Optional.of(a), orderByType=DESC), index=Optional.absent(), columnIndex=0)], "
+ "groupByColumns=[GroupByColumn(super=AbstractSortableColumn(owner=Optional.absent(), name=Optional.of(id), alias=Optional.of(d), orderByType=ASC), columnIndex=0)], "
+ "aggregationColumns=[AggregationColumn(expression=COUNT(id), aggregationType=COUNT, alias=Optional.of(c), option=Optional.absent(), derivedColumns=[], columnIndex=-1)], "
+ "limit=Limit(offset=0, rowCount=10), executorEngine=null, columnLabelIndexMap=null, currentOrderByKeys=[]))"));
}
......@@ -85,8 +85,8 @@ public final class SQLParsedResultTest {
private void generateMergeContext(final MergeContext mergeContext) {
mergeContext.getAggregationColumns().add(new AggregationColumn("COUNT(id)", AggregationType.COUNT, Optional.of("c"), Optional.<String>absent()));
mergeContext.getOrderByColumns().add(new OrderByColumn("id", "a", OrderByType.DESC));
mergeContext.getGroupByColumns().add(new GroupByColumn("id", "d", OrderByType.ASC));
mergeContext.getOrderByColumns().add(new OrderByColumn(Optional.<String>absent(), "id", Optional.of("a"), OrderByType.DESC));
mergeContext.getGroupByColumns().add(new GroupByColumn(Optional.<String>absent(), "id", Optional.of("d"), OrderByType.ASC));
mergeContext.setLimit(new Limit(0, 10));
}
}
......@@ -37,7 +37,7 @@
</aggregation-columns>
</assert>
<assert id="assertSelectWithAggregateAndGroupBy" sql="SELECT order_id, MAX(date) FROM order GROUP BY order_id" expected-sql="SELECT order_id, MAX(date)[Token(, order_id AS sharding_gen_1)] FROM [Token(order)] GROUP BY order_id">
<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">
<tables>
<table name="order"/>
</tables>
......@@ -45,7 +45,7 @@
<condition-context />
</condition-contexts>
<group-by-columns>
<group-by-column name="order_id" alias="sharding_gen_1" order-by-type="ASC" />
<group-by-column name="order_id" order-by-type="ASC" />
</group-by-columns>
<aggregation-columns>
<aggregation-column expression="MAX(date)" aggregation-type="MAX" index="2" />
......
<?xml version="1.0" encoding="UTF-8"?>
<asserts>
<assert id="assertSelectWithGroupBy" sql="SELECT * FROM order o GROUP BY o.state" expected-sql="SELECT *[Token(, o.state AS sharding_gen_1)] FROM [Token(order)] o GROUP BY o.state">
<assert id="assertSelectWithGroupByAndDirectiveColumn" sql="SELECT o.order_id FROM order o GROUP BY o.state" expected-sql="SELECT [Token(o)].order_id[Token(, o.state AS sharding_gen_1)] FROM [Token(order)] o GROUP BY o.state">
<tables>
<table name="order" alias="o" />
</tables>
......@@ -8,11 +8,23 @@
<condition-context />
</condition-contexts>
<group-by-columns>
<group-by-column name="o.state" alias="sharding_gen_1" order-by-type="ASC" />
<group-by-column owner="o" name="state" alias="sharding_gen_1" 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 [Token(o)].state FROM [Token(order)] o GROUP BY o.state">
<tables>
<table name="order" alias="o" />
</tables>
<condition-contexts>
<condition-context />
</condition-contexts>
<group-by-columns>
<group-by-column owner="o" name="state" order-by-type="ASC" />
</group-by-columns>
</assert>
<assert id="assertSelectWithGroupByAndOrderBy" sql="SELECT * FROM order o GROUP BY o.state ASC, o.order_id DESC" expected-sql="SELECT *[Token(, 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">
<assert id="assertSelectWithGroupByAndOrderByAndDirectiveColumn" sql="SELECT o.order_id orderId FROM order o GROUP BY o.state ASC, o.order_id DESC" expected-sql="SELECT [Token(o)].order_id AS orderId[Token(, 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>
......@@ -20,8 +32,8 @@
<condition-context />
</condition-contexts>
<group-by-columns>
<group-by-column name="o.state" alias="sharding_gen_1" order-by-type="ASC" />
<group-by-column name="o.order_id" alias="sharding_gen_2" order-by-type="DESC" />
<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-columns>
</assert>
</asserts>
......@@ -8,7 +8,7 @@
<condition-context />
</condition-contexts>
<order-by-columns>
<order-by-column name="order_id" order-by-type="ASC" />
<order-by-column owner="o" name="order_id" order-by-type="ASC" />
<order-by-column index="2" order-by-type="DESC" />
</order-by-columns>
</assert>
......@@ -26,12 +26,12 @@
</condition-context>
</condition-contexts>
<order-by-columns>
<order-by-column name="order_id" order-by-type="DESC" />
<order-by-column owner="o" name="order_id" order-by-type="DESC" />
<order-by-column index="2" order-by-type="ASC" />
</order-by-columns>
</assert>
<assert id="assertSelectWithOrderByForAlias" sql="SELECT o.order_id as `gen_order_id_` FROM order o ORDER BY o.order_id" expected-sql="SELECT [Token(o)].order_id AS `gen_order_id_`[Token(, order_id AS sharding_gen_1)] FROM [Token(order)] o ORDER BY o.order_id">
<assert id="assertSelectWithOrderByForAlias" sql="SELECT o.order_id as `gen_order_id_` FROM order o ORDER BY o.order_id" expected-sql="SELECT [Token(o)].order_id AS `gen_order_id_`[Token(, o.order_id AS sharding_gen_1)] FROM [Token(order)] o ORDER BY o.order_id">
<tables>
<table name="order" alias="o" />
</tables>
......@@ -40,7 +40,7 @@
</condition-context>
</condition-contexts>
<order-by-columns>
<order-by-column name="order_id" alias="sharding_gen_1" order-by-type="ASC" />
<order-by-column owner="o" name="order_id" alias="sharding_gen_1" order-by-type="ASC" />
</order-by-columns>
</assert>
</asserts>
<?xml version="1.0" encoding="UTF-8"?>
<asserts>
<assert id="assertSelectWithOrderByForAliasAndSubQuery" sql="SELECT price FROM (SELECT o.user_id,o.price FROM order o WHERE o.order_id = 1 ORDER BY o.order_id) order by user_id" expected-sql="SELECT price[Token(, user_id AS sharding_gen_1)] FROM (SELECT [Token(o)].user_id, [Token(o)].price[Token(, order_id AS sharding_gen_1)] FROM [Token(order)] o WHERE o.order_id = 1 ORDER BY o.order_id ) ORDER BY user_id">
<assert id="assertSelectWithOrderByForAliasAndSubQuery" sql="SELECT price FROM (SELECT o.user_id,o.price FROM order o WHERE o.order_id = 1 ORDER BY o.order_id) order by user_id" expected-sql="SELECT price[Token(, user_id AS sharding_gen_1)] FROM (SELECT [Token(o)].user_id, [Token(o)].price[Token(, o.order_id AS sharding_gen_1)] FROM [Token(order)] o WHERE o.order_id = 1 ORDER BY o.order_id ) ORDER BY user_id">
<tables>
<table name="order" alias="o" />
</tables>
<condition-contexts>
<condition-context>
<condition column-name="order_id" table-name="order" operator="EQUAL">
<value value="1" type="java.lang.Integer" />
</condition>
</condition-context>
</condition-contexts>
<order-by-columns>
<order-by-column name="user_id" alias="sharding_gen_1" order-by-type="ASC" />
</order-by-columns>
</assert>
<assert id="assertSelectWithGroupByAndSubQuery" sql="SELECT AVG(i.SUM_PRICE) avg FROM (SELECT o.order_id,SUM(o.price) AS SUM_PRICE FROM order o WHERE o.order_id = 1 GROUP BY o.order_id) i" expected-sql="SELECT AVG(i.SUM_PRICE) AS avg[Token(, COUNT(i.SUM_PRICE) AS sharding_gen_1, SUM(i.SUM_PRICE) AS sharding_gen_2)] FROM (SELECT [Token(o)].order_id, SUM(o.price) AS SUM_PRICE[Token(, o.order_id AS sharding_gen_1)] FROM [Token(order)] o WHERE o.order_id = 1 GROUP BY o.order_id ) i">
<assert id="assertSelectWithGroupByAndSubQuery" sql="SELECT AVG(i.SUM_PRICE) avg FROM (SELECT o.order_id,SUM(o.price) AS SUM_PRICE FROM order o WHERE o.order_id = 1 GROUP BY o.order_id) i" expected-sql="SELECT AVG(i.SUM_PRICE) AS avg[Token(, COUNT(i.SUM_PRICE) AS sharding_gen_1, SUM(i.SUM_PRICE) AS sharding_gen_2)] FROM (SELECT [Token(o)].order_id, SUM(o.price) AS SUM_PRICE FROM [Token(order)] o WHERE o.order_id = 1 GROUP BY o.order_id ) i">
<tables>
<table name="order" alias="o" />
</tables>
<condition-contexts>
<condition-context>
<condition column-name="order_id" table-name="order" operator="EQUAL">
<value value="1" type="java.lang.Integer" />
</condition>
</condition-context>
</condition-contexts>
<aggregation-columns>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册