From eca2108e1542ed7212f7cbbbcb0e5f487e800f5d Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Tue, 11 Nov 2014 10:16:48 +0100 Subject: [PATCH] DATAMONGO-1087 - Fix index resolver detecting cycles for partial match. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We now check for presence of a dot path to verify that we’ve detected a cycle. Original pull request: #240. --- .../MongoPersistentEntityIndexResolver.java | 2 +- ...ersistentEntityIndexResolverUnitTests.java | 50 +++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/index/MongoPersistentEntityIndexResolver.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/index/MongoPersistentEntityIndexResolver.java index 87c637739..a7d4e920e 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/index/MongoPersistentEntityIndexResolver.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/index/MongoPersistentEntityIndexResolver.java @@ -540,7 +540,7 @@ public class MongoPersistentEntityIndexResolver implements IndexResolver { return false; } - return path.contains(this.path); + return path.equals(this.path) || path.contains(this.path + ".") || path.contains("." + this.path); } } } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/index/MongoPersistentEntityIndexResolverUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/index/MongoPersistentEntityIndexResolverUnitTests.java index 45b110e13..e7966e817 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/index/MongoPersistentEntityIndexResolverUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/index/MongoPersistentEntityIndexResolverUnitTests.java @@ -812,6 +812,32 @@ public class MongoPersistentEntityIndexResolverUnitTests { assertThat((String) indexDefinitions.get(0).getIndexOptions().get("name"), equalTo("property_index")); } + /** + * @see DATAMONGO-1087 + */ + @Test + public void shouldAllowMultiplePropertiesOfSameTypeWithMatchingStartLettersOnRoot() { + + List indexDefinitions = prepareMappingContextAndResolveIndexForType(MultiplePropertiesOfSameTypeWithMatchingStartLetters.class); + + assertThat(indexDefinitions, hasSize(2)); + assertThat((String) indexDefinitions.get(0).getIndexOptions().get("name"), equalTo("name.component")); + assertThat((String) indexDefinitions.get(1).getIndexOptions().get("name"), equalTo("nameLast.component")); + } + + /** + * @see DATAMONGO-1087 + */ + @Test + public void shouldAllowMultiplePropertiesOfSameTypeWithMatchingStartLettersOnNestedProperty() { + + List indexDefinitions = prepareMappingContextAndResolveIndexForType(MultiplePropertiesOfSameTypeWithMatchingStartLettersOnNestedProperty.class); + + assertThat(indexDefinitions, hasSize(2)); + assertThat((String) indexDefinitions.get(0).getIndexOptions().get("name"), equalTo("component.nameLast")); + assertThat((String) indexDefinitions.get(1).getIndexOptions().get("name"), equalTo("component.name")); + } + @Document static class MixedIndexRoot { @@ -952,6 +978,30 @@ public class MongoPersistentEntityIndexResolverUnitTests { TypeWithNamedIndex propertyOfTypeHavingNamedIndex; } + @Document + public class MultiplePropertiesOfSameTypeWithMatchingStartLetters { + + public class NameComponent { + + @Indexed String component; + } + + NameComponent name; + NameComponent nameLast; + } + + @Document + public class MultiplePropertiesOfSameTypeWithMatchingStartLettersOnNestedProperty { + + public class NameComponent { + + @Indexed String nameLast; + @Indexed String name; + } + + NameComponent component; + } + } private static List prepareMappingContextAndResolveIndexForType(Class type) {