package com.mongodb.hvdf.oid; import org.bson.types.ObjectId; import com.mongodb.BasicDBList; import com.mongodb.BasicDBObject; import com.mongodb.DBObject; import com.mongodb.hvdf.api.Sample; import com.mongodb.hvdf.configuration.PluginConfiguration; public class SourceTimeDocumentIdFactory implements SampleIdFactory{ private static final String ID_SOURCE_KEY = Sample.ID_KEY + "." + Sample.SOURCE_KEY; private static final String ID_TIME_KEY = Sample.ID_KEY + "." + Sample.TS_KEY; public SourceTimeDocumentIdFactory(PluginConfiguration config){} @Override public SampleId createId(DBObject sample) { // get the timestamp as a long return createId(sample.get(Sample.SOURCE_KEY), (Long)sample.get(Sample.TS_KEY)); } @Override public SampleId createId(Object sourceId, long timeStamp) { return new SourceTimeDocumentId(sourceId, timeStamp); } @Override public SampleId createId(ObjectId docId) { return new SourceTimeDocumentId(docId); } @Override public BasicDBObject getTimeRangeQuery( Object sourceId, long timeStart, long minTime) { if(sourceId == null){ // All sources across the time range, cannot use the id index return new BasicDBObject(ID_TIME_KEY, new BasicDBObject("$lte", timeStart).append("$gte", minTime)); } else if( sourceId instanceof BasicDBList){ // Create a query from the id components rather than the id itself return new BasicDBObject(ID_SOURCE_KEY, new BasicDBObject("$in", sourceId)).append( ID_TIME_KEY, new BasicDBObject("$lte", timeStart).append("$gte", minTime)); } else { // Single sourceId, construct a more optimal ID query for this case BasicDBObject startId = new BasicDBObject( Sample.SOURCE_KEY, sourceId).append(Sample.TS_KEY, timeStart); BasicDBObject minId = new BasicDBObject( Sample.SOURCE_KEY, sourceId).append(Sample.TS_KEY, minTime); return new BasicDBObject("$lte", startId).append("$gte", minId); } } @Override public BasicDBObject getQuery(Object sourceId, long timestamp) { if(sourceId == null){ // query by the time component of _id return new BasicDBObject(ID_TIME_KEY, timestamp); } else if(sourceId instanceof BasicDBList){ // make a list of source/time id values BasicDBList idList = new BasicDBList(); for(Object sourceItem : (BasicDBList)sourceId){ idList.add(new BasicDBObject(Sample.SOURCE_KEY, sourceItem) .append(Sample.TS_KEY, timestamp)); } return new BasicDBObject(Sample.ID_KEY, new BasicDBObject("$in", idList)); } else { // single sourceId, looking for a specific _id value BasicDBObject targetId= new BasicDBObject( Sample.SOURCE_KEY, sourceId).append(Sample.TS_KEY, timestamp); return new BasicDBObject(Sample.ID_KEY, targetId); } } }