public virtual IEnumerable <BrowseFacet> GetFacets()
        {
            if (_ospec != null)
            {
                if (_predefinedRangeIndexes != null)
                {
                    int minCount = _ospec.MinHitCount;
                    //int maxNumOfFacets = _ospec.getMaxCount();
                    //if (maxNumOfFacets <= 0 || maxNumOfFacets > _predefinedRangeIndexes.length) maxNumOfFacets = _predefinedRangeIndexes.length;

                    int[] rangeCount = new int[_predefinedRangeIndexes.Length];
                    for (int k = 0; k < _predefinedRangeIndexes.Length; ++k)
                    {
                        int count = 0;
                        int idx   = _predefinedRangeIndexes[k][0];
                        int end   = _predefinedRangeIndexes[k][1];
                        while (idx < end)
                        {
                            count += _count.Get(idx++);
                        }
                        rangeCount[k] = count;
                    }

                    List <BrowseFacet> facetColl = new List <BrowseFacet>(_predefinedRanges.Count());
                    for (int k = 0; k < _predefinedRanges.Count(); ++k)
                    {
                        if (rangeCount[k] >= minCount)
                        {
                            BrowseFacet choice = new BrowseFacet(_predefinedRanges.ElementAt(k), rangeCount[k]);
                            facetColl.Add(choice);
                        }
                        //if(facetColl.size() >= maxNumOfFacets) break;
                    }
                    return(facetColl);
                }
                else
                {
                    return(FacetCountCollector_Fields.EMPTY_FACET_LIST);
                }
            }
            else
            {
                return(FacetCountCollector_Fields.EMPTY_FACET_LIST);
            }
        }
Esempio n. 2
0
        public virtual List <BrowseFacet> GetFacetsNew()
        {
            if (m_ospec != null)
            {
                if (m_predefinedRangeIndexes != null)
                {
                    int minCount       = m_ospec.MinHitCount;
                    int maxNumOfFacets = m_ospec.MaxCount;
                    if (maxNumOfFacets <= 0 || maxNumOfFacets > m_predefinedRangeIndexes.Length)
                    {
                        maxNumOfFacets = m_predefinedRangeIndexes.Length;
                    }

                    BigSegmentedArray rangeCount = new LazyBigInt32Array(m_predefinedRangeIndexes.Length);

                    for (int k = 0; k < m_predefinedRangeIndexes.Length; ++k)
                    {
                        int count = 0;
                        int idx   = m_predefinedRangeIndexes[k][0];
                        int end   = m_predefinedRangeIndexes[k][1];
                        while (idx <= end)
                        {
                            count += m_count.Get(idx++);
                        }
                        rangeCount.Add(k, count);
                    }

                    List <BrowseFacet>      facetColl;
                    FacetSpec.FacetSortSpec sortspec = m_ospec.OrderBy;
                    if (sortspec == FacetSpec.FacetSortSpec.OrderValueAsc)
                    {
                        facetColl = new List <BrowseFacet>(maxNumOfFacets);
                        for (int k = 0; k < m_predefinedRangeIndexes.Length; ++k)
                        {
                            if (rangeCount.Get(k) >= minCount)
                            {
                                BrowseFacet choice = new BrowseFacet(m_predefinedRanges.Get(k), rangeCount.Get(k));
                                facetColl.Add(choice);
                            }
                            if (facetColl.Count >= maxNumOfFacets)
                            {
                                break;
                            }
                        }
                    }
                    else //if (sortspec == FacetSortSpec.OrderHitsDesc)
                    {
                        IComparerFactory comparerFactory;
                        if (sortspec == FacetSpec.FacetSortSpec.OrderHitsDesc)
                        {
                            comparerFactory = new FacetHitcountComparerFactory();
                        }
                        else
                        {
                            comparerFactory = m_ospec.CustomComparerFactory;
                        }

                        if (comparerFactory == null)
                        {
                            throw new ArgumentException("facet comparer factory not specified");
                        }

                        IComparer <int> comparer = comparerFactory.NewComparer(new RangeFacetCountCollectorFieldAccessor(m_predefinedRanges), rangeCount);

                        int forbidden = -1;
                        Int32BoundedPriorityQueue pq = new Int32BoundedPriorityQueue(comparer, maxNumOfFacets, forbidden);
                        for (int i = 0; i < m_predefinedRangeIndexes.Length; ++i)
                        {
                            if (rangeCount.Get(i) >= minCount)
                            {
                                pq.Offer(i);
                            }
                        }

                        int val;
                        facetColl = new List <BrowseFacet>();
                        while ((val = pq.Poll()) != forbidden)
                        {
                            BrowseFacet facet = new BrowseFacet(m_predefinedRanges.ElementAt(val), rangeCount.Get(val));
                            facetColl.Insert(0, facet);
                        }
                    }
                    return(facetColl);
                }
                else
                {
                    return(FacetCountCollector.EMPTY_FACET_LIST);
                }
            }
            else
            {
                return(FacetCountCollector.EMPTY_FACET_LIST);
            }
        }