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; } }