Skip to content

Commit 0751e97

Browse files
committed
JAVA-2018: Support bypassDocumentValidation in DBCollection for all types of write operations
insert update findandmodify aggregate (with $out) mapReduce (to a collection)
1 parent b2de715 commit 0751e97

File tree

9 files changed

+686
-59
lines changed

9 files changed

+686
-59
lines changed

driver-core/src/main/com/mongodb/operation/BaseWriteOperation.java

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import com.mongodb.DuplicateKeyException;
2020
import com.mongodb.ErrorCategory;
2121
import com.mongodb.MongoBulkWriteException;
22-
import com.mongodb.MongoClientException;
2322
import com.mongodb.MongoException;
2423
import com.mongodb.MongoNamespace;
2524
import com.mongodb.WriteConcern;
@@ -33,7 +32,6 @@
3332
import com.mongodb.bulk.WriteRequest;
3433
import com.mongodb.connection.AsyncConnection;
3534
import com.mongodb.connection.Connection;
36-
import com.mongodb.connection.ConnectionDescription;
3735
import org.bson.BsonBoolean;
3836
import org.bson.BsonDocument;
3937
import org.bson.BsonInt32;
@@ -47,8 +45,9 @@
4745
import static com.mongodb.internal.async.ErrorHandlingResultCallback.errorHandlingCallback;
4846
import static com.mongodb.operation.OperationHelper.AsyncCallableWithConnection;
4947
import static com.mongodb.operation.OperationHelper.CallableWithConnection;
48+
import static com.mongodb.operation.OperationHelper.bypassDocumentValidationNotSupported;
49+
import static com.mongodb.operation.OperationHelper.getBypassDocumentValidationException;
5050
import static com.mongodb.operation.OperationHelper.releasingCallback;
51-
import static com.mongodb.operation.OperationHelper.serverIsAtLeastVersionThreeDotTwo;
5251
import static com.mongodb.operation.OperationHelper.serverIsAtLeastVersionTwoDotSix;
5352
import static com.mongodb.operation.OperationHelper.withConnection;
5453

