From 084273f0260c53e52f5e318f1de5686128320367 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Thu, 5 Sep 2019 15:12:28 +0200 Subject: [PATCH] #161 - Polishing. Properly convert null arrays to the corresponding, driver-supported array type. --- .../core/DefaultReactiveDataAccessStrategy.java | 15 ++++++++++++--- .../data/r2dbc/core/PostgresIntegrationTests.java | 3 +++ .../PostgresReactiveDataAccessStrategyTests.java | 13 +++++++++++-- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/springframework/data/r2dbc/core/DefaultReactiveDataAccessStrategy.java b/src/main/java/org/springframework/data/r2dbc/core/DefaultReactiveDataAccessStrategy.java index 1599b26..0c5cee7 100644 --- a/src/main/java/org/springframework/data/r2dbc/core/DefaultReactiveDataAccessStrategy.java +++ b/src/main/java/org/springframework/data/r2dbc/core/DefaultReactiveDataAccessStrategy.java @@ -37,9 +37,9 @@ import org.springframework.data.r2dbc.mapping.OutboundRow; import org.springframework.data.r2dbc.mapping.R2dbcMappingContext; import org.springframework.data.r2dbc.mapping.SettableValue; import org.springframework.data.r2dbc.query.UpdateMapper; +import org.springframework.data.r2dbc.support.ArrayUtils; import org.springframework.data.relational.core.dialect.ArrayColumns; import org.springframework.data.relational.core.dialect.RenderContextFactory; -import org.springframework.data.relational.core.mapping.RelationalMappingContext; import org.springframework.data.relational.core.mapping.RelationalPersistentEntity; import org.springframework.data.relational.core.mapping.RelationalPersistentProperty; import org.springframework.lang.Nullable; @@ -213,7 +213,7 @@ public class DefaultReactiveDataAccessStrategy implements ReactiveDataAccessStra } private boolean shouldConvertArrayValue(RelationalPersistentProperty property, SettableValue value) { - return value != null && value.hasValue() && property.isCollectionLike(); + return property.isCollectionLike(); } private SettableValue getArrayValue(SettableValue value, RelationalPersistentProperty property) { @@ -225,9 +225,18 @@ public class DefaultReactiveDataAccessStrategy implements ReactiveDataAccessStra throw new InvalidDataAccessResourceUsageException( "Dialect " + this.dialect.getClass().getName() + " does not support array columns"); } + Class actualType = property.getActualType(); + + if (value.isEmpty()) { + + Class targetType = arrayColumns.getArrayType(actualType); + int depth = actualType.isArray() ? ArrayUtils.getDimensionDepth(actualType) : 1; + Class targetArrayType = ArrayUtils.getArrayClass(targetType, depth); + return SettableValue.empty(targetArrayType); + } return SettableValue.fromOrEmpty(this.converter.getArrayValue(arrayColumns, property, value.getValue()), - property.getActualType()); + actualType); } /* diff --git a/src/test/java/org/springframework/data/r2dbc/core/PostgresIntegrationTests.java b/src/test/java/org/springframework/data/r2dbc/core/PostgresIntegrationTests.java index f2febdc..ff2056b 100644 --- a/src/test/java/org/springframework/data/r2dbc/core/PostgresIntegrationTests.java +++ b/src/test/java/org/springframework/data/r2dbc/core/PostgresIntegrationTests.java @@ -115,6 +115,9 @@ public class PostgresIntegrationTests extends R2dbcIntegrationTestSupport { assertThat(actual.multidimensionalArray[0]).containsExactly(1, 2, 3); assertThat(actual.multidimensionalArray[1]).containsExactly(4, 5, 6); }); + + client.update().table(EntityWithArrays.class).using(withArrays).then() // + .as(StepVerifier::create).verifyComplete(); } private void insert(EntityWithArrays object) { diff --git a/src/test/java/org/springframework/data/r2dbc/core/PostgresReactiveDataAccessStrategyTests.java b/src/test/java/org/springframework/data/r2dbc/core/PostgresReactiveDataAccessStrategyTests.java index 969e695..182f8b9 100644 --- a/src/test/java/org/springframework/data/r2dbc/core/PostgresReactiveDataAccessStrategyTests.java +++ b/src/test/java/org/springframework/data/r2dbc/core/PostgresReactiveDataAccessStrategyTests.java @@ -41,7 +41,7 @@ public class PostgresReactiveDataAccessStrategyTests extends ReactiveDataAccessS return strategy; } - @Test + @Test // gh-161 public void shouldConvertPrimitiveMultidimensionArrayToWrapper() { OutboundRow row = strategy.getOutboundRow(new WithMultidimensionalArray(new int[][] { { 1, 2, 3 }, { 4, 5 } })); @@ -50,7 +50,16 @@ public class PostgresReactiveDataAccessStrategyTests extends ReactiveDataAccessS assertThat(row.get("myarray").getValue()).isInstanceOf(Integer[][].class); } - @Test + @Test // gh-161 + public void shouldConvertNullArrayToDriverArrayType() { + + OutboundRow row = strategy.getOutboundRow(new WithMultidimensionalArray(null)); + + assertThat(row.get("myarray").hasValue()).isFalse(); + assertThat(row.get("myarray").getType()).isEqualTo(Integer[].class); + } + + @Test // gh-161 public void shouldConvertCollectionToArray() { OutboundRow row = strategy.getOutboundRow(new WithIntegerCollection(Arrays.asList(1, 2, 3)));