package org.orienteer.bpm.camunda.handler;
import com.github.raymanrt.orientqb.query.Clause;
import com.github.raymanrt.orientqb.query.Operator;
import com.github.raymanrt.orientqb.query.Parameter;
import com.github.raymanrt.orientqb.query.Projection;
import com.github.raymanrt.orientqb.query.ProjectionFunction;
import com.github.raymanrt.orientqb.query.Query;import com.orientechnologies.orient.core.db.ODatabase;
import com.orientechnologies.orient.core.db.document.ODatabaseDocument;
import com.orientechnologies.orient.core.metadata.schema.OType;
import com.orientechnologies.orient.core.record.impl.ODocument;
import com.orientechnologies.orient.core.sql.query.OSQLSynchQuery;
import org.camunda.bpm.engine.impl.db.ListQueryParameterObject;
import org.camunda.bpm.engine.impl.persistence.entity.MeterLogEntity;
import org.orienteer.bpm.camunda.OPersistenceSession;
import org.orienteer.core.util.OSchemaHelper;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* Created by kir on 11.07.16.
*/
public class MeterLogEntityHandler extends AbstractEntityHandler<MeterLogEntity> {
public MeterLogEntityHandler() {
super("BPMMeterLog");
}
@Override
public void applySchema(OSchemaHelper helper) {
super.applySchema(helper);
helper.oProperty("name", OType.STRING, 10)
.oProperty("reporter", OType.STRING, 20)
.oProperty("value", OType.INTEGER, 30)
.oProperty("timestamp", OType.DATETIME, 40);
}
@Statement
public Long selectMeterLogSum(OPersistenceSession session, final ListQueryParameterObject params) {
Map<String, Object> map = (Map<String, Object>) params.getParameter();
Query q = new Query().select(ProjectionFunction.count(Projection.projection("value")).as("value"))
.from(getSchemaClass());
List<Object> args = new ArrayList<>();
if(map.get("name")!=null) {
q.where(Clause.clause("name", Operator.EQ, Parameter.PARAMETER));
args.add(map.get("name"));
}
if(map.get("reporter")!=null) {
q.where(Clause.clause("reporter", Operator.EQ, Parameter.PARAMETER));
args.add(map.get("reporter"));
}
if(map.get("startDate")!=null) {
q.where(Clause.clause("timestamp", Operator.GT, Parameter.PARAMETER));
args.add(map.get("startDate"));
}
if(map.get("endDate")!=null) {
q.where(Clause.clause("timestamp", Operator.LT, Parameter.PARAMETER));
args.add(map.get("endDate"));
}
ODatabaseDocument db = session.getDatabase();
List<ODocument> ret = db.query(new OSQLSynchQuery<>(q.toString()), args.toArray());
return (Long)(ret!=null && !ret.isEmpty()? ret.get(0).field("value", OType.LONG):null);
}
}