package org.mongodb.morphia.query;
import com.mongodb.MongoException;
import org.bson.types.ObjectId;
import org.junit.Assert;
import org.junit.Test;
import org.mongodb.morphia.Key;
import org.mongodb.morphia.TestBase;
import org.mongodb.morphia.annotations.Entity;
import org.mongodb.morphia.annotations.Id;
import org.mongodb.morphia.annotations.Reference;
import org.mongodb.morphia.testutil.TestEntity;
import org.slf4j.Logger;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import static org.slf4j.LoggerFactory.getLogger;
/**
* @author scotthernandez
*/
public class QueryInTest extends TestBase {
private static final Logger LOG = getLogger(QueryInTest.class);
@Test
public void testAddEmpty() {
Query<Data> query = getDs().find(Data.class);
List<ObjectId> memberships = new ArrayList<ObjectId>();
query.or(
query.criteria("id").hasAnyOf(memberships),
query.criteria("otherIds").hasAnyOf(memberships)
);
List<Data> dataList = query.asList();
Assert.assertEquals(0, dataList.size());
}
@Test
public void testIdOnly() {
ReferencedEntity b = new ReferencedEntity();
b.setId(new ObjectId("111111111111111111111111"));
getDs().save(b);
HasIdOnly has = new HasIdOnly();
has.list = new ArrayList<ReferencedEntity>();
has.list.add(b);
has.entity = b;
getDs().save(has);
Query<HasIdOnly> q = getDs().find(HasIdOnly.class);
q.criteria("list").in(Arrays.asList(b));
Assert.assertEquals(1, q.asList().size());
q = getDs().find(HasIdOnly.class);
q.criteria("entity").equal(b.getId());
Assert.assertEquals(1, q.asList().size());
}
@Test
public void testInIdList() throws Exception {
final Doc doc = new Doc();
doc.id = 1;
getDs().save(doc);
// this works
getDs().find(Doc.class).field("_id").equal(1).asList();
final List<Long> idList = new ArrayList<Long>();
idList.add(1L);
// this causes an NPE
getDs().find(Doc.class).field("_id").in(idList).asList();
}
@Test
public void testInQuery() throws Exception {
checkMinServerVersion(2.5);
final HasRefs hr = new HasRefs();
for (int x = 0; x < 10; x++) {
final ReferencedEntity re = new ReferencedEntity("" + x);
hr.refs.add(re);
}
getDs().save(hr.refs);
getDs().save(hr);
Query<HasRefs> query = getDs().find(HasRefs.class).field("refs").in(hr.refs.subList(1, 3));
final List<HasRefs> res = query.asList();
Assert.assertEquals(1, res.size());
}
@Test
public void testInQueryByKey() throws Exception {
checkMinServerVersion(2.5);
final HasRef hr = new HasRef();
List<Key<ReferencedEntity>> refs = new ArrayList<Key<ReferencedEntity>>();
for (int x = 0; x < 10; x++) {
final ReferencedEntity re = new ReferencedEntity("" + x);
getDs().save(re);
refs.add(new Key<ReferencedEntity>(ReferencedEntity.class,
getMorphia().getMapper().getCollectionName(ReferencedEntity.class),
re.getId()));
}
hr.ref = refs.get(0);
getDs().save(hr);
Query<HasRef> query = getDs().find(HasRef.class).field("ref").in(refs);
try {
Assert.assertEquals(1, query.asList().size());
} catch (MongoException e) {
LOG.debug("query = " + query);
throw e;
}
}
@Test
public void testMapping() throws Exception {
getMorphia().map(HasRefs.class);
getMorphia().map(ReferencedEntity.class);
}
@Test
public void testReferenceDoesNotExist() {
final HasRefs hr = new HasRefs();
getDs().save(hr);
final Query<HasRefs> q = getDs().find(HasRefs.class);
q.field("refs").doesNotExist();
final List<HasRefs> found = q.asList();
Assert.assertNotNull(found);
Assert.assertEquals(1, found.size());
}
@Entity("data")
private static class Data {
private ObjectId id;
private Set<ObjectId> otherIds;
public Data() {
otherIds = new HashSet<ObjectId>();
}
}
@Entity
private static class HasRef implements Serializable {
@Id
private ObjectId id = new ObjectId();
@Reference
private Key<ReferencedEntity> ref;
}
@Entity
private static class HasRefs implements Serializable {
@Id
private ObjectId id = new ObjectId();
@Reference
private List<ReferencedEntity> refs = new ArrayList<ReferencedEntity>();
}
@Entity
private static class ReferencedEntity extends TestEntity {
private String foo;
public ReferencedEntity() {
}
public ReferencedEntity(final String s) {
foo = s;
}
}
@Entity(value = "as", noClassnameStored = true)
public static class HasIdOnly {
@Id
private ObjectId id;
private String name;
@Reference(idOnly = true)
private List<ReferencedEntity> list;
@Reference(idOnly = true)
private ReferencedEntity entity;
}
@Entity("docs")
private static class Doc {
@Id
private long id = 4;
}
}