提交 a1460d57 编写于 作者: T terrymanu

for #2993, simplify for the code

上级 f91f7f4f
......@@ -29,8 +29,6 @@ import org.apache.shardingsphere.core.parse.sql.segment.dml.assignment.Assignmen
import org.apache.shardingsphere.core.parse.sql.statement.dml.UpdateStatement;
import org.apache.shardingsphere.core.rule.ShardingRule;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
/**
......@@ -44,34 +42,20 @@ public final class ShardingUpdateOptimizeEngine implements ShardingOptimizeEngin
@Override
public ShardingConditionOptimizedStatement optimize(final ShardingRule shardingRule,
final TableMetas tableMetas, final String sql, final List<Object> parameters, final UpdateStatement sqlStatement) {
checkUpdateShardKey(shardingRule, sqlStatement);
checkUpdateShardingKey(shardingRule, sqlStatement);
WhereClauseShardingConditionEngine shardingConditionEngine = new WhereClauseShardingConditionEngine(shardingRule, tableMetas);
WhereClauseEncryptConditionEngine encryptConditionEngine = new WhereClauseEncryptConditionEngine(shardingRule.getEncryptRule(), tableMetas);
return new ShardingConditionOptimizedStatement(sqlStatement,
new ShardingConditions(shardingConditionEngine.createShardingConditions(sqlStatement, parameters)),
new EncryptConditions(encryptConditionEngine.createEncryptConditions(sqlStatement)));
}
private void checkUpdateShardKey(final ShardingRule shardingRule, final UpdateStatement updateStatement) {
if (updateStatement.getTables().size() > 1) {
return;
}
private void checkUpdateShardingKey(final ShardingRule shardingRule, final UpdateStatement updateStatement) {
String tableName = new Tables(updateStatement).getSingleTableName();
Collection<String> updateColumns = extractUpdateColumns(updateStatement);
for (String column : updateColumns) {
boolean isShardingColumn = shardingRule.isShardingColumn(column, tableName);
if (isShardingColumn) {
throw new UnsupportedOperationException(String.format("Can not update shard key,logicTable: [%s],colum: [%s].", tableName, column));
for (AssignmentSegment each : updateStatement.getSetAssignment().getAssignments()) {
if (shardingRule.isShardingColumn(each.getColumn().getName(), tableName)) {
throw new UnsupportedOperationException(String.format("Can not update sharding key, logic table: [%s], column: [%s].", tableName, each));
}
}
}
private Collection<String> extractUpdateColumns(final UpdateStatement updateStatement) {
List<String> result = new LinkedList<>();
Collection<AssignmentSegment> assignmentSegments = updateStatement.getSetAssignment().getAssignments();
for (AssignmentSegment each : assignmentSegments) {
result.add(each.getColumn().getName());
}
return result;
}
}
......@@ -30,7 +30,6 @@ import org.apache.shardingsphere.core.rule.ShardingRule;
import org.junit.Before;
import org.junit.Test;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
......@@ -40,17 +39,17 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public final class ShardingUpdateOptimizeEngineTest {
private ShardingRule shardingRule;
private TableMetas tableMetas;
private String sql;
private List<Object> parameters;
private UpdateStatement sqlStatement;
@Before
public void setUp() {
sql = "update user set id = 100";
......@@ -64,23 +63,23 @@ public final class ShardingUpdateOptimizeEngineTest {
when(columnSegment.getName()).thenReturn("id");
when(assignmentSegment.getColumn()).thenReturn(columnSegment);
when(tableAvailable.getTableName()).thenReturn("user");
when(sqlStatement.findSQLSegments(TableAvailable.class)).thenReturn(Arrays.asList(tableAvailable));
when(sqlStatement.findSQLSegments(TableAvailable.class)).thenReturn(Collections.singletonList(tableAvailable));
SetAssignmentsSegment setAssignmentsSegment = mock(SetAssignmentsSegment.class);
when(setAssignmentsSegment.getAssignments()).thenReturn(Arrays.asList(assignmentSegment));
when(setAssignmentsSegment.getAssignments()).thenReturn(Collections.singletonList(assignmentSegment));
when(sqlStatement.getSetAssignment()).thenReturn(setAssignmentsSegment);
when(sqlStatement.getWhere()).thenReturn(Optional.<WhereSegment>absent());
}
@Test
public void assertUpdateWithoutShardKey() {
public void assertUpdateWithoutShardingKey() {
when(shardingRule.isShardingColumn("id", "user")).thenReturn(false);
ShardingUpdateOptimizeEngine shardingUpdateOptimizeEngine = new ShardingUpdateOptimizeEngine();
ShardingConditionOptimizedStatement optimizedStatement = shardingUpdateOptimizeEngine.optimize(shardingRule, tableMetas, sql, parameters, sqlStatement);
assertThat(optimizedStatement, instanceOf(ShardingConditionOptimizedStatement.class));
}
@Test(expected = UnsupportedOperationException.class)
public void assertUpdateWithShardKey() {
public void assertUpdateWithShardingKey() {
when(shardingRule.isShardingColumn("id", "user")).thenReturn(true);
ShardingUpdateOptimizeEngine shardingUpdateOptimizeEngine = new ShardingUpdateOptimizeEngine();
shardingUpdateOptimizeEngine.optimize(shardingRule, tableMetas, sql, parameters, sqlStatement);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册