package gov.nysenate.openleg.dao.law.data; import com.google.common.collect.Range; import gov.nysenate.openleg.dao.base.*; import gov.nysenate.openleg.model.law.LawDocId; import gov.nysenate.openleg.model.law.LawVersionId; 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.HashMap; import java.util.Map; import static gov.nysenate.openleg.dao.law.data.SqlLawUpdatesQuery.*; @Repository public class SqlLawUpdatesDao extends SqlBaseDao implements LawUpdatesDao { private static final Logger logger = LoggerFactory.getLogger(SqlLawUpdatesDao.class); /** {@inheritDoc} */ @Override public PaginatedList<UpdateToken<LawVersionId>> getUpdates( Range<LocalDateTime> dateTimeRange, UpdateType type, SortOrder dateOrder, LimitOffset limitOffset) { MapSqlParameterSource params = new MapSqlParameterSource(); addDateTimeRangeParams(params, dateTimeRange); String sql = getQuery(SELECT_LAW_UPDATE_TOKENS, type, dateOrder, limitOffset); PaginatedRowHandler<UpdateToken<LawVersionId>> handler = new PaginatedRowHandler<>(limitOffset, "total_updated", lawIdUpdateTokenMapper); jdbcNamed.query(sql, params, handler); return handler.getList(); } /** {@inheritDoc} */ @Override public PaginatedList<UpdateDigest<LawDocId>> getDetailedUpdates( Range<LocalDateTime> dateTimeRange, UpdateType type, SortOrder dateOrder, LimitOffset limitOffset) { MapSqlParameterSource params = new MapSqlParameterSource(); addDateTimeRangeParams(params, dateTimeRange); String sql = getQuery(SELECT_LAW_UPDATE_DIGESTS, type, dateOrder, limitOffset); PaginatedRowHandler<UpdateDigest<LawDocId>> handler = new PaginatedRowHandler<>(limitOffset, "total_updated", lawDocIdUpdateDigestMapper); jdbcNamed.query(sql, params, handler); return handler.getList(); } /** {@inheritDoc} */ @Override public PaginatedList<UpdateDigest<LawDocId>> getDetailedUpdatesForLaw( String lawId, Range<LocalDateTime> dateTimeRange, UpdateType type, SortOrder dateOrder, LimitOffset limitOffset) { MapSqlParameterSource params = new MapSqlParameterSource(); params.addValue("lawId", lawId); addDateTimeRangeParams(params, dateTimeRange); String sql = getQuery(SELECT_LAW_UPDATE_DIGESTS_FOR_LAW, type, dateOrder, limitOffset); PaginatedRowHandler<UpdateDigest<LawDocId>> handler = new PaginatedRowHandler<>(limitOffset, "total_updated", lawDocIdUpdateDigestMapper); jdbcNamed.query(sql, params, handler); return handler.getList(); } /** {@inheritDoc} */ @Override public PaginatedList<UpdateDigest<LawDocId>> getDetailedUpdatesForDocument( String documentId, Range<LocalDateTime> dateTimeRange, UpdateType type, SortOrder dateOrder, LimitOffset limitOffset) { MapSqlParameterSource params = new MapSqlParameterSource(); params.addValue("documentId", documentId); addDateTimeRangeParams(params, dateTimeRange); String sql = getQuery(SELECT_LAW_UPDATE_DIGESTS_FOR_DOCUMENT, type, dateOrder, limitOffset); PaginatedRowHandler<UpdateDigest<LawDocId>> handler = new PaginatedRowHandler<>(limitOffset, "total_updated", lawDocIdUpdateDigestMapper); jdbcNamed.query(sql, params, handler); return handler.getList(); } /** --- Internal --- */ private String getQuery(SqlLawUpdatesQuery query, UpdateType type, SortOrder dateOrder, LimitOffset limitOffset) { String dateColumn = getDateColumnForUpdateType(type); OrderBy orderBy = getOrderByForUpdateType(type, dateOrder); String sql = query.getSql(schema(), orderBy, limitOffset); return queryReplace(sql, "dateColumn", dateColumn); } private static final RowMapper<UpdateToken<LawVersionId>> lawIdUpdateTokenMapper = (rs, rowNum) -> { LocalDateTime lastPubDateTime = getLocalDateTimeFromRs(rs, "last_published_date_time"); return new UpdateToken<>(new LawVersionId(rs.getString("law_id"), lastPubDateTime.toLocalDate()), UpdateContentType.LAW, rs.getString("last_source_file"), lastPubDateTime, getLocalDateTimeFromRs(rs, "last_processed_date_time")); }; private static final RowMapper<UpdateToken<LawDocId>> lawDocIdUpdateTokenMapper = (rs, rowNum) -> { LocalDateTime lastPubDateTime = getLocalDateTimeFromRs(rs, "last_published_date_time"); LawDocId lawDocId = new LawDocId(rs.getString("document_id"), lastPubDateTime.toLocalDate()); return new UpdateToken<>(lawDocId, UpdateContentType.LAW, rs.getString("last_source_file"), lastPubDateTime, getLocalDateTimeFromRs(rs, "last_processed_date_time")); }; private static final RowMapper<UpdateDigest<LawDocId>> lawDocIdUpdateDigestMapper = (rs, rowNum) -> { UpdateToken<LawDocId> updateToken = lawDocIdUpdateTokenMapper.mapRow(rs, rowNum); UpdateDigest<LawDocId> digest = new UpdateDigest<>(updateToken); digest.setTable(rs.getString("table_name")); digest.setAction(rs.getString("action")); return digest; }; }