From 9acc8d526850f4462e02b41e9dc1d2922faee464 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Thu, 19 Sep 2019 14:41:07 +0200 Subject: [PATCH] DATAMONGO-2360 - Polishing. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Apply index hints in ReactiveMongoTemplate.count(…). Original pull request: #788. --- .../data/mongodb/core/ReactiveMongoTemplate.java | 3 +++ .../data/mongodb/core/MongoTemplateUnitTests.java | 4 ++-- .../core/ReactiveMongoTemplateUnitTests.java | 15 +++++++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java index d86418a0c..99d826ec7 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java @@ -1167,6 +1167,9 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati if (query != null) { query.getCollation().map(Collation::toMongoCollation).ifPresent(options::collation); } + if (StringUtils.hasText(query.getHint())) { + options.hint(Document.parse(query.getHint())); + } if (LOGGER.isDebugEnabled()) { LOGGER.debug("Executing count: {} in collection: {}", serializeToJsonSafely(filter), collectionName); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateUnitTests.java index fb7b4ff9f..fa1add8f7 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateUnitTests.java @@ -914,12 +914,12 @@ public class MongoTemplateUnitTests extends MongoOperationsUnitTests { public void countShouldApplyQueryHintIfPresent() { Document queryHint = new Document("age", 1); - template.count(new BasicQuery("{}").withHint(queryHint), AutogenerateableId.class); + template.count(new BasicQuery("{}").withHint(queryHint.toJson()), AutogenerateableId.class); ArgumentCaptor options = ArgumentCaptor.forClass(CountOptions.class); verify(collection).count(any(), options.capture()); - assertThat(options.getValue().getHint()).isEqualTo(queryHint); + assertThat(options.getValue().getHint(), is(equalTo(queryHint))); } @Test // DATAMONGO-1733 diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveMongoTemplateUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveMongoTemplateUnitTests.java index 36ac32a79..67f910572 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveMongoTemplateUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveMongoTemplateUnitTests.java @@ -38,6 +38,7 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import org.reactivestreams.Publisher; + import org.springframework.beans.factory.annotation.Value; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.MongoTemplateUnitTests.AutogenerateableId; @@ -52,6 +53,7 @@ import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import org.springframework.test.util.ReflectionTestUtils; +import com.mongodb.client.model.CountOptions; import com.mongodb.client.model.DeleteOptions; import com.mongodb.client.model.FindOneAndDeleteOptions; import com.mongodb.client.model.FindOneAndUpdateOptions; @@ -343,6 +345,19 @@ public class ReactiveMongoTemplateUnitTests { verify(findPublisher, never()).projection(any()); } + @Test // DATAMONGO-2360 + public void countShouldApplyQueryHintIfPresent() { + + when(collection.count(any(Bson.class), any(CountOptions.class))).thenReturn(Mono.empty()); + Document queryHint = new Document("age", 1); + template.count(new Query().withHint(queryHint.toJson()), Person.class, "star-wars").subscribe(); + + ArgumentCaptor options = ArgumentCaptor.forClass(CountOptions.class); + verify(collection).count(any(), options.capture()); + + assertThat(options.getValue().getHint(), is(equalTo(queryHint))); + } + @Data @org.springframework.data.mongodb.core.mapping.Document(collection = "star-wars") static class Person {