diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/SQLParser.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/SQLParser.java index 5c60edeb6e261fe408fc46b4da1d16e19a8a0953..57a7de3024cb988cb723772fbcdeae84488440d9 100755 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/SQLParser.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/SQLParser.java @@ -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 = sqlStatement.findColumn(left); + Optional 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 = sqlStatement.findColumn(left); + Optional 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 = sqlStatement.findColumn(left); + Optional 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 find(final Collection 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 getColumnWithQualifiedName(final Collection
tables, final SQLPropertyExpression propertyExpression) { + Optional
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.absent(); + } + + private Optional
findTable(final Collection
tables, final String tableNameOrAlias) { + Optional
tableFromName = findTableFromName(tables, tableNameOrAlias); + return tableFromName.isPresent() ? tableFromName : findTableFromAlias(tables, tableNameOrAlias); + } + + private Optional
findTableFromName(final Collection
tables, final String name) { + for (Table each : tables) { + if (each.getName().equalsIgnoreCase(name)) { + return Optional.of(each); + } + } + return Optional.absent(); + } + + private Optional
findTableFromAlias(final Collection
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 getColumnWithoutOwner(final Collection
tables, final String columnName) { + return 1 == tables.size() ? Optional.of(new Column(columnName, tables.iterator().next().getName())) : Optional.absent(); + } } diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/AbstractSQLStatement.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/AbstractSQLStatement.java index a89bd730292ffb2e939f34bee74d921860cfd2fd..57ef478ed15791e99bcb51ec901f63c7be445f4d 100644 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/AbstractSQLStatement.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/AbstractSQLStatement.java @@ -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 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 = findTable((expr.getOwner()).getName()); - return expr.getOwner() instanceof SQLIdentifierExpression && table.isPresent() ? createColumn(expr.getName(), table.get().getName()) : null; - } - - private Optional
findTable(final String tableNameOrAlias) { - Optional
tableFromName = findTableFromName(tableNameOrAlias); - return tableFromName.isPresent() ? tableFromName : findTableFromAlias(tableNameOrAlias); - } - - private Optional
findTableFromName(final String name) { - for (Table each : tables) { - if (each.getName().equalsIgnoreCase(SQLUtil.getExactlyValue(name))) { - return Optional.of(each); - } - } - return Optional.absent(); - } - - private Optional
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 getOrderByList() { return Collections.emptyList(); } diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/SQLStatement.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/SQLStatement.java index 9839b43e63d91d3c77c2488b67860cf038016216..15fc915d448169cf6291c0db85d933a4d739994f 100644 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/SQLStatement.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/SQLStatement.java @@ -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 find(Column column); - /** - * 获取列对象. - * - * @param sqlExpression SQL表达式 - * @return 列对象 - */ - Optional findColumn(SQLExpression sqlExpression); - /** * 获取排序集合. *