Skip to content

Commit 196da88

Browse files
feature: adds OffsetDateTime converters for Hashes (#195)
* OffsetDateTime converters for Hashes * Adding Test Cases - OffsetDateTime converters for Hashes --------- Co-authored-by: khushwinder <[email protected]>
1 parent be2e10c commit 196da88

File tree

6 files changed

+91
-4
lines changed

6 files changed

+91
-4
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.redis.om.spring.convert;
2+
3+
import org.springframework.core.convert.converter.Converter;
4+
import org.springframework.data.convert.ReadingConverter;
5+
6+
import java.nio.charset.StandardCharsets;
7+
import java.time.Instant;
8+
import java.time.OffsetDateTime;
9+
import java.time.ZoneId;
10+
11+
@ReadingConverter
12+
public class BytesToOffsetDateTimeConverter implements Converter<byte[], OffsetDateTime> {
13+
14+
@Override
15+
public OffsetDateTime convert(byte[] source) {
16+
return OffsetDateTime.ofInstant(Instant.ofEpochMilli(Long.parseLong(toString(source))), ZoneId.systemDefault());
17+
}
18+
String toString(byte[] source) {
19+
return new String(source, StandardCharsets.UTF_8);
20+
}
21+
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.redis.om.spring.convert;
2+
3+
import org.springframework.core.convert.converter.Converter;
4+
import org.springframework.data.convert.WritingConverter;
5+
import org.springframework.stereotype.Component;
6+
7+
import java.nio.charset.StandardCharsets;
8+
import java.time.Instant;
9+
import java.time.OffsetDateTime;
10+
import java.time.ZoneId;
11+
12+
@Component
13+
@WritingConverter
14+
public class OffsetDateTimeToBytesConverter implements Converter<OffsetDateTime, byte[]> {
15+
byte[] fromString(String source) {
16+
return source.getBytes(StandardCharsets.UTF_8);
17+
}
18+
19+
@Override
20+
public byte[] convert(OffsetDateTime source) {
21+
Instant instant = source.atZoneSameInstant(ZoneId.systemDefault()).toInstant();
22+
long timeInMillis = instant.toEpochMilli();
23+
24+
return fromString(Long.toString(timeInMillis));
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.redis.om.spring.convert;
2+
3+
import org.springframework.core.convert.converter.Converter;
4+
import org.springframework.data.convert.WritingConverter;
5+
import org.springframework.stereotype.Component;
6+
7+
import java.time.Instant;
8+
import java.time.OffsetDateTime;
9+
import java.time.ZoneId;
10+
11+
@Component
12+
@WritingConverter
13+
public class OffsetDateTimeToStringConverter implements Converter<OffsetDateTime, String> {
14+
@Override
15+
public String convert(OffsetDateTime source) {
16+
Instant instant = source.atZoneSameInstant(ZoneId.systemDefault()).toInstant();
17+
long unixTime = instant.getEpochSecond();
18+
return Long.toString(unixTime);
19+
}
20+
}

redis-om-spring/src/main/java/com/redis/om/spring/convert/RedisOMCustomConversions.java

+4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ public class RedisOMCustomConversions extends RedisCustomConversions {
2020
omConverters.add(new LocalDateToBytesConverter());
2121
omConverters.add(new BytesToLocalDateConverter());
2222
omConverters.add(new LocalDateToStringConverter());
23+
// OffsetDateTime
24+
omConverters.add(new OffsetDateTimeToBytesConverter());
25+
omConverters.add(new BytesToOffsetDateTimeConverter());
26+
omConverters.add(new OffsetDateTimeToStringConverter());
2327
// LocalDateTime
2428
omConverters.add(new LocalDateTimeToBytesConverter());
2529
omConverters.add(new BytesToLocalDateTimeConverter());

redis-om-spring/src/test/java/com/redis/om/spring/annotations/hash/fixtures/KitchenSink.java

+4
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import java.time.LocalDate;
1111
import java.time.LocalDateTime;
12+
import java.time.OffsetDateTime;
1213
import java.util.Date;
1314
import java.util.List;
1415
import java.util.Set;
@@ -33,6 +34,9 @@ public class KitchenSink {
3334
private LocalDateTime localDateTime;
3435
@NonNull
3536
@Indexed
37+
private OffsetDateTime localOffsetDateTime;
38+
@NonNull
39+
@Indexed
3640
private Date date;
3741
@NonNull
3842
@Indexed

redis-om-spring/src/test/java/com/redis/om/spring/annotations/hash/serialization/SerializationTest.java

+15-4
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,7 @@
1111
import org.springframework.data.geo.Point;
1212
import org.springframework.data.redis.core.StringRedisTemplate;
1313

14-
import java.time.Instant;
15-
import java.time.LocalDate;
16-
import java.time.LocalDateTime;
17-
import java.time.ZoneId;
14+
import java.time.*;
1815
import java.time.temporal.ChronoUnit;
1916
import java.util.*;
2017

@@ -35,6 +32,7 @@
3532

3633
private LocalDate localDate;
3734
private LocalDateTime localDateTime;
35+
private OffsetDateTime localOffsetDateTime;
3836
private Date date;
3937
private Point point;
4038
private Ulid ulid;
@@ -50,6 +48,7 @@ public void cleanUp() {
5048

5149
localDate = LocalDate.now();
5250
localDateTime = LocalDateTime.now();
51+
localOffsetDateTime = OffsetDateTime.now();
5352
date = new Date();
5453
point = new Point(-111.83592170193586,33.62826024782707);
5554
ulid = UlidCreator.getMonotonicUlid();
@@ -67,6 +66,7 @@ public void cleanUp() {
6766
ks = KitchenSink.builder() //
6867
.localDate(localDate) //
6968
.localDateTime(localDateTime) //
69+
.localOffsetDateTime(localOffsetDateTime) //
7070
.date(date) //
7171
.point(point) //
7272
.ulid(ulid) //
@@ -77,6 +77,7 @@ public void cleanUp() {
7777
ks1 = KitchenSink.builder() //
7878
.localDate(localDate) //
7979
.localDateTime(localDateTime) //
80+
.localOffsetDateTime(localOffsetDateTime) //
8081
.date(date) //
8182
.point(point) //
8283
.ulid(ulid) //
@@ -87,6 +88,7 @@ public void cleanUp() {
8788
ks2 = KitchenSink.builder() //
8889
.localDate(localDate) //
8990
.localDateTime(localDateTime) //
91+
.localOffsetDateTime(localOffsetDateTime) //
9092
.date(date) //
9193
.point(point) //
9294
.ulid(ulid) //
@@ -98,6 +100,7 @@ public void cleanUp() {
98100
ks3 = KitchenSink.builder() //
99101
.localDate(localDate) //
100102
.localDateTime(localDateTime) //
103+
.localOffsetDateTime(localOffsetDateTime) //
101104
.date(date) //
102105
.point(point) //
103106
.ulid(ulid) //
@@ -109,6 +112,7 @@ public void cleanUp() {
109112
ks4 = KitchenSink.builder() //
110113
.localDate(localDate) //
111114
.localDateTime(localDateTime) //
115+
.localOffsetDateTime(localOffsetDateTime) //
112116
.date(date) //
113117
.point(point) //
114118
.ulid(ulid) //
@@ -134,6 +138,11 @@ void testHashSerialization() {
134138
long localDateTimeInMillis = localDateTimeInstant.toEpochMilli();
135139
long rawLocalDateTime = Long.parseLong(Objects.requireNonNull(template.opsForHash().get(key, "localDateTime")).toString());
136140

141+
// OffsetDateTime
142+
Instant localOffsetDateTimeInstant = localOffsetDateTime.atZoneSameInstant(ZoneId.systemDefault()).toInstant();
143+
long localOffsetDateTimeInMillis = localOffsetDateTimeInstant.toEpochMilli();
144+
long rawlocalOffsetDateTime = Long.parseLong(Objects.requireNonNull(template.opsForHash().get(key, "localOffsetDateTime")).toString());
145+
137146
// Date
138147
long dateInMillis = date.getTime();
139148
long rawDate = Long.parseLong(Objects.requireNonNull(template.opsForHash().get(key, "date")).toString());
@@ -150,6 +159,7 @@ void testHashSerialization() {
150159

151160
assertThat(rawLocalDate).isEqualTo(localDateAsUnixTS);
152161
assertThat(rawLocalDateTime).isEqualTo(localDateTimeInMillis);
162+
assertThat(rawlocalOffsetDateTime).isEqualTo(localOffsetDateTimeInMillis);
153163
assertThat(rawDate).isEqualTo(dateInMillis);
154164
assertThat(rawPoint).isEqualTo(redisGeo);
155165
assertThat(rawUlid).isEqualTo(ulid.toString());
@@ -168,6 +178,7 @@ void testHashDeserialization() {
168178
// NOTE: We lose nanosecond precision in order to store LocalDateTime as long in
169179
// order to allow for RediSearch range queries
170180
assertThat(fromDb.get().getLocalDateTime()).isEqualToIgnoringNanos(localDateTime);
181+
assertThat(fromDb.get().getLocalOffsetDateTime()).isEqualToIgnoringNanos(localOffsetDateTime);
171182
assertThat(fromDb.get().getSetThings()).isEqualTo(setThings);
172183
assertThat(fromDb.get().getListThings()).isEqualTo(listThings);
173184
}

0 commit comments

Comments
 (0)