Skip to content

Commit ba48d4d

Browse files
authored
fix: update libraries-bom to 26.60.0 and add support for Interval and UUID (#3769)
1 parent d7c6542 commit ba48d4d

File tree

7 files changed

+90
-3
lines changed

7 files changed

+90
-3
lines changed

spring-cloud-gcp-data-spanner/src/main/java/com/google/cloud/spring/data/spanner/core/convert/ConverterAwareMappingSpannerEntityWriter.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.google.cloud.ByteArray;
2020
import com.google.cloud.Date;
2121
import com.google.cloud.Timestamp;
22+
import com.google.cloud.spanner.Interval;
2223
import com.google.cloud.spanner.Key;
2324
import com.google.cloud.spanner.Mutation.WriteBuilder;
2425
import com.google.cloud.spanner.Struct;
@@ -38,6 +39,7 @@
3839
import java.util.List;
3940
import java.util.Map;
4041
import java.util.Set;
42+
import java.util.UUID;
4143
import java.util.function.BiConsumer;
4244
import java.util.function.BiFunction;
4345
import java.util.function.Predicate;
@@ -65,7 +67,8 @@ public class ConverterAwareMappingSpannerEntityWriter implements SpannerEntityWr
6567
ByteArray.class,
6668
Timestamp.class,
6769
com.google.cloud.Date.class,
68-
BigDecimal.class)));
70+
BigDecimal.class,
71+
UUID.class)));
6972

7073
/** A map of types to functions that binds them to `ValueBinder` objects. */
7174
public static final Map<Class<?>, BiFunction<ValueBinder, ?, ?>>
@@ -86,6 +89,8 @@ private static Map<Class<?>, BiConsumer<ValueBinder<?>, Iterable>> createIterabl
8689
map.put(Date.class, ValueBinder::toDateArray);
8790
map.put(ByteArray.class, ValueBinder::toBytesArray);
8891
map.put(String.class, ValueBinder::toStringArray);
92+
map.put(Interval.class, ValueBinder::toIntervalArray);
93+
map.put(UUID.class, ValueBinder::toUuidArray);
8994

9095
return Collections.unmodifiableMap(map);
9196
}
@@ -110,7 +115,8 @@ private static Map<Class<?>, BiConsumer<ValueBinder<?>, Iterable>> createIterabl
110115
map.put(boolean[].class, (BiFunction<ValueBinder, boolean[], ?>) ValueBinder::toBoolArray);
111116
map.put(long[].class, (BiFunction<ValueBinder, long[], ?>) ValueBinder::toInt64Array);
112117
map.put(Struct.class, (BiFunction<ValueBinder, Struct, ?>) ValueBinder::to);
113-
118+
map.put(Interval.class, (BiFunction<ValueBinder, Interval, ?>) ValueBinder::to);
119+
map.put(UUID.class, (BiFunction<ValueBinder, UUID, ?>) ValueBinder::to);
114120
singleItemTypeValueBinderMethodMap = Collections.unmodifiableMap(map);
115121
}
116122

spring-cloud-gcp-data-spanner/src/main/java/com/google/cloud/spring/data/spanner/core/convert/SpannerTypeMapper.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import com.google.cloud.ByteArray;
2020
import com.google.cloud.Timestamp;
21+
import com.google.cloud.spanner.Interval;
2122
import com.google.cloud.spanner.Struct;
2223
import com.google.cloud.spanner.Type;
2324
import com.google.cloud.spanner.Type.Code;
@@ -26,6 +27,7 @@
2627
import java.util.Collections;
2728
import java.util.HashMap;
2829
import java.util.Map;
30+
import java.util.UUID;
2931

