From 3f5cc897da7c17311c8eae5d0108bc4351409c81 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Tue, 1 Dec 2020 09:41:15 +0100 Subject: [PATCH] DATAMONGO-2659 - Polishing. Update Javadoc to reflect find and aggregation nature. Use primitive boolean on Query.allowDiskUse to avoid nullable type usage. Update ReactiveMongoTemplate to consider allowDiskUse. Original pull request: #891. --- .../mongodb/core/ReactiveMongoTemplate.java | 4 +++ .../data/mongodb/core/query/Meta.java | 6 +++- .../data/mongodb/core/query/Query.java | 11 +++++-- .../core/QueryCursorPreparerUnitTests.java | 33 +------------------ .../core/ReactiveMongoTemplateUnitTests.java | 12 +++++++ 5 files changed, 30 insertions(+), 36 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 977ceb394..d04f0805d 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 @@ -3329,6 +3329,10 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati if (meta.getCursorBatchSize() != null) { findPublisherToUse = findPublisherToUse.batchSize(meta.getCursorBatchSize()); } + + if (meta.getAllowDiskUse() != null) { + findPublisherToUse = findPublisherToUse.allowDiskUse(meta.getAllowDiskUse()); + } } } catch (RuntimeException e) { diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Meta.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Meta.java index c865fef80..bf48a9f5b 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Meta.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Meta.java @@ -181,7 +181,11 @@ public class Meta { } /** - * Set to {@literal true}, to allow aggregation stages to write data to disk. + * Enables writing to temporary files for aggregation stages and queries. When set to {@literal true}, aggregation + * stages can write data to the {@code _tmp} subdirectory in the {@code dbPath} directory. + *

+ * Starting in MongoDB 4.2, the profiler log messages and diagnostic log messages includes a {@code usedDisk} + * indicator if any aggregation stage wrote data to temporary files due to memory restrictions. * * @param allowDiskUse use {@literal null} for server defaults. * @since 3.0 diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Query.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Query.java index 31dfd5343..e509ea7a5 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Query.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Query.java @@ -374,13 +374,18 @@ public class Query { } /** - * Set a allowDiskUse to the query that is propagated to the profile log. + * Enables writing to temporary files for aggregation stages and queries. When set to {@literal true}, aggregation + * stages can write data to the {@code _tmp} subdirectory in the {@code dbPath} directory. + *

+ * Starting in MongoDB 4.2, the profiler log messages and diagnostic log messages includes a {@code usedDisk} + * indicator if any aggregation stage wrote data to temporary files due to memory restrictions. * - * @param allowDiskUse must not be {@literal null}. + * @param allowDiskUse * @return this. * @see Meta#setAllowDiskUse(Boolean) + * @since 3.2 */ - public Query allowDiskUse(Boolean allowDiskUse) { + public Query allowDiskUse(boolean allowDiskUse) { meta.setAllowDiskUse(allowDiskUse); return this; diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/QueryCursorPreparerUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/QueryCursorPreparerUnitTests.java index 2030f25ea..975fab857 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/QueryCursorPreparerUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/QueryCursorPreparerUnitTests.java @@ -96,27 +96,6 @@ class QueryCursorPreparerUnitTests { verify(cursor).hint(new Document("age", 1)); } - // TODO - // @Test // DATAMONGO-957 - // public void doesNotApplyMetaWhenEmpty() { - // - // Query query = query(where("foo").is("bar")); - // query.setMeta(new Meta()); - // - // prepare(query); - // - // verify(cursor, never()).modifiers(any(Document.class)); - // } - - // @Test // DATAMONGO-957 - // public void appliesMaxScanCorrectly() { - // - // Query query = query(where("foo").is("bar")).maxScan(100); - // prepare(query); - // - // verify(cursor).maxScan(100); - // } - @Test // DATAMONGO-957 void appliesMaxTimeCorrectly() { @@ -135,7 +114,7 @@ class QueryCursorPreparerUnitTests { verify(cursor).comment("spring data"); } - @Test + @Test // DATAMONGO-2659 void appliesAllowDiskUseCorrectly() { Query query = query(where("foo").is("bar")).allowDiskUse(true); @@ -144,16 +123,6 @@ class QueryCursorPreparerUnitTests { verify(cursor).allowDiskUse(true); } - // TODO - // @Test // DATAMONGO-957 - // public void appliesSnapshotCorrectly() { - // - // Query query = query(where("foo").is("bar")).useSnapshot(); - // prepare(query); - // - // verify(cursor).snapshot(true); - // } - @Test // DATAMONGO-1480 void appliesNoCursorTimeoutCorrectly() { 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 916123d70..84af57437 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 @@ -180,6 +180,7 @@ public class ReactiveMongoTemplateUnitTests { when(findPublisher.limit(anyInt())).thenReturn(findPublisher); when(findPublisher.collation(any())).thenReturn(findPublisher); when(findPublisher.first()).thenReturn(findPublisher); + when(findPublisher.allowDiskUse(anyBoolean())).thenReturn(findPublisher); when(aggregatePublisher.allowDiskUse(anyBoolean())).thenReturn(aggregatePublisher); when(aggregatePublisher.collation(any())).thenReturn(aggregatePublisher); when(aggregatePublisher.maxTime(anyLong(), any())).thenReturn(aggregatePublisher); @@ -231,6 +232,17 @@ public class ReactiveMongoTemplateUnitTests { verify(findPublisher).batchSize(1234); } + @Test // DATAMONGO-2659 + void executeQueryShouldUseAllowDiskSizeWhenPresent() { + + when(findPublisher.batchSize(anyInt())).thenReturn(findPublisher); + + Query query = new Query().allowDiskUse(true); + template.find(query, Person.class).subscribe(); + + verify(findPublisher).allowDiskUse(true); + } + @Test // DATAMONGO-1518 void findShouldUseCollationWhenPresent() {