From b44eacfa369cad127ecdd0904098dbabbce0f26f Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Tue, 16 Apr 2024 13:53:22 +0200 Subject: [PATCH 1/2] Prepare issue branch. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From fe9d67c8969db11fd1eb0da6394f84f618fb8d63 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Tue, 16 Apr 2024 15:23:04 +0200 Subject: [PATCH 2/2] Clear indexed data if property value is set to null. --- .../redis/core/convert/PathIndexResolver.java | 18 +++++++++++++++--- .../redis/core/RedisKeyValueAdapterTests.java | 19 +++++++++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) 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() {