3032
/**
3133
* A utility class to map between common Java types and types to use with Spanner.
@@ -52,6 +54,8 @@ private SpannerTypeMapper() {}
5254
.put(Type.Code.STRING, String.class)
5355
.put(Type.Code.STRUCT, Struct.class)
5456
.put(Type.Code.TIMESTAMP, Timestamp.class)
57+
.put(Type.Code.INTERVAL, Interval.class)
58+
.put(Type.Code.UUID, UUID.class)
5559
.build();
5660

5761
private static final Map<Type.Code, Class> SPANNER_ARRAY_COLUMN_CODES_TO_JAVA_TYPE_MAPPING =
@@ -66,6 +70,8 @@ private SpannerTypeMapper() {}
6670
.put(Type.Code.STRING, String[].class)
6771
.put(Type.Code.STRUCT, Struct[].class)
6872
.put(Type.Code.TIMESTAMP, Timestamp[].class)
73+
.put(Type.Code.INTERVAL, Interval[].class)
74+
.put(Code.UUID, UUID[].class)
6975
.build();
7076

7177
static {

spring-cloud-gcp-data-spanner/src/main/java/com/google/cloud/spring/data/spanner/core/convert/StructAccessor.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import com.google.cloud.Date;
2121
import com.google.cloud.Timestamp;
2222
import com.google.cloud.spanner.AbstractStructReader;
23+
import com.google.cloud.spanner.Interval;
2324
import com.google.cloud.spanner.Struct;
2425
import com.google.cloud.spanner.Type;
2526
import com.google.cloud.spanner.Type.Code;
@@ -32,6 +33,7 @@
3233
import java.util.List;
3334
import java.util.Map;
3435
import java.util.Set;
36+
import java.util.UUID;
3537
import java.util.function.BiFunction;
3638

3739
/**
@@ -55,6 +57,8 @@ public class StructAccessor {
5557
.put(ByteArray.class, AbstractStructReader::getBytesList)
5658
.put(BigDecimal.class, AbstractStructReader::getBigDecimalList)
5759
.put(Struct.class, AbstractStructReader::getStructList)
60+
.put(Interval.class, AbstractStructReader::getIntervalList)
61+
.put(UUID.class, AbstractStructReader::getUuidList)
5862
.build();
5963

6064
static final Map<Class, BiFunction<Struct, String, ?>> singleItemReadMethodMapping =
@@ -75,6 +79,8 @@ public class StructAccessor {
7579
.put(float[].class, AbstractStructReader::getFloatArray)
7680
.put(long[].class, AbstractStructReader::getLongArray)
7781
.put(boolean[].class, AbstractStructReader::getBooleanArray)
82+
.put(Interval.class, AbstractStructReader::getInterval)
83+
.put(UUID.class, AbstractStructReader::getUuid)
7884
// Note that Struct.class appears in this map. While we support
7985
// converting structs into POJO fields of POJOs, the value in this map is for
8086
// the case where the field within the POJO is Struct.
@@ -99,6 +105,8 @@ public class StructAccessor {
99105
.put(float[].class, AbstractStructReader::getFloatArray)
100106
.put(long[].class, AbstractStructReader::getLongArray)
101107
.put(boolean[].class, AbstractStructReader::getBooleanArray)
108+
.put(Interval.class, AbstractStructReader::getInterval)
109+
.put(UUID.class, AbstractStructReader::getUuid)
102110
// Note that Struct.class appears in this map. While we support
103111
// converting structs into POJO fields of POJOs, the value in this map
104112
// is for

spring-cloud-gcp-data-spanner/src/test/java/com/google/cloud/spring/data/spanner/core/convert/ConverterAwareMappingSpannerEntityProcessorTests.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import com.google.cloud.ByteArray;
2626
import com.google.cloud.Date;
2727
import com.google.cloud.Timestamp;
28+
import com.google.cloud.spanner.Interval;
2829
import com.google.cloud.spanner.ResultSet;
2930
import com.google.cloud.spanner.Struct;
3031
import com.google.cloud.spanner.Value;
@@ -39,6 +40,7 @@
3940
import java.util.Arrays;
4041
import java.util.Collections;
4142
import java.util.List;
43+
import java.util.UUID;
4244
import org.assertj.core.data.Offset;
4345
import org.junit.jupiter.api.BeforeEach;
4446
import org.junit.jupiter.api.Test;
@@ -194,6 +196,8 @@ void mapToListTest() {
194196
Timestamp.ofTimeSecondsAndNanos(111, 0),
195197
Timestamp.ofTimeSecondsAndNanos(222, 0),
196198
Timestamp.ofTimeSecondsAndNanos(333, 0));
199+
List<Interval> intervals = Collections.singletonList(Interval.ofSeconds(1L));
200+
List<UUID> uuids = Collections.singletonList(UUID.fromString("ffffffff-ffff-ffff-ffff-ffffffffffff"));
197201

198202
Struct struct1 =
199203
Struct.newBuilder()
@@ -253,6 +257,14 @@ void mapToListTest() {
253257
.to(Value.numeric(BigDecimal.TEN))
254258
.set("bigDecimals")
255259
.to(Value.numericArray(Arrays.asList(BigDecimal.ONE, BigDecimal.ZERO)))
260+
.set("intervalField")
261+
.to(Interval.ofSeconds(100L))
262+
.set("intervalList")
263+
.to(Value.intervalArray(intervals))
264+
.set("uuidField")
265+
.to(Value.uuid(UUID.fromString("a1b2c3d4-e5f6-7890-1234-567890abcdef")))
266+
.set("uuidList")
267+
.to(Value.uuidArray(uuids))
256268
.build();
257269

258270
Struct struct2 =
@@ -315,6 +327,14 @@ void mapToListTest() {
315327
.to(
316328
Value.numericArray(
317329
Arrays.asList(new BigDecimal("-0.999"), new BigDecimal("10.9001"))))
330+
.set("intervalField")
331+
.to(Value.interval(Interval.ofSeconds(200L)))
332+
.set("intervalList")
333+
.to(Value.intervalArray(intervals))
334+
.set("uuidField")
335+
.to(Value.uuid(UUID.fromString("123e4567-e89b-12d3-a456-426614174000")))
336+
.set("uuidList")
337+
.to(Value.uuidArray(uuids))
318338
.build();
319339

320340
MockResults mockResults = new MockResults();
@@ -354,6 +374,11 @@ void mapToListTest() {
354374
assertThat(t1.floatField).isEqualTo(3.33F, DELTA_FLOAT);
355375
assertThat(t1.floatArray).hasSize(3);
356376
assertThat(t1.bigDecimals).containsExactly(BigDecimal.ONE, BigDecimal.ZERO);
377+
assertThat(t1.intervalField).isEqualTo(Interval.ofSeconds(100L));
378+
assertThat(t1.intervalList).containsExactly(Interval.ofSeconds(1L));
379+
assertThat(t1.uuidField).isEqualTo(UUID.fromString("a1b2c3d4-e5f6-7890-1234-567890abcdef"));
380+
assertThat(t1.uuidList).containsExactly(UUID.fromString("ffffffff-ffff-ffff-ffff-ffffffffffff"));
381+
357382

358383
assertThat(t2)
359384
.hasFieldOrPropertyWithValue("id", "key12")
@@ -381,6 +406,10 @@ void mapToListTest() {
381406
assertThat(t2.stringList).containsExactly("string");
382407
assertThat(t2.bigDecimalField).isEqualTo(new BigDecimal("0.0001"));
383408
assertThat(t2.bigDecimals).containsExactly(new BigDecimal("-0.999"), new BigDecimal("10.9001"));
409+
assertThat(t2.intervalField).isEqualTo(Interval.ofSeconds(200L));
410+
assertThat(t2.intervalList).containsExactly(Interval.ofSeconds(1L));
411+
assertThat(t2.uuidField).isEqualTo(UUID.fromString("123e4567-e89b-12d3-a456-426614174000"));
412+
assertThat(t2.uuidList).containsExactly(UUID.fromString("ffffffff-ffff-ffff-ffff-ffffffffffff"));
384413
}
385414

386415
@Test

spring-cloud-gcp-data-spanner/src/test/java/com/google/cloud/spring/data/spanner/core/convert/ConverterAwareMappingSpannerEntityWriterTests.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import com.google.cloud.ByteArray;
3636
import com.google.cloud.Date;
3737
import com.google.cloud.Timestamp;
38+
import com.google.cloud.spanner.Interval;
3839
import com.google.cloud.spanner.Key;
3940
import com.google.cloud.spanner.Mutation;
4041
import com.google.cloud.spanner.Mutation.WriteBuilder;
@@ -61,6 +62,7 @@
6162
import java.util.List;
6263
import java.util.Map;
6364
import java.util.Objects;
65+
import java.util.UUID;
6466
import java.util.stream.Collectors;
6567
import org.junit.jupiter.api.BeforeEach;
6668
import org.junit.jupiter.api.Test;
@@ -116,6 +118,12 @@ void writeTest() {
116118
t.timestampList.add(t.timestampField);
117119
t.bytesList = new ArrayList<>();
118120
t.bytesList.add(t.bytes);
121+
t.intervalField = Interval.ofSeconds(100L);
122+
t.intervalList = new ArrayList<>();
123+
t.intervalList.add(t.intervalField);
124+
t.uuidField = UUID.fromString("123e4567-e89b-12d3-a456-426614174000");
125+
t.uuidList = new ArrayList<>();
126+
t.uuidList.add(t.uuidField);
119127

120128
// this property will be ignored in write mapping because it is a child relationship. no
121129
// exception will result even though it is an unsupported type for writing.
@@ -260,6 +268,22 @@ void writeTest() {
260268
when(bigDecimalsBinder.toNumericArray(any())).thenReturn(null);
261269
when(writeBuilder.set("bigDecimals")).thenReturn(bigDecimalsBinder);
262270

271+
ValueBinder<WriteBuilder> intervalFieldBinder = mock(ValueBinder.class);
272+
when(intervalFieldBinder.to((Interval) any())).thenReturn(null);
273+
when(writeBuilder.set("intervalField")).thenReturn(intervalFieldBinder);
274+
275+
ValueBinder<WriteBuilder> intervalListFieldBinder = mock(ValueBinder.class);
276+
when(intervalListFieldBinder.toIntervalArray(any())).thenReturn(null);
277+
when(writeBuilder.set("intervalList")).thenReturn(intervalListFieldBinder);
278+
279+
ValueBinder<WriteBuilder> uuidFieldBinder = mock(ValueBinder.class);
280+
when(uuidFieldBinder.to((UUID) any())).thenReturn(null);
281+
when(writeBuilder.set("uuidField")).thenReturn(uuidFieldBinder);
282+
283+
ValueBinder<WriteBuilder> uuidListFieldBinder = mock(ValueBinder.class);
284+
when(uuidListFieldBinder.toUuidArray(any())).thenReturn(null);
285+
when(writeBuilder.set("uuidList")).thenReturn(uuidListFieldBinder);
286+
263287
this.spannerEntityWriter.write(t, writeBuilder::set);
264288

265289
verify(idBinder, times(1)).to(t.id);
@@ -293,6 +317,10 @@ void writeTest() {
293317

294318
verify(bigDecimalFieldBinder, times(1)).to(t.bigDecimalField);
295319
verify(bigDecimalsBinder, times(1)).toNumericArray(t.bigDecimals);
320+
verify(intervalFieldBinder, times(1)).to(t.intervalField);
321+
verify(intervalListFieldBinder, times(1)).toIntervalArray(t.intervalList);
322+
verify(uuidFieldBinder, times(1)).to(t.uuidField);
323+
verify(uuidListFieldBinder, times(1)).toUuidArray(t.uuidList);
296324
}
297325

298326
@Test

spring-cloud-gcp-data-spanner/src/test/java/com/google/cloud/spring/data/spanner/core/convert/TestEntities.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.google.cloud.ByteArray;
2020
import com.google.cloud.Date;
2121
import com.google.cloud.Timestamp;
22+
import com.google.cloud.spanner.Interval;
2223
import com.google.cloud.spanner.Struct;
2324
import com.google.cloud.spring.data.spanner.core.mapping.Column;
2425
import com.google.cloud.spring.data.spanner.core.mapping.Embedded;
@@ -29,6 +30,7 @@
2930
import java.math.BigDecimal;
3031
import java.time.Instant;
3132
import java.util.List;
33+
import java.util.UUID;
3234

3335
/** Test entities for Spanner tests that hit many features and situations. */
3436
class TestEntities {
@@ -109,6 +111,14 @@ enum Color {
109111
BigDecimal bigDecimalField;
110112

111113
List<BigDecimal> bigDecimals;
114+
115+
Interval intervalField;
116+
117+
List<Interval> intervalList;
118+
119+
UUID uuidField;
120+
121+
List<UUID> uuidList;
112122
}
113123

114124
/** A test entity that acts as a child of another entity. */

spring-cloud-gcp-dependencies/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
</distributionManagement>
3535

3636
<properties>
37-
<gcp-libraries-bom.version>26.57.0</gcp-libraries-bom.version>
37+
<gcp-libraries-bom.version>26.60.0</gcp-libraries-bom.version>
3838
<cloud-sql-socket-factory.version>1.25.0</cloud-sql-socket-factory.version>
3939
<r2dbc-postgres-driver.version>1.0.7.RELEASE</r2dbc-postgres-driver.version>
4040
<cloud-spanner-r2dbc.version>1.3.0</cloud-spanner-r2dbc.version>

0 commit comments

Comments
 (0)