Skip to content

Commit

Permalink
Merge pull request #1146 from tuohai666/dev
Browse files Browse the repository at this point in the history
 #373, support "order by ?"
  • Loading branch information
terrymanu committed Aug 15, 2018
2 parents 299752a + 45bb004 commit a295f5e
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

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

import com.google.common.base.Optional;
import io.shardingsphere.core.constant.OrderDirection;
import io.shardingsphere.core.parsing.lexer.LexerEngine;
import io.shardingsphere.core.parsing.lexer.dialect.oracle.OracleKeyword;
Expand All @@ -30,7 +31,9 @@
import io.shardingsphere.core.parsing.parser.expression.SQLIdentifierExpression;
import io.shardingsphere.core.parsing.parser.expression.SQLIgnoreExpression;
import io.shardingsphere.core.parsing.parser.expression.SQLNumberExpression;
import io.shardingsphere.core.parsing.parser.expression.SQLPlaceholderExpression;
import io.shardingsphere.core.parsing.parser.expression.SQLPropertyExpression;
import io.shardingsphere.core.parsing.parser.expression.SQLTextExpression;
import io.shardingsphere.core.parsing.parser.sql.dql.select.SelectStatement;
import io.shardingsphere.core.util.SQLUtil;
import lombok.Getter;
Expand Down Expand Up @@ -68,34 +71,44 @@ public final void parse(final SelectStatement selectStatement) {
lexerEngine.skipIfEqual(OracleKeyword.SIBLINGS);
lexerEngine.accept(DefaultKeyword.BY);
do {
result.add(parseSelectOrderByItem(selectStatement));
Optional<OrderItem> orderItem = parseSelectOrderByItem(selectStatement);
if (orderItem.isPresent()) {
result.add(orderItem.get());
}
} while (lexerEngine.skipIfEqual(Symbol.COMMA));
selectStatement.getOrderByItems().addAll(result);
}

