Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
apache
Shardingsphere
提交
f6213bed
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 搜索 >>
提交
f6213bed
编写于
3月 11, 2019
作者:
T
terrymanu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
for #1864, decouple ShardingRule & Column
上级
7472df30
变更
13
隐藏空白更改
内联
并排
Showing
13 changed file
with
78 addition
and
85 deletion
+78
-85
sharding-core/sharding-core-rest/src/main/java/org/apache/shardingsphere/core/keygen/GeneratedKey.java
...a/org/apache/shardingsphere/core/keygen/GeneratedKey.java
+7
-6
sharding-core/sharding-core-rest/src/main/java/org/apache/shardingsphere/core/optimizer/engine/sharding/insert/InsertOptimizeEngine.java
...ptimizer/engine/sharding/insert/InsertOptimizeEngine.java
+12
-8
sharding-core/sharding-core-rest/src/main/java/org/apache/shardingsphere/core/parsing/antlr/filler/sharding/segment/impl/OrConditionFiller.java
...antlr/filler/sharding/segment/impl/OrConditionFiller.java
+2
-11
sharding-core/sharding-core-rest/src/main/java/org/apache/shardingsphere/core/parsing/antlr/filler/sharding/statement/impl/dml/InsertFiller.java
...ntlr/filler/sharding/statement/impl/dml/InsertFiller.java
+15
-16
sharding-core/sharding-core-rest/src/main/java/org/apache/shardingsphere/core/parsing/parser/clause/InsertColumnsClauseParser.java
...core/parsing/parser/clause/InsertColumnsClauseParser.java
+6
-6
sharding-core/sharding-core-rest/src/main/java/org/apache/shardingsphere/core/parsing/parser/clause/InsertDuplicateKeyUpdateClauseParser.java
...g/parser/clause/InsertDuplicateKeyUpdateClauseParser.java
+1
-1
sharding-core/sharding-core-rest/src/main/java/org/apache/shardingsphere/core/parsing/parser/clause/InsertSetClauseParser.java
...ere/core/parsing/parser/clause/InsertSetClauseParser.java
+4
-3
sharding-core/sharding-core-rest/src/main/java/org/apache/shardingsphere/core/parsing/parser/clause/InsertValuesClauseParser.java
.../core/parsing/parser/clause/InsertValuesClauseParser.java
+5
-5
sharding-core/sharding-core-rest/src/main/java/org/apache/shardingsphere/core/parsing/parser/clause/WhereClauseParser.java
...gsphere/core/parsing/parser/clause/WhereClauseParser.java
+3
-3
sharding-core/sharding-core-rest/src/main/java/org/apache/shardingsphere/core/parsing/parser/sql/dml/insert/AbstractInsertParser.java
...e/parsing/parser/sql/dml/insert/AbstractInsertParser.java
+4
-5
sharding-core/sharding-core-rest/src/main/java/org/apache/shardingsphere/core/rule/ShardingRule.java
...ava/org/apache/shardingsphere/core/rule/ShardingRule.java
+10
-10
sharding-core/sharding-core-rest/src/test/java/org/apache/shardingsphere/core/keygen/GeneratedKeyTest.java
...g/apache/shardingsphere/core/keygen/GeneratedKeyTest.java
+2
-3
sharding-core/sharding-core-rest/src/test/java/org/apache/shardingsphere/core/rule/ShardingRuleTest.java
...org/apache/shardingsphere/core/rule/ShardingRuleTest.java
+7
-8
未找到文件。
sharding-core/sharding-core-rest/src/main/java/org/apache/shardingsphere/core/keygen/GeneratedKey.java
浏览文件 @
f6213bed
...
...
@@ -56,15 +56,16 @@ public final class GeneratedKey {
}
private
static
Optional
<
GeneratedKey
>
createGeneratedKey
(
final
ShardingRule
shardingRule
,
final
InsertStatement
insertStatement
)
{
Optional
<
Column
>
generateKeyColumn
=
shardingRule
.
findGenerateKeyColumn
(
insertStatement
.
getTables
().
getSingleTableName
());
return
generateKeyColumn
.
isPresent
()
?
Optional
.
of
(
createGeneratedKey
(
shardingRule
,
generateKeyColumn
.
get
(),
insertStatement
.
getInsertValues
().
getInsertValues
().
size
()))
:
Optional
.<
GeneratedKey
>
absent
();
String
tableName
=
insertStatement
.
getTables
().
getSingleTableName
();
Optional
<
String
>
generateKeyColumnName
=
shardingRule
.
findGenerateKeyColumnName
(
tableName
);
return
generateKeyColumnName
.
isPresent
()
?
Optional
.
of
(
createGeneratedKey
(
shardingRule
,
generateKeyColumnName
.
get
(),
tableName
,
insertStatement
.
getInsertValues
().
getInsertValues
().
size
()))
:
Optional
.<
GeneratedKey
>
absent
();
}
private
static
GeneratedKey
createGeneratedKey
(
final
ShardingRule
shardingRule
,
final
Column
generateKeyColumn
,
final
int
insertValueSize
)
{
GeneratedKey
result
=
new
GeneratedKey
(
generateKeyColumn
);
private
static
GeneratedKey
createGeneratedKey
(
final
ShardingRule
shardingRule
,
final
String
generateKeyColumnName
,
final
String
generateKeyTableName
,
final
int
insertValueSize
)
{
GeneratedKey
result
=
new
GeneratedKey
(
new
Column
(
generateKeyColumnName
,
generateKeyTableName
)
);
for
(
int
i
=
0
;
i
<
insertValueSize
;
i
++)
{
result
.
getGeneratedKeys
().
add
(
shardingRule
.
generateKey
(
generateKey
Column
.
getTableName
()
));
result
.
getGeneratedKeys
().
add
(
shardingRule
.
generateKey
(
generateKey
TableName
));
}
return
result
;
}
...
...
sharding-core/sharding-core-rest/src/main/java/org/apache/shardingsphere/core/optimizer/engine/sharding/insert/InsertOptimizeEngine.java
浏览文件 @
f6213bed
...
...
@@ -137,14 +137,15 @@ public final class InsertOptimizeEngine implements OptimizeEngine {
}
private
boolean
isNeededToAppendGeneratedKey
()
{
Optional
<
Column
>
generateKeyColumn
=
shardingRule
.
findGenerateKeyColumn
(
insertStatement
.
getTables
().
getSingleTableName
());
return
generateKeyColumn
.
isPresent
()
&&
!
insertStatement
.
getColumns
().
contains
(
generateKeyColumn
.
get
());
String
tableName
=
insertStatement
.
getTables
().
getSingleTableName
();
Optional
<
String
>
generateKeyColumn
=
shardingRule
.
findGenerateKeyColumnName
(
tableName
);
return
generateKeyColumn
.
isPresent
()
&&
!
insertStatement
.
getColumns
().
contains
(
new
Column
(
generateKeyColumn
.
get
(),
tableName
));
}
private
void
fillInsertStatementWithGeneratedKeyName
(
final
InsertValuesToken
insertValuesToken
)
{
String
generate
dKeyName
=
shardingRule
.
findGenerateKeyColumn
(
insertStatement
.
getTables
().
getSingleTableName
()).
get
().
getName
();
insertValuesToken
.
getColumnNames
().
add
(
generate
dKey
Name
);
fillInsertStatementWithColumnName
(
insertValuesToken
,
generate
dKey
Name
);
String
generate
KeyColumnName
=
shardingRule
.
findGenerateKeyColumnName
(
insertStatement
.
getTables
().
getSingleTableName
()).
get
();
insertValuesToken
.
getColumnNames
().
add
(
generate
KeyColumn
Name
);
fillInsertStatementWithColumnName
(
insertValuesToken
,
generate
KeyColumn
Name
);
}
private
void
fillInsertStatementWithColumnName
(
final
InsertValuesToken
insertValuesToken
,
final
String
columnName
)
{
...
...
@@ -204,9 +205,12 @@ public final class InsertOptimizeEngine implements OptimizeEngine {
}
private
void
fillShardingCondition
(
final
ShardingCondition
shardingCondition
,
final
Comparable
<?>
currentGeneratedKey
)
{
Column
generateKeyColumn
=
shardingRule
.
findGenerateKeyColumn
(
insertStatement
.
getTables
().
getSingleTableName
()).
get
();
if
(
shardingRule
.
isShardingColumn
(
generateKeyColumn
))
{
shardingCondition
.
getShardingValues
().
add
(
new
ListRouteValue
<>(
generateKeyColumn
,
new
GeneratedKeyCondition
(
generateKeyColumn
,
-
1
,
currentGeneratedKey
).
getConditionValues
(
parameters
)));
String
tableName
=
insertStatement
.
getTables
().
getSingleTableName
();
String
generateKeyColumnName
=
shardingRule
.
findGenerateKeyColumnName
(
tableName
).
get
();
if
(
shardingRule
.
isShardingColumn
(
generateKeyColumnName
,
tableName
))
{
Column
generateKeyColumn
=
new
Column
(
generateKeyColumnName
,
tableName
);
List
<
Comparable
<?>>
conditionValues
=
new
GeneratedKeyCondition
(
generateKeyColumn
,
-
1
,
currentGeneratedKey
).
getConditionValues
(
parameters
);
shardingCondition
.
getShardingValues
().
add
(
new
ListRouteValue
<>(
generateKeyColumn
,
conditionValues
));
}
insertStatement
.
setContainGenerateKey
(
true
);
}
...
...
sharding-core/sharding-core-rest/src/main/java/org/apache/shardingsphere/core/parsing/antlr/filler/sharding/segment/impl/OrConditionFiller.java
浏览文件 @
f6213bed
...
...
@@ -112,7 +112,7 @@ public final class OrConditionFiller implements SQLSegmentShardingFiller<OrCondi
continue
;
}
Column
column
=
new
Column
(
condition
.
getColumn
().
getName
(),
getTableName
(
shardingTableMetaData
,
shardingRule
,
sqlStatement
,
condition
));
if
(
isShardingCondition
(
condition
.
getOperator
())
&&
shardingRule
.
isShardingColumn
(
column
))
{
if
(
isShardingCondition
(
condition
.
getOperator
())
&&
shardingRule
.
isShardingColumn
(
column
.
getName
(),
column
.
getTableName
()
))
{
shardingCondition
.
add
(
condition
);
needSharding
=
true
;
}
...
...
@@ -175,16 +175,7 @@ public final class OrConditionFiller implements SQLSegmentShardingFiller<OrCondi
}
private
boolean
isShardingCondition
(
final
String
operator
)
{
if
(
Symbol
.
EQ
.
getLiterals
().
equals
(
operator
))
{
return
true
;
}
if
(
ShardingOperator
.
IN
.
name
().
equals
(
operator
))
{
return
true
;
}
if
(
ShardingOperator
.
BETWEEN
.
name
().
equals
(
operator
))
{
return
true
;
}
return
false
;
return
Symbol
.
EQ
.
getLiterals
().
equals
(
operator
)
||
ShardingOperator
.
IN
.
name
().
equals
(
operator
)
||
ShardingOperator
.
BETWEEN
.
name
().
equals
(
operator
);
}
// TODO hongjun: find table from parent select statement, should find table in subquery level only
...
...
sharding-core/sharding-core-rest/src/main/java/org/apache/shardingsphere/core/parsing/antlr/filler/sharding/statement/impl/dml/InsertFiller.java
浏览文件 @
f6213bed
...
...
@@ -74,11 +74,11 @@ public final class InsertFiller implements SQLSegmentShardingFiller<InsertSegmen
}
String
tableName
=
insertStatement
.
getTables
().
getSingleTableName
();
int
index
=
0
;
Optional
<
Column
>
shardingColumn
=
shardingRule
.
findGenerateKeyColumn
(
tableName
);
Optional
<
String
>
generateKeyColumnName
=
shardingRule
.
findGenerateKeyColumnName
(
tableName
);
for
(
ColumnSegment
each
:
sqlSegment
.
getColumns
())
{
Column
column
=
new
Column
(
each
.
getName
(),
tableName
);
insertStatement
.
getColumns
().
add
(
column
);
if
(
shardingColumn
.
isPresent
()
&&
shardingColumn
.
get
().
getName
().
equalsIgnoreCase
(
each
.
getName
()))
{
if
(
generateKeyColumnName
.
isPresent
()
&&
generateKeyColumnName
.
get
().
equalsIgnoreCase
(
each
.
getName
()))
{
insertStatement
.
setGenerateKeyColumnIndex
(
index
);
}
if
(
each
.
getOwner
().
isPresent
()
&&
tableName
.
equals
(
each
.
getOwner
().
get
()))
{
...
...
@@ -97,9 +97,9 @@ public final class InsertFiller implements SQLSegmentShardingFiller<InsertSegmen
ItemsToken
columnsToken
=
new
ItemsToken
(
startIndex
);
columnsToken
.
setFirstOfItemsSpecial
(
true
);
if
(
shardingTableMetaData
.
containsTable
(
tableName
))
{
Optional
<
Column
>
generateKeyColumn
=
shardingRule
.
findGenerateKeyColumn
(
insertStatement
.
getTables
().
getSingleTableName
());
Optional
<
String
>
generateKeyColumnName
=
shardingRule
.
findGenerateKeyColumnName
(
insertStatement
.
getTables
().
getSingleTableName
());
for
(
String
each
:
shardingTableMetaData
.
getAllColumnNames
(
tableName
))
{
if
(
generateKeyColumn
.
isPresent
()
&&
generateKeyColumn
.
get
().
getName
().
equalsIgnoreCase
(
each
))
{
if
(
generateKeyColumn
Name
.
isPresent
()
&&
generateKeyColumnName
.
get
().
equalsIgnoreCase
(
each
))
{
insertStatement
.
setGenerateKeyColumnIndex
(
count
);
}
Column
column
=
new
Column
(
each
,
tableName
);
...
...
@@ -134,7 +134,7 @@ public final class InsertFiller implements SQLSegmentShardingFiller<InsertSegmen
Iterator
<
Column
>
iterator
=
insertStatement
.
getColumns
().
iterator
();
for
(
CommonExpressionSegment
commonExpressionSegment
:
each
.
getValues
())
{
Column
column
=
iterator
.
next
();
boolean
shardingColumn
=
shardingRule
.
isShardingColumn
(
column
);
boolean
shardingColumn
=
shardingRule
.
isShardingColumn
(
column
.
getName
(),
column
.
getTableName
()
);
SQLExpression
sqlExpression
=
commonExpressionSegment
.
convertToSQLExpression
(
sql
).
get
();
insertValue
.
getColumnValues
().
add
(
sqlExpression
);
if
(
shardingColumn
)
{
...
...
@@ -154,12 +154,12 @@ public final class InsertFiller implements SQLSegmentShardingFiller<InsertSegmen
}
private
void
removeGenerateKeyColumn
(
final
InsertStatement
insertStatement
,
final
ShardingRule
shardingRule
,
final
int
valueCount
)
{
Optional
<
Column
>
generateKeyColumn
=
shardingRule
.
findGenerateKeyColumn
(
insertStatement
.
getTables
().
getSingleTableName
());
if
(
generateKeyColumn
.
isPresent
()
&&
valueCount
<
insertStatement
.
getColumns
().
size
())
{
Optional
<
String
>
generateKeyColumnName
=
shardingRule
.
findGenerateKeyColumnName
(
insertStatement
.
getTables
().
getSingleTableName
());
if
(
generateKeyColumn
Name
.
isPresent
()
&&
valueCount
<
insertStatement
.
getColumns
().
size
())
{
List
<
ItemsToken
>
itemsTokens
=
insertStatement
.
getItemsTokens
();
insertStatement
.
getColumns
().
remove
(
new
Column
(
generateKeyColumn
.
get
().
getName
(),
insertStatement
.
getTables
().
getSingleTableName
()));
insertStatement
.
getColumns
().
remove
(
new
Column
(
generateKeyColumn
Name
.
get
(),
insertStatement
.
getTables
().
getSingleTableName
()));
for
(
ItemsToken
each
:
itemsTokens
)
{
each
.
getItems
().
remove
(
generateKeyColumn
.
get
().
getName
());
each
.
getItems
().
remove
(
generateKeyColumn
Name
.
get
());
insertStatement
.
setGenerateKeyColumnIndex
(-
1
);
}
}
...
...
@@ -177,16 +177,16 @@ public final class InsertFiller implements SQLSegmentShardingFiller<InsertSegmen
private
void
processGeneratedKey
(
final
ShardingRule
shardingRule
,
final
InsertStatement
insertStatement
)
{
String
tableName
=
insertStatement
.
getTables
().
getSingleTableName
();
Optional
<
Column
>
generateKeyColumn
=
shardingRule
.
findGenerateKeyColumn
(
tableName
);
if
(-
1
!=
insertStatement
.
getGenerateKeyColumnIndex
()
||
!
generateKeyColumn
.
isPresent
())
{
Optional
<
String
>
generateKeyColumnName
=
shardingRule
.
findGenerateKeyColumnName
(
tableName
);
if
(-
1
!=
insertStatement
.
getGenerateKeyColumnIndex
()
||
!
generateKeyColumn
Name
.
isPresent
())
{
return
;
}
if
(
DefaultKeyword
.
VALUES
.
equals
(
insertStatement
.
getInsertValues
().
getInsertValues
().
get
(
0
).
getType
()))
{
if
(!
insertStatement
.
getItemsTokens
().
isEmpty
())
{
insertStatement
.
getItemsTokens
().
get
(
0
).
getItems
().
add
(
generateKeyColumn
.
get
().
getName
());
insertStatement
.
getItemsTokens
().
get
(
0
).
getItems
().
add
(
generateKeyColumn
Name
.
get
());
}
else
{
ItemsToken
columnsToken
=
new
ItemsToken
(
insertStatement
.
getColumnsListLastIndex
());
columnsToken
.
getItems
().
add
(
generateKeyColumn
.
get
().
getName
());
columnsToken
.
getItems
().
add
(
generateKeyColumn
Name
.
get
());
insertStatement
.
addSQLToken
(
columnsToken
);
}
}
...
...
@@ -194,9 +194,8 @@ public final class InsertFiller implements SQLSegmentShardingFiller<InsertSegmen
private
void
processDuplicateKey
(
final
ShardingRule
shardingRule
,
final
InsertSegment
insertSegment
,
final
String
tableName
)
{
for
(
String
each
:
insertSegment
.
getDuplicateKeyColumns
())
{
if
(
shardingRule
.
isShardingColumn
(
new
Column
(
SQLUtil
.
getExactlyValue
(
each
),
tableName
)))
{
throw
new
SQLParsingException
(
"INSERT INTO .... ON DUPLICATE KEY UPDATE can not support on sharding column, token is '%s', literals is '%s'."
,
Literals
.
IDENTIFIER
,
each
);
if
(
shardingRule
.
isShardingColumn
(
SQLUtil
.
getExactlyValue
(
each
),
tableName
))
{
throw
new
SQLParsingException
(
"INSERT INTO .... ON DUPLICATE KEY UPDATE can not support on sharding column, token is '%s', literals is '%s'."
,
Literals
.
IDENTIFIER
,
each
);
}
}
}
...
...
sharding-core/sharding-core-rest/src/main/java/org/apache/shardingsphere/core/parsing/parser/clause/InsertColumnsClauseParser.java
浏览文件 @
f6213bed
...
...
@@ -68,12 +68,12 @@ public final class InsertColumnsClauseParser implements SQLClauseParser {
*/
public
void
parse
(
final
InsertStatement
insertStatement
,
final
ShardingTableMetaData
shardingTableMetaData
)
{
String
tableName
=
insertStatement
.
getTables
().
getSingleTableName
();
Optional
<
Column
>
generateKeyColumn
=
shardingRule
.
findGenerateKeyColumn
(
tableName
);
Optional
<
String
>
generateKeyColumnName
=
shardingRule
.
findGenerateKeyColumnName
(
tableName
);
insertStatement
.
getColumns
().
addAll
(
lexerEngine
.
equalAny
(
Symbol
.
LEFT_PAREN
)
?
parseWithColumn
(
insertStatement
,
tableName
,
generateKeyColumn
)
:
parseWithoutColumn
(
insertStatement
,
shardingTableMetaData
,
tableName
,
generateKeyColumn
));
?
parseWithColumn
(
insertStatement
,
tableName
,
generateKeyColumn
Name
)
:
parseWithoutColumn
(
insertStatement
,
shardingTableMetaData
,
tableName
,
generateKeyColumnName
));
}
private
Collection
<
Column
>
parseWithColumn
(
final
InsertStatement
insertStatement
,
final
String
tableName
,
final
Optional
<
Column
>
generateKeyColumn
)
{
private
Collection
<
Column
>
parseWithColumn
(
final
InsertStatement
insertStatement
,
final
String
tableName
,
final
Optional
<
String
>
generateKeyColumnName
)
{
int
count
=
0
;
Collection
<
Column
>
result
=
new
LinkedList
<>();
do
{
...
...
@@ -91,7 +91,7 @@ public final class InsertColumnsClauseParser implements SQLClauseParser {
}
Preconditions
.
checkNotNull
(
columnName
);
result
.
add
(
new
Column
(
columnName
,
tableName
));
if
(
generateKeyColumn
.
isPresent
()
&&
generateKeyColumn
.
get
().
getName
().
equalsIgnoreCase
(
columnName
))
{
if
(
generateKeyColumn
Name
.
isPresent
()
&&
generateKeyColumnName
.
get
().
equalsIgnoreCase
(
columnName
))
{
insertStatement
.
setGenerateKeyColumnIndex
(
count
);
}
count
++;
...
...
@@ -102,7 +102,7 @@ public final class InsertColumnsClauseParser implements SQLClauseParser {
}
private
Collection
<
Column
>
parseWithoutColumn
(
final
InsertStatement
insertStatement
,
final
ShardingTableMetaData
shardingTableMetaData
,
final
String
tableName
,
final
Optional
<
Column
>
generateKeyColumn
)
{
final
InsertStatement
insertStatement
,
final
ShardingTableMetaData
shardingTableMetaData
,
final
String
tableName
,
final
Optional
<
String
>
generateKeyColumn
)
{
int
count
=
0
;
int
beginPosition
=
lexerEngine
.
getCurrentToken
().
getEndPosition
()
-
lexerEngine
.
getCurrentToken
().
getLiterals
().
length
()
-
1
;
insertStatement
.
addSQLToken
(
new
InsertColumnToken
(
beginPosition
,
"("
));
...
...
@@ -112,7 +112,7 @@ public final class InsertColumnsClauseParser implements SQLClauseParser {
if
(
shardingTableMetaData
.
containsTable
(
tableName
))
{
for
(
String
each
:
shardingTableMetaData
.
getAllColumnNames
(
tableName
))
{
result
.
add
(
new
Column
(
each
,
tableName
));
if
(
generateKeyColumn
.
isPresent
()
&&
generateKeyColumn
.
get
().
getName
().
equalsIgnoreCase
(
each
))
{
if
(
generateKeyColumn
.
isPresent
()
&&
generateKeyColumn
.
get
().
equalsIgnoreCase
(
each
))
{
insertStatement
.
setGenerateKeyColumnIndex
(
count
);
}
columnsToken
.
getItems
().
add
(
each
);
...
...
sharding-core/sharding-core-rest/src/main/java/org/apache/shardingsphere/core/parsing/parser/clause/InsertDuplicateKeyUpdateClauseParser.java
浏览文件 @
f6213bed
...
...
@@ -62,7 +62,7 @@ public abstract class InsertDuplicateKeyUpdateClauseParser implements SQLClauseP
lexerEngine
.
accept
(
DefaultKeyword
.
UPDATE
);
do
{
Column
column
=
new
Column
(
SQLUtil
.
getExactlyValue
(
lexerEngine
.
getCurrentToken
().
getLiterals
()),
insertStatement
.
getTables
().
getSingleTableName
());
if
(
shardingRule
.
isShardingColumn
(
column
))
{
if
(
shardingRule
.
isShardingColumn
(
column
.
getName
(),
column
.
getTableName
()
))
{
throw
new
SQLParsingException
(
"INSERT INTO .... ON DUPLICATE KEY UPDATE can not support on sharding column, token is '%s', literals is '%s'."
,
lexerEngine
.
getCurrentToken
().
getType
(),
lexerEngine
.
getCurrentToken
().
getLiterals
());
}
...
...
sharding-core/sharding-core-rest/src/main/java/org/apache/shardingsphere/core/parsing/parser/clause/InsertSetClauseParser.java
浏览文件 @
f6213bed
...
...
@@ -79,7 +79,7 @@ public abstract class InsertSetClauseParser implements SQLClauseParser {
int
beginPosition
=
lexerEngine
.
getCurrentToken
().
getEndPosition
()
-
lexerEngine
.
getCurrentToken
().
getLiterals
().
length
();
insertStatement
.
addSQLToken
(
new
InsertValuesToken
(
beginPosition
,
DefaultKeyword
.
SET
));
String
tableName
=
insertStatement
.
getTables
().
getSingleTableName
();
Optional
<
Column
>
generateKeyColumn
=
shardingRule
.
findGenerateKeyColumn
(
tableName
);
Optional
<
String
>
generateKeyColumnName
=
shardingRule
.
findGenerateKeyColumnName
(
tableName
);
int
count
=
0
;
do
{
SQLExpression
left
=
basicExpressionParser
.
parse
(
insertStatement
);
...
...
@@ -94,12 +94,13 @@ public abstract class InsertSetClauseParser implements SQLClauseParser {
column
=
new
Column
(
SQLUtil
.
getExactlyValue
(((
SQLIgnoreExpression
)
left
).
getExpression
()),
insertStatement
.
getTables
().
getSingleTableName
());
}
Preconditions
.
checkNotNull
(
column
);
if
(
generateKeyColumn
.
isPresent
()
&&
generateKeyColumn
.
get
().
getName
().
equalsIgnoreCase
(
column
.
getName
()))
{
if
(
generateKeyColumn
Name
.
isPresent
()
&&
generateKeyColumnName
.
get
().
equalsIgnoreCase
(
column
.
getName
()))
{
insertStatement
.
setGenerateKeyColumnIndex
(
count
);
}
lexerEngine
.
accept
(
Symbol
.
EQ
);
SQLExpression
right
=
basicExpressionParser
.
parse
(
insertStatement
);
if
(
shardingRule
.
isShardingColumn
(
column
)
&&
(
right
instanceof
SQLNumberExpression
||
right
instanceof
SQLTextExpression
||
right
instanceof
SQLPlaceholderExpression
))
{
if
(
shardingRule
.
isShardingColumn
(
column
.
getName
(),
column
.
getTableName
())
&&
(
right
instanceof
SQLNumberExpression
||
right
instanceof
SQLTextExpression
||
right
instanceof
SQLPlaceholderExpression
))
{
insertStatement
.
getRouteConditions
().
add
(
new
Condition
(
column
,
right
));
}
count
++;
...
...
sharding-core/sharding-core-rest/src/main/java/org/apache/shardingsphere/core/parsing/parser/clause/InsertValuesClauseParser.java
浏览文件 @
f6213bed
...
...
@@ -107,7 +107,7 @@ public abstract class InsertValuesClauseParser implements SQLClauseParser {
AndCondition
andCondition
=
new
AndCondition
();
for
(
Column
each
:
insertStatement
.
getColumns
())
{
SQLExpression
sqlExpression
=
sqlExpressions
.
get
(
count
);
if
(
shardingRule
.
isShardingColumn
(
each
))
{
if
(
shardingRule
.
isShardingColumn
(
each
.
getName
(),
each
.
getTableName
()
))
{
if
(!(
sqlExpression
instanceof
SQLNumberExpression
||
sqlExpression
instanceof
SQLTextExpression
||
sqlExpression
instanceof
SQLPlaceholderExpression
))
{
throw
new
SQLParsingException
(
"INSERT INTO can not support complex expression value on sharding column '%s'."
,
each
.
getName
());
}
...
...
@@ -128,12 +128,12 @@ public abstract class InsertValuesClauseParser implements SQLClauseParser {
}
private
void
removeGenerateKeyColumn
(
final
InsertStatement
insertStatement
,
final
int
valueCount
)
{
Optional
<
Column
>
generateKeyColumn
=
shardingRule
.
findGenerateKeyColumn
(
insertStatement
.
getTables
().
getSingleTableName
());
if
(
generateKeyColumn
.
isPresent
()
&&
valueCount
<
insertStatement
.
getColumns
().
size
())
{
Optional
<
String
>
generateKeyColumnName
=
shardingRule
.
findGenerateKeyColumnName
(
insertStatement
.
getTables
().
getSingleTableName
());
if
(
generateKeyColumn
Name
.
isPresent
()
&&
valueCount
<
insertStatement
.
getColumns
().
size
())
{
List
<
ItemsToken
>
itemsTokens
=
insertStatement
.
getItemsTokens
();
insertStatement
.
getColumns
().
remove
(
new
Column
(
generateKeyColumn
.
get
().
getName
(),
insertStatement
.
getTables
().
getSingleTableName
()));
insertStatement
.
getColumns
().
remove
(
new
Column
(
generateKeyColumn
Name
.
get
(),
insertStatement
.
getTables
().
getSingleTableName
()));
for
(
ItemsToken
each
:
itemsTokens
)
{
each
.
getItems
().
remove
(
generateKeyColumn
.
get
().
getName
());
each
.
getItems
().
remove
(
generateKeyColumn
Name
.
get
());
insertStatement
.
setGenerateKeyColumnIndex
(-
1
);
}
}
...
...
sharding-core/sharding-core-rest/src/main/java/org/apache/shardingsphere/core/parsing/parser/clause/WhereClauseParser.java
浏览文件 @
f6213bed
...
...
@@ -214,7 +214,7 @@ public abstract class WhereClauseParser implements SQLClauseParser {
}
if
(
right
instanceof
SQLNumberExpression
||
right
instanceof
SQLTextExpression
||
right
instanceof
SQLPlaceholderExpression
)
{
Optional
<
Column
>
column
=
find
(
sqlStatement
.
getTables
(),
left
);
if
(
column
.
isPresent
()
&&
shardingRule
.
isShardingColumn
(
column
.
get
()))
{
if
(
column
.
isPresent
()
&&
shardingRule
.
isShardingColumn
(
column
.
get
()
.
getName
(),
column
.
get
().
getTableName
()
))
{
return
new
Condition
(
column
.
get
(),
right
);
}
}
...
...
@@ -239,7 +239,7 @@ public abstract class WhereClauseParser implements SQLClauseParser {
}
if
(!
hasComplexExpression
)
{
Optional
<
Column
>
column
=
find
(
sqlStatement
.
getTables
(),
left
);
if
(
column
.
isPresent
()
&&
shardingRule
.
isShardingColumn
(
column
.
get
()))
{
if
(
column
.
isPresent
()
&&
shardingRule
.
isShardingColumn
(
column
.
get
()
.
getName
(),
column
.
get
().
getTableName
()
))
{
return
new
Condition
(
column
.
get
(),
rights
);
}
}
...
...
@@ -266,7 +266,7 @@ public abstract class WhereClauseParser implements SQLClauseParser {
}
if
(!
hasComplexExpression
)
{
Optional
<
Column
>
column
=
find
(
sqlStatement
.
getTables
(),
left
);
if
(
column
.
isPresent
()
&&
shardingRule
.
isShardingColumn
(
column
.
get
()))
{
if
(
column
.
isPresent
()
&&
shardingRule
.
isShardingColumn
(
column
.
get
()
.
getName
(),
column
.
get
().
getTableName
()
))
{
return
new
Condition
(
column
.
get
(),
rights
.
get
(
0
),
rights
.
get
(
1
));
}
}
...
...
sharding-core/sharding-core-rest/src/main/java/org/apache/shardingsphere/core/parsing/parser/sql/dml/insert/AbstractInsertParser.java
浏览文件 @
f6213bed
...
...
@@ -25,7 +25,6 @@ import org.apache.shardingsphere.core.parsing.lexer.LexerEngine;
import
org.apache.shardingsphere.core.parsing.lexer.token.DefaultKeyword
;
import
org.apache.shardingsphere.core.parsing.lexer.token.Symbol
;
import
org.apache.shardingsphere.core.parsing.parser.clause.facade.AbstractInsertClauseParserFacade
;
import
org.apache.shardingsphere.core.parsing.parser.context.condition.Column
;
import
org.apache.shardingsphere.core.parsing.parser.sql.SQLParser
;
import
org.apache.shardingsphere.core.parsing.parser.sql.dml.DMLStatement
;
import
org.apache.shardingsphere.core.parsing.parser.token.ItemsToken
;
...
...
@@ -77,16 +76,16 @@ public abstract class AbstractInsertParser implements SQLParser {
private
void
processGeneratedKey
(
final
InsertStatement
insertStatement
)
{
String
tableName
=
insertStatement
.
getTables
().
getSingleTableName
();
Optional
<
Column
>
generateKeyColumn
=
shardingRule
.
findGenerateKeyColumn
(
tableName
);
if
(-
1
!=
insertStatement
.
getGenerateKeyColumnIndex
()
||
!
generateKeyColumn
.
isPresent
())
{
Optional
<
String
>
generateKeyColumnName
=
shardingRule
.
findGenerateKeyColumnName
(
tableName
);
if
(-
1
!=
insertStatement
.
getGenerateKeyColumnIndex
()
||
!
generateKeyColumn
Name
.
isPresent
())
{
return
;
}
if
(
DefaultKeyword
.
VALUES
.
equals
(
insertStatement
.
getInsertValues
().
getInsertValues
().
get
(
0
).
getType
()))
{
if
(!
insertStatement
.
getItemsTokens
().
isEmpty
())
{
insertStatement
.
getItemsTokens
().
get
(
0
).
getItems
().
add
(
generateKeyColumn
.
get
().
getName
());
insertStatement
.
getItemsTokens
().
get
(
0
).
getItems
().
add
(
generateKeyColumn
Name
.
get
());
}
else
{
ItemsToken
columnsToken
=
new
ItemsToken
(
insertStatement
.
getColumnsListLastIndex
());
columnsToken
.
getItems
().
add
(
generateKeyColumn
.
get
().
getName
());
columnsToken
.
getItems
().
add
(
generateKeyColumn
Name
.
get
());
insertStatement
.
addSQLToken
(
columnsToken
);
}
}
...
...
sharding-core/sharding-core-rest/src/main/java/org/apache/shardingsphere/core/rule/ShardingRule.java
浏览文件 @
f6213bed
...
...
@@ -33,7 +33,6 @@ import org.apache.shardingsphere.core.encrypt.ShardingEncryptorEngine;
import
org.apache.shardingsphere.core.encrypt.ShardingEncryptorStrategy
;
import
org.apache.shardingsphere.core.exception.ShardingConfigurationException
;
import
org.apache.shardingsphere.core.exception.ShardingException
;
import
org.apache.shardingsphere.core.parsing.parser.context.condition.Column
;
import
org.apache.shardingsphere.core.routing.strategy.ShardingStrategy
;
import
org.apache.shardingsphere.core.routing.strategy.ShardingStrategyFactory
;
import
org.apache.shardingsphere.core.routing.strategy.hint.HintShardingStrategy
;
...
...
@@ -325,32 +324,33 @@ public class ShardingRule implements SQLStatementFillerRule {
/**
* Judge is sharding column or not.
*
* @param column column object
* @param columnName column name
* @param tableName table name
* @return is sharding column or not
*/
public
boolean
isShardingColumn
(
final
Column
column
)
{
public
boolean
isShardingColumn
(
final
String
columnName
,
final
String
tableName
)
{
for
(
TableRule
each
:
tableRules
)
{
if
(
each
.
getLogicTable
().
equalsIgnoreCase
(
column
.
getTableName
())
&&
isShardingColumn
(
each
,
column
))
{
if
(
each
.
getLogicTable
().
equalsIgnoreCase
(
tableName
)
&&
isShardingColumn
(
each
,
columnName
))
{
return
true
;
}
}
return
false
;
}
private
boolean
isShardingColumn
(
final
TableRule
tableRule
,
final
Column
column
)
{
return
getDatabaseShardingStrategy
(
tableRule
).
getShardingColumns
().
contains
(
column
.
getName
())
||
getTableShardingStrategy
(
tableRule
).
getShardingColumns
().
contains
(
column
.
getName
()
);
private
boolean
isShardingColumn
(
final
TableRule
tableRule
,
final
String
columnName
)
{
return
getDatabaseShardingStrategy
(
tableRule
).
getShardingColumns
().
contains
(
column
Name
)
||
getTableShardingStrategy
(
tableRule
).
getShardingColumns
().
contains
(
columnName
);
}
/**
* Find column of generated key.
* Find column
name
of generated key.
*
* @param logicTableName logic table name
* @return
generated key's column
* @return
column name of generated key
*/
public
Optional
<
Column
>
findGenerateKeyColumn
(
final
String
logicTableName
)
{
public
Optional
<
String
>
findGenerateKeyColumnName
(
final
String
logicTableName
)
{
for
(
TableRule
each
:
tableRules
)
{
if
(
each
.
getLogicTable
().
equalsIgnoreCase
(
logicTableName
)
&&
null
!=
each
.
getGenerateKeyColumn
())
{
return
Optional
.
of
(
new
Column
(
each
.
getGenerateKeyColumn
(),
logicTableName
));
return
Optional
.
of
(
each
.
getGenerateKeyColumn
(
));
}
}
return
Optional
.
absent
();
...
...
sharding-core/sharding-core-rest/src/test/java/org/apache/shardingsphere/core/keygen/GeneratedKeyTest.java
浏览文件 @
f6213bed
...
...
@@ -18,7 +18,6 @@
package
org.apache.shardingsphere.core.keygen
;
import
com.google.common.base.Optional
;
import
org.apache.shardingsphere.core.parsing.parser.context.condition.Column
;
import
org.apache.shardingsphere.core.parsing.parser.context.condition.GeneratedKeyCondition
;
import
org.apache.shardingsphere.core.parsing.parser.context.insertvalue.InsertValue
;
import
org.apache.shardingsphere.core.parsing.parser.context.insertvalue.InsertValues
;
...
...
@@ -59,14 +58,14 @@ public final class GeneratedKeyTest {
@Test
public
void
assertGetGenerateKeyWhenCreateWithoutGenerateKeyColumnConfiguration
()
{
mockGetGenerateKeyWhenCreate
();
when
(
shardingRule
.
findGenerateKeyColumn
(
"tbl"
)).
thenReturn
(
Optional
.<
Column
>
absent
());
when
(
shardingRule
.
findGenerateKeyColumn
Name
(
"tbl"
)).
thenReturn
(
Optional
.<
String
>
absent
());
assertFalse
(
GeneratedKey
.
getGenerateKey
(
shardingRule
,
Collections
.<
Object
>
singletonList
(
1
),
insertStatement
).
isPresent
());
}
@Test
public
void
assertGetGenerateKeyWhenCreateWithGenerateKeyColumnConfiguration
()
{
mockGetGenerateKeyWhenCreate
();
when
(
shardingRule
.
findGenerateKeyColumn
(
"tbl"
)).
thenReturn
(
Optional
.
of
(
new
Column
(
"id"
,
"tbl"
)
));
when
(
shardingRule
.
findGenerateKeyColumn
Name
(
"tbl"
)).
thenReturn
(
Optional
.
of
(
"id"
));
Optional
<
GeneratedKey
>
actual
=
GeneratedKey
.
getGenerateKey
(
shardingRule
,
Collections
.<
Object
>
singletonList
(
1
),
insertStatement
);
assertTrue
(
actual
.
isPresent
());
assertThat
(
actual
.
get
().
getGeneratedKeys
().
size
(),
is
(
1
));
...
...
sharding-core/sharding-core-rest/src/test/java/org/apache/shardingsphere/core/rule/ShardingRuleTest.java
浏览文件 @
f6213bed
...
...
@@ -28,7 +28,6 @@ import org.apache.shardingsphere.core.exception.ShardingConfigurationException;
import
org.apache.shardingsphere.core.fixture.PreciseShardingAlgorithmFixture
;
import
org.apache.shardingsphere.core.keygen.fixture.IncrementShardingKeyGenerator
;
import
org.apache.shardingsphere.core.keygen.impl.SnowflakeShardingKeyGenerator
;
import
org.apache.shardingsphere.core.parsing.parser.context.condition.Column
;
import
org.apache.shardingsphere.core.routing.strategy.inline.InlineShardingStrategy
;
import
org.apache.shardingsphere.core.routing.strategy.none.NoneShardingStrategy
;
import
org.hamcrest.CoreMatchers
;
...
...
@@ -237,7 +236,7 @@ public final class ShardingRuleTest {
ShardingRuleConfiguration
shardingRuleConfig
=
new
ShardingRuleConfiguration
();
shardingRuleConfig
.
getTableRuleConfigs
().
add
(
createTableRuleConfigWithAllStrategies
());
shardingRuleConfig
.
setDefaultDatabaseShardingStrategyConfig
(
new
StandardShardingStrategyConfiguration
(
"column"
,
new
PreciseShardingAlgorithmFixture
()));
assertTrue
(
new
ShardingRule
(
shardingRuleConfig
,
createDataSourceNames
()).
isShardingColumn
(
new
Column
(
"column"
,
"LOGIC_TABLE"
)
));
assertTrue
(
new
ShardingRule
(
shardingRuleConfig
,
createDataSourceNames
()).
isShardingColumn
(
"column"
,
"LOGIC_TABLE"
));
}
@Test
...
...
@@ -245,38 +244,38 @@ public final class ShardingRuleTest {
ShardingRuleConfiguration
shardingRuleConfig
=
new
ShardingRuleConfiguration
();
shardingRuleConfig
.
getTableRuleConfigs
().
add
(
createTableRuleConfigWithAllStrategies
());
shardingRuleConfig
.
setDefaultTableShardingStrategyConfig
(
new
StandardShardingStrategyConfiguration
(
"column"
,
new
PreciseShardingAlgorithmFixture
()));
assertTrue
(
new
ShardingRule
(
shardingRuleConfig
,
createDataSourceNames
()).
isShardingColumn
(
new
Column
(
"column"
,
"LOGIC_TABLE"
)
));
assertTrue
(
new
ShardingRule
(
shardingRuleConfig
,
createDataSourceNames
()).
isShardingColumn
(
"column"
,
"LOGIC_TABLE"
));
}
@Test
public
void
assertIsShardingColumnForDatabaseShardingStrategy
()
{
ShardingRuleConfiguration
shardingRuleConfig
=
new
ShardingRuleConfiguration
();
shardingRuleConfig
.
getTableRuleConfigs
().
add
(
createTableRuleConfigWithAllStrategies
());
assertTrue
(
new
ShardingRule
(
shardingRuleConfig
,
createDataSourceNames
()).
isShardingColumn
(
new
Column
(
"column"
,
"logic_Table"
)
));
assertTrue
(
new
ShardingRule
(
shardingRuleConfig
,
createDataSourceNames
()).
isShardingColumn
(
"column"
,
"logic_Table"
));
}
@Test
public
void
assertIsShardingColumnForTableShardingStrategy
()
{
ShardingRuleConfiguration
shardingRuleConfig
=
new
ShardingRuleConfiguration
();
shardingRuleConfig
.
getTableRuleConfigs
().
add
(
createTableRuleConfigWithTableStrategies
());
assertTrue
(
new
ShardingRule
(
shardingRuleConfig
,
createDataSourceNames
()).
isShardingColumn
(
new
Column
(
"column"
,
"logic_Table"
)
));
assertTrue
(
new
ShardingRule
(
shardingRuleConfig
,
createDataSourceNames
()).
isShardingColumn
(
"column"
,
"logic_Table"
));
}
@Test
public
void
assertIsNotShardingColumn
()
{
ShardingRuleConfiguration
shardingRuleConfig
=
new
ShardingRuleConfiguration
();
shardingRuleConfig
.
getTableRuleConfigs
().
add
(
createTableRuleConfigWithAllStrategies
());
assertFalse
(
new
ShardingRule
(
shardingRuleConfig
,
createDataSourceNames
()).
isShardingColumn
(
new
Column
(
"column"
,
"other_Table"
)
));
assertFalse
(
new
ShardingRule
(
shardingRuleConfig
,
createDataSourceNames
()).
isShardingColumn
(
"column"
,
"other_Table"
));
}
@Test
public
void
assertFindGenerateKeyColumn
()
{
assertTrue
(
createMaximumShardingRule
().
findGenerateKeyColumn
(
"logic_table"
).
isPresent
());
assertTrue
(
createMaximumShardingRule
().
findGenerateKeyColumn
Name
(
"logic_table"
).
isPresent
());
}
@Test
public
void
assertNotFindGenerateKeyColumn
()
{
assertFalse
(
createMinimumShardingRule
().
findGenerateKeyColumn
(
"sub_logic_table"
).
isPresent
());
assertFalse
(
createMinimumShardingRule
().
findGenerateKeyColumn
Name
(
"sub_logic_table"
).
isPresent
());
}
@Test
(
expected
=
ShardingConfigurationException
.
class
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录