package gov.nysenate.openleg.dao.entity.member.search; import com.google.common.collect.Lists; import gov.nysenate.openleg.client.view.entity.MemberView; 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.base.SessionYear; import gov.nysenate.openleg.model.entity.SessionMember; 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.SearchHit; import org.elasticsearch.search.sort.SortBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Repository; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.stream.Collectors; @Repository public class ElasticMemberSearchDao extends ElasticBaseDao implements MemberSearchDao { private static final Logger logger = LoggerFactory.getLogger(ElasticMemberSearchDao.class); protected static final String memberIndexName = SearchIndex.MEMBER.getIndexName(); /** {@inheritDoc} */ @Override public SearchResults<SessionMember> searchMembers(QueryBuilder query, QueryBuilder filter, List<SortBuilder> sort, LimitOffset limOff) { SearchRequestBuilder searchBuilder = getSearchRequest(memberIndexName, query, filter, sort, limOff); SearchResponse response = searchBuilder.execute().actionGet(); logger.debug("Member search result with query {} and filter {} took {} ms", query, filter, response.getTookInMillis()); return getSearchResults(response, limOff, this::getMemberFromHit); } /** {@inheritDoc} */ @Override public void updateMemberIndex(SessionMember member) { updateMemberIndex(Arrays.asList(member)); } /** {@inheritDoc} */ @Override public void updateMemberIndex(Collection<SessionMember> members) { if (!members.isEmpty()) { BulkRequestBuilder bulkRequest = searchClient.prepareBulk(); List<MemberView> memberViewList = members.stream().map(MemberView::new).collect(Collectors.toList()); memberViewList.forEach(m -> bulkRequest.add(searchClient.prepareIndex(memberIndexName, String.valueOf(m.getSessionYear()), String.valueOf(m.getMemberId())) .setSource(OutputUtils.toJson(m))) ); safeBulkRequestExecute(bulkRequest); } } /** {@inheritDoc} */ @Override public void deleteMemberFromIndex(SessionMember member) { if (member != null) { deleteEntry(memberIndexName, String.valueOf(member.getPersonId()), String.valueOf(member.getSessionYear())); } } /** {@inheritDoc} */ @Override protected List<String> getIndices() { return Lists.newArrayList(memberIndexName); } private SessionMember getMemberFromHit(SearchHit hit) { return new SessionMember(Integer.valueOf(hit.getId()), SessionYear.of(Integer.valueOf(hit.getType()))); } }