Skip to content

Commit 4d7a0d5

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 a97d7d8 commit 4d7a0d5

File tree

3 files changed

+33
-28
lines changed

3 files changed

+33
-28
lines changed

driver-core/src/test/functional/com/mongodb/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/operation/MapReduceWithInlineResultsOperationSpecification.groovy

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,14 @@ import com.mongodb.connection.ServerVersion
3636
import com.mongodb.session.SessionContext
3737
import org.bson.BsonBoolean
3838
import org.bson.BsonDocument
39+
import org.bson.BsonDouble
3940
import org.bson.BsonInt32
4041
import org.bson.BsonInt64
4142
import org.bson.BsonJavaScript
4243
import org.bson.BsonString
4344
import org.bson.BsonTimestamp
4445
import org.bson.Document
46+
import org.bson.codecs.BsonDocumentCodec
4547
import org.bson.codecs.DocumentCodec
4648
import spock.lang.IgnoreIf
4749

@@ -52,18 +54,18 @@ import static com.mongodb.operation.OperationReadConcernHelper.appendReadConcern
5254
import static java.util.concurrent.TimeUnit.MILLISECONDS
5355

5456
class MapReduceWithInlineResultsOperationSpecification extends OperationFunctionalSpecification {
55-
private final documentCodec = new DocumentCodec()
56-
def mapReduceOperation = new MapReduceWithInlineResultsOperation<Document>(
57+
private final bsonDocumentCodec = new BsonDocumentCodec()
58+
def mapReduceOperation = new MapReduceWithInlineResultsOperation<BsonDocument>(
5759
getNamespace(),
5860
new BsonJavaScript('function(){ emit( this.name , 1 ); }'),
5961
new BsonJavaScript('function(key, values){ return values.length; }'),
60-
documentCodec)
62+
bsonDocumentCodec)
6163

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

6567
def setup() {
66-
CollectionHelper<Document> helper = new CollectionHelper<Document>(documentCodec, getNamespace())
68+
CollectionHelper<BsonDocument> helper = new CollectionHelper<BsonDocument>(bsonDocumentCodec, getNamespace())
6769
Document pete = new Document('name', 'Pete').append('job', 'handyman')
6870
Document sam = new Document('name', 'Sam').append('job', 'plumber')
6971
Document pete2 = new Document('name', 'Pete').append('job', 'electrician')
@@ -74,7 +76,7 @@ class MapReduceWithInlineResultsOperationSpecification extends OperationFunction
7476
when:
7577
def mapF = new BsonJavaScript('function(){ }')
7678
def reduceF = new BsonJavaScript('function(key, values){ }')
77-
def operation = new MapReduceWithInlineResultsOperation<Document>(helper.namespace, mapF, reduceF, documentCodec)
79+
def operation = new MapReduceWithInlineResultsOperation<BsonDocument>(helper.namespace, mapF, reduceF, bsonDocumentCodec)
7880

7981
then:
8082
operation.getMapFunction() == mapF
@@ -98,7 +100,7 @@ class MapReduceWithInlineResultsOperationSpecification extends OperationFunction
98100
def finalizeF = new BsonJavaScript('function(key, value){}')
99101
def mapF = new BsonJavaScript('function(){ }')
100102
def reduceF = new BsonJavaScript('function(key, values){ }')
101-
def operation = new MapReduceWithInlineResultsOperation<Document>(helper.namespace, mapF, reduceF, documentCodec)
103+
def operation = new MapReduceWithInlineResultsOperation<BsonDocument>(helper.namespace, mapF, reduceF, bsonDocumentCodec)
102104
.filter(filter)
103105
.finalizeFunction(finalizeF)
104106
.scope(scope)
@@ -128,7 +130,7 @@ class MapReduceWithInlineResultsOperationSpecification extends OperationFunction
128130
def operation = mapReduceOperation
129131

130132
when:
131-
def results = executeAndCollectBatchCursorResults(operation, async)
133+
def results = executeAndCollectBatchCursorResults(operation, async) as Set
132134

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

145147
then:
146148
testOperationSlaveOk(operation, [3, 4, 0], readPreference, async, helper.commandResult)
@@ -152,7 +154,7 @@ class MapReduceWithInlineResultsOperationSpecification extends OperationFunction
152154
def 'should create the expected command'() {
153155
when:
154156
def operation = new MapReduceWithInlineResultsOperation<Document>(helper.namespace, new BsonJavaScript('function(){ }'),
155-
new BsonJavaScript('function(key, values){ }'), documentCodec)
157+
new BsonJavaScript('function(key, values){ }'), bsonDocumentCodec)
156158
def expectedCommand = new BsonDocument('mapreduce', new BsonString(helper.namespace.getCollectionName()))
157159
.append('map', operation.getMapFunction())
158160
.append('reduce', operation.getReduceFunction())
@@ -199,8 +201,8 @@ class MapReduceWithInlineResultsOperationSpecification extends OperationFunction
199201

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

205207
when:
206208
testOperationThrows(operation, [3, 0, 0], readConcern, async)
@@ -215,8 +217,8 @@ class MapReduceWithInlineResultsOperationSpecification extends OperationFunction
215217

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

221223
when:
222224
testOperationThrows(operation, [3, 2, 0], async)
@@ -234,16 +236,16 @@ class MapReduceWithInlineResultsOperationSpecification extends OperationFunction
234236
given:
235237
def document = Document.parse('{_id: 1, str: "foo"}')
236238
getCollectionHelper().insertDocuments(document)
237-
def operation = new MapReduceWithInlineResultsOperation<Document>(
239+
def operation = new MapReduceWithInlineResultsOperation<BsonDocument>(
238240
namespace,
239241
new BsonJavaScript('function(){ emit( this._id, this.str ); }'),
240242
new BsonJavaScript('function(key, values){ return key, values; }'),
241-
documentCodec)
243+
bsonDocumentCodec)
242244
.filter(BsonDocument.parse('{str: "FOO"}'))
243245
.collation(caseInsensitiveCollation)
244246

245247
when:
246-
def results = executeAndCollectBatchCursorResults(operation, async)
248+
def results = executeAndCollectBatchCursorResults(operation, async) as Set
247249

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

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

276278
when:
277279
operation.execute(binding)
@@ -317,8 +319,8 @@ class MapReduceWithInlineResultsOperationSpecification extends OperationFunction
317319
}''')
318320
appendReadConcernToCommand(sessionContext, commandDocument)
319321

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

323325
when:
324326
executeAsync(operation, binding)

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import static org.junit.Assert.assertEquals;
4040
import static org.junit.Assert.assertNotNull;
4141
import static org.junit.Assert.assertThat;
42+
import static org.junit.Assert.assertTrue;
4243

4344
public class MongoCollectionTest extends DatabaseTestCase {
4445

@@ -135,8 +136,8 @@ public void testMapReduceWithGenerics() {
135136
List<Name> result = collection.mapReduce(mapFunction, reduceFunction, Name.class).into(new ArrayList<Name>());
136137

137138
// then
138-
assertEquals(new Name("Pete", 2), result.get(0));
139-
assertEquals(new Name("Sam", 1), result.get(1));
139+
assertTrue(result.contains(new Name("Pete", 2)));
140+
assertTrue(result.contains(new Name("Sam", 1)));
140141
}
141142

142143
@Test

0 commit comments

Comments
 (0)