protected override IEnumerable<LucObject> DoExecute(Query query, bool allVersions, IndexReader idxReader, out int totalCount)
{
Searcher searcher = null;
IEnumerable<LucObject> result;
totalCount = 0;
BeginFullExecutingTime();
searcher = new IndexSearcher(idxReader);
var numDocs = idxReader.NumDocs();
var start = this.LucQuery.Skip;
var maxtop = numDocs - start;
if (maxtop < 1)
return EmptyResult;
int top = this.LucQuery.Top != 0 ? this.LucQuery.Top : this.LucQuery.PageSize;
if (top == 0)
top = 100000;
var howMany = (top < int.MaxValue / 2) ? top * 2 : int.MaxValue; // numDocs; // * 4; // * 2;
bool noMorePage = false;
if ((long)howMany > maxtop)
{
howMany = maxtop - start;
noMorePage = true;
}
var numHits = howMany + start;
if (numHits > numDocs)
numHits = numDocs;
try
{
//====================================================
var collector = CreateCollector(numHits);
BeginKernelTime();
searcher.Search(query, collector);
FinishKernelTime();
BeginCollectingTime();
//var topDocs = collector.TopDocs(start, howMany);
var topDocs = (this.LucQuery.SortFields.Length > 0) ?
((TopFieldCollector)collector).TopDocs(start, howMany) :
((TopScoreDocCollector)collector).TopDocs(start, howMany);
totalCount = topDocs.TotalHits;
var hits = topDocs.ScoreDocs;
FinishCollectingTime();
//====================================================
BeginPagingTime();
bool noMoreHits;
result = GetResultPage(hits, searcher, top, allVersions, out noMoreHits);
FinishPagingTime();
if (result.Count() < top && !noMorePage /*&& !noMoreHits*/)
{
//re-search
numHits = numDocs - start;
collector = CreateCollector(numHits);
searcher.Search(query, collector);
//topDocs = collector.TopDocs(start);
topDocs = (this.LucQuery.SortFields.Length > 0) ?
((TopFieldCollector)collector).TopDocs(start, howMany) :
((TopScoreDocCollector)collector).TopDocs(start, howMany);
hits = topDocs.ScoreDocs;
result = GetResultPage(hits, searcher, top, allVersions, out noMoreHits);
}
return result;
}
catch
{
FinishKernelTime();
FinishCollectingTime();
FinishPagingTime();
throw;
}
finally
{
if (searcher != null)
searcher.Close();
searcher = null;
FinishFullExecutingTime();
}
}
protected Collector CreateCollector(int numHits)