int totalMaxDocs = searcher.getSearcher().maxDoc();
final int maxDocs = Math.min( n, totalMaxDocs );
final Weight weight = preparedQuery.weight( searcher.getSearcher() );
final TopDocsCollector<?> topDocCollector;
final TotalHitCountCollector hitCountCollector;
Collector collector = null;
if ( maxDocs != 0 ) {
topDocCollector = createTopDocCollector( maxDocs, weight );
hitCountCollector = null;
collector = topDocCollector;
collector = optionallyEnableFieldCacheOnTypes( collector, totalMaxDocs, maxDocs );
collector = optionallyEnableFieldCacheOnIds( collector, totalMaxDocs, maxDocs );
collector = optionallyEnableFacetingCollectors( collector );
collector = optionallyEnableDistanceCollector( collector, maxDocs );
}
else {
topDocCollector = null;
hitCountCollector = new TotalHitCountCollector();
collector = hitCountCollector;
}
collector = decorateWithTimeOutCollector( collector );
boolean timeoutNow = isImmediateTimeout();
if ( !timeoutNow ) {
try {
searcher.getSearcher().search( weight, filter, collector );
}
catch ( TimeLimitingCollector.TimeExceededException e ) {
//we have reached the time limit and stopped before the end
//TimeoutManager.isTimedOut should be above that limit but set if for safety
timeoutManager.forceTimedOut();
}
}
// update top docs and totalHits
if ( maxDocs != 0 ) {
this.topDocs = topDocCollector.topDocs();
this.totalHits = topDocs.totalHits;
// if we were collecting facet data we have to update our instance state
if ( facetCollectors != null && !facetCollectors.isEmpty() ) {
facetMap = new HashMap<String, List<Facet>>();
for ( FacetCollector facetCollector : facetCollectors ) {
facetMap.put( facetCollector.getFacetName(), facetCollector.getFacetList() );
}
}
}
else {
this.topDocs = null;
this.totalHits = hitCountCollector.getTotalHits();
}
timeoutManager.isTimedOut();
}