Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
apache
Shardingsphere
提交
edee3928
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,发现更多精彩内容 >>
提交
edee3928
编写于
5月 11, 2017
作者:
T
terrymanu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
refactor generateKeys to rewrite module
上级
a3d4961f
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
84 addition
and
55 deletion
+84
-55
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/rewrite/GenerateKeysUtils.java
...gdang/ddframe/rdb/sharding/rewrite/GenerateKeysUtils.java
+77
-0
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/router/SQLRouteEngine.java
.../dangdang/ddframe/rdb/sharding/router/SQLRouteEngine.java
+2
-53
sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/InsertStatementParserTest.java
...g/parsing/parser/statement/InsertStatementParserTest.java
+5
-2
未找到文件。
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/rewrite/GenerateKeysUtils.java
0 → 100644
浏览文件 @
edee3928
package
com.dangdang.ddframe.rdb.sharding.rewrite
;
import
com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRule
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.context.ConditionContext
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.context.InsertSQLContext
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.context.ItemsToken
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.context.ShardingColumnContext
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.expr.SQLNumberExpr
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.expr.SQLPlaceholderExpr
;
import
java.util.Collection
;
import
java.util.List
;
/**
* .
*
* @author zhangliang
*/
public
class
GenerateKeysUtils
{
/**
* 追加自增主键.
*
* @param shardingRule 分片规则
* @param parameters 参数
* @param insertSQLContext 解析结果
*/
public
static
void
appendGenerateKeys
(
final
ShardingRule
shardingRule
,
final
List
<
Object
>
parameters
,
final
InsertSQLContext
insertSQLContext
)
{
String
tableName
=
insertSQLContext
.
getTables
().
get
(
0
).
getName
();
ItemsToken
columnsToken
=
new
ItemsToken
(
insertSQLContext
.
getColumnsListLastPosition
());
Collection
<
String
>
autoIncrementColumns
=
shardingRule
.
getAutoIncrementColumns
(
tableName
);
for
(
String
each
:
autoIncrementColumns
)
{
if
(!
isIncluded
(
insertSQLContext
,
each
))
{
columnsToken
.
getItems
().
add
(
each
);
}
}
if
(!
columnsToken
.
getItems
().
isEmpty
())
{
insertSQLContext
.
getSqlBuilderContext
().
getSqlTokens
().
add
(
columnsToken
);
}
ItemsToken
valuesToken
=
new
ItemsToken
(
insertSQLContext
.
getValuesListLastPosition
());
int
offset
=
parameters
.
size
()
-
1
;
for
(
String
each
:
autoIncrementColumns
)
{
if
(
isIncluded
(
insertSQLContext
,
each
))
{
continue
;
}
Number
generatedId
=
shardingRule
.
findTableRule
(
tableName
).
generateId
(
each
);
ShardingColumnContext
shardingColumnContext
=
new
ShardingColumnContext
(
each
,
tableName
,
true
);
if
(
parameters
.
isEmpty
())
{
valuesToken
.
getItems
().
add
(
generatedId
.
toString
());
if
(
shardingRule
.
isShardingColumn
(
shardingColumnContext
))
{
insertSQLContext
.
getConditionContext
().
add
(
new
ConditionContext
.
Condition
(
shardingColumnContext
,
new
SQLNumberExpr
(
generatedId
)));
}
}
else
{
valuesToken
.
getItems
().
add
(
"?"
);
parameters
.
add
(
generatedId
);
offset
++;
if
(
shardingRule
.
isShardingColumn
(
shardingColumnContext
))
{
insertSQLContext
.
getConditionContext
().
add
(
new
ConditionContext
.
Condition
(
shardingColumnContext
,
new
SQLPlaceholderExpr
(
offset
)));
}
}
insertSQLContext
.
getGeneratedKeyContext
().
getColumns
().
add
(
each
);
insertSQLContext
.
getGeneratedKeyContext
().
putValue
(
each
,
generatedId
);
}
if
(!
valuesToken
.
getItems
().
isEmpty
())
{
insertSQLContext
.
getSqlBuilderContext
().
getSqlTokens
().
add
(
valuesToken
);
}
}
private
static
boolean
isIncluded
(
final
InsertSQLContext
insertSQLContext
,
final
String
autoIncrementColumn
)
{
for
(
ShardingColumnContext
shardingColumnContext
:
insertSQLContext
.
getShardingColumnContexts
())
{
if
(
shardingColumnContext
.
getColumnName
().
equalsIgnoreCase
(
autoIncrementColumn
))
{
return
true
;
}
}
return
false
;
}
}
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/router/SQLRouteEngine.java
浏览文件 @
edee3928
...
...
@@ -26,18 +26,15 @@ import com.dangdang.ddframe.rdb.sharding.parsing.SQLParsingEngine;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.context.ConditionContext
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.context.DeleteSQLContext
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.context.InsertSQLContext
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.context.ItemsToken
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.context.LimitContext
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.context.OffsetLimitToken
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.context.RowCountLimitToken
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.context.SQLContext
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.context.SelectSQLContext
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.context.ShardingColumnContext
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.context.TableContext
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.context.UpdateSQLContext
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.exception.SQLParsingException
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.expr.SQLNumberExpr
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.expr.SQLPlaceholderExpr
;
import
com.dangdang.ddframe.rdb.sharding.rewrite.GenerateKeysUtils
;
import
com.dangdang.ddframe.rdb.sharding.rewrite.SQLBuilder
;
import
com.dangdang.ddframe.rdb.sharding.rewrite.SQLBuilderContext
;
import
com.dangdang.ddframe.rdb.sharding.rewrite.SQLRewriteEngine
;
...
...
@@ -52,7 +49,6 @@ import com.google.common.collect.Sets;
import
lombok.RequiredArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
java.util.Collection
;
import
java.util.Collections
;
import
java.util.List
;
import
java.util.Set
;
...
...
@@ -100,59 +96,12 @@ public final class SQLRouteEngine {
log
.
debug
(
"Logic SQL: {}, {}"
,
logicSql
,
parameters
);
SQLContext
result
=
new
SQLParsingEngine
(
databaseType
,
logicSql
,
shardingRule
).
parseStatement
();
MetricsContext
.
stop
(
context
);
// TODO 提炼至rewrite模块
if
(
result
instanceof
InsertSQLContext
)
{
String
tableName
=
result
.
getTables
().
get
(
0
).
getName
();
ItemsToken
columnsToken
=
new
ItemsToken
(((
InsertSQLContext
)
result
).
getColumnsListLastPosition
());
Collection
<
String
>
autoIncrementColumns
=
shardingRule
.
getAutoIncrementColumns
(
tableName
);
for
(
String
each
:
autoIncrementColumns
)
{
if
(!
isIncluded
((
InsertSQLContext
)
result
,
each
))
{
columnsToken
.
getItems
().
add
(
each
);
}
}
if
(!
columnsToken
.
getItems
().
isEmpty
())
{
result
.
getSqlBuilderContext
().
getSqlTokens
().
add
(
columnsToken
);
}
ItemsToken
valuesToken
=
new
ItemsToken
(((
InsertSQLContext
)
result
).
getValuesListLastPosition
());
int
offset
=
parameters
.
size
()
-
1
;
for
(
String
each
:
autoIncrementColumns
)
{
if
(
isIncluded
((
InsertSQLContext
)
result
,
each
))
{
continue
;
}
Number
generatedId
=
shardingRule
.
findTableRule
(
tableName
).
generateId
(
each
);
ShardingColumnContext
shardingColumnContext
=
new
ShardingColumnContext
(
each
,
tableName
,
true
);
if
(
parameters
.
isEmpty
())
{
valuesToken
.
getItems
().
add
(
generatedId
.
toString
());
if
(
shardingRule
.
isShardingColumn
(
shardingColumnContext
))
{
result
.
getConditionContext
().
add
(
new
ConditionContext
.
Condition
(
shardingColumnContext
,
new
SQLNumberExpr
(
generatedId
)));
}
}
else
{
valuesToken
.
getItems
().
add
(
"?"
);
parameters
.
add
(
generatedId
);
offset
++;
if
(
shardingRule
.
isShardingColumn
(
shardingColumnContext
))
{
result
.
getConditionContext
().
add
(
new
ConditionContext
.
Condition
(
shardingColumnContext
,
new
SQLPlaceholderExpr
(
offset
)));
}
}
((
InsertSQLContext
)
result
).
getGeneratedKeyContext
().
getColumns
().
add
(
each
);
((
InsertSQLContext
)
result
).
getGeneratedKeyContext
().
putValue
(
each
,
generatedId
);
}
if
(!
valuesToken
.
getItems
().
isEmpty
())
{
result
.
getSqlBuilderContext
().
getSqlTokens
().
add
(
valuesToken
);
}
GenerateKeysUtils
.
appendGenerateKeys
(
shardingRule
,
parameters
,
(
InsertSQLContext
)
result
);
}
return
result
;
}
private
boolean
isIncluded
(
final
InsertSQLContext
insertSQLContext
,
final
String
autoIncrementColumn
)
{
for
(
ShardingColumnContext
shardingColumnContext
:
insertSQLContext
.
getShardingColumnContexts
())
{
if
(
shardingColumnContext
.
getColumnName
().
equalsIgnoreCase
(
autoIncrementColumn
))
{
return
true
;
}
}
return
false
;
}
private
SQLContext
buildHintParsedResult
(
final
String
logicSql
)
{
SQLContext
result
;
switch
(
SQLUtil
.
getTypeByStart
(
logicSql
))
{
...
...
sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/InsertStatementParserTest.java
浏览文件 @
edee3928
...
...
@@ -29,6 +29,7 @@ import com.dangdang.ddframe.rdb.sharding.parsing.SQLParsingEngine;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.context.ConditionContext
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.context.InsertSQLContext
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.exception.SQLParsingUnsupportedException
;
import
com.dangdang.ddframe.rdb.sharding.rewrite.GenerateKeysUtils
;
import
com.dangdang.ddframe.rdb.sharding.rewrite.SQLRewriteEngine
;
import
org.junit.Test
;
...
...
@@ -77,7 +78,8 @@ public final class InsertStatementParserTest extends AbstractStatementParserTest
InsertSQLContext
sqlContext
=
(
InsertSQLContext
)
statementParser
.
parseStatement
();
assertInsertStatementWithoutParameter
(
sqlContext
);
// TODO 放入rewrite模块断言
assertThat
(
new
SQLRewriteEngine
(
sqlContext
.
getSqlBuilderContext
()).
rewrite
().
toString
(),
is
(
"INSERT INTO [Token(TABLE_XXX)] (`field1`) VALUES (10)"
));
GenerateKeysUtils
.
appendGenerateKeys
(
shardingRule
,
Collections
.
emptyList
(),
sqlContext
);
assertThat
(
new
SQLRewriteEngine
(
sqlContext
.
getSqlBuilderContext
()).
rewrite
().
toString
(),
is
(
"INSERT INTO [Token(TABLE_XXX)] (`field1`, field2) VALUES (10, 1)"
));
}
@Test
...
...
@@ -87,7 +89,8 @@ public final class InsertStatementParserTest extends AbstractStatementParserTest
InsertSQLContext
sqlContext
=
(
InsertSQLContext
)
statementParser
.
parseStatement
();
assertInsertStatementWithParameter
(
sqlContext
);
// TODO 放入rewrite模块断言
assertThat
(
new
SQLRewriteEngine
(
sqlContext
.
getSqlBuilderContext
()).
rewrite
().
toString
(),
is
(
"INSERT INTO [Token(TABLE_XXX)] (`field1`) VALUES (?)"
));
GenerateKeysUtils
.
appendGenerateKeys
(
shardingRule
,
Collections
.
emptyList
(),
sqlContext
);
assertThat
(
new
SQLRewriteEngine
(
sqlContext
.
getSqlBuilderContext
()).
rewrite
().
toString
(),
is
(
"INSERT INTO [Token(TABLE_XXX)] (`field1`, field2) VALUES (?, 1)"
));
}
private
void
assertInsertStatementWithoutParameter
(
final
InsertSQLContext
sqlContext
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录