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 77d1ff952dc Replace value expressions with insertValueContexts (#29246)
77d1ff952dc is described below

commit 77d1ff952dc7b35015542b3411fa44dd684771f9
Author: ZhangCheng <[email protected]>
AuthorDate: Fri Dec 1 13:38:24 2023 +0800

    Replace value expressions with insertValueContexts (#29246)
---
 .../InsertClauseShardingConditionEngine.java       |  3 ++-
 .../keygen/engine/GeneratedKeyContextEngine.java   | 22 ++++++++++++----------
 .../statement/dml/InsertStatementContext.java      |  4 ++--
 .../engine/GeneratedKeyContextEngineTest.java      |  9 ++++++---
 4 files changed, 22 insertions(+), 16 deletions(-)

diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/InsertClauseShardingConditionEngine.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/InsertClauseShardingConditionEngine.java
index c6b2b889b0b..d0ae2515d2d 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/InsertClauseShardingConditionEngine.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/InsertClauseShardingConditionEngine.java
@@ -137,7 +137,8 @@ public final class InsertClauseShardingConditionEngine {
                 List<Integer> parameterMarkerIndexes = each instanceof 
ParameterMarkerExpressionSegment
                         ? 
Collections.singletonList(((ParameterMarkerExpressionSegment) 
each).getParameterMarkerIndex())
                         : Collections.emptyList();
-                result.getValues().add(new 
ListShardingConditionValue<>(shardingColumn.get(), tableName, 
Collections.singletonList(getShardingValue((SimpleExpressionSegment) each, 
params)),
+                Object shardingValue = 
getShardingValue((SimpleExpressionSegment) each, params);
+                result.getValues().add(new 
ListShardingConditionValue<>(shardingColumn.get(), tableName, 
Collections.singletonList(shardingValue),
                         parameterMarkerIndexes));
             } else if (each instanceof CommonExpressionSegment) {
                 generateShardingCondition((CommonExpressionSegment) each, 
result, shardingColumn.get(), tableName);
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/insert/keygen/engine/GeneratedKeyContextEngine.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/insert/keygen/engine/GeneratedKeyContextEngine.java
index fa7921f4cdc..356b713910d 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/insert/keygen/engine/GeneratedKeyContextEngine.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/insert/keygen/engine/GeneratedKeyContextEngine.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.infra.binder.context.segment.insert.keygen.eng
 
 import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.infra.binder.context.segment.insert.keygen.GeneratedKeyContext;
+import 
org.apache.shardingsphere.infra.binder.context.segment.insert.values.InsertValueContext;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.assignment.SetAssignmentSegment;
@@ -47,14 +48,14 @@ public final class GeneratedKeyContextEngine {
      * Create generate key context.
      *
      * @param insertColumnNames insert column names
-     * @param valueExpressions value expressions
+     * @param insertValueContexts value expressions
      * @param params SQL parameters
      * @return generate key context
      */
-    public Optional<GeneratedKeyContext> createGenerateKeyContext(final 
List<String> insertColumnNames, final List<List<ExpressionSegment>> 
valueExpressions, final List<Object> params) {
+    public Optional<GeneratedKeyContext> createGenerateKeyContext(final 
List<String> insertColumnNames, final List<InsertValueContext> 
insertValueContexts, final List<Object> params) {
         String tableName = 
Optional.ofNullable(insertStatement.getTable()).map(optional -> 
optional.getTableName().getIdentifier().getValue()).orElse("");
         return findGenerateKeyColumn(tableName).map(optional -> 
containsGenerateKey(insertColumnNames, optional)
-                ? findGeneratedKey(insertColumnNames, valueExpressions, 
params, optional)
+                ? findGeneratedKey(insertColumnNames, insertValueContexts, 
params, optional)
                 : new GeneratedKeyContext(optional, true));
     }
     
@@ -89,19 +90,20 @@ public final class GeneratedKeyContextEngine {
         return 0;
     }
     
-    private GeneratedKeyContext findGeneratedKey(final List<String> 
insertColumnNames, final List<List<ExpressionSegment>> valueExpressions,
+    private GeneratedKeyContext findGeneratedKey(final List<String> 
insertColumnNames, final List<InsertValueContext> insertValueContexts,
                                                  final List<Object> params, 
final String generateKeyColumnName) {
         GeneratedKeyContext result = new 
GeneratedKeyContext(generateKeyColumnName, false);
-        for (ExpressionSegment each : 
findGenerateKeyExpressions(insertColumnNames, valueExpressions, 
generateKeyColumnName)) {
-            if (each instanceof ParameterMarkerExpressionSegment) {
+        for (InsertValueContext each : insertValueContexts) {
+            ExpressionSegment expression = 
each.getValueExpressions().get(findGenerateKeyIndex(insertColumnNames, 
generateKeyColumnName.toLowerCase()));
+            if (expression instanceof ParameterMarkerExpressionSegment) {
                 if (params.isEmpty()) {
                     continue;
                 }
-                if (null != params.get(((ParameterMarkerExpressionSegment) 
each).getParameterMarkerIndex())) {
-                    result.getGeneratedValues().add((Comparable<?>) 
params.get(((ParameterMarkerExpressionSegment) 
each).getParameterMarkerIndex()));
+                if (null != params.get(((ParameterMarkerExpressionSegment) 
expression).getParameterMarkerIndex())) {
+                    result.getGeneratedValues().add((Comparable<?>) 
params.get(((ParameterMarkerExpressionSegment) 
expression).getParameterMarkerIndex()));
                 }
-            } else if (each instanceof LiteralExpressionSegment) {
-                result.getGeneratedValues().add((Comparable<?>) 
((LiteralExpressionSegment) each).getLiterals());
+            } else if (expression instanceof LiteralExpressionSegment) {
+                result.getGeneratedValues().add((Comparable<?>) 
((LiteralExpressionSegment) expression).getLiterals());
             }
         }
         return result;
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/InsertStatementContext.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/InsertStatementContext.java
index 2099a80a8f2..90e3e08e55a 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/InsertStatementContext.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/InsertStatementContext.java
@@ -96,7 +96,7 @@ public final class InsertStatementContext extends 
CommonSQLStatementContext impl
         ShardingSphereSchema schema = getSchema(metaData, defaultDatabaseName);
         columnNames = containsInsertColumns() ? insertColumnNames
                 : Optional.ofNullable(sqlStatement.getTable()).map(optional -> 
schema.getVisibleColumnNames(optional.getTableName().getIdentifier().getValue())).orElseGet(Collections::emptyList);
-        generatedKeyContext = new GeneratedKeyContextEngine(sqlStatement, 
schema).createGenerateKeyContext(insertColumnNames, 
getAllValueExpressions(sqlStatement), params).orElse(null);
+        generatedKeyContext = new GeneratedKeyContextEngine(sqlStatement, 
schema).createGenerateKeyContext(insertColumnNames, insertValueContexts, 
params).orElse(null);
     }
     
     private ShardingSphereSchema getSchema(final ShardingSphereMetaData 
metaData, final String defaultDatabaseName) {
@@ -276,6 +276,6 @@ public final class InsertStatementContext extends 
CommonSQLStatementContext impl
         insertSelectContext = getInsertSelectContext(metaData, params, 
parametersOffset, defaultDatabaseName).orElse(null);
         onDuplicateKeyUpdateValueContext = 
getOnDuplicateKeyUpdateValueContext(params, parametersOffset).orElse(null);
         ShardingSphereSchema schema = getSchema(metaData, defaultDatabaseName);
-        generatedKeyContext = new GeneratedKeyContextEngine(getSqlStatement(), 
schema).createGenerateKeyContext(insertColumnNames, valueExpressions, 
params).orElse(null);
+        generatedKeyContext = new GeneratedKeyContextEngine(getSqlStatement(), 
schema).createGenerateKeyContext(insertColumnNames, insertValueContexts, 
params).orElse(null);
     }
 }
diff --git 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/insert/keygen/engine/GeneratedKeyContextEngineTest.java
 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/insert/keygen/engine/GeneratedKeyContextEngineTest.java
index 8e072bcb791..7b2c47bff73 100644
--- 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/insert/keygen/engine/GeneratedKeyContextEngineTest.java
+++ 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/insert/keygen/engine/GeneratedKeyContextEngineTest.java
@@ -18,6 +18,7 @@
 package 
org.apache.shardingsphere.infra.binder.context.segment.insert.keygen.engine;
 
 import 
org.apache.shardingsphere.infra.binder.context.segment.insert.keygen.GeneratedKeyContext;
+import 
org.apache.shardingsphere.infra.binder.context.segment.insert.values.InsertValueContext;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
@@ -124,9 +125,10 @@ class GeneratedKeyContextEngineTest {
         insertStatement.setTable(new SimpleTableSegment(new 
TableNameSegment(0, 0, new IdentifierValue("tbl"))));
         insertStatement.setInsertColumns(new InsertColumnsSegment(0, 0, 
Collections.singletonList(new ColumnSegment(0, 0, new IdentifierValue("id")))));
         List<ExpressionSegment> expressionSegments = 
Collections.singletonList(new LiteralExpressionSegment(0, 0, 1));
+        InsertValueContext insertValueContext = new 
InsertValueContext(expressionSegments, Collections.emptyList(), 0);
         insertStatement.getValues().add(new InsertValuesSegment(0, 0, 
expressionSegments));
         Optional<GeneratedKeyContext> actual = new 
GeneratedKeyContextEngine(insertStatement, schema)
-                .createGenerateKeyContext(Collections.singletonList("id"), 
Collections.singletonList(expressionSegments), Collections.singletonList(1));
+                .createGenerateKeyContext(Collections.singletonList("id"), 
Collections.singletonList(insertValueContext), Collections.singletonList(1));
         assertTrue(actual.isPresent());
         assertThat(actual.get().getGeneratedValues().size(), is(1));
     }
@@ -163,9 +165,10 @@ class GeneratedKeyContextEngineTest {
         insertStatement.getValues().add(new InsertValuesSegment(0, 0, 
Collections.singletonList(new LiteralExpressionSegment(1, 2, 100))));
         insertStatement.getValues().add(new InsertValuesSegment(0, 0, 
Collections.singletonList(new LiteralExpressionSegment(1, 2, "value"))));
         insertStatement.getValues().add(new InsertValuesSegment(0, 0, 
Collections.singletonList(new CommonExpressionSegment(1, 2, "ignored value"))));
-        List<List<ExpressionSegment>> valueExpressions = 
insertStatement.getValues().stream().map(InsertValuesSegment::getValues).collect(Collectors.toList());
+        List<InsertValueContext> insertValueContexts = 
insertStatement.getValues().stream()
+                .map(each -> new InsertValueContext(each.getValues(), 
Collections.emptyList(), 0)).collect(Collectors.toList());
         Optional<GeneratedKeyContext> actual = new 
GeneratedKeyContextEngine(insertStatement, schema)
-                .createGenerateKeyContext(Collections.singletonList("id"), 
valueExpressions, Collections.singletonList(1));
+                .createGenerateKeyContext(Collections.singletonList("id"), 
insertValueContexts, Collections.singletonList(1));
         assertTrue(actual.isPresent());
         assertThat(actual.get().getGeneratedValues().size(), is(3));
         Iterator<Comparable<?>> generatedValuesIterator = 
actual.get().getGeneratedValues().iterator();

Reply via email to