package com.mongodb.hvdf.rollup;
import java.util.Set;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import com.mongodb.hvdf.configuration.PluginConfiguration;
public abstract class OperatorBasedRollup extends RollupOperation{
protected final Set<String> rawFields;
protected final String fieldExtention;
protected final String operator;
public OperatorBasedRollup(PluginConfiguration config, String operator, String rolledFieldName){
this.operator = operator;
this.fieldExtention = "." + rolledFieldName;
// any field mentioned in the config is a target
this.rawFields = config.getRaw().keySet();
}
@Override
public DBObject getUpdateClause(DBObject sample) {
BasicDBObject opFields = new BasicDBObject();
for(String fieldName : rawFields){
Object valueObj = getNestedFieldValue(fieldName, sample);
if(valueObj != null){
if (valueObj instanceof DBObject){
// this might be a nested *do everything* request
// TODO : handle recursing into the object adding all fields
} else {
// this is the normal case, we can apply it directly as a clause
appendField(opFields, fieldName, valueObj);
}
}
}
if(opFields.size() > 0){
return getOperator(opFields);
} else {
return new BasicDBObject();
}
}
protected DBObject getOperator(BasicDBObject opFields){
return new BasicDBObject(this.operator, opFields);
}
protected void appendField(
BasicDBObject opFields, String fieldName, Object valueObj){
opFields.append(fieldName + fieldExtention, valueObj);
}
}