You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2024/11/25 07:19:45 UTC
(shardingsphere) branch master updated: Add insert values not empty judgement and test (#33793)
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 <ch...@apache.org>
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(", ", "(", ")");