public SubScorer(Scorer scorer, bool required, bool prohibited, HitCollector collector, SubScorer next) { this.scorer = scorer; this.done = !scorer.Next(); this.required = required; this.prohibited = prohibited; this.collector = collector; this.next = next; }
internal void Add(Scorer scorer, bool required, bool prohibited) { int mask = 0; if (required || prohibited) { if (nextMask == 0) throw new System.IndexOutOfRangeException("More than 32 required/prohibited clauses in query."); mask = nextMask; nextMask = nextMask << 1; } else mask = 0; if (!prohibited) maxCoord++; if (prohibited) prohibitedMask |= mask; // update prohibited mask else if (required) requiredMask |= mask; // update required mask scorers = new SubScorer(scorer, required, prohibited, bucketTable.NewCollector(mask), scorers); }
internal void Add(Scorer scorer) { scorers.Insert(scorers.Count, scorer); }
public virtual Scorer Scorer(Monodoc.Lucene.Net.Index.IndexReader reader) { // First see if the (faster) ConjunctionScorer will work. This can be // used when all clauses are required. Also, at this point a // BooleanScorer cannot be embedded in a ConjunctionScorer, as the hits // from a BooleanScorer are not always sorted by document number (sigh) // and hence BooleanScorer cannot implement skipTo() correctly, which is // required by ConjunctionScorer. bool allRequired = true; bool noneBoolean = true; for (int i = 0; i < weights.Count; i++) { BooleanClause c = (BooleanClause)Enclosing_Instance.clauses[i]; if (!c.required) { allRequired = false; } if (c.query is BooleanQuery) { noneBoolean = false; } } if (allRequired && noneBoolean) { // ConjunctionScorer is okay ConjunctionScorer result = new ConjunctionScorer(Enclosing_Instance.GetSimilarity(searcher)); for (int i = 0; i < weights.Count; i++) { Weight w = (Weight)weights[i]; Scorer subScorer = w.Scorer(reader); if (subScorer == null) { return(null); } result.Add(subScorer); } return(result); } // Use good-old BooleanScorer instead. BooleanScorer result2 = new BooleanScorer(Enclosing_Instance.GetSimilarity(searcher)); for (int i = 0; i < weights.Count; i++) { BooleanClause c = (BooleanClause)Enclosing_Instance.clauses[i]; Weight w = (Weight)weights[i]; Scorer subScorer = w.Scorer(reader); if (subScorer != null) { result2.Add(subScorer, c.required, c.prohibited); } else if (c.required) { return(null); } } return(result2); }