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 HiDefTimeIdFactory implements SampleIdFactory{
public HiDefTimeIdFactory(PluginConfiguration config){}
@Override
public SampleId createId(DBObject sample) {
// get the timestamp as a long
return createId(null, (Long)sample.get(Sample.TS_KEY));
}
@Override
public SampleId createId(Object sourceId, long timeStamp) {
return new HiDefTimeSampleId(timeStamp);
}
@Override
public SampleId createId(ObjectId docId) {
return new HiDefTimeSampleId(docId);
}
@Override
public BasicDBObject getTimeRangeQuery(
Object sourceId, long timeStart, long minTime) {
byte[] startId = new byte[12];
byte[] minId = new byte[12];
HiDefTimeSampleId.writeTimeStamp(startId, timeStart + 1);
HiDefTimeSampleId.writeTimeStamp(minId, minTime + 1);
BasicDBObject idTimeRange = new BasicDBObject("$lt", new ObjectId(startId)).
append("$gte", new ObjectId(minId));
BasicDBObject query = new BasicDBObject(Sample.ID_KEY, idTimeRange);
// There is no source embedded, so we need a general clause for sourceId
addStandardSourceClause(query, sourceId);
return query;
}
@Override
public BasicDBObject getQuery(Object sourceId, long timestamp) {
byte[] minId = new byte[12];
byte[] maxId = new byte[12];
HiDefTimeSampleId.writeTimeStamp(minId, timestamp);
HiDefTimeSampleId.writeTimeStamp(maxId, timestamp + 1);
BasicDBObject idTimeRange = new BasicDBObject("$lt", new ObjectId(maxId)).
append("$gte", new ObjectId(minId));
BasicDBObject query = new BasicDBObject(Sample.ID_KEY, idTimeRange);
// There is no source embedded, so we need a general clause for sourceId
addStandardSourceClause(query, sourceId);
return query;
}
private void addStandardSourceClause(BasicDBObject query, Object sourceId) {
if(sourceId != null){
if(sourceId instanceof BasicDBList){
// The the source provided is a list, convert to $in
query.append(Sample.SOURCE_KEY, new BasicDBObject("$in", sourceId));
} else {
// Its an absolute value
query.append(Sample.SOURCE_KEY, sourceId);
}
}
}
}