package org.sakaiproject.search.elasticsearch; import com.google.common.collect.ForwardingList; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.facet.terms.InternalTermsFacet; import org.sakaiproject.search.api.*; import org.sakaiproject.search.elasticsearch.filter.SearchItemFilter; import java.util.*; /** * Created by IntelliJ IDEA. * User: jbush * Date: 10/31/12 * Time: 2:19 PM * To change this template use File | Settings | File Templates. */ public class ElasticSearchList extends ForwardingList<SearchResult> implements SearchList { private static final Log log = LogFactory.getLog(ElasticSearchList.class); private final List<SearchResult> results; private final SearchResponse response; private final SearchItemFilter filter; public ElasticSearchList(String searchTerms, SearchResponse response, ElasticSearchService elasticSearchService, ElasticSearchIndexBuilder searchIndexBuilder, String facetName, SearchItemFilter filter) { this.response = response; this.filter = filter; results = new ArrayList<SearchResult>(); List<String> references = new ArrayList<String>(); for (SearchHit hit : response.getHits()) { references.add(searchIndexBuilder.getFieldFromSearchHit(SearchService.FIELD_REFERENCE, hit) ); } SearchResponse highlightedResponse = null; try { highlightedResponse = elasticSearchService.search(searchTerms, new ArrayList<String>(), 0, references.size(), references); } catch (Exception e) { log.error("problem running hightlighted and facetted search: " + e.getMessage(), e); return; } int i=0; for (SearchHit hit : highlightedResponse.getHits()) { InternalTermsFacet facet = null; if (elasticSearchService.getUseFacetting()){ facet = (InternalTermsFacet) highlightedResponse.getFacets().facet(facetName); } ElasticSearchResult result = new ElasticSearchResult(hit, facet, searchIndexBuilder, searchTerms); result.setIndex(i++); results.add(filter.filter(result)); } } @Override public Iterator<SearchResult> iterator(int startAt) { Iterator<SearchResult> iterator = iterator(); //Skip the fist elements for (int i = 0; i < startAt && iterator.hasNext(); i++) iterator.next(); return iterator; } @Override public int getFullSize() { if (response == null) { return 0; } return (int) response.getHits().getTotalHits(); } @Override public int getStart() { return 0; } @Override protected List<SearchResult> delegate() { return Collections.unmodifiableList(results); } }