Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
apache
Shardingsphere
提交
2dd6253f
Shardingsphere
项目概览
apache
/
Shardingsphere
通知
56
Star
3
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Shardingsphere
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
2dd6253f
编写于
5月 31, 2017
作者:
T
terrymanu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
refactor find column
上级
be300938
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
49 addition
and
65 deletion
+49
-65
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/SQLParser.java
...ngdang/ddframe/rdb/sharding/parsing/parser/SQLParser.java
+47
-3
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/AbstractSQLStatement.java
...arding/parsing/parser/statement/AbstractSQLStatement.java
+1
-52
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/SQLStatement.java
...e/rdb/sharding/parsing/parser/statement/SQLStatement.java
+1
-10
未找到文件。
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/SQLParser.java
浏览文件 @
2dd6253f
...
...
@@ -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
();
}
}
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/AbstractSQLStatement.java
浏览文件 @
2dd6253f
...
...
@@ -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
();
}
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/SQLStatement.java
浏览文件 @
2dd6253f
...
...
@@ -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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录