@@ -135,7 +134,7 @@ public WriteConcernResult execute(final WriteBinding binding) {
135134
@Override
136135
public WriteConcernResult call(final Connection connection) {
137136
try {
138-
if (bypassDocumentValidationNotSupported(connection.getDescription())) {
137+
if (bypassDocumentValidationNotSupported(bypassDocumentValidation, writeConcern, connection.getDescription())) {
139138
throw getBypassDocumentValidationException();
140139
}
141140
if (writeConcern.isAcknowledged() && serverIsAtLeastVersionTwoDotSix(connection.getDescription())) {
@@ -157,7 +156,7 @@ public void executeAsync(final AsyncWriteBinding binding, final SingleResultCall
157156
public void call(final AsyncConnection connection, final Throwable t) {
158157
if (t != null) {
159158
errorHandlingCallback(callback).onResult(null, t);
160-
} else if (bypassDocumentValidationNotSupported(connection.getDescription())) {
159+
} else if (bypassDocumentValidationNotSupported(bypassDocumentValidation, writeConcern, connection.getDescription())) {
161160
releasingCallback(errorHandlingCallback(callback), connection).onResult(null, getBypassDocumentValidationException());
162161
} else {
163162
final SingleResultCallback<WriteConcernResult> wrappedCallback = releasingCallback(errorHandlingCallback(callback),
@@ -220,15 +219,6 @@ public void onResult(final WriteConcernResult result, final Throwable t) {
220219
*/
221220
protected abstract void executeCommandProtocolAsync(AsyncConnection connection, SingleResultCallback<BulkWriteResult> callback);
222221

223-
private boolean bypassDocumentValidationNotSupported(final ConnectionDescription description) {
224-
return bypassDocumentValidation != null && serverIsAtLeastVersionThreeDotTwo(description) && !writeConcern.isAcknowledged();
225-
}
226-
227-
private MongoClientException getBypassDocumentValidationException() {
228-
return new MongoClientException("Specifying bypassDocumentValidation with an unacknowledged WriteConcern "
229-
+ "is not supported");
230-
}
231-
232222
private MongoException translateException(final Throwable t) {
233223
MongoException checkedError = MongoException.fromThrowable(t);
234224
if (t instanceof MongoBulkWriteException) {

driver-core/src/main/com/mongodb/operation/MixedBulkWriteOperation.java

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package com.mongodb.operation;
1818

1919
import com.mongodb.MongoBulkWriteException;
20-
import com.mongodb.MongoClientException;
2120
import com.mongodb.MongoNamespace;
2221
import com.mongodb.WriteConcern;
2322
import com.mongodb.WriteConcernException;
@@ -58,8 +57,9 @@
5857
import static com.mongodb.internal.async.ErrorHandlingResultCallback.errorHandlingCallback;
5958
import static com.mongodb.operation.OperationHelper.AsyncCallableWithConnection;
6059
import static com.mongodb.operation.OperationHelper.CallableWithConnection;
60+
import static com.mongodb.operation.OperationHelper.bypassDocumentValidationNotSupported;
61+
import static com.mongodb.operation.OperationHelper.getBypassDocumentValidationException;
6162
import static com.mongodb.operation.OperationHelper.releasingCallback;
62-
import static com.mongodb.operation.OperationHelper.serverIsAtLeastVersionThreeDotTwo;
6363
import static com.mongodb.operation.OperationHelper.withConnection;
6464
import static java.lang.String.format;
6565
import static java.util.Arrays.asList;
@@ -168,7 +168,7 @@ public BulkWriteResult execute(final WriteBinding binding) {
168168
return withConnection(binding, new CallableWithConnection<BulkWriteResult>() {
169169
@Override
170170
public BulkWriteResult call(final Connection connection) {
171-
if (bypassDocumentValidationNotSupported(connection.getDescription())) {
171+
if (bypassDocumentValidationNotSupported(bypassDocumentValidation, writeConcern, connection.getDescription())) {
172172
throw getBypassDocumentValidationException();
173173
}
174174

@@ -200,7 +200,7 @@ public void executeAsync(final AsyncWriteBinding binding, final SingleResultCall
200200
public void call(final AsyncConnection connection, final Throwable t) {
201201
if (t != null) {
202202
wrappedCallback.onResult(null, t);
203-
} else if (bypassDocumentValidationNotSupported(connection.getDescription())) {
203+
} else if (bypassDocumentValidationNotSupported(bypassDocumentValidation, writeConcern, connection.getDescription())) {
204204
releasingCallback(wrappedCallback, connection).onResult(null, getBypassDocumentValidationException());
205205
} else {
206206
Iterator<Run> runs = getRunGenerator(connection.getDescription()).iterator();
@@ -211,15 +211,6 @@ public void call(final AsyncConnection connection, final Throwable t) {
211211
});
212212
}
213213

214-
private boolean bypassDocumentValidationNotSupported(final ConnectionDescription description) {
215-
return bypassDocumentValidation != null && serverIsAtLeastVersionThreeDotTwo(description) && !writeConcern.isAcknowledged();
216-
}
217-
218-
private MongoClientException getBypassDocumentValidationException() {
219-
return new MongoClientException("Specifying bypassDocumentValidation with an unacknowledged WriteConcern "
220-
+ "is not supported");
221-
}
222-
223214
private void executeRunsAsync(final Iterator<Run> runs, final AsyncConnection connection,
224215
final BulkWriteBatchCombiner bulkWriteBatchCombiner,
225216
final SingleResultCallback<BulkWriteResult> callback) {

driver-core/src/main/com/mongodb/operation/OperationHelper.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,11 @@
1717
package com.mongodb.operation;
1818

1919
import com.mongodb.Function;
20+
import com.mongodb.MongoClientException;
2021
import com.mongodb.MongoNamespace;
2122
import com.mongodb.ReadConcern;
2223
import com.mongodb.ServerAddress;
24+
import com.mongodb.WriteConcern;
2325
import com.mongodb.async.AsyncBatchCursor;
2426
import com.mongodb.async.SingleResultCallback;
2527
import com.mongodb.binding.AsyncConnectionSource;
@@ -103,6 +105,17 @@ static void checkValidReadConcern(final AsyncConnectionSource source, final Asyn
103105
callable.call(source, connection, throwable);
104106
}
105107

108+
static boolean bypassDocumentValidationNotSupported(final Boolean bypassDocumentValidation, final WriteConcern writeConcern,
109+
final ConnectionDescription description) {
110+
return bypassDocumentValidation != null && serverIsAtLeastVersionThreeDotTwo(description) && !writeConcern.isAcknowledged();
111+
}
112+
113+
static MongoClientException getBypassDocumentValidationException() {
114+
return new MongoClientException("Specifying bypassDocumentValidation with an unacknowledged WriteConcern "
115+
+ "is not supported");
116+
}
117+
118+
106119
static <T> QueryBatchCursor<T> createEmptyBatchCursor(final MongoNamespace namespace, final Decoder<T> decoder,
107120
final ServerAddress serverAddress, final int batchSize) {
108121
return new QueryBatchCursor<T>(new QueryResult<T>(namespace, Collections.<T>emptyList(), 0L,

driver/src/main/com/mongodb/AggregationOptions.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public class AggregationOptions {
3535
private final Boolean allowDiskUse;
3636
private final OutputMode outputMode;
3737
private final long maxTimeMS;
38+
private final Boolean bypassDocumentValidation;
3839

3940
/**
4041
* Enumeration to define where the results of the aggregation will be output.
@@ -58,6 +59,7 @@ public enum OutputMode {
5859
allowDiskUse = builder.allowDiskUse;
5960
outputMode = builder.outputMode;
6061
maxTimeMS = builder.maxTimeMS;
62+
bypassDocumentValidation = builder.bypassDocumentValidation;
6163
}
6264

6365
/**
@@ -103,6 +105,17 @@ public long getMaxTime(final TimeUnit timeUnit) {
103105
return timeUnit.convert(maxTimeMS, MILLISECONDS);
104106
}
105107

108+
/**
109+
* Gets whether to bypass document validation, or null if unspecified. The default is null.
110+
*
111+
* @return whether to bypass document validation, or null if unspecified.
112+
* @since 2.14
113+
* @mongodb.server.release 3.2
114+
*/
115+
public Boolean getBypassDocumentValidation() {
116+
return bypassDocumentValidation;
117+
}
118+
106119
@Override
107120
public String toString() {
108121
StringBuilder sb = new StringBuilder("AggregationOptions{");
@@ -114,6 +127,8 @@ public String toString() {
114127
.append(outputMode);
115128
sb.append(", maxTimeMS=")
116129
.append(maxTimeMS);
130+
sb.append(", bypassDocumentValidation=")
131+
.append(bypassDocumentValidation);
117132
sb.append('}');
118133
return sb.toString();
119134
}
@@ -139,6 +154,7 @@ public static class Builder {
139154
private Boolean allowDiskUse;
140155
private OutputMode outputMode = OutputMode.INLINE;
141156
private long maxTimeMS;
157+
private Boolean bypassDocumentValidation;
142158

143159
private Builder() {
144160
}
@@ -193,6 +209,19 @@ public Builder maxTime(final long maxTime, final TimeUnit timeUnit) {
193209
return this;
194210
}
195211

212+
/**
213+
* Sets whether to bypass document validation.
214+
*
215+
* @param bypassDocumentValidation whether to bypass document validation, or null if unspecified
216+
* @return this
217+
* @since 2.14
218+
* @mongodb.server.release 3.2
219+
*/
220+
public Builder bypassDocumentValidation(final Boolean bypassDocumentValidation) {
221+
this.bypassDocumentValidation = bypassDocumentValidation;
222+
return this;
223+
}
224+
196225
/**
197226
* Return the options based on this builder.
198227
*

driver/src/main/com/mongodb/BulkWriteOperation.java

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public class BulkWriteOperation {
4141
private final boolean ordered;
4242
private final DBCollection collection;
4343
private final List<WriteRequest> requests = new ArrayList<WriteRequest>();
44+
private Boolean bypassDocumentValidation;
4445
private boolean closed;
4546

4647
BulkWriteOperation(final boolean ordered, final DBCollection collection) {
@@ -59,6 +60,28 @@ public boolean isOrdered() {
5960
return ordered;
6061
}
6162

63+
/**
64+
* Gets whether to bypass document validation, or null if unspecified. The default is null.
65+
*
66+
* @return whether to bypass document validation, or null if unspecified.
67+
* @since 2.14
68+
* @mongodb.server.release 3.2
69+
*/
70+
public Boolean getBypassDocumentValidation() {
71+
return bypassDocumentValidation;
72+
}
73+
74+
/**
75+
* Sets whether to bypass document validation.
76+
*
77+
* @param bypassDocumentValidation whether to bypass document validation, or null if unspecified
78+
* @since 2.14
79+
* @mongodb.server.release 3.2
80+
*/
81+
public void setBypassDocumentValidation(final Boolean bypassDocumentValidation) {
82+
this.bypassDocumentValidation = bypassDocumentValidation;
83+
}
84+
6285
/**
6386
* Add an insert request to the bulk operation
6487
*
@@ -95,7 +118,7 @@ public BulkWriteRequestBuilder find(final DBObject query) {
95118
public BulkWriteResult execute() {
96119
isTrue("already executed", !closed);
97120
closed = true;
98-
return collection.executeBulkWriteOperation(ordered, requests);
121+
return collection.executeBulkWriteOperation(ordered, bypassDocumentValidation, requests);
99122
}
100123

101124
/**
@@ -110,7 +133,7 @@ public BulkWriteResult execute() {
110133
public BulkWriteResult execute(final WriteConcern writeConcern) {
111134
isTrue("already executed", !closed);
112135
closed = true;
113-
return collection.executeBulkWriteOperation(ordered, requests, writeConcern);
136+
return collection.executeBulkWriteOperation(ordered, bypassDocumentValidation, requests, writeConcern);
114137
}
115138

116139
void addRequest(final WriteRequest request) {

0 commit comments

Comments
 (0)