Skip to content

Commit 4a1b4cb

Browse files
committed
Remove assumptions about result order for mapReduce
Several driver tests assume mapReduce results are returned in a particular order even in the absence of a sort criteria. Remove those assumptions by comparing the results as a Set instead of a List JAVA-3555
1 parent e397462 commit 4a1b4cb

File tree

3 files changed

+32
-28
lines changed

3 files changed

+32
-28
lines changed

driver-core/src/test/functional/com/mongodb/internal/operation/MapReduceToCollectionOperationSpecification.groovy

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,13 @@ import com.mongodb.client.model.ValidationOptions
2727
import com.mongodb.client.test.CollectionHelper
2828
import org.bson.BsonBoolean
2929
import org.bson.BsonDocument
30+
import org.bson.BsonDouble
3031
import org.bson.BsonInt32
3132
import org.bson.BsonInt64
3233
import org.bson.BsonJavaScript
3334
import org.bson.BsonString
3435
import org.bson.Document
36+
import org.bson.codecs.BsonDocumentCodec
3537
import org.bson.codecs.DocumentCodec
3638
import spock.lang.IgnoreIf
3739

@@ -48,9 +50,9 @@ class MapReduceToCollectionOperationSpecification extends OperationFunctionalSpe
4850
new BsonJavaScript('function(){ emit( this.name , 1 ); }'),
4951
new BsonJavaScript('function(key, values){ return values.length; }'),
5052
mapReduceOutputNamespace.getCollectionName())
51-
def expectedResults = [['_id': 'Pete', 'value': 2.0] as Document,
52-
['_id': 'Sam', 'value': 1.0] as Document]
53-
def helper = new CollectionHelper<Document>(new DocumentCodec(), mapReduceOutputNamespace)
53+
def expectedResults = [new BsonDocument('_id', new BsonString('Pete')).append('value', new BsonDouble(2.0)),
54+
new BsonDocument('_id', new BsonString('Sam')).append('value', new BsonDouble(1.0))] as Set
55+
def helper = new CollectionHelper<BsonDocument>(new BsonDocumentCodec(), mapReduceOutputNamespace)
5456

