public virtual int CompareTo(DocsAndCost other) { if (disi == null) { if (other.disi == null) { return(0); } else { return(1); } } else if (other.disi == null) { return(-1); } else if (disi.GetCost() < other.disi.GetCost()) { return(-1); } else if (disi.GetCost() > other.disi.GetCost()) { return(1); } else { return(0); } }
public override bool Score(ICollector collector, int maxDoc) { if (maxDoc != int.MaxValue) { throw new ArgumentException("maxDoc must be System.Int32.MaxValue"); } //if (DEBUG) { // System.out.println("\nscore: reader=" + context.reader()); //} //System.out.println("score r=" + context.reader()); FakeScorer scorer = new FakeScorer(this); collector.SetScorer(scorer); if (drillDownCollector != null) { drillDownCollector.SetScorer(scorer); drillDownCollector.SetNextReader(context); } foreach (DocsAndCost dim in dims) { dim.sidewaysCollector.SetScorer(scorer); dim.sidewaysCollector.SetNextReader(context); } // TODO: if we ever allow null baseScorer ... it will // mean we DO score docs out of order ... hmm, or if we // change up the order of the conjuntions below if (Debugging.AssertsEnabled) { Debugging.Assert(baseScorer != null); } // some scorers, eg ReqExlScorer, can hit NPE if cost is called after nextDoc long baseQueryCost = baseScorer.GetCost(); int numDims = dims.Length; long drillDownCost = 0; for (int dim = 0; dim < numDims; dim++) { DocIdSetIterator disi = dims[dim].disi; if (dims[dim].bits == null && disi != null) { drillDownCost += disi.GetCost(); } } long drillDownAdvancedCost = 0; if (numDims > 1 && dims[1].disi != null) { drillDownAdvancedCost = dims[1].disi.GetCost(); } // Position all scorers to their first matching doc: baseScorer.NextDoc(); int numBits = 0; foreach (DocsAndCost dim in dims) { if (dim.disi != null) { dim.disi.NextDoc(); } else if (dim.bits != null) { numBits++; } } IBits[] bits = new IBits[numBits]; ICollector[] bitsSidewaysCollectors = new ICollector[numBits]; DocIdSetIterator[] disis = new DocIdSetIterator[numDims - numBits]; ICollector[] sidewaysCollectors = new ICollector[numDims - numBits]; int disiUpto = 0; int bitsUpto = 0; for (int dim = 0; dim < numDims; dim++) { DocIdSetIterator disi = dims[dim].disi; if (dims[dim].bits == null) { disis[disiUpto] = disi; sidewaysCollectors[disiUpto] = dims[dim].sidewaysCollector; disiUpto++; } else { bits[bitsUpto] = dims[dim].bits; bitsSidewaysCollectors[bitsUpto] = dims[dim].sidewaysCollector; bitsUpto++; } } /* * System.out.println("\nbaseDocID=" + baseScorer.docID() + " est=" + estBaseHitCount); * System.out.println(" maxDoc=" + context.reader().maxDoc()); * System.out.println(" maxCost=" + maxCost); * System.out.println(" dims[0].freq=" + dims[0].freq); * if (numDims > 1) { * System.out.println(" dims[1].freq=" + dims[1].freq); * } */ if (bitsUpto > 0 || scoreSubDocsAtOnce || baseQueryCost < drillDownCost / 10) { //System.out.println("queryFirst: baseScorer=" + baseScorer + " disis.length=" + disis.length + " bits.length=" + bits.length); DoQueryFirstScoring(collector, disis, sidewaysCollectors, bits, bitsSidewaysCollectors); } else if (numDims > 1 && (dims[1].disi == null || drillDownAdvancedCost < baseQueryCost / 10)) { //System.out.println("drillDownAdvance"); DoDrillDownAdvanceScoring(collector, disis, sidewaysCollectors); } else { //System.out.println("union"); DoUnionScoring(collector, disis, sidewaysCollectors); } return(false); }
public override long GetCost() { return(m_innerIter.GetCost()); }