package gov.nysenate.openleg.dao.process;
import com.google.common.collect.Range;
import gov.nysenate.openleg.dao.base.*;
import gov.nysenate.openleg.model.process.DataProcessAction;
import gov.nysenate.openleg.model.process.DataProcessRun;
import gov.nysenate.openleg.model.process.DataProcessUnit;
import org.apache.shiro.dao.DataAccessException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.SingleColumnRowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.stereotype.Repository;
import java.time.LocalDateTime;
import java.util.List;
import static gov.nysenate.openleg.dao.process.SqlDataProcessLogQuery.*;
import static gov.nysenate.openleg.util.DateUtils.*;
@Repository
public class SqlDataProcessLogDao extends SqlBaseDao implements DataProcessLogDao
{
private static final Logger logger = LoggerFactory.getLogger(SqlDataProcessLogDao.class);
/** {@inheritDoc} */
@Override
public DataProcessRun getRun(int processId) throws DataAccessException {
MapSqlParameterSource params = new MapSqlParameterSource("processId", processId);
return jdbcNamed.queryForObject(SELECT_DATA_PROCESS_RUN.getSql(schema()), params, processRunRowMapper);
}
/** {@inheritDoc} */
@Override
public PaginatedList<DataProcessRun> getRuns(Range<LocalDateTime> dateTimeRange, boolean withActivityOnly,
SortOrder dateOrder, LimitOffset limOff) {
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("startDateTime", toDate(startOfDateTimeRange(dateTimeRange)))
.addValue("endDateTime", toDate(endOfDateTimeRange(dateTimeRange)));
OrderBy orderBy = new OrderBy("process_start_date_time", dateOrder);
SqlDataProcessLogQuery sqlQuery = (withActivityOnly) ? SELECT_DATA_PROCESS_RUNS_WITH_ACTIVITY
: SELECT_DATA_PROCESS_RUNS_DURING;
PaginatedRowHandler<DataProcessRun> handler = new PaginatedRowHandler<>(limOff, "total_count", processRunRowMapper);
jdbcNamed.query(sqlQuery.getSql(schema(), orderBy, limOff), params, handler);
return handler.getList();
}
/** {@inheritDoc} */
@Override
public PaginatedList<DataProcessUnit> getUnits(int processId, SortOrder dateOrder, LimitOffset limOff) {
MapSqlParameterSource params = new MapSqlParameterSource("processId", processId);
OrderBy orderBy = new OrderBy("start_date_time", dateOrder);
PaginatedRowHandler<DataProcessUnit> handler = new PaginatedRowHandler<>(limOff, "total_count", processUnitRowMapper);
jdbcNamed.query(SELECT_DATA_PROCESS_UNITS.getSql(schema(), orderBy, limOff), params, handler);
return handler.getList();
}
@Override
public List<DataProcessUnit> getFirstAndLastUnits(int processId) {
MapSqlParameterSource params = new MapSqlParameterSource("processId", processId);
return jdbcNamed.query(SELECT_FIRST_AND_LAST_DATA_PROCESS_UNITS.getSql(schema()), params, processUnitRowMapper);
}
/** {@inheritDoc} */
@Override
public void insertRun(DataProcessRun run) {
MapSqlParameterSource params = getDataProcessRunParams(run);
int id = jdbcNamed.queryForObject(INSERT_DATA_PROCESS_RUN.getSql(schema()), params, new SingleColumnRowMapper<>());
run.setProcessId(id);
}
/** {@inheritDoc} */
public void insertUnit(int processId, DataProcessUnit unit) {
jdbcNamed.update(INSERT_PROCESS_UNIT.getSql(schema()), getDataProcessUnitParams(processId, unit));
}
/** {@inheritDoc} */
@Override
public void updateRun(DataProcessRun run) {
jdbcNamed.update(UPDATE_DATA_PROCESS_RUN.getSql(schema()), getDataProcessRunParams(run));
}
/** --- Internal --- */
private static final RowMapper<DataProcessRun> processRunRowMapper = (rs, rowNum) -> {
DataProcessRun run = new DataProcessRun(rs.getInt("id"), getLocalDateTimeFromRs(rs, "process_start_date_time"),
rs.getString("invoked_by"));
run.setEndDateTime(getLocalDateTimeFromRs(rs, "process_end_date_time"));
run.getExceptions().append(rs.getString("exceptions"));
return run;
};
private static final RowMapper<DataProcessUnit> processUnitRowMapper = (rs, rowNum) -> {
DataProcessUnit unit = new DataProcessUnit(
rs.getString("source_type"), rs.getString("source_id"), getLocalDateTimeFromRs(rs, "start_date_time"),
DataProcessAction.valueOf(rs.getString("action")));
unit.setEndDateTime(getLocalDateTimeFromRs(rs, "end_date_time"));
unit.setErrors(new StringBuilder(rs.getString("errors")));
unit.setMessages(new StringBuilder(rs.getString("messages")));
return unit;
};
private MapSqlParameterSource getDataProcessRunParams(DataProcessRun run) {
return new MapSqlParameterSource()
.addValue("id", run.getProcessId())
.addValue("startDateTime", toDate(run.getStartDateTime()))
.addValue("endDateTime", toDate(run.getEndDateTime()))
.addValue("invokedBy", run.getInvokedBy())
.addValue("exceptions", run.getExceptions().toString());
}
private MapSqlParameterSource getDataProcessUnitParams(int processId, DataProcessUnit unit) {
return new MapSqlParameterSource("processId", processId)
.addValue("sourceType", unit.getSourceType())
.addValue("sourceId", unit.getSourceId())
.addValue("action", unit.getAction().name())
.addValue("startDateTime", toDate(unit.getStartDateTime()))
.addValue("endDateTime", toDate(unit.getEndDateTime()))
.addValue("messages", unit.getMessages())
.addValue("errors", unit.getErrorsBuilder());
}
}