Do not set AggregationOptions.allowDiskUse by default.

With MongoDB changing its default, we now no longer set allowDiskUse to false if the value is not configured.

Closes: #4664
Original Pull Request: #4666
This commit is contained in:
Mark Paluch
2024-03-19 10:03:01 +01:00
committed by Christoph Strobl
parent 34eff501c2
commit 52ba939bd7
4 changed files with 55 additions and 18 deletions

View File

@@ -2191,8 +2191,11 @@ public class MongoTemplate
.getCollation());
AggregateIterable<Document> 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<Document> cursor = delegate.prepare(collection).aggregate(pipeline, Document.class) //
.allowDiskUse(options.isAllowDiskUse());
AggregateIterable<Document> 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());

View File

@@ -1027,8 +1027,11 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
@Nullable Class<?> inputType) {
ReactiveCollectionPreparerDelegate collectionPreparer = ReactiveCollectionPreparerDelegate.of(options);
AggregatePublisher<Document> cursor = collectionPreparer.prepare(collection).aggregate(pipeline, Document.class)
.allowDiskUse(options.isAllowDiskUse());
AggregatePublisher<Document> 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());

View File

@@ -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<Boolean> allowDiskUse;
private final boolean explain;
private final Optional<Document> cursor;
private final Optional<Collation> 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;

View File

@@ -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() {