提交 2dd6253f 编写于 作者: T terrymanu

refactor find column

上级 be300938
......@@ -40,6 +40,7 @@ import com.google.common.base.Optional;
import lombok.Getter;
import lombok.Setter;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
......@@ -286,7 +287,7 @@ public class SQLParser extends AbstractParser {
// TODO 如果有多表,且找不到column是哪个表的,则不加入condition,以后需要解析binding table
if ((1 == sqlStatement.getTables().size() || left instanceof SQLPropertyExpression)
&& (right instanceof SQLNumberExpression || right instanceof SQLTextExpression || right instanceof SQLPlaceholderExpression)) {
Optional<Column> column = sqlStatement.findColumn(left);
Optional<Column> column = find(sqlStatement.getTables(), left);
if (column.isPresent() && shardingRule.isShardingColumn(column.get())) {
sqlStatement.add(new Condition(column.get(), right));
}
......@@ -303,7 +304,7 @@ public class SQLParser extends AbstractParser {
}
rights.add(parseExpression(sqlStatement));
} while (!equalAny(Symbol.RIGHT_PAREN));
Optional<Column> column = sqlStatement.findColumn(left);
Optional<Column> column = find(sqlStatement.getTables(), left);
if (column.isPresent() && shardingRule.isShardingColumn(column.get())) {
sqlStatement.add(new Condition(column.get(), rights));
}
......@@ -316,7 +317,7 @@ public class SQLParser extends AbstractParser {
rights.add(parseExpression(sqlStatement));
accept(DefaultKeyword.AND);
rights.add(parseExpression(sqlStatement));
Optional<Column> column = sqlStatement.findColumn(left);
Optional<Column> column = find(sqlStatement.getTables(), left);
if (column.isPresent() && shardingRule.isShardingColumn(column.get())) {
sqlStatement.add(new Condition(column.get(), rights.get(0), rights.get(1)));
}
......@@ -326,4 +327,47 @@ public class SQLParser extends AbstractParser {
getLexer().nextToken();
parseExpression(sqlStatement);
}
private Optional<Column> find(final Collection<Table> tables, final SQLExpression sqlExpression) {
if (sqlExpression instanceof SQLPropertyExpression) {
return getColumnWithQualifiedName(tables, (SQLPropertyExpression) sqlExpression);
}
if (sqlExpression instanceof SQLIdentifierExpression) {
return getColumnWithoutOwner(tables, SQLUtil.getExactlyValue(((SQLIdentifierExpression) sqlExpression).getName()));
}
return Optional.absent();
}
private Optional<Column> getColumnWithQualifiedName(final Collection<Table> tables, final SQLPropertyExpression propertyExpression) {
Optional<Table> table = findTable(tables, SQLUtil.getExactlyValue((propertyExpression.getOwner()).getName()));
return propertyExpression.getOwner() instanceof SQLIdentifierExpression && table.isPresent()
? Optional.of(new Column(SQLUtil.getExactlyValue(propertyExpression.getName()), table.get().getName())) : Optional.<Column>absent();
}
private Optional<Table> findTable(final Collection<Table> tables, final String tableNameOrAlias) {
Optional<Table> tableFromName = findTableFromName(tables, tableNameOrAlias);
return tableFromName.isPresent() ? tableFromName : findTableFromAlias(tables, tableNameOrAlias);
}
private Optional<Table> findTableFromName(final Collection<Table> tables, final String name) {
for (Table each : tables) {
if (each.getName().equalsIgnoreCase(name)) {
return Optional.of(each);
}
}
return Optional.absent();
}
private Optional<Table> findTableFromAlias(final Collection<Table> tables, final String alias) {
for (Table each : tables) {
if (each.getAlias().isPresent() && each.getAlias().get().equalsIgnoreCase(alias)) {
return Optional.of(each);
}
}
return Optional.absent();
}
private Optional<Column> getColumnWithoutOwner(final Collection<Table> tables, final String columnName) {
return 1 == tables.size() ? Optional.of(new Column(columnName, tables.iterator().next().getName())) : Optional.<Column>absent();
}
}
......@@ -19,17 +19,13 @@ package com.dangdang.ddframe.rdb.sharding.parsing.parser.statement;
import com.dangdang.ddframe.rdb.sharding.constant.SQLType;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.AggregationSelectItem;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.Column;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.Condition;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.GroupBy;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.Limit;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.OrderBy;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.Column;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.Table;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLExpression;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLIdentifierExpression;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLPropertyExpression;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.token.SQLToken;
import com.dangdang.ddframe.rdb.sharding.util.SQLUtil;
import com.google.common.base.Optional;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
......@@ -75,53 +71,6 @@ public abstract class AbstractSQLStatement implements SQLStatement {
return Optional.fromNullable(conditions.get(column));
}
@Override
public Optional<Column> findColumn(final SQLExpression sqlExpression) {
if (sqlExpression instanceof SQLPropertyExpression) {
return Optional.fromNullable(getColumnWithQualifiedName((SQLPropertyExpression) sqlExpression));
}
if (sqlExpression instanceof SQLIdentifierExpression) {
return Optional.fromNullable(getColumnWithoutAlias((SQLIdentifierExpression) sqlExpression));
}
return Optional.absent();
}
private Column getColumnWithQualifiedName(final SQLPropertyExpression expr) {
Optional<Table> table = findTable((expr.getOwner()).getName());
return expr.getOwner() instanceof SQLIdentifierExpression && table.isPresent() ? createColumn(expr.getName(), table.get().getName()) : null;
}
private Optional<Table> findTable(final String tableNameOrAlias) {
Optional<Table> tableFromName = findTableFromName(tableNameOrAlias);
return tableFromName.isPresent() ? tableFromName : findTableFromAlias(tableNameOrAlias);
}
private Optional<Table> findTableFromName(final String name) {
for (Table each : tables) {
if (each.getName().equalsIgnoreCase(SQLUtil.getExactlyValue(name))) {
return Optional.of(each);
}
}
return Optional.absent();
}
private Optional<Table> findTableFromAlias(final String alias) {
for (Table each : tables) {
if (each.getAlias().isPresent() && each.getAlias().get().equalsIgnoreCase(SQLUtil.getExactlyValue(alias))) {
return Optional.of(each);
}
}
return Optional.absent();
}
private Column getColumnWithoutAlias(final SQLIdentifierExpression expr) {
return 1 == tables.size() ? createColumn(expr.getName(), tables.iterator().next().getName()) : null;
}
private Column createColumn(final String columnName, final String tableName) {
return new Column(SQLUtil.getExactlyValue(columnName), SQLUtil.getExactlyValue(tableName));
}
public List<OrderBy> getOrderByList() {
return Collections.emptyList();
}
......
......@@ -19,13 +19,12 @@ package com.dangdang.ddframe.rdb.sharding.parsing.parser.statement;
import com.dangdang.ddframe.rdb.sharding.constant.SQLType;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.AggregationSelectItem;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.Column;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.Condition;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.GroupBy;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.Limit;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.OrderBy;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.Column;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.Table;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLExpression;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.token.SQLToken;
import com.google.common.base.Optional;
......@@ -67,14 +66,6 @@ public interface SQLStatement {
*/
Optional<Condition> find(Column column);
/**
* 获取列对象.
*
* @param sqlExpression SQL表达式
* @return 列对象
*/
Optional<Column> findColumn(SQLExpression sqlExpression);
/**
* 获取排序集合.
*
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册