package ee.telekom.workflow.facade.workflowinstance;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import ee.telekom.workflow.core.common.WorkflowEngineConfiguration;
import ee.telekom.workflow.facade.model.SearchWorkflowInstances;
import ee.telekom.workflow.facade.model.WorkflowInstanceFacadeStatus;
import ee.telekom.workflow.facade.model.WorkflowInstanceState;
import ee.telekom.workflow.facade.util.StatusUtil;
import ee.telekom.workflow.util.AbstractWorkflowEngineDao;
import ee.telekom.workflow.util.AdvancedParameterSource;
/**
* Workflow instance DAO, providing methods exclusively used by the facade.
*
* @author Christian Klock
*/
@Repository
public class WorkflowInstanceStateDao extends AbstractWorkflowEngineDao{
@Autowired
private WorkflowEngineConfiguration config;
public WorkflowInstanceState find( long refNum, boolean isActive ){
String sql = "SELECT * FROM " + getTableName( isActive ) + " WHERE ref_num = ? AND cluster_name = ?";
Object[] args = {refNum, config.getClusterName()};
List<WorkflowInstanceState> result = getJdbcTemplate().query( sql, args, WorkflowInstanceStateRowMapper.INSTANCE );
return result.isEmpty() ? null : result.get( 0 );
}
public List<WorkflowInstanceState> findByLabel1( String label1, boolean activeOnly ){
String where = ""
+ " WHERE cluster_name = :clusterName "
+ " AND label1 " + (StringUtils.isBlank( label1 ) ? "IS NULL" : "= :label1 ");
AdvancedParameterSource source = new AdvancedParameterSource()
.addValue( "clusterName", config.getClusterName() )
.addValue( "label1", label1 );
String sql;
if( activeOnly ){
sql = "SELECT * FROM " + getTableName( true ) + where;
}
else{
sql = ""
+ "SELECT * FROM " + getTableName( true ) + where
+ " UNION ALL "
+ "SELECT * FROM " + getTableName( false ) + where;
}
return getNamedParameterJdbcTemplate().query( sql, source, WorkflowInstanceStateRowMapper.INSTANCE );
}
public List<WorkflowInstanceState> findByLabels( String label1, String label2, boolean activeOnly ){
String where = ""
+ " WHERE cluster_name = :clusterName "
+ " AND label1 " + (StringUtils.isBlank( label1 ) ? "IS NULL" : "= :label1 ")
+ " AND label2 " + (StringUtils.isBlank( label2 ) ? "IS NULL" : "= :label2 ");
AdvancedParameterSource source = new AdvancedParameterSource()
.addValue( "clusterName", config.getClusterName() )
.addValue( "label1", label1 )
.addValue( "label2", label2 );
String sql;
if( activeOnly ){
sql = "SELECT * FROM " + getTableName( true ) + where;
}
else{
sql = ""
+ "SELECT * FROM " + getTableName( true ) + where
+ " UNION ALL "
+ "SELECT * FROM " + getTableName( false ) + where;
}
return getNamedParameterJdbcTemplate().query( sql, source, WorkflowInstanceStateRowMapper.INSTANCE );
}
public List<WorkflowInstanceState> find( SearchWorkflowInstances request ){
String select = "SELECT * ";
StringBuilder where = new StringBuilder( " WHERE cluster_name = :clusterName " );
AdvancedParameterSource source = new AdvancedParameterSource().addValue( "clusterName", config.getClusterName() );
if( request.getRefNum() != null && request.getRefNum().size() > 0 ){
where.append( " AND ref_num IN (:refNum) " );
source.addValue( "refNum", request.getRefNum() );
}
if( request.getWorkflowName() != null && request.getWorkflowName().size() > 0 ){
where.append( " AND workflow_name IN (:workflowName) " );
source.addValue( "workflowName", request.getWorkflowName() );
}
if( request.getLabel1() != null && request.getLabel1().size() > 0 ){
where.append( " AND label1 IN (:label1) " );
source.addValue( "label1", request.getLabel1() );
}
if( request.getLabel2() != null && request.getLabel2().size() > 0 ){
where.append( " AND label2 IN (:label2) " );
source.addValue( "label2", request.getLabel2() );
}
if( request.getStatus() != null && request.getStatus().size() > 0 ){
where.append( " AND status IN (:statuses) " );
source.addValue( "statuses", StatusUtil.toInternal( request.getStatus() ) );
}
String sql;
boolean needToQueryMainTable = needToQueryMainTable( request.getStatus() );
boolean needToQueryArchiveTable = needToQueryArchiveTable( request.getStatus() );
if( needToQueryMainTable && needToQueryArchiveTable ){
sql = ""
+ select + "FROM " + getTableName( true ) + where
+ "UNION ALL "
+ select + "FROM " + getTableName( false ) + where;
}
else if( needToQueryArchiveTable ){
sql = select + "FROM " + getTableName( false ) + where;
}
else{
sql = select + "FROM " + getTableName( true ) + where;
}
return getNamedParameterJdbcTemplate().query( sql, source, WorkflowInstanceStateRowMapper.INSTANCE );
}
public List<WorkflowStatusCount> findWorklowStatusCount(){
String select = "SELECT workflow_name, status, count(1) as count ";
String where = " WHERE cluster_name = :clusterName ";
String group = " GROUP BY workflow_name, status ";
String sql = ""
+ select + "FROM " + getTableName( true ) + where + group
+ "UNION ALL "
+ select + "FROM " + getTableName( false ) + where + group;
AdvancedParameterSource source = new AdvancedParameterSource()
.addValue( "clusterName", config.getClusterName() );
return getNamedParameterJdbcTemplate().query( sql, source, WorkflowStatusCountRowMapper.INSTANCE );
}
public List<String> findWorkflowNamesWithInstances(){
String select = "SELECT DISTINCT workflow_name ";
String where = " WHERE cluster_name = :clusterName ";
String sql = ""
+ select + "FROM " + getTableName( true ) + where
+ "UNION "
+ select + "FROM " + getTableName( false ) + where;
AdvancedParameterSource source = new AdvancedParameterSource()
.addValue( "clusterName", config.getClusterName() );
return getNamedParameterJdbcTemplate().queryForList( sql, source, String.class );
}
private String getTableName( boolean isActive ){
return getSchema() + (isActive ? "workflow_instances" : "workflow_instances_archive");
}
private static boolean needToQueryMainTable( List<WorkflowInstanceFacadeStatus> statuses ){
if( statuses == null || statuses.isEmpty() ){
return true;
}
for( WorkflowInstanceFacadeStatus status : statuses ){
if( status != WorkflowInstanceFacadeStatus.EXECUTED && status != WorkflowInstanceFacadeStatus.ABORTED ){
return true;
}
}
return false;
}
private static boolean needToQueryArchiveTable( List<WorkflowInstanceFacadeStatus> statuses ){
if( statuses == null || statuses.isEmpty() ){
return true;
}
for( WorkflowInstanceFacadeStatus status : statuses ){
if( status == WorkflowInstanceFacadeStatus.EXECUTED || status == WorkflowInstanceFacadeStatus.ABORTED ){
return true;
}
}
return false;
}
}