private void CompleteFacetCalculationsStage1(IndexSearcherHolder.IndexSearcherHoldingState state, bool allVectoredTerms) { var fieldsToRead = new HashSet <string>(Facets .Where(x => x.Value.Aggregation != FacetAggregation.None && x.Value.Aggregation != FacetAggregation.Count) .Select(x => x.Value.AggregationField) .Where(x => x != null)); if (fieldsToRead.Count == 0) { return; } var allDocs = new HashSet <int>(matches.Values.SelectMany(x => x.Docs)); if (allVectoredTerms) { IndexedTerms.ReadEntriesForFieldsFromTermVectors(state, fieldsToRead, allDocs, GetValueFromIndex, (field, textVal, currentVal, docId) => HandleFacetsCalculationStage1(docId, field, textVal, currentVal)); } else { IndexedTerms.ReadEntriesForFields(state, fieldsToRead, allDocs, GetValueFromIndex, (field, textVal, currentVal, docId) => HandleFacetsCalculationStage1(docId, field, textVal, currentVal)); } }
public void Execute() { //We only want to run the base query once, so we capture all of the facet-ing terms then run the query // once through the collector and pull out all of the terms in one shot var allCollector = new GatherAllCollector(); var facetsByName = new Dictionary <string, Dictionary <string, FacetValue> >(); using (var currentState = Database.IndexStorage.GetCurrentStateHolder(Index)) { var currentIndexSearcher = currentState.IndexSearcher; var baseQuery = Database.IndexStorage.GetLuceneQuery(Index, IndexQuery, Database.IndexQueryTriggers); currentIndexSearcher.Search(baseQuery, allCollector); var fields = Facets.Values.Select(x => x.Name) .Concat(Ranges.Select(x => x.Key)); var fieldsToRead = new HashSet <string>(fields); FieldTermVector fieldTermVector; var allVectoredTerms = fieldsToRead.All(s => indexDefinition.TermVectors.TryGetValue(s, out fieldTermVector) && fieldTermVector != FieldTermVector.No); if (allVectoredTerms) { IndexedTerms.ReadEntriesForFieldsFromTermVectors(currentState, fieldsToRead, allCollector.Documents, (field, value, doc) => HandleFacets(field, value, facetsByName, doc)); } else { IndexedTerms.ReadEntriesForFields(currentState, fieldsToRead, allCollector.Documents, (field, value, doc) => HandleFacets(field, value, facetsByName, doc)); } UpdateFacetResults(facetsByName); CompleteFacetCalculationsStage1(currentState, allVectoredTerms); CompleteFacetCalculationsStage2(); } }