@Override public MongoTailableIterator getInactiveIterator(DatabaseQuery<MongoType> query) { try { return new MongoTailableIterator(((MongoQuery)query).toDBObject(), oldDocuments); } catch (BackingStoreException e) { logger.error("Unable to get Tailable Iterator!", e); return null; } }
@Override public MongoDocument getDocument(DatabaseQuery<MongoType> dbq) { DBObject query = ((MongoQuery)dbq).toDBObject(); MongoDocument doc = (MongoDocument) documents.findOne(query); if (doc==null) { return null; } return doc; }
@Override public long getNumberOfDocuments(DatabaseQuery<MongoType> q) { return documents.getCount(((MongoQuery)q).toDBObject()); } }
@Override public MongoDocument getDocumentById(DocumentID<MongoType> id, boolean includeInactive) { MongoQuery mq = new MongoQuery(); mq.requireID(id); MongoDocument doc = (MongoDocument) documents.findOne(mq.toDBObject()); if(doc==null && includeInactive) { doc = (MongoDocument) oldDocuments.findOne(mq.toDBObject()); } return doc; }
@Override public boolean markTouched(DocumentID<MongoType> id, String tag) { MongoQuery mq = new MongoQuery(); mq.requireID(id); DBObject update = new BasicDBObject(MongoDocument.METADATA_KEY+"."+DatabaseDocument.TOUCHED_METADATA_TAG+"."+tag, new Date()); DBObject dbo = getUpdateObject(update); if(documents.findAndModify(mq.toDBObject(), dbo)==null) { return false; } return true; }
@Override public List<DatabaseDocument<MongoType>> getDocuments( DatabaseQuery<MongoType> dbq, int limit, int skip) { DBCursor cursor = documents.find(((MongoQuery)dbq).toDBObject()).skip(skip).limit(limit); List<DatabaseDocument<MongoType>> list = new ArrayList<DatabaseDocument<MongoType>>(); while(cursor.hasNext()) { cursor.next(); list.add((MongoDocument)cursor.curr()); } return list; }
@Override public boolean markPending(DatabaseDocument<MongoType> d, String stage) { MongoQuery mq = new MongoQuery(); mq.requireID(d.getID()); DBObject update = new BasicDBObject(); update.put(MongoDocument.METADATA_KEY+"."+MongoDocument.PENDING_METADATA_FLAG+"."+MongoDocument.DATE_METADATA_SUBKEY, new Date()); update.put(MongoDocument.METADATA_KEY+"."+MongoDocument.PENDING_METADATA_FLAG+"."+MongoDocument.STAGE_METADATA_SUBKEY, stage); DBObject dbo = getUpdateObject(update); if(documents.findAndModify(mq.toDBObject(), dbo)==null) { return false; } return true; }
@Override public MongoDocument getAndTag(DatabaseQuery<MongoType> query, String ... tag) { for(String t : tag) { ensureIndex(t); } MongoQuery mq = (MongoQuery)query; mq.requireMetadataFieldNotExists(Document.PENDING_METADATA_FLAG); /* The document must be fully committed (i.e. all attachments are committed) before we can fetch it * Using not equals to true here (instead of "equals false"), to allow for documents where committing * isn't set at all. */ mq.requireMetadataFieldNotEquals(Document.COMMITTING_METADATA_FLAG, true); for(String t : tag) { mq.requireMetadataFieldNotExists(DatabaseDocument.FETCHED_METADATA_TAG+"."+t); } DBObject update = new BasicDBObject(); for(String t : tag) { update.put(MongoDocument.METADATA_KEY+"."+DatabaseDocument.FETCHED_METADATA_TAG+"."+t, new Date()); } DBObject dbo = getUpdateObject(update); return findAndModify(mq.toDBObject(), dbo); }
private boolean markDone(final DatabaseDocument<MongoType> d, String stage, String stamp) { MongoQuery mq = new MongoQuery(); mq.requireID(d.getID()); DBObject doc = documents.findAndRemove(mq.toDBObject()); if(doc==null) { return false; } doc.putAll(((MongoDocument)d).toMap()); stampMetadataField(doc, stamp, stage); deleteAllFiles(d); return writeToOldDocuments(d, stage, doc); }
WriteResult wr = documents.update(mdq.toDBObject(), updateObject, true, false, concern); return wr.getN()==1;