Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
apache
Shardingsphere
提交
487df317
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 搜索 >>
提交
487df317
编写于
4月 25, 2016
作者:
T
terrymanu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
refactor
上级
07843a30
变更
10
隐藏空白更改
内联
并排
Showing
10 changed file
with
119 addition
and
58 deletion
+119
-58
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/rule/DataNode.java
.../com/dangdang/ddframe/rdb/sharding/api/rule/DataNode.java
+21
-0
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/rule/DataSourceRule.java
...angdang/ddframe/rdb/sharding/api/rule/DataSourceRule.java
+0
-1
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/rule/ShardingRule.java
.../dangdang/ddframe/rdb/sharding/api/rule/ShardingRule.java
+32
-28
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/rule/TableRule.java
...com/dangdang/ddframe/rdb/sharding/api/rule/TableRule.java
+3
-12
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/router/SQLRouteEngine.java
.../dangdang/ddframe/rdb/sharding/router/SQLRouteEngine.java
+1
-1
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/router/binding/BindingTablesRouter.java
...rame/rdb/sharding/router/binding/BindingTablesRouter.java
+1
-1
sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/AllApiTest.java
...ava/com/dangdang/ddframe/rdb/sharding/api/AllApiTest.java
+3
-1
sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/rule/DataNodeTest.java
.../dangdang/ddframe/rdb/sharding/api/rule/DataNodeTest.java
+49
-0
sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/rule/DataSourceRuleTest.java
...ang/ddframe/rdb/sharding/api/rule/DataSourceRuleTest.java
+0
-5
sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/rule/ShardingRuleTest.java
...gdang/ddframe/rdb/sharding/api/rule/ShardingRuleTest.java
+9
-9
未找到文件。
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/rule/DataNode.java
浏览文件 @
487df317
...
...
@@ -17,11 +17,14 @@
package
com.dangdang.ddframe.rdb.sharding.api.rule
;
import
com.google.common.base.Splitter
;
import
lombok.EqualsAndHashCode
;
import
lombok.Getter
;
import
lombok.RequiredArgsConstructor
;
import
lombok.ToString
;
import
java.util.List
;
/**
* 分库分表数据单元.
*
...
...
@@ -33,7 +36,25 @@ import lombok.ToString;
@ToString
public
final
class
DataNode
{
private
static
final
String
DELIMITER
=
"."
;
private
final
String
dataSourceName
;
private
final
String
tableName
;
public
DataNode
(
final
String
dataNode
)
{
List
<
String
>
segments
=
Splitter
.
on
(
DELIMITER
).
splitToList
(
dataNode
);
dataSourceName
=
segments
.
get
(
0
);
tableName
=
segments
.
get
(
1
);
}
/**
* 判断字符串是否为合法的分库分表数据单元字符串.
*
* @param dataNodeStr 待判断的字符串
* @return 是否为合法的分库分表数据单元字符串
*/
public
static
boolean
isValidDataNode
(
final
String
dataNodeStr
)
{
return
dataNodeStr
.
contains
(
DELIMITER
)
&&
2
==
Splitter
.
on
(
DELIMITER
).
splitToList
(
dataNodeStr
).
size
();
}
}
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/rule/DataSourceRule.java
浏览文件 @
487df317
...
...
@@ -34,7 +34,6 @@ public final class DataSourceRule {
private
final
Map
<
String
,
DataSource
>
dataSourceMap
;
public
DataSourceRule
(
final
Map
<
String
,
DataSource
>
dataSourceMap
)
{
Preconditions
.
checkNotNull
(
dataSourceMap
,
"Must have one data source at least."
);
Preconditions
.
checkState
(!
dataSourceMap
.
isEmpty
(),
"Must have one data source at least."
);
this
.
dataSourceMap
=
dataSourceMap
;
}
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/rule/ShardingRule.java
浏览文件 @
487df317
...
...
@@ -133,21 +133,14 @@ public final class ShardingRule {
}
/**
*
根据逻辑表名称获取binding表配置的逻辑表名称集合
.
*
* @param logicTable
逻辑表名称
* @return
binding表配置的逻辑表名称集合
*
判断逻辑表名称集合是否全部属于Binding表
.
*
* @param logicTable
s 逻辑表名称集合
* @return
是否全部属于Binding表
*/
public
Optional
<
BindingTableRule
>
getBindingTableRule
(
final
String
logicTable
)
{
if
(
null
==
bindingTableRules
)
{
return
Optional
.
absent
();
}
for
(
BindingTableRule
each
:
bindingTableRules
)
{
if
(
each
.
hasLogicTable
(
logicTable
))
{
return
Optional
.
of
(
each
);
}
}
return
Optional
.
absent
();
public
boolean
isAllBindingTables
(
final
Collection
<
String
>
logicTables
)
{
Collection
<
String
>
bindingTables
=
filterAllBindingTables
(
logicTables
);
return
!
bindingTables
.
isEmpty
()
&&
bindingTables
.
containsAll
(
logicTables
);
}
/**
...
...
@@ -160,13 +153,7 @@ public final class ShardingRule {
if
(
logicTables
.
isEmpty
())
{
return
Collections
.
emptyList
();
}
Optional
<
BindingTableRule
>
bindingTableRule
=
Optional
.
absent
();
for
(
String
each
:
logicTables
)
{
bindingTableRule
=
getBindingTableRule
(
each
);
if
(
bindingTableRule
.
isPresent
())
{
break
;
}
}
Optional
<
BindingTableRule
>
bindingTableRule
=
findBindingTableRule
(
logicTables
);
if
(!
bindingTableRule
.
isPresent
())
{
return
Collections
.
emptyList
();
}
...
...
@@ -175,15 +162,32 @@ public final class ShardingRule {
return
result
;
}
private
Optional
<
BindingTableRule
>
findBindingTableRule
(
final
Collection
<
String
>
logicTables
)
{
for
(
String
each
:
logicTables
)
{
Optional
<
BindingTableRule
>
result
=
findBindingTableRule
(
each
);
if
(
result
.
isPresent
())
{
return
result
;
}
}
return
Optional
.
absent
();
}
/**
*
判断逻辑表名称集合是否全部属于Binding表
.
*
* @param logicTable
s 逻辑表名称集合
* @return
是否全部属于Binding表
*
根据逻辑表名称获取binding表配置的逻辑表名称集合
.
*
* @param logicTable
逻辑表名称
* @return
binding表配置的逻辑表名称集合
*/
public
boolean
isAllBindingTable
(
final
Collection
<
String
>
logicTables
)
{
Collection
<
String
>
bindingTables
=
filterAllBindingTables
(
logicTables
);
return
!
bindingTables
.
isEmpty
()
&&
bindingTables
.
containsAll
(
logicTables
);
public
Optional
<
BindingTableRule
>
findBindingTableRule
(
final
String
logicTable
)
{
if
(
null
==
bindingTableRules
)
{
return
Optional
.
absent
();
}
for
(
BindingTableRule
each
:
bindingTableRules
)
{
if
(
each
.
hasLogicTable
(
logicTable
))
{
return
Optional
.
of
(
each
);
}
}
return
Optional
.
absent
();
}
/**
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/rule/TableRule.java
浏览文件 @
487df317
...
...
@@ -24,7 +24,6 @@ import java.util.List;
import
com.dangdang.ddframe.rdb.sharding.api.strategy.database.DatabaseShardingStrategy
;
import
com.dangdang.ddframe.rdb.sharding.api.strategy.table.TableShardingStrategy
;
import
com.google.common.base.Splitter
;
import
lombok.AllArgsConstructor
;
import
lombok.Getter
;
import
lombok.RequiredArgsConstructor
;
...
...
@@ -69,9 +68,8 @@ public final class TableRule {
private
void
generateDataNodes
(
final
List
<
String
>
actualTables
,
final
DataSourceRule
dataSourceRule
)
{
for
(
String
actualTable
:
actualTables
)
{
if
(
actualTable
.
contains
(
"."
))
{
List
<
String
>
actualDatabaseTable
=
Splitter
.
on
(
"."
).
splitToList
(
actualTable
);
this
.
actualTables
.
add
(
new
DataNode
(
actualDatabaseTable
.
get
(
0
),
actualDatabaseTable
.
get
(
1
)));
if
(
DataNode
.
isValidDataNode
(
actualTable
))
{
this
.
actualTables
.
add
(
new
DataNode
(
actualTable
));
}
else
{
for
(
String
dataSourceName
:
dataSourceRule
.
getDataSourceNames
())
{
this
.
actualTables
.
add
(
new
DataNode
(
dataSourceName
,
actualTable
));
...
...
@@ -126,14 +124,7 @@ public final class TableRule {
return
result
;
}
/**
* 根据数据源和真实表名称查找真实表顺序.
*
* @param dataSourceName 数据源名称
* @param actualTableName 真实表名称
* @return 真实表顺序
*/
public
int
findActualTableIndex
(
final
String
dataSourceName
,
final
String
actualTableName
)
{
int
findActualTableIndex
(
final
String
dataSourceName
,
final
String
actualTableName
)
{
int
result
=
0
;
for
(
DataNode
each
:
actualTables
)
{
if
(
each
.
getDataSourceName
().
equals
(
dataSourceName
)
&&
each
.
getTableName
().
equals
(
actualTableName
))
{
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/router/SQLRouteEngine.java
浏览文件 @
487df317
...
...
@@ -93,7 +93,7 @@ public final class SQLRouteEngine {
RoutingResult
result
;
if
(
1
==
logicTables
.
size
())
{
result
=
new
SingleTableRouter
(
shardingRule
,
logicTables
.
iterator
().
next
(),
conditionContext
,
type
).
route
();
}
else
if
(
shardingRule
.
isAllBindingTable
(
logicTables
))
{
}
else
if
(
shardingRule
.
isAllBindingTable
s
(
logicTables
))
{
result
=
new
BindingTablesRouter
(
shardingRule
,
logicTables
,
conditionContext
,
type
).
route
();
}
else
{
// TODO 可配置是否执行笛卡尔积
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/router/binding/BindingTablesRouter.java
浏览文件 @
487df317
...
...
@@ -51,7 +51,7 @@ public class BindingTablesRouter {
this
.
logicTables
=
logicTables
;
this
.
conditionContext
=
conditionContext
;
this
.
sqlStatementType
=
sqlStatementType
;
Optional
<
BindingTableRule
>
optionalBindingTableRule
=
shardingRule
.
get
BindingTableRule
(
logicTables
.
iterator
().
next
());
Optional
<
BindingTableRule
>
optionalBindingTableRule
=
shardingRule
.
find
BindingTableRule
(
logicTables
.
iterator
().
next
());
Preconditions
.
checkState
(
optionalBindingTableRule
.
isPresent
());
bindingTableRule
=
optionalBindingTableRule
.
get
();
}
...
...
sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/AllApiTest.java
浏览文件 @
487df317
...
...
@@ -20,6 +20,7 @@ package com.dangdang.ddframe.rdb.sharding.api;
import
com.dangdang.ddframe.rdb.sharding.api.props.ShardingPropertiesConstantTest
;
import
com.dangdang.ddframe.rdb.sharding.api.props.ShardingPropertiesTest
;
import
com.dangdang.ddframe.rdb.sharding.api.rule.BindingTableRuleTest
;
import
com.dangdang.ddframe.rdb.sharding.api.rule.DataNodeTest
;
import
com.dangdang.ddframe.rdb.sharding.api.rule.DataSourceRuleTest
;
import
com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRuleTest
;
import
com.dangdang.ddframe.rdb.sharding.api.rule.TableRuleTest
;
...
...
@@ -41,7 +42,8 @@ import org.junit.runners.Suite;
ShardingValueTest
.
class
,
DataSourceRuleTest
.
class
,
ShardingRuleTest
.
class
,
TableRuleTest
.
class
,
TableRuleTest
.
class
,
DataNodeTest
.
class
,
BindingTableRuleTest
.
class
,
ShardingStrategyTest
.
class
,
DatabaseShardingStrategyTest
.
class
,
...
...
sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/rule/DataNodeTest.java
0 → 100644
浏览文件 @
487df317
/**
* Copyright 1999-2015 dangdang.com.
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* </p>
*/
package
com.dangdang.ddframe.rdb.sharding.api.rule
;
import
org.junit.Test
;
import
static
org
.
hamcrest
.
core
.
Is
.
is
;
import
static
org
.
junit
.
Assert
.
assertFalse
;
import
static
org
.
junit
.
Assert
.
assertThat
;
import
static
org
.
junit
.
Assert
.
assertTrue
;
public
class
DataNodeTest
{
@Test
public
void
assertIsValidDataNode
()
{
assertTrue
(
DataNode
.
isValidDataNode
(
"ds_0.tbl_0"
));
}
@Test
public
void
assertIsInvalidDataNodeWithoutDelimiter
()
{
assertFalse
(
DataNode
.
isValidDataNode
(
"ds_0_tbl_0"
));
}
@Test
public
void
assertIsInvalidDataNodeWithTwoDelimiters
()
{
assertFalse
(
DataNode
.
isValidDataNode
(
"ds_0.tbl_0.tbl_1"
));
}
@Test
public
void
assertNewDataNode
()
{
assertThat
(
new
DataNode
(
"ds_0.tbl_0"
).
getDataSourceName
(),
is
(
"ds_0"
));
assertThat
(
new
DataNode
(
"ds_0.tbl_0"
).
getTableName
(),
is
(
"tbl_0"
));
}
}
sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/rule/DataSourceRuleTest.java
浏览文件 @
487df317
...
...
@@ -30,11 +30,6 @@ public final class DataSourceRuleTest {
dataSourceRule
=
new
DataSourceRule
(
dataSourceMap
);
}
@Test
(
expected
=
NullPointerException
.
class
)
public
void
assertNewDataSourceFailureWhenDataSourceMapIsNull
()
{
new
DataSourceRule
(
null
);
}
@Test
(
expected
=
IllegalStateException
.
class
)
public
void
assertNewDataSourceFailureWhenDataSourceMapIsEmpty
()
{
new
DataSourceRule
(
Collections
.<
String
,
DataSource
>
emptyMap
());
...
...
sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/rule/ShardingRuleTest.java
浏览文件 @
487df317
...
...
@@ -115,19 +115,19 @@ public final class ShardingRuleTest {
@Test
public
void
assertGetBindingTableRuleForNotConfig
()
{
ShardingRule
actual
=
new
ShardingRule
(
createDataSourceRule
(),
Collections
.
singletonList
(
createTableRule
()));
assertFalse
(
actual
.
get
BindingTableRule
(
"logicTable"
).
isPresent
());
assertFalse
(
actual
.
find
BindingTableRule
(
"logicTable"
).
isPresent
());
}
@Test
public
void
assertGetBindingTableRuleForNotFound
()
{
assertFalse
(
createShardingRule
().
get
BindingTableRule
(
"newTable"
).
isPresent
());
assertFalse
(
createShardingRule
().
find
BindingTableRule
(
"newTable"
).
isPresent
());
}
@Test
public
void
assertGetBindingTableRuleForFound
()
{
BindingTableRule
bindingTableRule
=
createBindingTableRule
();
ShardingRule
actual
=
new
ShardingRule
(
createDataSourceRule
(),
Collections
.
singletonList
(
createTableRule
()),
Collections
.
singletonList
(
bindingTableRule
));
assertThat
(
actual
.
get
BindingTableRule
(
"logicTable"
).
get
(),
is
(
bindingTableRule
));
assertThat
(
actual
.
find
BindingTableRule
(
"logicTable"
).
get
(),
is
(
bindingTableRule
));
}
@Test
...
...
@@ -150,20 +150,20 @@ public final class ShardingRuleTest {
@Test
public
void
assertIsAllBindingTableWhenLogicTablesIsEmpty
()
{
assertFalse
(
createShardingRule
().
isAllBindingTable
(
Collections
.<
String
>
emptyList
()));
assertFalse
(
createShardingRule
().
isAllBindingTable
s
(
Collections
.<
String
>
emptyList
()));
}
@Test
public
void
assertIsNotAllBindingTable
()
{
assertFalse
(
createShardingRule
().
isAllBindingTable
(
Collections
.
singletonList
(
"newTable"
)));
assertFalse
(
createShardingRule
().
isAllBindingTable
(
Arrays
.
asList
(
"logicTable"
,
"newTable"
)));
assertFalse
(
createShardingRule
().
isAllBindingTable
s
(
Collections
.
singletonList
(
"newTable"
)));
assertFalse
(
createShardingRule
().
isAllBindingTable
s
(
Arrays
.
asList
(
"logicTable"
,
"newTable"
)));
}
@Test
public
void
assertIsAllBindingTable
()
{
assertTrue
(
createShardingRule
().
isAllBindingTable
(
Collections
.
singletonList
(
"logicTable"
)));
assertTrue
(
createShardingRule
().
isAllBindingTable
(
Collections
.
singletonList
(
"subLogicTable"
)));
assertTrue
(
createShardingRule
().
isAllBindingTable
(
Arrays
.
asList
(
"logicTable"
,
"subLogicTable"
)));
assertTrue
(
createShardingRule
().
isAllBindingTable
s
(
Collections
.
singletonList
(
"logicTable"
)));
assertTrue
(
createShardingRule
().
isAllBindingTable
s
(
Collections
.
singletonList
(
"subLogicTable"
)));
assertTrue
(
createShardingRule
().
isAllBindingTable
s
(
Arrays
.
asList
(
"logicTable"
,
"subLogicTable"
)));
}
private
ShardingRule
createShardingRule
()
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录