package gov.nysenate.openleg.dao.log.search; import com.fasterxml.jackson.databind.ObjectMapper; import gov.nysenate.openleg.client.view.log.ApiLogItemView; import gov.nysenate.openleg.dao.base.ElasticBaseDao; import gov.nysenate.openleg.dao.base.LimitOffset; import gov.nysenate.openleg.dao.base.SearchIndex; import gov.nysenate.openleg.model.auth.ApiResponse; import gov.nysenate.openleg.model.search.SearchResults; import gov.nysenate.openleg.util.OutputUtils; import org.elasticsearch.action.bulk.BulkRequestBuilder; import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.search.sort.SortBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @Repository public class ElasticApiLogSearchDao extends ElasticBaseDao implements ApiLogSearchDao { private static final Logger logger = LoggerFactory.getLogger(ElasticApiLogSearchDao.class); protected static final String logIndexName = SearchIndex.API_LOG.getIndexName(); @Autowired protected ObjectMapper objectMapper; /** {@inheritDoc} */ @Override public SearchResults<Integer> searchLogs(QueryBuilder query, QueryBuilder filter, List<SortBuilder> sort, LimitOffset limOff) { SearchRequestBuilder searchBuilder = getSearchRequest(logIndexName, query, filter, null, null, sort, limOff, false); SearchResponse response = searchBuilder.execute().actionGet(); return getSearchResults(response, limOff, hit -> Integer.parseInt(hit.getId())); } /** {@inheritDoc} */ @Override public SearchResults<ApiLogItemView> searchLogsAndFetchData(QueryBuilder query, QueryBuilder filter, List<SortBuilder> sort, LimitOffset limOff) { SearchRequestBuilder searchBuilder = getSearchRequest(logIndexName, query, filter, null, null, sort, limOff, true); SearchResponse response = searchBuilder.execute().actionGet(); return getSearchResults(response, limOff, hit -> objectMapper.convertValue(hit.getSource(), ApiLogItemView.class)); } /** {@inheritDoc} */ @Override public void updateLogIndex(ApiResponse apiResponse) { updateLogIndex(Collections.singletonList(apiResponse)); } /** {@inheritDoc} */ @Override public void updateLogIndex(Collection<ApiResponse> apiResponses) { if (!apiResponses.isEmpty()) { BulkRequestBuilder bulkRequest = searchClient.prepareBulk(); List<ApiLogItemView> logViewList = apiResponses.stream().map(ApiLogItemView::new).collect(Collectors.toList()); logViewList.forEach(log -> bulkRequest.add(searchClient .prepareIndex(logIndexName, "default", Integer.toString(log.getRequestId())) .setSource(OutputUtils.toJson(log))) ); safeBulkRequestExecute(bulkRequest); } } /** {@inheritDoc} */ @Override public void deleteLogFromIndex(Integer requestId) { deleteEntry(logIndexName, "default", Integer.toString(requestId)); } /** {@inheritDoc} */ @Override protected List<String> getIndices() { return Collections.singletonList(logIndexName); } }