package org.orienteer.bpm.camunda.handler;
import com.orientechnologies.orient.core.metadata.schema.OType;
import org.camunda.bpm.engine.impl.db.ListQueryParameterObject;
import org.camunda.bpm.engine.impl.dmn.entity.repository.DecisionDefinitionEntity;
import org.camunda.bpm.engine.repository.DecisionDefinitionQuery;
import org.orienteer.bpm.camunda.OPersistenceSession;
import org.orienteer.bpm.camunda.handler.history.HistoricDecisionInstanceEntityHandler;
import org.orienteer.core.util.OSchemaHelper;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by KMukhov on 12.08.2016.
*/
public class DecisionDefinitionEntityHandler extends AbstractEntityHandler<DecisionDefinitionEntity> {
public static final String OCLASS_NAME = "BPMDecisionDefinition";
public DecisionDefinitionEntityHandler() {
super(OCLASS_NAME);
}
@Override
public void applySchema(OSchemaHelper helper) {
super.applySchema(helper);
helper.oProperty("category", OType.STRING, 10)
.oProperty("name", OType.STRING, 20)
.oProperty("key", OType.STRING, 30)
.oProperty("version", OType.INTEGER, 40)
.oProperty("deploymentId", OType.STRING, 50)
.oProperty("resourceName", OType.STRING, 60)
.oProperty("diagramResourceName", OType.STRING, 70)
.oProperty("decisionRequirementsDefinitionId", OType.STRING, 80)
.oProperty("tenantId", OType.STRING, 90)
.oProperty("historyDecisionInstances", OType.LINKLIST, 100).assignVisualization("table");
}
@Override
public void applyRelationships(OSchemaHelper helper) {
super.applyRelationships(helper);
helper.setupRelationship(OCLASS_NAME, "historyDecisionInstances", HistoricDecisionInstanceEntityHandler.OCLASS_NAME, "decisionDefinition");
}
@Statement
public List<DecisionDefinitionEntity> selectDecisionDefinitionByDeploymentId(OPersistenceSession session, ListQueryParameterObject parameter) {
return queryList(session, "select from " + getSchemaClass() + " where deploymentId=?", parameter.getParameter());
}
@Statement
public List<DecisionDefinitionEntity> selectDecisionDefinitionByDeploymentAndKey(OPersistenceSession session, ListQueryParameterObject parameter) {
Map<String, String> params = (Map<String, String>) parameter.getParameter();
return queryList(session, "select from " + getSchemaClass() + " where deploymentId=? and key=?",
params.get("deploymentId"), params.get("decisionDefinitionKey"));
}
@Statement
public List<DecisionDefinitionEntity> selectLatestDecisionDefinitionByKey(OPersistenceSession session, ListQueryParameterObject parameter) {
return queryList(session, "select from " + getSchemaClass() + " d1 inner join (select key, tenantId, max(version) as MAX_VERSION from " +
getSchemaClass() + " where key = ? group by tenantId, key) d2 on d1.key = d2.key where d1.version = d2.MAX_VERSION " +
"and (d1.tenantId = d2.tenantId or (d1.tenantId is null and d2.tenantId is null))", parameter.getParameter());
}
@Statement
public List<DecisionDefinitionEntity> selectLatestDecisionDefinitionByKeyWithoutTenantId(OPersistenceSession session, ListQueryParameterObject parameter) {
return queryList(session, "select from " + getSchemaClass() + " where key = ? and tenantId is null and version = (" +
"select max(version) from " + getSchemaClass() + " where key = ? and tenantId is null)",
parameter.getParameter(), parameter.getParameter());
}
@Statement
public List<DecisionDefinitionEntity> selectLatestDecisionDefinitionByKeyAndTenantId(OPersistenceSession session, ListQueryParameterObject parameter) {
Map<String, String> params = (Map<String, String>) parameter.getParameter();
String key = params.get("key");
String tenantId = params.get("tenantId");
return queryList(session, "select from " + getSchemaClass() + " where key = ? and tenantId = ? and version = (" +
"select max(version) from " + getSchemaClass() + " where key = ? and tenantId = ?)",
key, tenantId, key, tenantId);
}
@Statement
public List<DecisionDefinitionEntity> selectDecisionDefinitionByKeyAndVersion(OPersistenceSession session, ListQueryParameterObject parameter) {
Map<String, String> params = (Map<String, String>) parameter.getParameter();
return queryList(session, "select from " + getSchemaClass() + " where key = ? and version = ?",
params.get("key"), params.get("version"));
}
@Statement
public List<DecisionDefinitionEntity> selectDecisionDefinitionByKeyVersionWithoutTenantId(OPersistenceSession session, ListQueryParameterObject parameter) {
Map<String, String> params = (Map<String, String>) parameter.getParameter();
return queryList(session, "select from " + getSchemaClass() + " where key = ? and version = ? and tenantId is null",
params.get("key"), params.get("version"));
}
@Statement
public List<DecisionDefinitionEntity> selectDecisionDefinitionByKeyVersionAndTenantId(OPersistenceSession session, ListQueryParameterObject parameter) {
Map<String, String> params = (Map<String, String>) parameter.getParameter();
return queryList(session, "select from " + getSchemaClass() + " where key = ? and version = ? and tenantId = ?",
params.get("key"), params.get("version"), params.get("tenantId"));
}
@Statement
public String selectPreviousDecisionDefinitionId(OPersistenceSession session, ListQueryParameterObject parameter) {
Map<String, String> params = (Map<String, String>) parameter.getParameter();
String key = params.get("key");
String tenantId = params.get("tenantId");
String version = params.get("version");
String query = "select distinct RES.* from " + getSchemaClass() + " where RES.key = " + key;
query += tenantId != null ? " and tenantId = " + tenantId : " and tenantId is null";
query += " and RES.version = (select max(version) from " + getSchemaClass() + " where key = " + key;
query += tenantId != null ? " and tenantId = " + tenantId : " and tenantId is null";
query += " and version < " + version + ")";
return querySingle(session, query).getPreviousDecisionDefinitionId();
}
@Statement
public List<DecisionDefinitionEntity> selectDecisionDefinitionsByQueryCriteria(OPersistenceSession session, DecisionDefinitionQuery query) {
return query(session, query);
}
@Statement
public void deleteDecisionDefinitionsByDeploymentId(OPersistenceSession session, String deploymentId) {
Map<String, String> params = new HashMap<String, String>();
params.put("deploymentId", deploymentId);
delete(session, params);
}
}