package gov.nysenate.openleg.dao.calendar.data; import com.google.common.collect.Range; import gov.nysenate.openleg.dao.base.*; import gov.nysenate.openleg.model.calendar.CalendarId; 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 java.util.Map; import static gov.nysenate.openleg.dao.calendar.data.SqlCalendarUpdatesQuery.*; @Repository public class SqlCalendarUpdatesDao extends SqlBaseDao implements CalendarUpdatesDao { private static final Logger logger = LoggerFactory.getLogger(SqlCalendarUpdatesDao.class); /** {@inheritDoc} */ @Override public PaginatedList<UpdateToken<CalendarId>> getUpdates( UpdateType updateType, Range<LocalDateTime> dateTimeRange, SortOrder dateOrder, LimitOffset limitOffset) { MapSqlParameterSource params = getDateTimeRangeParams(dateTimeRange); String queryString = getSqlQuery(false, false, updateType, dateOrder, limitOffset); PaginatedRowHandler<UpdateToken<CalendarId>> rowHandler = new PaginatedRowHandler<>(limitOffset, "total_updated", calendarUpdateTokenRowMapper); jdbcNamed.query(queryString, params, rowHandler); return rowHandler.getList(); } /** {@inheritDoc} */ @Override public PaginatedList<UpdateDigest<CalendarId>> getDetailedUpdates( UpdateType updateType, Range<LocalDateTime> dateTimeRange, SortOrder dateOrder, LimitOffset limitOffset) { MapSqlParameterSource params = getDateTimeRangeParams(dateTimeRange); String queryString = getSqlQuery(true, false, updateType, dateOrder, limitOffset); PaginatedRowHandler<UpdateDigest<CalendarId>> rowHandler = new PaginatedRowHandler<>(limitOffset, "total_updated", calendarUpdateDigestRowMapper); jdbcNamed.query(queryString, params, rowHandler); return rowHandler.getList(); } /** {@inheritDoc} */ @Override public PaginatedList<UpdateDigest<CalendarId>> getDetailedUpdatesForCalendar( UpdateType updateType, CalendarId calendarId, Range<LocalDateTime> dateTimeRange, SortOrder dateOrder, LimitOffset limitOffset) { MapSqlParameterSource params = getCalendarIdParams(calendarId, dateTimeRange); String queryString = getSqlQuery(true, true, updateType, dateOrder, limitOffset); PaginatedRowHandler<UpdateDigest<CalendarId>> rowHandler = new PaginatedRowHandler<>(limitOffset, "total_updated", calendarUpdateDigestRowMapper); jdbcNamed.query(queryString, params, rowHandler); return rowHandler.getList(); } /** --- Internal --- */ /** * Generates the appropriate sql query based on the args, to remove code duplication. */ private String getSqlQuery(boolean detail, boolean specificCalendar, UpdateType updateType, SortOrder sortOrder, LimitOffset limOff) { String dateColumn = getDateColumnForUpdateType(updateType); OrderBy orderBy = getOrderByForUpdateType(updateType, sortOrder); String sqlQuery; if (specificCalendar) { sqlQuery = SELECT_UPDATE_DIGESTS_FOR_SPECIFIC_CALENDAR.getSql(schema(), orderBy, limOff); } else { sqlQuery = (detail) ? SELECT_CALENDAR_UPDATE_DIGESTS.getSql(schema(), orderBy, limOff) : SELECT_CALENDAR_UPDATE_TOKENS.getSql(schema(), orderBy, limOff); } sqlQuery = queryReplace(sqlQuery, "dateColumn", dateColumn); return sqlQuery; } private static RowMapper<UpdateToken<CalendarId>> calendarUpdateTokenRowMapper = (rs, rowNum) -> new UpdateToken<>( new CalendarId(rs.getInt("calendar_no"), rs.getInt("calendar_year")), UpdateContentType.CALENDAR, rs.getString("last_fragment_id"), getLocalDateTimeFromRs(rs, "last_published_date_time"), getLocalDateTimeFromRs(rs, "last_processed_date_time") ); private static RowMapper<UpdateDigest<CalendarId>> calendarUpdateDigestRowMapper = (rs, rowNum) -> { UpdateDigest<CalendarId> digest = new UpdateDigest<>(calendarUpdateTokenRowMapper.mapRow(rs, rowNum)); Map<String, String> data = getHstoreMap(rs, "data"); digest.setFields(data); digest.setAction(rs.getString("action")); digest.setTable(rs.getString("table_name")); return digest; }; private MapSqlParameterSource getCalendarIdParams(CalendarId calendarId, Range<LocalDateTime> dateTimeRange) { return getDateTimeRangeParams(dateTimeRange) .addValue("calendarNo", calendarId.getCalNo()) .addValue("calendarYear", calendarId.getYear()); } }