func (fb *NumericFacetBuilder) Result() search.FacetResult { rv := search.FacetResult{ Field: fb.field, Total: fb.total, Missing: fb.missing, } // FIXME better implementation needed here this is quick and dirty topN := list.New() // walk entries and find top N OUTER: for term, count := range fb.termsCount { numericRange := fb.ranges[term] tf := &search.NumericRangeFacet{ Name: term, Count: count, Min: numericRange.min, Max: numericRange.max, } for e := topN.Front(); e != nil; e = e.Next() { curr := e.Value.(*search.NumericRangeFacet) if tf.Count < curr.Count { topN.InsertBefore(tf, e) // if we just made the list too long if topN.Len() > fb.size { // remove the head topN.Remove(topN.Front()) } continue OUTER } } // if we got to the end, we still have to add it topN.PushBack(tf) if topN.Len() > fb.size { // remove the head topN.Remove(topN.Front()) } } // we now have the list of the top N facets rv.NumericRanges = make([]*search.NumericRangeFacet, topN.Len()) i := 0 notOther := 0 for e := topN.Back(); e != nil; e = e.Prev() { rv.NumericRanges[i] = e.Value.(*search.NumericRangeFacet) i++ notOther += e.Value.(*search.NumericRangeFacet).Count } rv.Other = fb.total - notOther return rv }
func (fb *NumericFacetBuilder) Result() *search.FacetResult { rv := search.FacetResult{ Field: fb.field, Total: fb.total, Missing: fb.missing, } rv.NumericRanges = make([]*search.NumericRangeFacet, 0, len(fb.termsCount)) for term, count := range fb.termsCount { numericRange := fb.ranges[term] tf := &search.NumericRangeFacet{ Name: term, Count: count, Min: numericRange.min, Max: numericRange.max, } rv.NumericRanges = append(rv.NumericRanges, tf) } sort.Sort(rv.NumericRanges) // we now have the list of the top N facets if fb.size < len(rv.NumericRanges) { rv.NumericRanges = rv.NumericRanges[:fb.size] } notOther := 0 for _, nr := range rv.NumericRanges { notOther += nr.Count } rv.Other = fb.total - notOther return &rv }