Skip to content

Commit 2d60af4

Browse files
committed
fix: serialize java.time.Instant as milliseconds (resolves gh-275)
1 parent df5c0a7 commit 2d60af4

File tree

9 files changed

+22
-16
lines changed

9 files changed

+22
-16
lines changed

redis-om-spring/src/main/java/com/redis/om/spring/RediSearchIndexer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import java.time.Instant;
3232
import java.time.LocalDate;
3333
import java.time.LocalDateTime;
34+
import java.time.OffsetDateTime;
3435
import java.util.*;
3536
import java.util.concurrent.ConcurrentHashMap;
3637

@@ -225,7 +226,7 @@ private List<Field> findIndexFields(java.lang.reflect.Field field, String prefix
225226
//
226227
else if (Number.class.isAssignableFrom(fieldType) || (fieldType == LocalDateTime.class)
227228
|| (field.getType() == LocalDate.class) || (field.getType() == Date.class)
228-
|| (field.getType() == Instant.class)) {
229+
|| (field.getType() == Instant.class) || (field.getType() == OffsetDateTime.class)) {
229230
fields.add(indexAsNumericFieldFor(field, isDocument, prefix, indexed.sortable(), indexed.noindex()));
230231
}
231232
//

redis-om-spring/src/main/java/com/redis/om/spring/RedisModulesConfiguration.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ RedisJSONKeyValueAdapter getRedisJSONKeyValueAdapter( //
288288
RedisModulesOperations<?> redisModulesOperations, //
289289
RedisMappingContext mappingContext, //
290290
RediSearchIndexer indexer, //
291-
GsonBuilder gsonBuilder, //
291+
@Qualifier("omGsonBuilder") GsonBuilder gsonBuilder, //
292292
RedisOMSpringProperties properties //
293293
) {
294294
return new RedisJSONKeyValueAdapter(redisOps, redisModulesOperations, mappingContext, indexer, gsonBuilder, properties);
@@ -300,7 +300,7 @@ public CustomRedisKeyValueTemplate getRedisJSONKeyValueTemplate( //
300300
RedisModulesOperations<?> redisModulesOperations, //
301301
RedisMappingContext mappingContext, //
302302
RediSearchIndexer indexer, //
303-
GsonBuilder gsonBuilder, //
303+
@Qualifier("omGsonBuilder") GsonBuilder gsonBuilder, //
304304
RedisOMSpringProperties properties //
305305
) {
306306
return new CustomRedisKeyValueTemplate(
@@ -323,8 +323,11 @@ public CustomRedisKeyValueTemplate getKeyValueTemplate( //
323323
}
324324

325325
@Bean(name = "streamingQueryBuilder")
326-
EntityStream streamingQueryBuilder(RedisModulesOperations<?> redisModulesOperations, Gson gson) {
327-
return new EntityStreamImpl(redisModulesOperations, gson);
326+
EntityStream streamingQueryBuilder(
327+
RedisModulesOperations<?> redisModulesOperations,
328+
@Qualifier("omGsonBuilder") GsonBuilder gsonBuilder
329+
) {
330+
return new EntityStreamImpl(redisModulesOperations, gsonBuilder);
328331
}
329332

330333
@EventListener(ContextRefreshedEvent.class)

redis-om-spring/src/main/java/com/redis/om/spring/search/stream/AggregationStreamImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ private ReducerFieldPair(Reducer reducer, MetamodelField<?, ?> field) {
4646
this.field = field;
4747
}
4848

49-
public static ReducerFieldPair of( Reducer reducer, MetamodelField<?, ?> field) {
49+
public static ReducerFieldPair of(Reducer reducer, MetamodelField<?, ?> field) {
5050
return new ReducerFieldPair(reducer, field);
5151
}
5252

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,23 @@
11
package com.redis.om.spring.search.stream;
22

33
import com.google.gson.Gson;
4+
import com.google.gson.GsonBuilder;
45
import com.redis.om.spring.ops.RedisModulesOperations;
56

67
public class EntityStreamImpl implements EntityStream {
78

89
final RedisModulesOperations<String> modulesOperations;
9-
final Gson gson;
10+
final GsonBuilder gsonBuilder;
1011

1112
@SuppressWarnings("unchecked")
12-
public EntityStreamImpl(RedisModulesOperations<?> rmo, Gson gson) {
13+
public EntityStreamImpl(RedisModulesOperations<?> rmo, GsonBuilder gsonBuilder) {
1314
this.modulesOperations = (RedisModulesOperations<String>) rmo;
14-
this.gson = gson;
15+
this.gsonBuilder = gsonBuilder;
1516
}
1617

1718
@Override
1819
public <E> SearchStream<E> of(Class<E> entityClass) {
19-
return new SearchStreamImpl<>(entityClass, modulesOperations, gson);
20+
return new SearchStreamImpl<>(entityClass, modulesOperations, gsonBuilder.create());
2021
}
2122

2223
}

redis-om-spring/src/main/java/com/redis/om/spring/search/stream/predicates/BaseAbstractPredicate.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import redis.clients.jedis.search.Schema.FieldType;
77

88
import java.lang.reflect.Field;
9+
import java.time.Instant;
910
import java.time.LocalDate;
1011
import java.time.LocalDateTime;
1112
import java.util.Date;
@@ -71,7 +72,7 @@ else if (field.isAnnotationPresent(NumericIndexed.class)) {
7172
// Any Numeric class -> Numeric Search Field
7273
//
7374
else if (Number.class.isAssignableFrom(field.getType()) || (field.getType() == LocalDateTime.class)
74-
|| (field.getType() == LocalDate.class) || (field.getType() == Date.class)) {
75+
|| (field.getType() == LocalDate.class) || (field.getType() == Date.class) || (field.getType() == Instant.class)) {
7576
result = FieldType.NUMERIC;
7677
}
7778
//

redis-om-spring/src/main/java/com/redis/om/spring/search/stream/predicates/jedis/InstantRangeValue.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ private static void appendInstant(StringBuilder sb, Instant instant, boolean inc
2424
} else if (instant == Instant.MAX) {
2525
sb.append("inf");
2626
} else {
27-
long timeInMillis = instant.getEpochSecond();
27+
long timeInMillis = instant.toEpochMilli();
2828
sb.append(new JsonPrimitive(timeInMillis));
2929
}
3030

redis-om-spring/src/main/java/com/redis/om/spring/serialization/gson/InstantTypeAdapter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@ public class InstantTypeAdapter implements JsonSerializer<Instant>, JsonDeserial
99

1010
@Override
1111
public JsonElement serialize(Instant instant, Type typeOfSrc, JsonSerializationContext context) {
12-
long timeInMillis = instant.getEpochSecond();
12+
long timeInMillis = instant.toEpochMilli();
1313
return new JsonPrimitive(timeInMillis);
1414
}
1515

1616
@Override
1717
public Instant deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
1818
throws JsonParseException {
19-
return Instant.ofEpochSecond(json.getAsLong());
19+
return Instant.ofEpochMilli(json.getAsLong());
2020
}
2121

2222
public static InstantTypeAdapter getInstance() {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ void testJSONSerialization() {
123123
String redisGeo = "33.62826024782707,-111.83592170193586";
124124

125125
// Instant
126-
long instantInMillis = instant.getEpochSecond();
126+
long instantInMillis = instant.toEpochMilli();
127127

128128
JsonObject rawJSON = ops.get(KitchenSink.class.getName() + ":" + ks.getId(), JsonObject.class);
129129

redis-om-spring/src/test/java/com/redis/om/spring/search/stream/EntityStreamsAggregationsDocsTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -867,7 +867,7 @@ void testCalculateTotalOrderValueandAverageOrderQuantity() {
867867
List<Triple<String,Double,Integer>> totalOrderQuanties = stream //
868868
.filter(PizzaOrder$.DATE.onOrAfter(Instant.parse("2020-01-30T00:00:00.00Z"))) //
869869
.filter(PizzaOrder$.DATE.before(Instant.parse("2022-01-30T00:00:00.00Z"))) //
870-
.apply("timefmt(@date, '%Y-%m-%d') ", "_id") //
870+
.apply("timefmt(@date / 1000, '%Y-%m-%d') ", "_id") //
871871
.apply("@price * @quantity", "total") //
872872
.groupBy(Alias.of("_id")) //
873873
.reduce(ReducerFunction.SUM, "@total").as("totalOrderValue") //

0 commit comments

Comments
 (0)