package eu.europeana.cloud.service.dps.storm.utils;
import com.datastax.driver.core.PreparedStatement;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.Row;
import com.datastax.driver.core.exceptions.NoHostAvailableException;
import com.datastax.driver.core.exceptions.QueryExecutionException;
import eu.europeana.cloud.cassandra.CassandraConnectionProvider;
import eu.europeana.cloud.common.model.dps.SubTaskInfo;
import eu.europeana.cloud.common.model.dps.TaskInfo;
import eu.europeana.cloud.common.model.dps.TaskState;
import eu.europeana.cloud.service.dps.exception.TaskInfoDoesNotExistException;
import eu.europeana.cloud.service.dps.service.cassandra.CassandraTablesAndColumnsNames;
import java.util.Date;
import java.util.List;
/**
* The {@link eu.europeana.cloud.common.model.dps.TaskInfo} DAO
*
* @author akrystian
*/
public class CassandraTaskInfoDAO extends CassandraDAO {
private PreparedStatement taskSearchStatement;
private PreparedStatement taskInsertStatement;
private CassandraSubTaskInfoDAO cassandraSubTaskInfoDAO;
private PreparedStatement updateTask;
private PreparedStatement endTask;
private PreparedStatement updateProcessedFiles;
private static CassandraTaskInfoDAO instance = null;
public static CassandraTaskInfoDAO getInstance(CassandraConnectionProvider cassandra) {
if (instance == null) {
synchronized (CassandraTaskInfoDAO.class) {
if (instance == null) {
instance = new CassandraTaskInfoDAO(cassandra);
}
}
}
return instance;
}
/**
* @param dbService The service exposing the connection and session
*/
private CassandraTaskInfoDAO(CassandraConnectionProvider dbService) {
super(dbService);
cassandraSubTaskInfoDAO = CassandraSubTaskInfoDAO.getInstance(dbService);
}
@Override
void prepareStatements() {
taskSearchStatement = dbService.getSession().prepare(
"SELECT * FROM " + CassandraTablesAndColumnsNames.BASIC_INFO_TABLE + " WHERE " + CassandraTablesAndColumnsNames.BASIC_TASK_ID + " = ?");
taskSearchStatement.setConsistencyLevel(dbService.getConsistencyLevel());
updateTask = dbService.getSession().prepare("UPDATE " + CassandraTablesAndColumnsNames.BASIC_INFO_TABLE + " SET " + CassandraTablesAndColumnsNames.STATE + " = ? , " + CassandraTablesAndColumnsNames.START_TIME + " = ? , " + CassandraTablesAndColumnsNames.INFO + " =? WHERE " + CassandraTablesAndColumnsNames.BASIC_TASK_ID + " = ?");
updateTask.setConsistencyLevel(dbService.getConsistencyLevel());
updateProcessedFiles = dbService.getSession().prepare("UPDATE " + CassandraTablesAndColumnsNames.BASIC_INFO_TABLE + " SET " + CassandraTablesAndColumnsNames.PROCESSED_FILES_COUNT + " = ? WHERE " + CassandraTablesAndColumnsNames.BASIC_TASK_ID + " = ?");
updateProcessedFiles.setConsistencyLevel(dbService.getConsistencyLevel());
endTask = dbService.getSession().prepare("UPDATE " + CassandraTablesAndColumnsNames.BASIC_INFO_TABLE + " SET " + CassandraTablesAndColumnsNames.PROCESSED_FILES_COUNT + " = ? , " + CassandraTablesAndColumnsNames.STATE + " = ? , " + CassandraTablesAndColumnsNames.FINISH_TIME + " = ? , " + CassandraTablesAndColumnsNames.INFO + " =? WHERE " + CassandraTablesAndColumnsNames.BASIC_TASK_ID + " = ?");
endTask.setConsistencyLevel(dbService.getConsistencyLevel());
taskInsertStatement = dbService.getSession().prepare("INSERT INTO " + CassandraTablesAndColumnsNames.BASIC_INFO_TABLE +
"(" + CassandraTablesAndColumnsNames.BASIC_TASK_ID + ","
+ CassandraTablesAndColumnsNames.BASIC_TOPOLOGY_NAME + ","
+ CassandraTablesAndColumnsNames.BASIC_EXPECTED_SIZE + ","
+ CassandraTablesAndColumnsNames.PROCESSED_FILES_COUNT + ","
+ CassandraTablesAndColumnsNames.STATE + ","
+ CassandraTablesAndColumnsNames.INFO + ","
+ CassandraTablesAndColumnsNames.SENT_TIME + ","
+ CassandraTablesAndColumnsNames.START_TIME + ","
+ CassandraTablesAndColumnsNames.FINISH_TIME +
") VALUES (?,?,?,?,?,?,?,?,?)");
taskInsertStatement.setConsistencyLevel(dbService.getConsistencyLevel());
}
public TaskInfo searchById(long taskId)
throws NoHostAvailableException, QueryExecutionException, TaskInfoDoesNotExistException {
ResultSet rs = dbService.getSession().execute(taskSearchStatement.bind(taskId));
if (!rs.iterator().hasNext()) {
throw new TaskInfoDoesNotExistException();
}
Row row = rs.one();
TaskInfo task = new TaskInfo(row.getLong(CassandraTablesAndColumnsNames.BASIC_TASK_ID), row.getString(CassandraTablesAndColumnsNames.BASIC_TOPOLOGY_NAME), TaskState.valueOf(row.getString(CassandraTablesAndColumnsNames.STATE)), row.getString(CassandraTablesAndColumnsNames.INFO), row.getDate(CassandraTablesAndColumnsNames.SENT_TIME), row.getDate(CassandraTablesAndColumnsNames.START_TIME), row.getDate(CassandraTablesAndColumnsNames.FINISH_TIME));
task.setContainsElements(row.getInt(CassandraTablesAndColumnsNames.BASIC_EXPECTED_SIZE));
return task;
}
public void insert(long taskId, String topologyName, int expectedSize, int processedFilesCount, String state, String info, Date sentTime, Date startTime, Date finishTime)
throws NoHostAvailableException, QueryExecutionException {
dbService.getSession().execute(taskInsertStatement.bind(taskId, topologyName, expectedSize, processedFilesCount, state, info, sentTime, startTime, finishTime));
}
public void updateTask(long taskId, String info, String state, Date startDate)
throws NoHostAvailableException, QueryExecutionException {
dbService.getSession().execute(updateTask.bind(state, startDate, info, taskId));
}
public void endTask(long taskId, int processeFilesCount, String info, String state, Date finishDate)
throws NoHostAvailableException, QueryExecutionException {
dbService.getSession().execute(endTask.bind(processeFilesCount, state, finishDate, info, taskId));
}
public void insert(long taskId, String topologyName, int expectedSize, String state, String info, Date sentTime)
throws NoHostAvailableException, QueryExecutionException {
insert(taskId, topologyName, expectedSize, 0, state, info, sentTime, null, null);
}
public void setUpdateProcessedFiles(long taskId, int processedFilesCount)
throws NoHostAvailableException, QueryExecutionException {
dbService.getSession().execute(updateProcessedFiles.bind(processedFilesCount, taskId));
}
public TaskInfo searchByIdWithSubtasks(long taskId)
throws NoHostAvailableException, QueryExecutionException, TaskInfoDoesNotExistException {
TaskInfo result = searchById(taskId);
List<SubTaskInfo> subTasks = cassandraSubTaskInfoDAO.searchById(taskId);
for (SubTaskInfo subTask : subTasks) {
result.addSubtask(subTask);
}
return result;
}
}