This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new 17e0286698c Add insert values not empty judgement and test (#33793)
17e0286698c is described below
commit 17e0286698c6d13cf741c75aa6ec2e74e4a64b82
Author: ZhangCheng <[email protected]>
AuthorDate: Mon Nov 25 15:19:39 2024 +0800
Add insert values not empty judgement and test (#33793)
* Add insert values not empty judgement and test
* Add insert values not empty judgement and test
* Add insert values not empty judgement and test
* Add insert values not empty judgement and test
---
.../impl/ShardingInsertValuesTokenGenerator.java | 6 ++---
.../ShardingInsertValuesTokenGeneratorTest.java | 17 +++++-------
.../token/pojo/ShardingInsertValuesTokenTest.java | 31 ++++++++++++++++------
.../sql/token/common/pojo/generic/InsertValue.java | 9 +++++--
4 files changed, 39 insertions(+), 24 deletions(-)
diff --git
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/ShardingInsertValuesTokenGenerator.java
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/ShardingInsertValuesTokenGenerator.java
index b8b31ac6fbd..209c4e57860 100644
---
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/ShardingInsertValuesTokenGenerator.java
+++
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/ShardingInsertValuesTokenGenerator.java
@@ -55,12 +55,10 @@ public final class ShardingInsertValuesTokenGenerator
implements OptionalSQLToke
public InsertValuesToken generateSQLToken(final InsertStatementContext
insertStatementContext) {
Collection<InsertValuesSegment> insertValuesSegments =
insertStatementContext.getSqlStatement().getValues();
InsertValuesToken result = new
ShardingInsertValuesToken(getStartIndex(insertValuesSegments),
getStopIndex(insertValuesSegments));
- Iterator<Collection<DataNode>> originalDataNodesIterator = null ==
routeContext || routeContext.getOriginalDataNodes().isEmpty()
- ? null
- : routeContext.getOriginalDataNodes().iterator();
+ Iterator<Collection<DataNode>> dataNodesIterator =
routeContext.getOriginalDataNodes().isEmpty() ? Collections.emptyIterator() :
routeContext.getOriginalDataNodes().iterator();
for (InsertValueContext each :
insertStatementContext.getInsertValueContexts()) {
List<ExpressionSegment> expressionSegments =
each.getValueExpressions();
- Collection<DataNode> dataNodes = null == originalDataNodesIterator
? Collections.emptyList() : originalDataNodesIterator.next();
+ Collection<DataNode> dataNodes = dataNodesIterator.hasNext() ?
dataNodesIterator.next() : Collections.emptyList();
result.getInsertValues().add(new
ShardingInsertValue(expressionSegments, dataNodes));
}
return result;
diff --git
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/ShardingInsertValuesTokenGeneratorTest.java
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/ShardingInsertValuesTokenGeneratorTest.java
index cc99c797419..4b712125822 100644
---
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/ShardingInsertValuesTokenGeneratorTest.java
+++
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/ShardingInsertValuesTokenGeneratorTest.java
@@ -25,10 +25,13 @@ import
org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.generic.Ins
import org.apache.shardingsphere.infra.route.context.RouteContext;
import
org.apache.shardingsphere.sharding.rewrite.token.pojo.ShardingInsertValue;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.assignment.InsertValuesSegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simple.LiteralExpressionSegment;
import org.junit.jupiter.api.Test;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.List;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
@@ -59,19 +62,12 @@ class ShardingInsertValuesTokenGeneratorTest {
assertTrue(generator.isGenerateSQLToken(mock(InsertStatementContext.class,
RETURNS_DEEP_STUBS)));
}
- @Test
- void assertGenerateSQLTokenWithNullRouteContext() {
- InsertValuesToken insertValuesToken =
generator.generateSQLToken(mockInsertStatementContext());
- assertThat(insertValuesToken.getInsertValues().size(), is(1));
-
assertTrue(insertValuesToken.getInsertValues().get(0).getValues().isEmpty());
- }
-
@Test
void assertGenerateSQLTokenWithEmptyDataNode() {
generator.setRouteContext(new RouteContext());
InsertValuesToken actual =
generator.generateSQLToken(mockInsertStatementContext());
assertThat(actual.getInsertValues().size(), is(1));
- assertTrue(actual.getInsertValues().get(0).getValues().isEmpty());
+ assertThat(actual.getInsertValues().get(0).getValues().size(), is(1));
}
@Test
@@ -86,8 +82,9 @@ class ShardingInsertValuesTokenGeneratorTest {
private InsertStatementContext mockInsertStatementContext() {
InsertStatementContext result = mock(InsertStatementContext.class,
RETURNS_DEEP_STUBS);
-
when(result.getInsertValueContexts()).thenReturn(Collections.singletonList(new
InsertValueContext(Collections.emptyList(), Collections.emptyList(), 4)));
-
when(result.getSqlStatement().getValues()).thenReturn(Collections.singleton(new
InsertValuesSegment(1, 2, Collections.emptyList())));
+ List<ExpressionSegment> assignments = Collections.singletonList(new
LiteralExpressionSegment(0, 0, "foo"));
+
when(result.getInsertValueContexts()).thenReturn(Collections.singletonList(new
InsertValueContext(assignments, Collections.emptyList(), 4)));
+
when(result.getSqlStatement().getValues()).thenReturn(Collections.singleton(new
InsertValuesSegment(1, 2, assignments)));
return result;
}
}
diff --git
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/pojo/ShardingInsertValuesTokenTest.java
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/pojo/ShardingInsertValuesTokenTest.java
index 391ebbae514..f4cc7f2b59c 100644
---
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/pojo/ShardingInsertValuesTokenTest.java
+++
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/pojo/ShardingInsertValuesTokenTest.java
@@ -18,6 +18,7 @@
package org.apache.shardingsphere.sharding.rewrite.token.pojo;
import org.apache.shardingsphere.infra.datanode.DataNode;
+import
org.apache.shardingsphere.infra.exception.generic.UnsupportedSQLOperationException;
import org.apache.shardingsphere.infra.route.context.RouteMapper;
import org.apache.shardingsphere.infra.route.context.RouteUnit;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment;
@@ -31,13 +32,13 @@ import java.util.List;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertThrows;
class ShardingInsertValuesTokenTest {
@Test
- void assertToStringWithRouteUnit() {
- // TODO This test case may not necessary; the trailing parentheses
should not be there. Is there too much protective coding in main code?
@duanzhengqiang
- assertThat(createInsertValuesToken().toString(createRouteUnit()),
is("('foo', 'bar'), ()"));
+ void assertToStringForInsertValue() {
+ assertThat(createInsertValuesToken().toString(createRouteUnit()),
is("('foo', 'bar')"));
}
private ShardingInsertValuesToken createInsertValuesToken() {
@@ -45,8 +46,6 @@ class ShardingInsertValuesTokenTest {
Collection<DataNode> dataNodes = Collections.singleton(new
DataNode("foo_ds", "tbl_0"));
List<ExpressionSegment> values = Arrays.asList(new
LiteralExpressionSegment(0, 0, "foo"), new LiteralExpressionSegment(0, 0,
"bar"));
result.getInsertValues().add(new ShardingInsertValue(values,
dataNodes));
- result.getInsertValues().add(new
ShardingInsertValue(Collections.emptyList(), Collections.singleton(new
DataNode("bar_ds", "tbl_1"))));
- result.getInsertValues().add(new
ShardingInsertValue(Collections.emptyList(), Collections.emptyList()));
return result;
}
@@ -58,8 +57,24 @@ class ShardingInsertValuesTokenTest {
}
@Test
- void assertToStringWithoutRouteUnit() {
- // TODO This test case may not necessary; the trailing parentheses
should not be there. Is there too much protective coding in main code?
@duanzhengqiang
- assertThat(createInsertValuesToken().toString(), is("('foo', 'bar'),
(), ()"));
+ void assertToStringForMultipleInsertValues() {
+ assertThat(createMultipleInsertValuesToken().toString(), is("('foo',
'bar'), ('foo', 'bar')"));
+ }
+
+ private ShardingInsertValuesToken createMultipleInsertValuesToken() {
+ ShardingInsertValuesToken result = new ShardingInsertValuesToken(0, 2);
+ Collection<DataNode> dataNodes = Collections.singleton(new
DataNode("foo_ds", "tbl_0"));
+ List<ExpressionSegment> values = Arrays.asList(new
LiteralExpressionSegment(0, 0, "foo"), new LiteralExpressionSegment(0, 0,
"bar"));
+ result.getInsertValues().add(new ShardingInsertValue(values,
dataNodes));
+ result.getInsertValues().add(new ShardingInsertValue(values,
dataNodes));
+ return result;
+ }
+
+ @Test
+ void assertToStringWithEmptyInsertValues() {
+ ShardingInsertValuesToken result = new ShardingInsertValuesToken(0, 2);
+ Collection<DataNode> dataNodes = Collections.singleton(new
DataNode("foo_ds", "tbl_0"));
+ List<ExpressionSegment> values = Collections.emptyList();
+ assertThrows(UnsupportedSQLOperationException.class, () ->
result.getInsertValues().add(new ShardingInsertValue(values, dataNodes)));
}
}
diff --git
a/infra/rewrite/src/main/java/org/apache/shardingsphere/infra/rewrite/sql/token/common/pojo/generic/InsertValue.java
b/infra/rewrite/src/main/java/org/apache/shardingsphere/infra/rewrite/sql/token/common/pojo/generic/InsertValue.java
index ea8f4c310fb..dde1f56ec58 100644
---
a/infra/rewrite/src/main/java/org/apache/shardingsphere/infra/rewrite/sql/token/common/pojo/generic/InsertValue.java
+++
b/infra/rewrite/src/main/java/org/apache/shardingsphere/infra/rewrite/sql/token/common/pojo/generic/InsertValue.java
@@ -18,7 +18,8 @@
package org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.generic;
import lombok.Getter;
-import lombok.RequiredArgsConstructor;
+import
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
+import
org.apache.shardingsphere.infra.exception.generic.UnsupportedSQLOperationException;
import
org.apache.shardingsphere.sql.parser.statement.core.enums.ParameterMarkerType;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simple.LiteralExpressionSegment;
@@ -30,12 +31,16 @@ import java.util.StringJoiner;
/**
* Insert value.
*/
-@RequiredArgsConstructor
@Getter
public class InsertValue {
private final List<ExpressionSegment> values;
+ public InsertValue(final List<ExpressionSegment> values) {
+ ShardingSpherePreconditions.checkNotEmpty(values, () -> new
UnsupportedSQLOperationException("Insert values can not be empty"));
+ this.values = values;
+ }
+
@Override
public final String toString() {
StringJoiner result = new StringJoiner(", ", "(", ")");