From 615cee1b94fe448126c1366d0056102d25df6f36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E6=99=93=E5=85=89?= Date: Sun, 6 May 2018 20:50:03 +0800 Subject: [PATCH] use iterator.next() instead of get() --- .../insert/InsertOptimizeEngine.java | 31 +++++++++++-------- .../optimizer/InsertOptimizeEngineTest.java | 8 ++--- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/sharding-core/src/main/java/io/shardingjdbc/core/optimizer/insert/InsertOptimizeEngine.java b/sharding-core/src/main/java/io/shardingjdbc/core/optimizer/insert/InsertOptimizeEngine.java index 62e49ce91b..f5972ebb65 100644 --- a/sharding-core/src/main/java/io/shardingjdbc/core/optimizer/insert/InsertOptimizeEngine.java +++ b/sharding-core/src/main/java/io/shardingjdbc/core/optimizer/insert/InsertOptimizeEngine.java @@ -34,6 +34,7 @@ import lombok.RequiredArgsConstructor; import java.util.ArrayList; import java.util.Collection; +import java.util.Iterator; import java.util.LinkedList; import java.util.List; @@ -59,6 +60,7 @@ public final class InsertOptimizeEngine implements OptimizeEngine { List andConditions = insertStatement.getConditions().getOrCondition().getAndConditions(); List insertValues = insertStatement.getInsertValues().getInsertValues(); List result = new ArrayList<>(andConditions.size()); + Iterator generatedKeys = null; int count = 0; for (AndCondition each : andConditions) { InsertValue insertValue = insertValues.get(count); @@ -67,28 +69,36 @@ public final class InsertOptimizeEngine implements OptimizeEngine { String logicTableName = insertStatement.getTables().getSingleTableName(); Optional generateKeyColumn = shardingRule.getGenerateKeyColumn(logicTableName); - String expression; + InsertShardingCondition insertShardingCondition; if (-1 != insertStatement.getGenerateKeyColumnIndex() || !generateKeyColumn.isPresent()) { - expression = insertValue.getExpression(); + insertShardingCondition = new InsertShardingCondition(insertValue.getExpression(), currentParameters); } else { + if (null == generatedKeys) { + generatedKeys = generatedKey.getGeneratedKeys().iterator(); + } + String expression; + Number currentGeneratedKey = generatedKeys.next(); if (0 == parameters.size()) { - expression = insertValue.getExpression().substring(0, insertValue.getExpression().length() - 1) + ", " + generatedKey.getGeneratedKeys().get(count).toString() + ")"; + expression = insertValue.getExpression().substring(0, insertValue.getExpression().length() - 1) + ", " + currentGeneratedKey.toString() + ")"; } else { expression = insertValue.getExpression().substring(0, insertValue.getExpression().length() - 1) + ", ?)"; - currentParameters.add(generatedKey.getGeneratedKeys().get(count)); + currentParameters.add(currentGeneratedKey); } + insertShardingCondition = new InsertShardingCondition(expression, currentParameters); + insertShardingCondition.getShardingValues().add(getShardingCondition(generateKeyColumn.get(), currentGeneratedKey)); } - InsertShardingCondition insertShardingCondition = new InsertShardingCondition(expression, currentParameters); insertShardingCondition.getShardingValues().addAll(getShardingCondition(each)); - if (-1 == insertStatement.getGenerateKeyColumnIndex() && generateKeyColumn.isPresent()) { - insertShardingCondition.getShardingValues().add(getShardingCondition(generateKeyColumn.get(), generatedKey.getGeneratedKeys().get(count))); - } result.add(insertShardingCondition); count++; } return new ShardingConditions(result); } + private ListShardingValue getShardingCondition(final Column column, final Number value) { + return new ListShardingValue<>(column.getTableName(), column.getName(), + new GeneratedKeyCondition(column, -1, value).getConditionValues(parameters)); + } + private Collection getShardingCondition(final AndCondition andCondition) { Collection result = new LinkedList<>(); for (Condition each : andCondition.getConditions()) { @@ -96,9 +106,4 @@ public final class InsertOptimizeEngine implements OptimizeEngine { } return result; } - - private ListShardingValue getShardingCondition(final Column column, final Number value) { - return new ListShardingValue<>(column.getTableName(), column.getName(), - new GeneratedKeyCondition(column, -1, value).getConditionValues(parameters)); - } } diff --git a/sharding-core/src/test/java/io/shardingjdbc/core/optimizer/InsertOptimizeEngineTest.java b/sharding-core/src/test/java/io/shardingjdbc/core/optimizer/InsertOptimizeEngineTest.java index bd32520bc3..9efd693a8d 100644 --- a/sharding-core/src/test/java/io/shardingjdbc/core/optimizer/InsertOptimizeEngineTest.java +++ b/sharding-core/src/test/java/io/shardingjdbc/core/optimizer/InsertOptimizeEngineTest.java @@ -104,10 +104,10 @@ public final class InsertOptimizeEngineTest { assertThat(((InsertShardingCondition) actual.getShardingConditions().get(1)).getInsertValueExpression(), is("(?, ?, ?)")); assertThat(actual.getShardingConditions().get(0).getShardingValues().size(), is(2)); assertThat(actual.getShardingConditions().get(1).getShardingValues().size(), is(2)); - assertShardingValue((ListShardingValue) actual.getShardingConditions().get(0).getShardingValues().get(0), 10); - assertShardingValue((ListShardingValue) actual.getShardingConditions().get(0).getShardingValues().get(1), 1); - assertShardingValue((ListShardingValue) actual.getShardingConditions().get(1).getShardingValues().get(0), 11); - assertShardingValue((ListShardingValue) actual.getShardingConditions().get(1).getShardingValues().get(1), 2); + assertShardingValue((ListShardingValue) actual.getShardingConditions().get(0).getShardingValues().get(0), 1); + assertShardingValue((ListShardingValue) actual.getShardingConditions().get(0).getShardingValues().get(1), 10); + assertShardingValue((ListShardingValue) actual.getShardingConditions().get(1).getShardingValues().get(0), 2); + assertShardingValue((ListShardingValue) actual.getShardingConditions().get(1).getShardingValues().get(1), 11); } @Test -- GitLab