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.Cost() < other.disi.Cost())
     {
         return(-1);
     }
     else if (disi.Cost() > other.disi.Cost())
     {
         return(1);
     }
     else
     {
         return(0);
     }
 }
Exemple #2
0
 public override long Cost()
 {
     return(_innerIter.Cost());
 }
        public override bool Score(Collector collector, int maxDoc)
        {
            if (maxDoc != int.MaxValue)
            {
                throw new System.ArgumentException("maxDoc must be Integer.MAX_VALUE");
            }
            //if (DEBUG) {
            //  System.out.println("\nscore: reader=" + context.reader());
            //}
            //System.out.println("score r=" + context.reader());
            FakeScorer scorer = new FakeScorer(this);

            collector.Scorer = scorer;
            if (drillDownCollector != null)
            {
                drillDownCollector.Scorer     = scorer;
                drillDownCollector.NextReader = context;
            }
            foreach (DocsAndCost dim in dims)
            {
                dim.sidewaysCollector.Scorer     = scorer;
                dim.sidewaysCollector.NextReader = 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
            Debug.Assert(baseScorer != null);

            // 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++;
                }
            }

            int numDims = dims.Length;

            Bits[]      bits = new Bits[numBits];
            Collector[] bitsSidewaysCollectors = new Collector[numBits];

            DocIdSetIterator[] disis = new DocIdSetIterator[numDims - numBits];
            Collector[]        sidewaysCollectors = new Collector[numDims - numBits];
            long drillDownCost = 0;
            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++;
                    if (disi != null)
                    {
                        drillDownCost += disi.Cost();
                    }
                }
                else
                {
                    bits[bitsUpto] = dims[dim].bits;
                    bitsSidewaysCollectors[bitsUpto] = dims[dim].sidewaysCollector;
                    bitsUpto++;
                }
            }

            long baseQueryCost = baseScorer.Cost();

            /*
             * 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 || dims[1].disi.Cost() < baseQueryCost / 10))
            {
                //System.out.println("drillDownAdvance");
                DoDrillDownAdvanceScoring(collector, disis, sidewaysCollectors);
            }
            else
            {
                //System.out.println("union");
                DoUnionScoring(collector, disis, sidewaysCollectors);
            }

            return(false);
        }