package org.mongodb.morphia.query;
import com.mongodb.BasicDBObject;
import com.mongodb.MongoException;
import org.bson.types.ObjectId;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mongodb.morphia.Datastore;
import org.mongodb.morphia.TestBase;
import org.mongodb.morphia.annotations.Entity;
import org.mongodb.morphia.annotations.Field;
import org.mongodb.morphia.annotations.Id;
import org.mongodb.morphia.annotations.Index;
import org.mongodb.morphia.annotations.Indexes;
import java.util.List;
public class TestMaxMin extends TestBase {
@Override
@Before
public void setUp() {
super.setUp();
getMorphia().map(IndexedEntity.class);
getDs().ensureIndexes();
}
@SuppressWarnings("deprecation")
@Test(expected = MongoException.class)
public void testExceptionForIndexMismatchOld() throws Exception {
getDs().find(IndexedEntity.class).lowerIndexBound(new BasicDBObject("doesNotExist", 1)).get();
}
@Test(expected = MongoException.class)
public void testExceptionForIndexMismatch() throws Exception {
getDs().find(IndexedEntity.class).get(new FindOptions()
.modifier("$min", new BasicDBObject("doesNotExist", 1)));
}
@Test
@SuppressWarnings("deprecation")
public void testMax() {
final IndexedEntity a = new IndexedEntity("a");
final IndexedEntity b = new IndexedEntity("b");
final IndexedEntity c = new IndexedEntity("c");
Datastore ds = getDs();
ds.save(a);
ds.save(b);
ds.save(c);
Assert.assertEquals("last", b.id, ds.find(IndexedEntity.class)
.order("-id")
.upperIndexBound(new BasicDBObject("testField", "c"))
.get()
.id);
Assert.assertEquals("last", b.id, ds.find(IndexedEntity.class)
.order("-id")
.get(new FindOptions()
.modifier("$max", new BasicDBObject("testField", "c")))
.id);
}
@Test
@SuppressWarnings("deprecation")
public void testMaxCompoundIndex() {
final IndexedEntity a1 = new IndexedEntity("a");
final IndexedEntity a2 = new IndexedEntity("a");
final IndexedEntity b1 = new IndexedEntity("b");
final IndexedEntity b2 = new IndexedEntity("b");
final IndexedEntity c1 = new IndexedEntity("c");
final IndexedEntity c2 = new IndexedEntity("c");
Datastore ds = getDs();
ds.save(a1);
ds.save(a2);
ds.save(b1);
ds.save(b2);
ds.save(c1);
ds.save(c2);
List<IndexedEntity> l = ds.find(IndexedEntity.class).order("testField, id")
.upperIndexBound(new BasicDBObject("testField", "b").append("_id", b2.id)).asList();
Assert.assertEquals("size", 3, l.size());
Assert.assertEquals("item", b1.id, l.get(2).id);
l = ds.find(IndexedEntity.class).order("testField, id")
.asList(new FindOptions()
.modifier("$max", new BasicDBObject("testField", "b").append("_id", b2.id)));
Assert.assertEquals("size", 3, l.size());
Assert.assertEquals("item", b1.id, l.get(2).id);
}
@Test
@SuppressWarnings("deprecation")
public void testMin() {
final IndexedEntity a = new IndexedEntity("a");
final IndexedEntity b = new IndexedEntity("b");
final IndexedEntity c = new IndexedEntity("c");
Datastore ds = getDs();
ds.save(a);
ds.save(b);
ds.save(c);
Assert.assertEquals("last", b.id, ds.find(IndexedEntity.class).order("id")
.lowerIndexBound(new BasicDBObject("testField", "b")).get().id);
Assert.assertEquals("last", b.id, ds.find(IndexedEntity.class).order("id")
.get(new FindOptions().modifier("$min", new BasicDBObject("testField", "b")))
.id);
}
@Test
@SuppressWarnings("deprecation")
public void testMinCompoundIndex() {
final IndexedEntity a1 = new IndexedEntity("a");
final IndexedEntity a2 = new IndexedEntity("a");
final IndexedEntity b1 = new IndexedEntity("b");
final IndexedEntity b2 = new IndexedEntity("b");
final IndexedEntity c1 = new IndexedEntity("c");
final IndexedEntity c2 = new IndexedEntity("c");
Datastore ds = getDs();
ds.save(a1);
ds.save(a2);
ds.save(b1);
ds.save(b2);
ds.save(c1);
ds.save(c2);
List<IndexedEntity> l = ds.find(IndexedEntity.class).order("testField, id")
.lowerIndexBound(new BasicDBObject("testField", "b").append("_id", b1.id)).asList();
Assert.assertEquals("size", 4, l.size());
Assert.assertEquals("item", b1.id, l.get(0).id);
l = ds.find(IndexedEntity.class).order("testField, id")
.asList(new FindOptions().modifier("$min", new BasicDBObject("testField", "b").append("_id", b1.id)));
Assert.assertEquals("size", 4, l.size());
Assert.assertEquals("item", b1.id, l.get(0).id);
}
@Entity("IndexedEntity")
@Indexes({
@Index(fields = @Field("testField")),
@Index(fields = {@Field("testField"), @Field("_id")})})
private static final class IndexedEntity {
@Id
private ObjectId id;
private String testField;
private IndexedEntity(final String testField) {
this.testField = testField;
}
private IndexedEntity() {
}
}
}