diff --git a/pom.xml b/pom.xml index 15b2d67f47..d4095ea505 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-mongodb-parent - 2.3.0.BUILD-SNAPSHOT + 2.2.0.DATAMONGO-2388-SNAPSHOT pom Spring Data MongoDB diff --git a/spring-data-mongodb-benchmarks/pom.xml b/spring-data-mongodb-benchmarks/pom.xml index c4766040c1..77174680f8 100644 --- a/spring-data-mongodb-benchmarks/pom.xml +++ b/spring-data-mongodb-benchmarks/pom.xml @@ -7,7 +7,7 @@ org.springframework.data spring-data-mongodb-parent - 2.3.0.BUILD-SNAPSHOT + 2.2.0.DATAMONGO-2388-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml index ed39c63e76..8bea297f7d 100644 --- a/spring-data-mongodb-distribution/pom.xml +++ b/spring-data-mongodb-distribution/pom.xml @@ -14,7 +14,7 @@ org.springframework.data spring-data-mongodb-parent - 2.3.0.BUILD-SNAPSHOT + 2.2.0.DATAMONGO-2388-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index 25cf02b5d5..08b7932482 100644 --- a/spring-data-mongodb/pom.xml +++ b/spring-data-mongodb/pom.xml @@ -11,7 +11,7 @@ org.springframework.data spring-data-mongodb-parent - 2.3.0.BUILD-SNAPSHOT + 2.2.0.DATAMONGO-2388-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/index/IndexInfo.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/index/IndexInfo.java index 7554a546e2..20468c5d31 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/index/IndexInfo.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/index/IndexInfo.java @@ -26,6 +26,7 @@ import java.util.Optional; import org.bson.Document; +import org.springframework.data.mongodb.util.BsonUtils; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.NumberUtils; @@ -117,9 +118,8 @@ public static IndexInfo indexInfoOf(Document sourceDocument) { boolean sparse = sourceDocument.containsKey("sparse") ? (Boolean) sourceDocument.get("sparse") : false; String language = sourceDocument.containsKey("default_language") ? (String) sourceDocument.get("default_language") : ""; - String partialFilter = sourceDocument.containsKey("partialFilterExpression") - ? ((Document) sourceDocument.get("partialFilterExpression")).toJson() - : null; + + String partialFilter = extractPartialFilterString(sourceDocument); IndexInfo info = new IndexInfo(indexFields, name, unique, sparse, language); info.partialFilterExpression = partialFilter; @@ -134,6 +134,21 @@ public static IndexInfo indexInfoOf(Document sourceDocument) { return info; } + /** + * @param sourceDocument + * @return the {@link String} representation of the partial filter {@link Document}. + * @since 2.1.11 + */ + @Nullable + private static String extractPartialFilterString(Document sourceDocument) { + + if (!sourceDocument.containsKey("partialFilterExpression")) { + return null; + } + + return BsonUtils.toJson(sourceDocument.get("partialFilterExpression", Document.class)); + } + /** * Returns the individual index fields of the index. * diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/BsonUtils.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/BsonUtils.java index 34c85cbc70..fe9e865d20 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/BsonUtils.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/BsonUtils.java @@ -16,13 +16,18 @@ package org.springframework.data.mongodb.util; import java.util.Arrays; +import java.util.Collection; import java.util.Date; import java.util.Map; import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; import org.bson.BsonValue; import org.bson.Document; import org.bson.conversions.Bson; +import org.bson.json.JsonParseException; +import org.springframework.core.convert.converter.Converter; import org.springframework.lang.Nullable; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; @@ -30,6 +35,7 @@ import com.mongodb.BasicDBObject; import com.mongodb.DBObject; import com.mongodb.DBRef; +import com.mongodb.MongoClientSettings; /** * @author Christoph Strobl @@ -147,4 +153,77 @@ public static Document toDocumentOrElse(String source, Function) value); + } else if (value instanceof Map) { + return toString((Map) value); + } else if (ObjectUtils.isArray(value)) { + return toString(Arrays.asList(ObjectUtils.toObjectArray(value))); + } + + throw e instanceof JsonParseException ? (JsonParseException) e : new JsonParseException(e); + } + } + + private static String serializeValue(@Nullable Object value) { + + if (value == null) { + return "null"; + } + + String documentJson = new Document("toBeEncoded", value).toJson(); + return documentJson.substring(documentJson.indexOf(':') + 1, documentJson.length() - 1).trim(); + } + + private static String toString(Map source) { + + return iterableToDelimitedString(source.entrySet(), "{ ", " }", + entry -> String.format("\"%s\" : %s", entry.getKey(), toJson(entry.getValue()))); + } + + private static String toString(Collection source) { + return iterableToDelimitedString(source, "[ ", " ]", BsonUtils::toJson); + } + + private static String iterableToDelimitedString(Iterable source, String prefix, String postfix, + Converter transformer) { + + return prefix + + StringUtils.collectionToCommaDelimitedString( + StreamSupport.stream(source.spliterator(), false).map(transformer::convert).collect(Collectors.toList())) + + postfix; + } } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/DefaultIndexOperationsIntegrationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/DefaultIndexOperationsIntegrationTests.java index 516fcdbac2..d9f548bdd3 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/DefaultIndexOperationsIntegrationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/DefaultIndexOperationsIntegrationTests.java @@ -20,6 +20,7 @@ import static org.springframework.data.mongodb.core.index.PartialIndexFilter.*; import static org.springframework.data.mongodb.core.query.Criteria.*; +import org.bson.BsonDocument; import org.bson.Document; import org.junit.Before; import org.junit.Test; @@ -39,6 +40,7 @@ import org.springframework.util.ObjectUtils; import com.mongodb.client.MongoCollection; +import com.mongodb.client.model.IndexOptions; /** * Integration tests for {@link DefaultIndexOperations}. @@ -153,6 +155,21 @@ public void shouldFavorExplicitMappingHintViaClass() { .isEqualTo(Document.parse("{ \"a_g_e\" : { \"$gte\" : 10 } }")); } + @Test // DATAMONGO-2388 + public void shouldReadIndexWithPartialFilterContainingDbRefCorrectly() { + + BsonDocument partialFilter = BsonDocument.parse( + "{ \"the-ref\" : { \"$ref\" : \"other-collection\", \"$id\" : { \"$oid\" : \"59ce08baf264b906810fe8c5\"} } }"); + IndexOptions indexOptions = new IndexOptions(); + indexOptions.name("partial-with-dbref"); + indexOptions.partialFilterExpression(partialFilter); + + collection.createIndex(BsonDocument.parse("{ \"key-1\" : 1, \"key-2\": 1}"), indexOptions); + + IndexInfo info = findAndReturnIndexInfo(indexOps.getIndexInfo(), "partial-with-dbref"); + assertThat(BsonDocument.parse(info.getPartialFilterExpression())).isEqualTo(partialFilter); + } + @Test // DATAMONGO-1518 public void shouldCreateIndexWithCollationCorrectly() { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateCollationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateCollationTests.java index 70bf70777c..8950571c0c 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateCollationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateCollationTests.java @@ -60,6 +60,11 @@ public MongoClient mongoClient() { protected String getDatabaseName() { return "collation-tests"; } + + @Override + protected boolean autoIndexCreation() { + return false; + } } @Autowired MongoTemplate template; diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTransactionTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTransactionTests.java index 92654379a4..da8ab558ee 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTransactionTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTransactionTests.java @@ -85,6 +85,11 @@ protected String getDatabaseName() { return DB_NAME; } + @Override + protected boolean autoIndexCreation() { + return false; + } + @Bean MongoTransactionManager txManager(MongoDbFactory dbFactory) { return new MongoTransactionManager(dbFactory); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateValidationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateValidationTests.java index d0b68acf2e..1983634d06 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateValidationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateValidationTests.java @@ -74,6 +74,11 @@ public MongoClient mongoClient() { protected String getDatabaseName() { return "validation-tests"; } + + @Override + protected boolean autoIndexCreation() { + return false; + } } @Autowired MongoTemplate template; diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/NoExplicitIdTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/NoExplicitIdTests.java index 19a373068e..5e74309c05 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/NoExplicitIdTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/NoExplicitIdTests.java @@ -59,6 +59,11 @@ protected String getDatabaseName() { public MongoClient mongoClient() { return MongoTestUtils.client(); } + + @Override + protected boolean autoIndexCreation() { + return false; + } } @Autowired MongoOperations mongoOps;