diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java index 5c8c2702b..e0938bcaf 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java @@ -2191,8 +2191,11 @@ public class MongoTemplate .getCollation()); AggregateIterable aggregateIterable = delegate.prepare(collection).aggregate(pipeline, Document.class) // - .collation(collation.map(Collation::toMongoCollation).orElse(null)) // - .allowDiskUse(options.isAllowDiskUse()); + .collation(collation.map(Collation::toMongoCollation).orElse(null)); + + if (options.isAllowDiskUseSet()) { + aggregateIterable = aggregateIterable.allowDiskUse(options.isAllowDiskUse()); + } if (options.getCursorBatchSize() != null) { aggregateIterable = aggregateIterable.batchSize(options.getCursorBatchSize()); @@ -2255,8 +2258,11 @@ public class MongoTemplate CollectionPreparerDelegate delegate = CollectionPreparerDelegate.of(options); - AggregateIterable cursor = delegate.prepare(collection).aggregate(pipeline, Document.class) // - .allowDiskUse(options.isAllowDiskUse()); + AggregateIterable cursor = delegate.prepare(collection).aggregate(pipeline, Document.class); + + if (options.isAllowDiskUseSet()) { + cursor = cursor.allowDiskUse(options.isAllowDiskUse()); + } if (options.getCursorBatchSize() != null) { cursor = cursor.batchSize(options.getCursorBatchSize()); 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 0f1b8905a..146bd0cb9 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 @@ -1027,8 +1027,11 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati @Nullable Class inputType) { ReactiveCollectionPreparerDelegate collectionPreparer = ReactiveCollectionPreparerDelegate.of(options); - AggregatePublisher cursor = collectionPreparer.prepare(collection).aggregate(pipeline, Document.class) - .allowDiskUse(options.isAllowDiskUse()); + AggregatePublisher cursor = collectionPreparer.prepare(collection).aggregate(pipeline, Document.class); + + if (options.isAllowDiskUseSet()) { + cursor = cursor.allowDiskUse(options.isAllowDiskUse()); + } if (options.getCursorBatchSize() != null) { cursor = cursor.batchSize(options.getCursorBatchSize()); diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/AggregationOptions.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/AggregationOptions.java index ebee5122f..972980b1a 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/AggregationOptions.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/AggregationOptions.java @@ -55,7 +55,7 @@ public class AggregationOptions implements ReadConcernAware, ReadPreferenceAware private static final String MAX_TIME = "maxTimeMS"; private static final String HINT = "hint"; - private final boolean allowDiskUse; + private final Optional allowDiskUse; private final boolean explain; private final Optional cursor; private final Optional collation; @@ -123,10 +123,10 @@ public class AggregationOptions implements ReadConcernAware, ReadPreferenceAware * @param hint can be {@literal null}, used to provide an index that would be forcibly used by query optimizer. * @since 3.1 */ - private AggregationOptions(boolean allowDiskUse, boolean explain, @Nullable Document cursor, + private AggregationOptions(@Nullable Boolean allowDiskUse, boolean explain, @Nullable Document cursor, @Nullable Collation collation, @Nullable String comment, @Nullable Object hint) { - this.allowDiskUse = allowDiskUse; + this.allowDiskUse = Optional.ofNullable(allowDiskUse); this.explain = explain; this.cursor = Optional.ofNullable(cursor); this.collation = Optional.ofNullable(collation); @@ -159,7 +159,7 @@ public class AggregationOptions implements ReadConcernAware, ReadPreferenceAware Assert.notNull(document, "Document must not be null"); - boolean allowDiskUse = document.getBoolean(ALLOW_DISK_USE, false); + Boolean allowDiskUse = document.get(ALLOW_DISK_USE, Boolean.class); boolean explain = document.getBoolean(EXPLAIN, false); Document cursor = document.get(CURSOR, Document.class); Collation collation = document.containsKey(COLLATION) ? Collation.from(document.get(COLLATION, Document.class)) @@ -185,13 +185,23 @@ public class AggregationOptions implements ReadConcernAware, ReadPreferenceAware } /** - * Enables writing to temporary files. When set to true, aggregation stages can write data to the _tmp subdirectory in - * the dbPath directory. + * Enables writing to temporary files. When set to {@literal true}, aggregation stages can write data to the + * {@code _tmp} subdirectory in the {@code dbPath} directory. * - * @return {@literal true} if enabled. + * @return {@literal true} if enabled; {@literal false} otherwise (or if not set). */ public boolean isAllowDiskUse() { - return allowDiskUse; + return allowDiskUse.orElse(false); + } + + /** + * Return whether {@link #isAllowDiskUse} is configured. + * + * @return {@literal true} if is {@code allowDiskUse} is configured, {@literal false} otherwise. + * @since 4.2.5 + */ + public boolean isAllowDiskUseSet() { + return allowDiskUse.isPresent(); } /** @@ -335,8 +345,8 @@ public class AggregationOptions implements ReadConcernAware, ReadPreferenceAware Document result = new Document(command); - if (allowDiskUse && !result.containsKey(ALLOW_DISK_USE)) { - result.put(ALLOW_DISK_USE, allowDiskUse); + if (isAllowDiskUseSet() && !result.containsKey(ALLOW_DISK_USE)) { + result.put(ALLOW_DISK_USE, isAllowDiskUse()); } if (explain && !result.containsKey(EXPLAIN)) { @@ -370,7 +380,9 @@ public class AggregationOptions implements ReadConcernAware, ReadPreferenceAware public Document toDocument() { Document document = new Document(); - document.put(ALLOW_DISK_USE, allowDiskUse); + if (isAllowDiskUseSet()) { + document.put(ALLOW_DISK_USE, isAllowDiskUse()); + } document.put(EXPLAIN, explain); cursor.ifPresent(val -> document.put(CURSOR, val)); @@ -410,7 +422,7 @@ public class AggregationOptions implements ReadConcernAware, ReadPreferenceAware */ public static class Builder { - private boolean allowDiskUse; + private Boolean allowDiskUse; private boolean explain; private @Nullable Document cursor; private @Nullable Collation collation; diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationOptionsTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationOptionsTests.java index 719a10d1c..249fea987 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationOptionsTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationOptionsTests.java @@ -77,6 +77,22 @@ class AggregationOptionsTests { assertThat(aggregationOptions.getHintObject()).contains(dummyHint); } + @Test // GH-4664 + void omitsAllowDiskUseByDefault() { + + aggregationOptions = AggregationOptions.fromDocument(new Document()); + + assertThat(aggregationOptions.isAllowDiskUse()).isFalse(); + assertThat(aggregationOptions.isAllowDiskUseSet()).isFalse(); + + assertThat(aggregationOptions.toDocument()).doesNotContainKey("allowDiskUse"); + + Document empty = new Document(); + aggregationOptions.applyAndReturnPotentiallyChangedCommand(empty); + + assertThat(empty).doesNotContainKey("allowDiskUse"); + } + @Test // DATAMONGO-960, DATAMONGO-2153, DATAMONGO-1836 void aggregationOptionsToString() {