internal static IQueryable <T> TrackRetrievedDocuments <T>(this IQueryable <T> source, IRetrievedDocumentTracker <T> tracker) { return(source.Provider.CreateQuery <T>( Expression.Call(((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(T)), source.Expression, Expression.Constant(tracker)))); }
private IEnumerable <T> EnumerateHits <T>(TopDocs hits, QueryExecutionContext executionContext, Searchable searcher, IRetrievedDocumentTracker <TDocument> tracker, ItemHolder itemHolder, int skipResults, Func <TDocument, T> projector) { for (var i = skipResults; i < hits.ScoreDocs.Length; i++) { executionContext.CurrentHit = i; executionContext.CurrentScoreDoc = hits.ScoreDocs[i]; var docNum = hits.ScoreDocs[i].Doc; var document = searcher.Doc(docNum); if (tracker == null) { itemHolder.Current = ConvertDocument(document, executionContext); yield return(projector(itemHolder.Current)); continue; } var key = GetDocumentKey(document, executionContext); if (tracker.IsMarkedForDeletion(key)) { continue; } TDocument item; if (!tracker.TryGetTrackedDocument(key, out item)) { item = ConvertDocument(document, executionContext); tracker.TrackDocument(key, item, document); } itemHolder.Current = item; yield return(projector(itemHolder.Current)); } }