diff --git a/pom.xml b/pom.xml index 507b76dd15..4dd2f5148f 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-redis - 3.3.0-SNAPSHOT + 3.3.x-2882-SNAPSHOT Spring Data Redis Spring Data module for Redis diff --git a/src/main/java/org/springframework/data/redis/core/convert/PathIndexResolver.java b/src/main/java/org/springframework/data/redis/core/convert/PathIndexResolver.java index 98bb52bed4..47023696a7 100644 --- a/src/main/java/org/springframework/data/redis/core/convert/PathIndexResolver.java +++ b/src/main/java/org/springframework/data/redis/core/convert/PathIndexResolver.java @@ -122,6 +122,7 @@ public void doWithPersistentProperty(RedisPersistentProperty persistentProperty) Object propertyValue = accessor.getProperty(persistentProperty); if (propertyValue == null) { + indexes.addAll(resolveIndex(keyspace, currentPath, persistentProperty, null)); return; } @@ -212,7 +213,18 @@ protected Set resolveIndex(String keyspace, String propertyPath, IndexedData indexedData = null; if (transformedValue == null) { - indexedData = new RemoveIndexedData(indexedData); + + indexedData = new RemoveIndexedData(new IndexedData() { + @Override + public String getIndexName() { + return indexDefinition.getIndexName(); + } + + @Override + public String getKeyspace() { + return indexDefinition.getKeyspace(); + } + }); } else { indexedData = indexedDataFactoryProvider.getIndexedDataFactory(indexDefinition).createIndexedDataFor(value); } @@ -220,13 +232,13 @@ protected Set resolveIndex(String keyspace, String propertyPath, } } - else if (property != null && property.isAnnotationPresent(Indexed.class)) { + else if (property != null && value != null && property.isAnnotationPresent(Indexed.class)) { SimpleIndexDefinition indexDefinition = new SimpleIndexDefinition(keyspace, path); indexConfiguration.addIndexDefinition(indexDefinition); data.add(indexedDataFactoryProvider.getIndexedDataFactory(indexDefinition).createIndexedDataFor(value)); - } else if (property != null && property.isAnnotationPresent(GeoIndexed.class)) { + } else if (property != null && value != null && property.isAnnotationPresent(GeoIndexed.class)) { GeoIndexDefinition indexDefinition = new GeoIndexDefinition(keyspace, path); indexConfiguration.addIndexDefinition(indexDefinition); diff --git a/src/test/java/org/springframework/data/redis/core/RedisKeyValueAdapterTests.java b/src/test/java/org/springframework/data/redis/core/RedisKeyValueAdapterTests.java index eb1f514f02..afa842f13a 100644 --- a/src/test/java/org/springframework/data/redis/core/RedisKeyValueAdapterTests.java +++ b/src/test/java/org/springframework/data/redis/core/RedisKeyValueAdapterTests.java @@ -147,6 +147,25 @@ void putWritesSimpleIndexDataCorrectly() { assertThat(template.opsForSet().members("persons:firstname:rand")).contains("1"); } + @Test // GH-2882 + void indexDataShouldBeCleardIfPropertyValueIsSetToNull() { + + Person rand = new Person(); + rand.firstname = "rand"; + + adapter.put("1", rand, "persons"); + + assertThat(template.keys("persons*")).contains("persons:firstname:rand"); + assertThat(template.opsForSet().members("persons:firstname:rand")).contains("1"); + + rand.id = "1"; + rand.firstname = null; + adapter.put("1", rand, "persons"); + + assertThat(template.keys("persons*")).doesNotContain("persons:firstname:rand"); + assertThat(template.opsForSet().members("persons:firstname:rand")).doesNotContain("1"); + } + @Test // DATAREDIS-744 void putWritesSimpleIndexDataWithColonCorrectly() {