package gov.nysenate.openleg.dao.transcript; import com.google.common.collect.Range; import gov.nysenate.openleg.dao.base.*; import gov.nysenate.openleg.model.transcript.Transcript; import gov.nysenate.openleg.model.transcript.TranscriptFile; import gov.nysenate.openleg.model.transcript.TranscriptId; import gov.nysenate.openleg.model.transcript.TranscriptUpdateToken; import gov.nysenate.openleg.util.DateUtils; import org.springframework.dao.DataAccessException; 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.List; import static gov.nysenate.openleg.dao.transcript.SqlTranscriptQuery.*; import static gov.nysenate.openleg.util.DateUtils.toDate; @Repository public class SqlTranscriptDao extends SqlBaseDao implements TranscriptDao { /** {@inheritDoc} */ @Override public List<TranscriptId> getTranscriptIds(SortOrder sortOrder, LimitOffset limOff) { OrderBy orderBy = new OrderBy("filename", sortOrder); return jdbcNamed.query(SELECT_TRANSCRIPT_IDS_BY_YEAR.getSql(schema(), orderBy, limOff), transcriptIdRowMapper); } /** {@inheritDoc} */ @Override public Transcript getTranscript(TranscriptId transcriptId) throws DataAccessException { MapSqlParameterSource params = getTranscriptIdParams(transcriptId); return jdbcNamed.queryForObject(SELECT_TRANSCRIPT_BY_ID.getSql(schema()), params, transcriptRowMapper); } /** {@inheritDoc} */ @Override public void updateTranscript(Transcript transcript, TranscriptFile transcriptFile) { MapSqlParameterSource params = getTranscriptParams(transcript, transcriptFile); if (jdbcNamed.update(UPDATE_TRANSCRIPT.getSql(schema()), params) == 0) { jdbcNamed.update(INSERT_TRANSCRIPT.getSql(schema()), params); } } /** {@inheritDoc} */ @Override public PaginatedList<TranscriptUpdateToken> transcriptsUpdatedDuring(Range<LocalDateTime> dateRange, SortOrder dateOrder, LimitOffset limOff) { MapSqlParameterSource params = new MapSqlParameterSource(); addDateTimeRangeParams(params, dateRange); OrderBy orderBy = new OrderBy("modified_date_time", dateOrder); PaginatedRowHandler<TranscriptUpdateToken> handler = new PaginatedRowHandler<>(limOff, "total_updated", transcriptUpdateRowMapper); jdbcNamed.query(SELECT_TRANSCRIPTS_UPDATED_DURING.getSql(schema(), orderBy, limOff), params, handler); return handler.getList(); } /** --- Param Source Methods --- */ private MapSqlParameterSource getTranscriptParams(Transcript transcript, TranscriptFile transcriptFile) { MapSqlParameterSource params = new MapSqlParameterSource(); params.addValue("transcriptFilename", transcriptFile.getFileName()); params.addValue("sessionType", transcript.getSessionType()); params.addValue("dateTime", toDate(transcript.getDateTime())); params.addValue("location", transcript.getLocation()); params.addValue("text", transcript.getText()); return params; } private MapSqlParameterSource getTranscriptIdParams(TranscriptId transcriptId) { MapSqlParameterSource params = new MapSqlParameterSource(); params.addValue("transcriptFilename", transcriptId.getFilename()); return params; } /** --- Row Mapper Instances --- */ static RowMapper<Transcript> transcriptRowMapper = (rs, rowNum) -> { TranscriptId id = new TranscriptId(rs.getString("transcript_filename")); Transcript transcript = new Transcript(id, rs.getString("session_type"), getLocalDateTimeFromRs(rs, "date_time"), rs.getString("location"), rs.getString("text")); transcript.setModifiedDateTime(getLocalDateTimeFromRs(rs, "modified_date_time")); transcript.setPublishedDateTime(getLocalDateTimeFromRs(rs, "published_date_time")); return transcript; }; static RowMapper<TranscriptId> transcriptIdRowMapper = (rs, rowNum) -> new TranscriptId(rs.getString("filename")); private static RowMapper<TranscriptUpdateToken> transcriptUpdateRowMapper = (rs, rowNum) -> new TranscriptUpdateToken(new TranscriptId(rs.getString("transcript_filename")), getLocalDateTimeFromRs(rs, "modified_date_time")); }