package gov.nysenate.openleg.dao.agenda.data;
import com.google.common.collect.Range;
import gov.nysenate.openleg.dao.base.*;
import gov.nysenate.openleg.model.agenda.AgendaId;
import gov.nysenate.openleg.model.updates.UpdateContentType;
import gov.nysenate.openleg.model.updates.UpdateDigest;
import gov.nysenate.openleg.model.updates.UpdateToken;
import gov.nysenate.openleg.model.updates.UpdateType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.stereotype.Repository;
import java.time.LocalDateTime;
import static gov.nysenate.openleg.dao.agenda.data.SqlAgendaUpdatesQuery.*;
@Repository
public class SqlAgendaUpdatesDao extends SqlBaseDao implements AgendaUpdatesDao
{
private static final Logger logger = LoggerFactory.getLogger(SqlAgendaUpdatesDao.class);
/** {@inheritDoc} */
@Override
public PaginatedList<UpdateToken<AgendaId>> getUpdates(Range<LocalDateTime> dateTimeRange, UpdateType type,
SortOrder dateOrder, LimitOffset limOff) {
MapSqlParameterSource params = new MapSqlParameterSource();
addDateTimeRangeParams(params, dateTimeRange);
String sqlQuery = getSqlQuery(false, false, type, dateOrder, limOff);
PaginatedRowHandler<UpdateToken<AgendaId>> handler =
new PaginatedRowHandler<>(limOff, "total_updated", agendaUpdateTokenRowMapper);
jdbcNamed.query(sqlQuery, params, handler);
return handler.getList();
}
/** {@inheritDoc} */
@Override
public PaginatedList<UpdateDigest<AgendaId>> getDetailedUpdates(Range<LocalDateTime> dateTimeRange, UpdateType type,
SortOrder dateOrder, LimitOffset limOff) {
MapSqlParameterSource params = new MapSqlParameterSource();
addDateTimeRangeParams(params, dateTimeRange);
String sqlQuery = getSqlQuery(true, false, type, dateOrder, limOff);
PaginatedRowHandler<UpdateDigest<AgendaId>> handler =
new PaginatedRowHandler<>(limOff, "total_updated", agendaUpdateDigestRowMapper);
jdbcNamed.query(sqlQuery, params, handler);
return handler.getList();
}
/** {@inheritDoc} */
@Override
public PaginatedList<UpdateDigest<AgendaId>> getDetailedUpdatesForAgenda(
AgendaId agendaId, Range<LocalDateTime> dateTimeRange, UpdateType type, SortOrder dateOrder, LimitOffset limOff) {
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("agendaNo", agendaId.getNumber()).addValue("year", agendaId.getYear());
addDateTimeRangeParams(params, dateTimeRange);
String sqlQuery = getSqlQuery(true, true, type, dateOrder, limOff);
PaginatedRowHandler<UpdateDigest<AgendaId>> handler =
new PaginatedRowHandler<>(limOff, "total_updated", agendaUpdateDigestRowMapper);
jdbcNamed.query(sqlQuery, params, handler);
return handler.getList();
}
/** --- Internal --- */
private static final RowMapper<UpdateToken<AgendaId>> agendaUpdateTokenRowMapper = (rs, rowNum) ->
new UpdateToken<>(
new AgendaId(rs.getInt("agenda_no"), rs.getInt("year")), UpdateContentType.AGENDA,
rs.getString("last_fragment_id"), getLocalDateTimeFromRs(rs, "last_published_date_time"),
getLocalDateTimeFromRs(rs, "last_processed_date_time"));
private static RowMapper<UpdateDigest<AgendaId>> agendaUpdateDigestRowMapper = (rs, rowNum) -> {
UpdateDigest<AgendaId> digest = new UpdateDigest<>(agendaUpdateTokenRowMapper.mapRow(rs, rowNum));
digest.setFields(getHstoreMap(rs, "data"));
digest.setAction(rs.getString("action"));
digest.setTable(rs.getString("table_name"));
return digest;
};
/**
* Generates the appropriate sql query based on the args, to remove code duplication.
*/
private String getSqlQuery(boolean detail, boolean specificAgenda, UpdateType updateType, SortOrder sortOrder,
LimitOffset limOff) {
String dateColumn = getDateColumnForUpdateType(updateType);
OrderBy orderBy = getOrderByForUpdateType(updateType, sortOrder);
String sqlQuery;
if (specificAgenda) {
sqlQuery = SELECT_UPDATE_DIGESTS_FOR_SPECIFIC_AGENDA.getSql(schema(), orderBy, limOff);
}
else {
sqlQuery = (detail) ? SELECT_AGENDA_UPDATE_DIGESTS.getSql(schema(), orderBy, limOff)
: SELECT_AGENDA_UPDATE_TOKENS.getSql(schema(), orderBy, limOff);
}
sqlQuery = queryReplace(sqlQuery, "dateColumn", dateColumn);
return sqlQuery;
}
}