Browse Source

HUE-2392 [search] Allow multiple independent range facet on the same field

Romain Rigaux 10 years ago
parent
commit
46f8bc4855
2 changed files with 17 additions and 13 deletions
  1. 5 5
      apps/search/src/search/models.py
  2. 12 8
      desktop/libs/libsolr/src/libsolr/api.py

+ 5 - 5
apps/search/src/search/models.py

@@ -445,7 +445,7 @@ def pairwise2(field, cat, fq_filter, iterable):
     })
   return pairs
 
-def range_pair(cat, fq_filter, iterable, end, collection_facet):
+def range_pair(field, cat, fq_filter, iterable, end, collection_facet):
   # e.g. counts":["0",17430,"1000",1949,"2000",671,"3000",404,"4000",243,"5000",165],"gap":1000,"start":0,"end":6000}
   pairs = []
   selected_values = [f['value'] for f in fq_filter]
@@ -477,7 +477,7 @@ def range_pair(cat, fq_filter, iterable, end, collection_facet):
     total_counts += counts.pop(0)
 
     pairs.append({
-        'field': cat, 'from': element, 'value': count, 'to': to_value, 'selected': element in selected_values,
+        'field': field, 'from': element, 'value': count, 'to': to_value, 'selected': element in selected_values,
         'exclude': all([f['exclude'] for f in fq_filter if f['value'] == element]),
         'is_single_unit_gap': is_single_unit_gap,
         'total_counts': total_counts,
@@ -518,14 +518,14 @@ def augment_solr_response(response, collection, query):
         }
         normalized_facets.append(facet)
       elif (category == 'range' or category == 'range-up') and response['facet_counts']['facet_ranges']:
-        name = facet['field']
+        name = NAME % facet
         collection_facet = get_facet_field(category, name, collection['facets'])
         counts = response['facet_counts']['facet_ranges'][name]['counts']
         end = response['facet_counts']['facet_ranges'][name]['end']
-        counts = range_pair(name, selected_values.get((facet['id'], name, category), []), counts, end, collection_facet)
+        counts = range_pair(facet['field'], name, selected_values.get((facet['id'], name, category), []), counts, end, collection_facet)
         facet = {
           'id': collection_facet['id'],
-          'field': name,
+          'field': facet['field'],
           'type': category,
           'label': collection_facet['label'],
           'counts': counts,

+ 12 - 8
desktop/libs/libsolr/src/libsolr/api.py

@@ -67,7 +67,7 @@ class SolrApi(object):
 
   def _get_fq(self, query):
     params = ()
-    
+
     # Merge facets queries on same fields
     grouped_fqs = groupby(query['fqs'], lambda x: (x['type'], x['field']))
     merged_fqs = []
@@ -138,12 +138,16 @@ class SolrApi(object):
         if facet['type'] == 'query':
           params += (('facet.query', '%s' % facet['field']),)
         elif facet['type'] == 'range' or facet['type'] == 'range-up':
-          params += tuple([
-             ('facet.range', '{!ex=%s}%s' % (facet['field'], facet['field'])),
-             ('f.%s.facet.range.start' % facet['field'], facet['properties']['start']),
-             ('f.%s.facet.range.end' % facet['field'], facet['properties']['end']),
-             ('f.%s.facet.range.gap' % facet['field'], facet['properties']['gap']),
-             ('f.%s.facet.mincount' % facet['field'], facet['properties']['mincount']),]
+          keys = {
+              'field': facet['field'],
+              'key': '%(field)s-%(id)s' % facet,
+              'start': facet['properties']['start'],
+              'end': facet['properties']['end'],
+              'gap': facet['properties']['gap'],
+              'mincount': int(facet['properties']['mincount'])
+          }
+          params += (
+             ('facet.range', '{!key=%(key)s ex=%(field)s f.%(field)s.facet.range.start=%(start)s f.%(field)s.facet.range.end=%(end)s f.%(field)s.facet.range.gap=%(gap)s f.%(field)s.facet.mincount=%(mincount)s}%(field)s' % keys),
           )
         elif facet['type'] == 'field':
           keys = {
@@ -153,7 +157,7 @@ class SolrApi(object):
               'mincount': int(facet['properties']['mincount'])
           }
           params += (
-              ('facet.field', '{!key=%(key)s ex=%(field)s f.%(field)s.facet.limit=%(limit)s f.%(field)s.facet.mincount=%(mincount)s }%(field)s' % keys),
+              ('facet.field', '{!key=%(key)s ex=%(field)s f.%(field)s.facet.limit=%(limit)s f.%(field)s.facet.mincount=%(mincount)s}%(field)s' % keys),
           )
         elif facet['type'] == 'pivot':
           if facet['properties']['facets'] or facet['widgetType'] == 'map-widget':