package gov.nysenate.openleg.dao.updates;
import com.google.common.collect.Range;
import gov.nysenate.openleg.dao.base.*;
import gov.nysenate.openleg.model.updates.*;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import java.sql.SQLException;
import java.time.LocalDateTime;
import java.util.Map;
import java.util.Set;
import static gov.nysenate.openleg.dao.updates.SqlAggregateUpdatesQuery.*;
@Repository
public class SqlAggregateUpdatesDao extends SqlBaseDao implements AggregateUpdatesDao {
/** {@inheritDoc} */
@Override
public PaginatedList<UpdateToken<Map<String, String>>> getUpdateTokens(Range<LocalDateTime> dateTimeRange,
Set<UpdateContentType> types, UpdateType updateType,
SortOrder order, LimitOffset limitOffset) {
String query = buildQuery(schema(), limitOffset, order, types, UpdateReturnType.TOKEN, updateType);
PaginatedRowHandler<UpdateToken<Map<String, String>>> rowHandler =
new PaginatedRowHandler<>(limitOffset, "total_updated", aggregateUpdateTokenRowMapper);
jdbcNamed.query(query, getDateTimeRangeParams(dateTimeRange), rowHandler);
return rowHandler.getList();
}
/** {@inheritDoc} */
@Override
public PaginatedList<UpdateDigest<Map<String, String>>> getUpdateDigests(Range<LocalDateTime> dateTimeRange,
Set<UpdateContentType> types, UpdateType updateType,
SortOrder order, LimitOffset limitOffset, boolean detail) {
String query = buildQuery(schema(), limitOffset, order, types,
detail ? UpdateReturnType.DETAIL_DIGEST : UpdateReturnType.DIGEST, updateType);
PaginatedRowHandler<UpdateDigest<Map<String, String>>> rowHandler =
new PaginatedRowHandler<>(limitOffset, "total_updated", aggregateUpdateDigestRowMapper);
jdbcNamed.query(query, getDateTimeRangeParams(dateTimeRange), rowHandler);
return rowHandler.getList();
}
protected static final RowMapper<UpdateToken<Map<String, String>>> aggregateUpdateTokenRowMapper = (rs, num) ->
new UpdateToken<>(getHstoreMap(rs, "id"),
UpdateContentType.getValue(rs.getString("content_type")),
rs.getString("last_source_id"),
getLocalDateTimeFromRs(rs, "last_published_date_time"),
getLocalDateTimeFromRs(rs, "last_processed_date_time"));
protected static final RowMapper<UpdateDigest<Map<String, String>>> aggregateUpdateDigestRowMapper = (rs, num) -> {
UpdateDigest<Map<String, String>> digest = new UpdateDigest<>(aggregateUpdateTokenRowMapper.mapRow(rs, num));
digest.setAction(rs.getString("action"));
digest.setTable(rs.getString("table_name"));
try {
digest.setFields(getHstoreMap(rs, "data"));
} catch (SQLException ignored) {}
return digest;
};
}