public override TermStatistics TermStatistics(Term term, TermContext context) { Debug.Assert(term != null); long docFreq = 0; long totalTermFreq = 0; for (int nodeID = 0; nodeID < NodeVersions.Length; nodeID++) { TermStatistics subStats; if (nodeID == MyNodeID) { subStats = base.TermStatistics(term, context); } else { TermAndShardVersion key = new TermAndShardVersion(nodeID, NodeVersions[nodeID], term); subStats = OuterInstance.TermStatsCache[key]; // We pre-cached during rewrite so all terms // better be here... Debug.Assert(subStats != null); } long nodeDocFreq = subStats.DocFreq(); if (docFreq >= 0 && nodeDocFreq >= 0) { docFreq += nodeDocFreq; } else { docFreq = -1; } long nodeTotalTermFreq = subStats.TotalTermFreq(); if (totalTermFreq >= 0 && nodeTotalTermFreq >= 0) { totalTermFreq += nodeTotalTermFreq; } else { totalTermFreq = -1; } } return new TermStatistics(term.Bytes, docFreq, totalTermFreq); }
public override Query Rewrite(Query original) { Query rewritten = base.Rewrite(original); HashSet<Term> terms = new HashSet<Term>(); rewritten.ExtractTerms(terms); // Make a single request to remote nodes for term // stats: for (int nodeID = 0; nodeID < NodeVersions.Length; nodeID++) { if (nodeID == MyNodeID) { continue; } HashSet<Term> missing = new HashSet<Term>(); foreach (Term term in terms) { TermAndShardVersion key = new TermAndShardVersion(nodeID, NodeVersions[nodeID], term); if (!OuterInstance.TermStatsCache.ContainsKey(key)) { missing.Add(term); } } if (missing.Count != 0) { foreach (KeyValuePair<Term, TermStatistics> ent in OuterInstance.OuterInstance.GetNodeTermStats(missing, nodeID, NodeVersions[nodeID])) { TermAndShardVersion key = new TermAndShardVersion(nodeID, NodeVersions[nodeID], ent.Key); OuterInstance.TermStatsCache[key] = ent.Value; } } } return rewritten; }