5557
def setup() {
5658
CollectionHelper<Document> helper = new CollectionHelper<Document>(new DocumentCodec(), mapReduceInputNamespace)
@@ -146,7 +148,7 @@ class MapReduceToCollectionOperationSpecification extends OperationFunctionalSpe
146148
results.inputCount == 3
147149
results.outputCount == 2
148150
helper.count() == 2
149-
helper.find() == expectedResults
151+
helper.find() as Set == expectedResults
150152

151153
where:
152154
async << [true, false]

driver-core/src/test/functional/com/mongodb/internal/operation/MapReduceWithInlineResultsOperationSpecification.groovy

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,14 @@ import com.mongodb.internal.connection.Connection
3535
import com.mongodb.internal.session.SessionContext
3636
import org.bson.BsonBoolean
3737
import org.bson.BsonDocument
38+
import org.bson.BsonDouble
3839
import org.bson.BsonInt32
3940
import org.bson.BsonInt64
4041
import org.bson.BsonJavaScript
4142
import org.bson.BsonString
4243
import org.bson.BsonTimestamp
4344
import org.bson.Document
45+
import org.bson.codecs.BsonDocumentCodec
4446
import org.bson.codecs.DocumentCodec
4547
import spock.lang.IgnoreIf
4648

@@ -51,18 +53,18 @@ import static com.mongodb.internal.operation.OperationReadConcernHelper.appendRe
5153
import static java.util.concurrent.TimeUnit.MILLISECONDS
5254

5355
class MapReduceWithInlineResultsOperationSpecification extends OperationFunctionalSpecification {
54-
private final documentCodec = new DocumentCodec()
55-
def mapReduceOperation = new MapReduceWithInlineResultsOperation<Document>(
56+
private final bsonDocumentCodec = new BsonDocumentCodec()
57+
def mapReduceOperation = new MapReduceWithInlineResultsOperation<BsonDocument>(
5658
getNamespace(),
5759
new BsonJavaScript('function(){ emit( this.name , 1 ); }'),
5860
new BsonJavaScript('function(key, values){ return values.length; }'),
59-
documentCodec)
61+
bsonDocumentCodec)
6062

61-
def expectedResults = [['_id': 'Pete', 'value': 2.0] as Document,
62-
['_id': 'Sam', 'value': 1.0] as Document]
63+
def expectedResults = [new BsonDocument('_id', new BsonString('Pete')).append('value', new BsonDouble(2.0)),
64+
new BsonDocument('_id', new BsonString('Sam')).append('value', new BsonDouble(1.0))] as Set
6365

6466
def setup() {
65-
CollectionHelper<Document> helper = new CollectionHelper<Document>(documentCodec, getNamespace())
67+
CollectionHelper<BsonDocument> helper = new CollectionHelper<BsonDocument>(bsonDocumentCodec, getNamespace())
6668
Document pete = new Document('name', 'Pete').append('job', 'handyman')
6769
Document sam = new Document('name', 'Sam').append('job', 'plumber')
6870
Document pete2 = new Document('name', 'Pete').append('job', 'electrician')
@@ -73,7 +75,7 @@ class MapReduceWithInlineResultsOperationSpecification extends OperationFunction
7375
when:
7476
def mapF = new BsonJavaScript('function(){ }')
7577
def reduceF = new BsonJavaScript('function(key, values){ }')
76-
def operation = new MapReduceWithInlineResultsOperation<Document>(helper.namespace, mapF, reduceF, documentCodec)
78+
def operation = new MapReduceWithInlineResultsOperation<BsonDocument>(helper.namespace, mapF, reduceF, bsonDocumentCodec)
7779

7880
then:
7981
operation.getMapFunction() == mapF
@@ -97,7 +99,7 @@ class MapReduceWithInlineResultsOperationSpecification extends OperationFunction
9799
def finalizeF = new BsonJavaScript('function(key, value){}')
98100
def mapF = new BsonJavaScript('function(){ }')
99101
def reduceF = new BsonJavaScript('function(key, values){ }')
100-
def operation = new MapReduceWithInlineResultsOperation<Document>(helper.namespace, mapF, reduceF, documentCodec)
102+
def operation = new MapReduceWithInlineResultsOperation<BsonDocument>(helper.namespace, mapF, reduceF, bsonDocumentCodec)
101103
.filter(filter)
102104
.finalizeFunction(finalizeF)
103105
.scope(scope)
@@ -127,7 +129,7 @@ class MapReduceWithInlineResultsOperationSpecification extends OperationFunction
127129
def operation = mapReduceOperation
128130

129131
when:
130-
def results = executeAndCollectBatchCursorResults(operation, async)
132+
def results = executeAndCollectBatchCursorResults(operation, async) as Set
131133

132134
then:
133135
results == expectedResults
@@ -139,7 +141,7 @@ class MapReduceWithInlineResultsOperationSpecification extends OperationFunction
139141
def 'should use the ReadBindings readPreference to set slaveOK'() {
140142
when:
141143
def operation = new MapReduceWithInlineResultsOperation<Document>(helper.namespace, new BsonJavaScript('function(){ }'),
142-
new BsonJavaScript('function(key, values){ }'), documentCodec)
144+
new BsonJavaScript('function(key, values){ }'), bsonDocumentCodec)
143145

144146
then:
145147
testOperationSlaveOk(operation, [3, 4, 0], readPreference, async, helper.commandResult)
@@ -151,7 +153,7 @@ class MapReduceWithInlineResultsOperationSpecification extends OperationFunction
151153
def 'should create the expected command'() {
152154
when:
153155
def operation = new MapReduceWithInlineResultsOperation<Document>(helper.namespace, new BsonJavaScript('function(){ }'),
154-
new BsonJavaScript('function(key, values){ }'), documentCodec)
156+
new BsonJavaScript('function(key, values){ }'), bsonDocumentCodec)
155157
def expectedCommand = new BsonDocument('mapreduce', new BsonString(helper.namespace.getCollectionName()))
156158
.append('map', operation.getMapFunction())
157159
.append('reduce', operation.getReduceFunction())
@@ -198,8 +200,8 @@ class MapReduceWithInlineResultsOperationSpecification extends OperationFunction
198200

199201
def 'should throw an exception when using an unsupported ReadConcern'() {
200202
given:
201-
def operation = new MapReduceWithInlineResultsOperation<Document>(helper.namespace, new BsonJavaScript('function(){ }'),
202-
new BsonJavaScript('function(key, values){ }'), documentCodec)
203+
def operation = new MapReduceWithInlineResultsOperation<BsonDocument>(helper.namespace, new BsonJavaScript('function(){ }'),
204+
new BsonJavaScript('function(key, values){ }'), bsonDocumentCodec)
203205

204206
when:
205207
testOperationThrows(operation, [3, 0, 0], readConcern, async)
@@ -214,8 +216,8 @@ class MapReduceWithInlineResultsOperationSpecification extends OperationFunction
214216

215217
def 'should throw an exception when using an unsupported Collation'() {
216218
given:
217-
def operation = new MapReduceWithInlineResultsOperation<Document>(helper.namespace, new BsonJavaScript('function(){ }'),
218-
new BsonJavaScript('function(key, values){ }'), documentCodec).collation(defaultCollation)
219+
def operation = new MapReduceWithInlineResultsOperation<BsonDocument>(helper.namespace, new BsonJavaScript('function(){ }'),
220+
new BsonJavaScript('function(key, values){ }'), bsonDocumentCodec).collation(defaultCollation)
219221

220222
when:
221223
testOperationThrows(operation, [3, 2, 0], async)
@@ -233,16 +235,16 @@ class MapReduceWithInlineResultsOperationSpecification extends OperationFunction
233235
given:
234236
def document = Document.parse('{_id: 1, str: "foo"}')
235237
getCollectionHelper().insertDocuments(document)
236-
def operation = new MapReduceWithInlineResultsOperation<Document>(
238+
def operation = new MapReduceWithInlineResultsOperation<BsonDocument>(
237239
namespace,
238240
new BsonJavaScript('function(){ emit( this._id, this.str ); }'),
239241
new BsonJavaScript('function(key, values){ return key, values; }'),
240-
documentCodec)
242+
bsonDocumentCodec)
241243
.filter(BsonDocument.parse('{str: "FOO"}'))
242244
.collation(caseInsensitiveCollation)
243245

244246
when:
245-
def results = executeAndCollectBatchCursorResults(operation, async)
247+
def results = executeAndCollectBatchCursorResults(operation, async) as Set
246248

247249
then:
248250
results == [Document.parse('{_id: 1.0, value: "foo"}')]
@@ -269,8 +271,8 @@ class MapReduceWithInlineResultsOperationSpecification extends OperationFunction
269271
}''')
270272
appendReadConcernToCommand(sessionContext, commandDocument)
271273

272-
def operation = new MapReduceWithInlineResultsOperation<Document>(helper.namespace, new BsonJavaScript('function(){ }'),
273-
new BsonJavaScript('function(key, values){ }'), documentCodec)
274+
def operation = new MapReduceWithInlineResultsOperation<BsonDocument>(helper.namespace, new BsonJavaScript('function(){ }'),
275+
new BsonJavaScript('function(key, values){ }'), bsonDocumentCodec)
274276

275277
when:
276278
operation.execute(binding)
@@ -316,8 +318,8 @@ class MapReduceWithInlineResultsOperationSpecification extends OperationFunction
316318
}''')
317319
appendReadConcernToCommand(sessionContext, commandDocument)
318320

319-
def operation = new MapReduceWithInlineResultsOperation<Document>(helper.namespace, new BsonJavaScript('function(){ }'),
320-
new BsonJavaScript('function(key, values){ }'), documentCodec)
321+
def operation = new MapReduceWithInlineResultsOperation<BsonDocument>(helper.namespace, new BsonJavaScript('function(){ }'),
322+
new BsonJavaScript('function(key, values){ }'), bsonDocumentCodec)
321323

322324
when:
323325
executeAsync(operation, binding)

driver-sync/src/test/functional/com/mongodb/client/MongoCollectionTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,8 @@ public void testMapReduceWithGenerics() {
155155
List<Name> result = collection.mapReduce(mapFunction, reduceFunction, Name.class).into(new ArrayList<Name>());
156156

157157
// then
158-
assertEquals(new Name("Pete", 2), result.get(0));
159-
assertEquals(new Name("Sam", 1), result.get(1));
158+
assertTrue(result.contains(new Name("Pete", 2)));
159+
assertTrue(result.contains(new Name("Sam", 1)));
160160
}
161161

162162
@Test

0 commit comments

Comments
 (0)