package org.mongodb.morphia.dao;
import com.mongodb.DBCollection;
import com.mongodb.MongoClient;
import com.mongodb.WriteConcern;
import com.mongodb.WriteResult;
import org.mongodb.morphia.Datastore;
import org.mongodb.morphia.InsertOptions;
import org.mongodb.morphia.Key;
import org.mongodb.morphia.Morphia;
import org.mongodb.morphia.query.FindOptions;
import org.mongodb.morphia.query.Query;
import org.mongodb.morphia.query.QueryResults;
import org.mongodb.morphia.query.UpdateOperations;
import org.mongodb.morphia.query.UpdateResults;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@SuppressWarnings({"WeakerAccess", "deprecation", "unused"})
public class BasicDAO<T, K> implements DAO<T, K> {
@Deprecated
protected Class<T> entityClazz;
@Deprecated
protected org.mongodb.morphia.DatastoreImpl ds;
public BasicDAO(final Class<T> entityClass, final MongoClient mongoClient, final Morphia morphia, final String dbName) {
initDS(mongoClient, morphia, dbName);
initType(entityClass);
}
public BasicDAO(final Class<T> entityClass, final Datastore ds) {
this.ds = (org.mongodb.morphia.DatastoreImpl) ds;
initType(entityClass);
}
@SuppressWarnings("unchecked")
protected BasicDAO(final MongoClient mongoClient, final Morphia morphia, final String dbName) {
initDS(mongoClient, morphia, dbName);
initType(((Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]));
}
@SuppressWarnings("unchecked")
protected BasicDAO(final Datastore ds) {
this.ds = (org.mongodb.morphia.DatastoreImpl) ds;
initType(((Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]));
}
@Override
public long count() {
return ds.getCount(entityClazz);
}
@Override
public long count(final String key, final Object value) {
return count(ds.find(entityClazz).filter(key, value));
}
@Override
public long count(final Query<T> query) {
return ds.getCount(query);
}
@Override
public Query<T> createQuery() {
return ds.find(entityClazz);
}
@Override
public UpdateOperations<T> createUpdateOperations() {
return ds.createUpdateOperations(entityClazz);
}
@Override
public WriteResult delete(final T entity) {
return ds.delete(entity);
}
@Override
public WriteResult delete(final T entity, final WriteConcern wc) {
return ds.delete(entity, wc);
}
@Override
public WriteResult deleteById(final K id) {
return ds.delete(entityClazz, id);
}
@Override
public WriteResult deleteByQuery(final Query<T> query) {
return ds.delete(query);
}
@Override
public void ensureIndexes() {
ds.ensureIndexes(entityClazz);
}
@Override
public boolean exists(final String key, final Object value) {
return exists(ds.find(entityClazz).filter(key, value));
}
@Override
public boolean exists(final Query<T> query) {
return query.get(new FindOptions().limit(1)) != null;
}
@Override
public QueryResults<T> find() {
return createQuery();
}
@Override
public QueryResults<T> find(final Query<T> query) {
return query;
}
@Override
@SuppressWarnings("unchecked")
public List<K> findIds() {
return (List<K>) keysToIds(ds.find(entityClazz).asKeyList());
}
@Override
@SuppressWarnings("unchecked")
public List<K> findIds(final String key, final Object value) {
return (List<K>) keysToIds(ds.find(entityClazz).filter(key, value).asKeyList());
}
@Override
@SuppressWarnings("unchecked")
public List<K> findIds(final Query<T> query) {
return (List<K>) keysToIds(query.asKeyList());
}
@Override
public T findOne(final String key, final Object value) {
return ds.find(entityClazz).filter(key, value).get();
}
@Override
public T findOne(final Query<T> query) {
return query.get();
}
@Override
public Key<T> findOneId() {
return findOneId(ds.find(entityClazz));
}
@Override
public Key<T> findOneId(final String key, final Object value) {
return findOneId(ds.find(entityClazz).filter(key, value));
}
@Override
public Key<T> findOneId(final Query<T> query) {
Iterator<Key<T>> keys = query.fetchKeys().iterator();
return keys.hasNext() ? keys.next() : null;
}
@Override
public T get(final K id) {
return ds.get(entityClazz, id);
}
@Override
public DBCollection getCollection() {
return ds.getCollection(entityClazz);
}
@Override
public Datastore getDatastore() {
return ds;
}
@Override
public Class<T> getEntityClass() {
return entityClazz;
}
@Override
public Key<T> save(final T entity) {
return ds.save(entity);
}
@Override
public Key<T> save(final T entity, final WriteConcern wc) {
return ds.save(entity, new InsertOptions().writeConcern(wc));
}
@Override
public UpdateResults update(final Query<T> query, final UpdateOperations<T> ops) {
return ds.update(query, ops);
}
@Override
public UpdateResults updateFirst(final Query<T> query, final UpdateOperations<T> ops) {
return ds.updateFirst(query, ops);
}
@Deprecated
public org.mongodb.morphia.DatastoreImpl getDs() {
return ds;
}
@Deprecated
public Class<T> getEntityClazz() {
return entityClazz;
}
protected void initDS(final MongoClient mongoClient, final Morphia mor, final String db) {
ds = (org.mongodb.morphia.DatastoreImpl) mor.createDatastore(mongoClient, db);
}
protected void initType(final Class<T> type) {
entityClazz = type;
ds.getMapper().addMappedClass(type);
}
protected List<?> keysToIds(final List<Key<T>> keys) {
final List<Object> ids = new ArrayList<Object>(keys.size() * 2);
for (final Key<T> key : keys) {
ids.add(key.getId());
}
return ids;
}
}