/*
* Copyright (c) 2008-2014 MongoDB, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.mongodb.client;
import com.mongodb.DBRef;
import com.mongodb.Function;
import com.mongodb.ReadPreference;
import com.mongodb.WriteConcern;
import org.bson.Document;
import org.bson.codecs.BsonValueCodecProvider;
import org.bson.codecs.DocumentCodec;
import org.bson.codecs.DocumentCodecProvider;
import org.bson.codecs.ValueCodecProvider;
import org.bson.codecs.configuration.CodecRegistry;
import org.bson.types.ObjectId;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static com.mongodb.ClusterFixture.serverVersionAtLeast;
import static java.util.Arrays.asList;
import static org.bson.codecs.configuration.CodecRegistries.fromProviders;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assume.assumeTrue;
public class MongoCollectionTest extends DatabaseTestCase {
@Test
public void testFindAndUpdateWithGenerics() {
CodecRegistry codecRegistry = fromProviders(asList(new ValueCodecProvider(), new DocumentCodecProvider(),
new BsonValueCodecProvider(), new ConcreteCodecProvider()));
MongoCollection<Concrete> collection = database
.getCollection(getCollectionName())
.withDocumentClass(Concrete.class)
.withCodecRegistry(codecRegistry)
.withReadPreference(ReadPreference.primary())
.withWriteConcern(WriteConcern.ACKNOWLEDGED);
Concrete doc = new Concrete(new ObjectId(), "str", 5, 10L, 4.0, 3290482390480L);
collection.insertOne(doc);
Concrete newDoc = collection.findOneAndUpdate(new Document("i", 5),
new Document("$set", new Document("i", 6)));
assertNotNull(newDoc);
assertEquals(doc, newDoc);
}
@Test
public void shouldBeAbleToQueryTypedCollectionAndMapResultsIntoTypedLists() {
// given
CodecRegistry codecRegistry = fromProviders(asList(new ValueCodecProvider(), new DocumentCodecProvider(),
new BsonValueCodecProvider(), new ConcreteCodecProvider()));
MongoCollection<Concrete> collection = database
.getCollection(getCollectionName())
.withDocumentClass(Concrete.class)
.withCodecRegistry(codecRegistry)
.withReadPreference(ReadPreference.primary())
.withWriteConcern(WriteConcern.ACKNOWLEDGED);
Concrete firstItem = new Concrete("first", 1, 2L, 3.0, 5L);
collection.insertOne(firstItem);
Concrete secondItem = new Concrete("second", 7, 11L, 13.0, 17L);
collection.insertOne(secondItem);
// when
List<String> listOfStringObjectIds = collection.find(new Document("i", 1))
.map(new Function<Concrete, ObjectId>() {
@Override
public ObjectId apply(final Concrete concrete) {
return concrete.getId();
}
})
.map(new Function<ObjectId, String>() {
@Override
public String apply(final ObjectId objectId) {
return objectId.toString();
}
}).into(new ArrayList<String>());
// then
assertThat(listOfStringObjectIds.size(), is(1));
assertThat(listOfStringObjectIds.get(0), is(firstItem.getId().toString()));
// when
List<ObjectId> listOfObjectIds = collection.find(new Document("i", 1))
.map(new Function<Concrete, ObjectId>() {
@Override
public ObjectId apply(final Concrete concrete) {
return concrete.getId();
}
})
.into(new ArrayList<ObjectId>());
// then
assertThat(listOfObjectIds.size(), is(1));
assertThat(listOfObjectIds.get(0), is(firstItem.getId()));
}
@Test
public void testMapReduceWithGenerics() {
// given
CodecRegistry codecRegistry = fromProviders(asList(new DocumentCodecProvider(), new NameCodecProvider()));
getCollectionHelper().insertDocuments(new DocumentCodec(), new Document("name", "Pete").append("job", "handyman"),
new Document("name", "Sam").append("job", "Plumber"),
new Document("name", "Pete").append("job", "'electrician'"));
String mapFunction = "function(){ emit( this.name , 1 ); }";
String reduceFunction = "function(key, values){ return values.length; }";
MongoCollection<Document> collection = database
.getCollection(getCollectionName())
.withCodecRegistry(codecRegistry)
.withReadPreference(ReadPreference.primary())
.withWriteConcern(WriteConcern.ACKNOWLEDGED);
// when
List<Name> result = collection.mapReduce(mapFunction, reduceFunction, Name.class).into(new ArrayList<Name>());
// then
assertEquals(new Name("Pete", 2), result.get(0));
assertEquals(new Name("Sam", 1), result.get(1));
}
@Test
public void testAggregationToACollection() {
assumeTrue(serverVersionAtLeast(2, 6));
// given
List<Document> documents = asList(new Document("_id", 1), new Document("_id", 2));
getCollectionHelper().insertDocuments(new DocumentCodec(), documents);
MongoCollection<Document> collection = database
.getCollection(getCollectionName());
// when
List<Document> result = collection.aggregate(Collections.singletonList(new Document("$out", "outCollection")))
.into(new ArrayList<Document>());
// then
assertEquals(documents, result);
}
// This is really a test that the default registry created in MongoClient and passed down to MongoCollection has been constructed
// properly to handle DBRef encoding and decoding
@Test
public void testDBRefEncodingAndDecoding() {
// given
Document doc = new Document("_id", 1)
.append("ref", new DBRef("foo", 5))
.append("refWithDB", new DBRef("db", "foo", 5));
// when
collection.insertOne(doc);
// then
assertEquals(doc, collection.find().first());
}
}