private OrderItem parseSelectOrderByItem(final SelectStatement selectStatement) {
private Optional<OrderItem> parseSelectOrderByItem(final SelectStatement selectStatement) {
SQLExpression sqlExpression = basicExpressionParser.parse(selectStatement);
OrderDirection orderDirection = OrderDirection.ASC;
if (lexerEngine.skipIfEqual(DefaultKeyword.ASC)) {
orderDirection = OrderDirection.ASC;
} else if (lexerEngine.skipIfEqual(DefaultKeyword.DESC)) {
orderDirection = OrderDirection.DESC;
}
if (sqlExpression instanceof SQLTextExpression) {
return Optional.of(new OrderItem(SQLUtil.getExactlyValue(((SQLTextExpression) sqlExpression).getText()), orderDirection, getNullOrderDirection()));
}
if (sqlExpression instanceof SQLNumberExpression) {
return new OrderItem(((SQLNumberExpression) sqlExpression).getNumber().intValue(), orderDirection, getNullOrderDirection());
return Optional.of(new OrderItem(((SQLNumberExpression) sqlExpression).getNumber().intValue(), orderDirection, getNullOrderDirection()));
}
if (sqlExpression instanceof SQLIdentifierExpression) {
return new OrderItem(SQLUtil.getExactlyValue(((SQLIdentifierExpression) sqlExpression).getName()),
orderDirection, getNullOrderDirection(), selectStatement.getAlias(SQLUtil.getExactlyValue(((SQLIdentifierExpression) sqlExpression).getName())));
return Optional.of(new OrderItem(SQLUtil.getExactlyValue(((SQLIdentifierExpression) sqlExpression).getName()),
orderDirection, getNullOrderDirection(), selectStatement.getAlias(SQLUtil.getExactlyValue(((SQLIdentifierExpression) sqlExpression).getName()))));
}
if (sqlExpression instanceof SQLPropertyExpression) {
SQLPropertyExpression sqlPropertyExpression = (SQLPropertyExpression) sqlExpression;
return new OrderItem(SQLUtil.getExactlyValue(sqlPropertyExpression.getOwner().getName()), SQLUtil.getExactlyValue(sqlPropertyExpression.getName()), orderDirection, getNullOrderDirection(),
selectStatement.getAlias(SQLUtil.getExactlyValue(sqlPropertyExpression.getOwner().getName()) + "." + SQLUtil.getExactlyValue(sqlPropertyExpression.getName())));
return Optional.of(
new OrderItem(SQLUtil.getExactlyValue(sqlPropertyExpression.getOwner().getName()), SQLUtil.getExactlyValue(sqlPropertyExpression.getName()), orderDirection, getNullOrderDirection(),
selectStatement.getAlias(SQLUtil.getExactlyValue(sqlPropertyExpression.getOwner().getName()) + "." + SQLUtil.getExactlyValue(sqlPropertyExpression.getName()))));
}
if (sqlExpression instanceof SQLIgnoreExpression) {
SQLIgnoreExpression sqlIgnoreExpression = (SQLIgnoreExpression) sqlExpression;
return new OrderItem(sqlIgnoreExpression.getExpression(), orderDirection, getNullOrderDirection(), selectStatement.getAlias(sqlIgnoreExpression.getExpression()));
return Optional.of(new OrderItem(sqlIgnoreExpression.getExpression(), orderDirection, getNullOrderDirection(), selectStatement.getAlias(sqlIgnoreExpression.getExpression())));
}
if (sqlExpression instanceof SQLPlaceholderExpression) {
return Optional.absent();
}
throw new SQLParsingException(lexerEngine);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,14 @@ public OrderItem(final int index, final OrderDirection orderDirection, final Ord
alias = Optional.absent();
}

public OrderItem(final String name, final OrderDirection orderDirection, final OrderDirection nullOrderDirection) {
owner = Optional.absent();
this.name = Optional.of(name);
this.orderDirection = orderDirection;
this.nullOrderDirection = nullOrderDirection;
alias = Optional.absent();
}

/**
* Get column label.
*
Expand Down
25 changes: 19 additions & 6 deletions sharding-core/src/test/resources/parser/select_order_by.xml
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@
<order-by-column owner="o" name="order_id" alias="gen_order_id_" order-direction="ASC" />
</order-by-columns>
</parser-result>

<parser-result sql-case-id="select_order_by_with_multiple_stars">
<tables>
<table name="t_order" alias="o" />
Expand All @@ -103,7 +103,7 @@
<order-by-column owner="o" name="order_id" order-direction="ASC" />
</order-by-columns>
</parser-result>

<parser-result sql-case-id="select_order_by_with_alias_star_alias_name">
<tables>
<table name="t_order" alias="o" />
Expand All @@ -115,7 +115,7 @@
<order-by-column owner="o" name="order_id" order-direction="ASC" />
</order-by-columns>
</parser-result>

<parser-result sql-case-id="select_order_by_with_star_table_alias">
<tables>
<table name="t_order" alias="o" />
Expand All @@ -127,7 +127,20 @@
<order-by-column name="order_id" order-direction="ASC" />
</order-by-columns>
</parser-result>


<!--TODO need to add later-->
<!--<parser-result sql-case-id="select_order_by_with_parameter" parameters="order_id">-->
<!--<tables>-->
<!--<table name="t_order" alias="o" />-->
<!--</tables>-->
<!--<tokens>-->
<!--<table-token begin-position="14" original-literals="t_order" />-->
<!--</tokens>-->
<!--<order-by-columns>-->
<!--<order-by-column name="order_id" order-direction="ASC" />-->
<!--</order-by-columns>-->
<!--</parser-result>-->

<parser-result sql-case-id="select_order_by_with_table_star_table_name">
<tables>
<table name="t_order" />
Expand All @@ -141,7 +154,7 @@
<order-by-column owner="t_order" name="order_id" order-direction="ASC" />
</order-by-columns>
</parser-result>

<parser-result sql-case-id="select_order_by_with_star_no_table_alias">
<tables>
<table name="t_order" />
Expand All @@ -153,7 +166,7 @@
<order-by-column name="order_id" order-direction="ASC" />
</order-by-columns>
</parser-result>

<parser-result sql-case-id="select_order_by_with_table_star_without_table_name">
<tables>
<table name="t_order" alias="o"/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -243,27 +243,32 @@
<dql-test-case sql-case-id="select_order_by_for_nulls_last">
<assertion expected-data-file="select_order_by_with_ordered_column.xml" />
</dql-test-case>

<dql-test-case sql-case-id="select_order_by_with_multiple_stars">
<assertion expected-data-file="select_order_by_with_multiple_stars.xml" />
</dql-test-case>

<dql-test-case sql-case-id="select_order_by_with_alias_star_alias_name">
<assertion expected-data-file="select_order_by_with_alias_star_alias_name.xml" />
</dql-test-case>

<dql-test-case sql-case-id="select_order_by_with_alias_star_alias_name">
<assertion expected-data-file="select_order_by_with_alias_star_alias_name.xml" />
</dql-test-case>

<dql-test-case sql-case-id="select_order_by_with_star_table_alias">
<assertion expected-data-file="select_order_by_with_star_table_alias.xml" />
</dql-test-case>

<dql-test-case sql-case-id="select_order_by_with_table_star_table_name">
<assertion expected-data-file="select_order_by_with_table_star_table_name.xml" />
</dql-test-case>


<!--TODO need to add later-->
<!--<dql-test-case sql-case-id="select_order_by_with_parameter">-->
<!--<assertion parameters="order_id:String" expected-data-file="select_order_by_with_star_table_alias.xml" />-->
<!--</dql-test-case>-->

<dql-test-case sql-case-id="select_order_by_with_star_no_table_alias">
<assertion expected-data-file="select_order_by_with_star_no_table_alias.xml" />
</dql-test-case>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
<sql-case id="select_order_by_with_multiple_stars" value="SELECT *, order_id, o.* FROM t_order o ORDER BY o.order_id" />
<sql-case id="select_order_by_with_alias_star_alias_name" value="SELECT o.* FROM t_order o ORDER BY o.order_id" db-types="H2,MySQL" />
<sql-case id="select_order_by_with_star_table_alias" value="SELECT * FROM t_order o ORDER BY order_id" db-types="H2,MySQL" />
<!--TODO need to add later-->
<!--<sql-case id="select_order_by_with_parameter" value="SELECT * FROM t_order o ORDER BY ?" db-types="H2,MySQL" />-->
<!--<sql-case id="select_order_by_with_parameter_desc" value="SELECT * FROM t_order o ORDER BY ? DESC" db-types="H2,MySQL" />-->
<sql-case id="select_order_by_with_table_star_table_name" value="SELECT t_order.* FROM t_order ORDER BY t_order.order_id" db-types="H2,MySQL" />
<sql-case id="select_order_by_with_star_no_table_alias" value="SELECT * FROM t_order ORDER BY order_id" db-types="H2,MySQL" />
<sql-case id="select_order_by_with_table_star_without_table_name" value="SELECT i.*, o.* FROM t_order o JOIN t_order_item i ON o.user_id = i.user_id AND o.order_id = i.order_id ORDER BY item_id" db-types="H2,MySQL" />
Expand Down

0 comments on commit a295f5e

Please sign in to comment.