SenseNet.Search.QueryExecutor20100701.DoExecute C# (CSharp) Метод

DoExecute() защищенный Метод

protected DoExecute ( Query query, bool allVersions, IndexReader idxReader, int &totalCount ) : IEnumerable
query Lucene.Net.Search.Query
allVersions bool
idxReader Lucene.Net.Index.IndexReader
totalCount int
Результат IEnumerable
        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)