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(", ", "(", ")");

Reply via email to