public override double NextDouble()
        {
            if (!HasNext())
            {
                throw new IndexOutOfRangeException("No more facets in this iteration");
            }

            DoubleIteratorNode node = m_queue.Top;

            m_facet = node.CurFacet;
            double next = TermDoubleList.VALUE_MISSING;

            m_count = 0;
            while (HasNext())
            {
                node = m_queue.Top;
                next = node.CurFacet;
                if ((next != TermDoubleList.VALUE_MISSING) && (next != m_facet))
                {
                    return(m_facet);
                }
                m_count += node.CurFacetCount;
                if (node.Fetch(1))
                {
                    m_queue.UpdateTop();
                }
                else
                {
                    m_queue.Pop();
                }
            }
            return(TermDoubleList.VALUE_MISSING);
        }
        /// <summary>
        /// (non-Javadoc)
        /// see com.browseengine.bobo.api.FacetIterator#next()
        /// </summary>
        /// <returns></returns>
        public override string Next()
        {
            if (!HasNext())
            {
                throw new IndexOutOfRangeException("No more facets in this iteration");
            }

            DoubleIteratorNode node = _queue.Top();

            _facet = node.CurFacet;
            double next = TermDoubleList.VALUE_MISSING;

            count = 0;
            while (HasNext())
            {
                node = _queue.Top();
                next = node.CurFacet;
                if ((next != TermDoubleList.VALUE_MISSING) && (next != _facet))
                {
                    return(Format(_facet));
                }
                count += node.CurFacetCount;
                if (node.Fetch(1))
                {
                    _queue.UpdateTop();
                }
                else
                {
                    _queue.Pop();
                }
            }
            return(null);
        }
        /// <summary>
        /// This version of the next() method applies the minHits from the facet spec
        /// before returning the facet and its hitcount
        /// </summary>
        /// <param name="minHits">the minHits from the facet spec for CombinedFacetAccessible</param>
        /// <returns>The next facet that obeys the minHits</returns>
        public override string Next(int minHits)
        {
            int qsize = m_queue.Count;

            if (qsize == 0)
            {
                m_facet = TermDoubleList.VALUE_MISSING;
                m_count = 0;
                return(null);
            }

            DoubleIteratorNode node = m_queue.Top;

            m_facet = node.CurFacet;
            m_count = node.CurFacetCount;
            while (true)
            {
                if (node.Fetch(minHits))
                {
                    node = m_queue.UpdateTop();
                }
                else
                {
                    m_queue.Pop();
                    if (--qsize > 0)
                    {
                        node = m_queue.Pop();
                    }
                    else
                    {
                        // we reached the end. check if this facet obeys the minHits
                        if (m_count < minHits)
                        {
                            m_facet = TermDoubleList.VALUE_MISSING;
                            m_count = 0;
                            return(null);
                        }
                        break;
                    }
                }
                double next = node.CurFacet;
                if (next != m_facet)
                {
                    // check if this facet obeys the minHits
                    if (m_count >= minHits)
                    {
                        break;
                    }
                    // else, continue iterating to the next facet
                    m_facet = next;
                    m_count = node.CurFacetCount;
                }
                else
                {
                    m_count += node.CurFacetCount;
                }
            }
            return(Format(m_facet));
        }
        public override double NextDouble(int minHits)
        {
            int qsize = _queue.Size();

            if (qsize == 0)
            {
                _facet = TermDoubleList.VALUE_MISSING;
                count  = 0;
                return(TermDoubleList.VALUE_MISSING);
            }

            DoubleIteratorNode node = _queue.Top();

            _facet = node.CurFacet;
            count  = node.CurFacetCount;
            while (true)
            {
                if (node.Fetch(minHits))
                {
                    node = _queue.UpdateTop();
                }
                else
                {
                    _queue.Pop();
                    if (--qsize > 0)
                    {
                        node = _queue.Top();
                    }
                    else
                    {
                        // we reached the end. check if this facet obeys the minHits
                        if (count < minHits)
                        {
                            _facet = TermDoubleList.VALUE_MISSING;
                            count  = 0;
                        }
                        break;
                    }
                }
                double next = node.CurFacet;
                if (next != _facet)
                {
                    // check if this facet obeys the minHits
                    if (count >= minHits)
                    {
                        break;
                    }
                    // else, continue iterating to the next facet
                    _facet = next;
                    count  = node.CurFacetCount;
                }
                else
                {
                    count += node.CurFacetCount;
                }
            }
            return(_facet);
        }
 public CombinedDoubleFacetIterator(IList <DoubleFacetIterator> iterators)
     : this(iterators.Count)
 {
     m_iterators = iterators;
     foreach (DoubleFacetIterator iterator in iterators)
     {
         DoubleIteratorNode node = new DoubleIteratorNode(iterator);
         if (node.Fetch(1))
         {
             m_queue.Add(node);
         }
     }
     m_facet = TermDoubleList.VALUE_MISSING;
     m_count = 0;
 }
 public CombinedDoubleFacetIterator(IList<DoubleFacetIterator> iterators, int minHits)
     : this(iterators.Count)
 {
     _iterators = iterators;
     foreach (DoubleFacetIterator iterator in iterators)
     {
         DoubleIteratorNode node = new DoubleIteratorNode(iterator);
         if (node.Fetch(minHits))
             _queue.Add(node);
     }
     _facet = TermDoubleList.VALUE_MISSING;
     count = 0;
 }