This is an automated email from the ASF dual-hosted git repository.

tuichenchuxin 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 000380dfb70 Optimize StandardParameterBuilder logic (#29545)
000380dfb70 is described below

commit 000380dfb70a5be13ef4172c334831672158f816
Author: ZhangCheng <[email protected]>
AuthorDate: Tue Dec 26 14:11:59 2023 +0800

    Optimize StandardParameterBuilder logic (#29545)
---
 .../builder/impl/StandardParameterBuilder.java     | 44 ++++++++++++++--------
 1 file changed, 28 insertions(+), 16 deletions(-)

diff --git 
a/infra/rewrite/src/main/java/org/apache/shardingsphere/infra/rewrite/parameter/builder/impl/StandardParameterBuilder.java
 
b/infra/rewrite/src/main/java/org/apache/shardingsphere/infra/rewrite/parameter/builder/impl/StandardParameterBuilder.java
index 336fb46248c..2c1d5fbf113 100644
--- 
a/infra/rewrite/src/main/java/org/apache/shardingsphere/infra/rewrite/parameter/builder/impl/StandardParameterBuilder.java
+++ 
b/infra/rewrite/src/main/java/org/apache/shardingsphere/infra/rewrite/parameter/builder/impl/StandardParameterBuilder.java
@@ -23,12 +23,11 @@ import 
org.apache.shardingsphere.infra.rewrite.parameter.builder.ParameterBuilde
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.LinkedHashMap;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.TreeMap;
 
 /**
  * Standard parameter builder.
@@ -39,23 +38,29 @@ public final class StandardParameterBuilder implements 
ParameterBuilder {
     private final List<Object> originalParameters;
     
     @Getter
-    private final Map<Integer, Collection<Object>> addedIndexAndParameters = 
new TreeMap<>();
+    private final Map<Integer, Collection<Object>> addedIndexAndParameters = 
new HashMap<>();
     
     private final Map<Integer, Object> replacedIndexAndParameters = new 
LinkedHashMap<>();
     
+    private int addedParameterCount;
+    
+    private int maxAddedParameterIndex;
+    
     /**
      * Add added parameters.
-     * 
+     *
      * @param index parameters index to be added
      * @param params parameters to be added
      */
     public void addAddedParameters(final int index, final Collection<Object> 
params) {
+        addedParameterCount += params.size();
+        maxAddedParameterIndex = Math.max(maxAddedParameterIndex, index);
         addedIndexAndParameters.put(index, params);
     }
     
     /**
      * Add replaced parameter.
-     * 
+     *
      * @param index parameter index to be replaced
      * @param param parameter to be replaced
      */
@@ -65,28 +70,35 @@ public final class StandardParameterBuilder implements 
ParameterBuilder {
     
     @Override
     public List<Object> getParameters() {
-        List<Object> replacedParams = new ArrayList<>(originalParameters);
-        for (Entry<Integer, Object> entry : 
replacedIndexAndParameters.entrySet()) {
-            replacedParams.set(entry.getKey(), entry.getValue());
+        if (addedIndexAndParameters.isEmpty() && 
replacedIndexAndParameters.isEmpty()) {
+            return new ArrayList<>(originalParameters);
         }
+        List<Object> replacedParams = getReplacedParameters();
         int maxParamIndex = getMaxParameterIndex();
-        List<Object> result = new LinkedList<>();
+        List<Object> result = new ArrayList<>(replacedParams.size() + 
addedParameterCount);
         for (int index = 0; index <= maxParamIndex; index++) {
-            List<Object> currentIndexParams = new LinkedList<>();
             if (replacedParams.size() > index) {
-                currentIndexParams.add(replacedParams.get(index));
+                result.add(replacedParams.get(index));
             }
             if (addedIndexAndParameters.containsKey(index)) {
-                currentIndexParams.addAll(addedIndexAndParameters.get(index));
+                result.addAll(addedIndexAndParameters.get(index));
             }
-            result.addAll(currentIndexParams);
+        }
+        return result;
+    }
+    
+    private List<Object> getReplacedParameters() {
+        if (replacedIndexAndParameters.isEmpty()) {
+            return originalParameters;
+        }
+        List<Object> result = new ArrayList<>(originalParameters);
+        for (Entry<Integer, Object> entry : 
replacedIndexAndParameters.entrySet()) {
+            result.set(entry.getKey(), entry.getValue());
         }
         return result;
     }
     
     private int getMaxParameterIndex() {
-        return addedIndexAndParameters.isEmpty()
-                ? originalParameters.size() - 1
-                : Math.max(originalParameters.size() - 1, ((TreeMap<Integer, 
Collection<Object>>) addedIndexAndParameters).descendingMap().firstKey());
+        return addedIndexAndParameters.isEmpty() ? originalParameters.size() - 
1 : Math.max(originalParameters.size() - 1, maxAddedParameterIndex);
     }
 }

Reply via email to