Index: src/main/src/org/compass/core/CompassQuery.java =================================================================== --- src/main/src/org/compass/core/CompassQuery.java (revision 3896) +++ src/main/src/org/compass/core/CompassQuery.java (working copy) @@ -18,6 +18,8 @@ import java.util.Locale; +import org.apache.lucene.search.HitCollector; + /** * An object representing a Compass query. The query is created using the * {@link org.compass.core.CompassQueryBuilder}, and used to get the @@ -356,6 +358,11 @@ long count(float minimumScore); /** + * Collect hits using a Lucene {@link HitCollector}. + */ + void collect(HitCollector hitCollector); + + /** * Clones the given query. */ Object clone() throws CloneNotSupportedException; Index: src/main/src/org/compass/core/engine/SearchEngineQuery.java =================================================================== --- src/main/src/org/compass/core/engine/SearchEngineQuery.java (revision 3896) +++ src/main/src/org/compass/core/engine/SearchEngineQuery.java (working copy) @@ -18,6 +18,7 @@ import java.util.Locale; +import org.apache.lucene.search.HitCollector; import org.compass.core.CompassQuery.SortDirection; import org.compass.core.CompassQuery.SortImplicitType; import org.compass.core.CompassQuery.SortPropertyType; @@ -65,5 +66,7 @@ long count(SearchEngine searchEngine, float minimumScore); + void collect(SearchEngine searchEngine, HitCollector hitCollector); + Object clone() throws CloneNotSupportedException; } Index: src/main/src/org/compass/core/impl/DefaultCompassQuery.java =================================================================== --- src/main/src/org/compass/core/impl/DefaultCompassQuery.java (revision 3896) +++ src/main/src/org/compass/core/impl/DefaultCompassQuery.java (working copy) @@ -18,6 +18,7 @@ import java.util.Locale; +import org.apache.lucene.search.HitCollector; import org.compass.core.CompassException; import org.compass.core.CompassHits; import org.compass.core.CompassQuery; @@ -194,6 +195,10 @@ return searchEngineQuery.count(session().getSearchEngine(), minimumScore); } + public void collect(HitCollector hitCollector) { + searchEngineQuery.collect(session().getSearchEngine(), hitCollector); + } + public CompassHits hits() throws CompassException { InternalCompassSession session = session(); SearchEngineHits searchEngineHits = searchEngineQuery.hits(session.getSearchEngine()); Index: src/main/src/org/compass/core/lucene/engine/LuceneSearchEngineQuery.java =================================================================== --- src/main/src/org/compass/core/lucene/engine/LuceneSearchEngineQuery.java (revision 3896) +++ src/main/src/org/compass/core/lucene/engine/LuceneSearchEngineQuery.java (working copy) @@ -24,6 +24,7 @@ import org.apache.lucene.search.BooleanClause; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.Filter; +import org.apache.lucene.search.HitCollector; import org.apache.lucene.search.Query; import org.apache.lucene.search.Sort; import org.apache.lucene.search.SortField; @@ -193,20 +194,29 @@ } public long count(SearchEngine searchEngine, float minimumScore) { - LuceneSearchEngineInternalSearch internalSearch = (LuceneSearchEngineInternalSearch) searchEngine.internalSearch(getSubIndexes(), getAliases()); CountHitCollector countHitCollector = new CountHitCollector(minimumScore); try { + collect(searchEngine, countHitCollector); + return countHitCollector.getTotalHits(); + } catch (SearchEngineException e) { + throw new SearchEngineException("Failed to count query [" + query + "]", e); + } + + } + + public void collect(SearchEngine searchEngine, HitCollector hitCollector) { + LuceneSearchEngineInternalSearch internalSearch = (LuceneSearchEngineInternalSearch) searchEngine.internalSearch(getSubIndexes(), getAliases()); + try { if (internalSearch.getSearcher() == null) { - // no index, return 0 - return 0; + // no index + return; } - internalSearch.getSearcher().search(getQuery(), getLuceneFilter(), countHitCollector); + internalSearch.getSearcher().search(getQuery(), getLuceneFilter(), hitCollector); } catch (IOException e) { - throw new SearchEngineException("Failed to count query [" + query + "]", e); + throw new SearchEngineException("Failed to collect hits for query [" + query + "]", e); } - return countHitCollector.getTotalHits(); } - + public SearchEngineQuery setBoost(float boost) { query.setBoost(boost); return this;