package br.com.arsmachina.eloquentia.dao.mongodb;
import java.util.Date;
import java.util.List;
import org.mongojack.DBCursor;
import org.mongojack.DBQuery;
import org.mongojack.DBQuery.Query;
import org.mongojack.JacksonDBCollection;
import br.com.arsmachina.dao.SortCriterion;
import br.com.arsmachina.eloquentia.dao.PageDAO;
import br.com.arsmachina.eloquentia.entity.Page;
import br.com.arsmachina.eloquentia.entity.Tag;
import com.mongodb.BasicDBObject;
/**
* Implementation of {@link PageDAO} using MongoDB and MongoJack.
*
* @author Thiago H. de Paula Figueiredo (http://machina.com.br/thiago)
*/
public class PageDAOImpl extends AbstractDAOImpl<Page, String> implements PageDAO {
final private static PrimaryKeyEncoder<Page, String> ID_VALUE_EXTRACTOR = new PrimaryKeyEncoder<Page, String>() {
public String get(Page object) {
return object != null ? object.getId() : null;
}
public void set(Page object, String id) {
object.setId(id);
}
};
public PageDAOImpl() {
super(ID_VALUE_EXTRACTOR);
final JacksonDBCollection<Page, String> dbCollection = getDbCollection();
dbCollection.ensureIndex(new BasicDBObject("uri", 1), "uri", true);
dbCollection.ensureIndex("tags");
}
public SortCriterion[] getDefaultSortCriteria() {
return PageDAO.DEFAULT_SORT_CRITERIA;
}
public Page findByUri(String uri) {
return objectOrNull(getDbCollection().find(getUriQuery(uri)));
}
protected Query getUriQuery(String uri) {
return DBQuery.is("uri", uri);
}
public List<Page> findByTag(Tag tag, int firstResult, int maxResults, SortCriterion... sortCriteria) {
return findByTag(tag.getName(), firstResult, maxResults, sortCriteria);
}
public List<Page> findByTag(final String tagName, int firstResult, int maxResults, SortCriterion... sortCriteria) {
DBCursor<Page> cursor = getDbCollection().find().in("tags", tagName).lessThan("posted", new Date());
addSortCriteria(cursor, sortCriteria);
addSkipAndLimit(cursor, firstResult, maxResults);
return toList(cursor);
}
public boolean exists(String uri) {
return getDbCollection().getCount(getUriQuery(uri)) > 0;
}
public boolean isTagReferenced(String name) {
return getDbCollection().find().in("tags", name).limit(1).hasNext();
}
}