Browse Source

HUE-2620 [search] Pivot facet limit can conflict

Romain Rigaux 10 years ago
parent
commit
d90e74d494

+ 12 - 11
apps/search/src/search/models.py

@@ -496,7 +496,7 @@ def augment_solr_response(response, collection, query):
   NAME = '%(field)s-%(id)s'
   normalized_facets = []
 
-  selected_values = dict([((fq['id'], NAME % fq, fq['type']), fq['filter']) for fq in query['fqs']])
+  selected_values = dict([(fq['id'], fq['filter']) for fq in query['fqs']])
 
   if response and response.get('facet_counts'):
     # e.g. [{u'field': u'sun', u'type': u'query', u'id': u'67b43a63-ed22-747b-47e8-b31aad1431ea', u'label': u'sun'}
@@ -506,7 +506,7 @@ def augment_solr_response(response, collection, query):
       if category == 'field' and response['facet_counts']['facet_fields']:
         name = NAME % facet
         collection_facet = get_facet_field(category, name, collection['facets'])
-        counts = pairwise2(facet['field'], selected_values.get((facet['id'], name, category), []), response['facet_counts']['facet_fields'][name])
+        counts = pairwise2(facet['field'], selected_values.get(facet['id'], []), response['facet_counts']['facet_fields'][name])
         if collection_facet['properties']['sort'] == 'asc':
           counts.reverse()
         facet = {
@@ -522,7 +522,7 @@ def augment_solr_response(response, collection, query):
         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(facet['field'], name, selected_values.get((facet['id'], name, category), []), counts, end, collection_facet)
+        counts = range_pair(facet['field'], name, selected_values.get(facet['id'], []), counts, end, collection_facet)
         facet = {
           'id': collection_facet['id'],
           'field': facet['field'],
@@ -544,10 +544,10 @@ def augment_solr_response(response, collection, query):
           }
           normalized_facets.append(facet)
       elif category == 'pivot':
-        name = ','.join([facet['field']] + [f['field'] for f in facet['properties']['facets']])
+        name = NAME % facet
         if 'facet_pivot' in response['facet_counts'] and name in response['facet_counts']['facet_pivot']:
           if facet['properties']['scope'] == 'stack':
-            count = _augment_pivot_2d(facet['id'], response['facet_counts']['facet_pivot'][name], selected_values)
+            count = _augment_pivot_2d(name, facet['id'], response['facet_counts']['facet_pivot'][name], selected_values)
           else:
             count = response['facet_counts']['facet_pivot'][name]
             _augment_pivot_nd(facet['id'], count, selected_values)
@@ -601,7 +601,7 @@ def augment_solr_response(response, collection, query):
   return augmented
 
 
-def _augment_pivot_2d(facet_id, counts, selected_values):
+def _augment_pivot_2d(name, facet_id, counts, selected_values):
   values = set()
 
   for dimension in counts:
@@ -609,7 +609,6 @@ def _augment_pivot_2d(facet_id, counts, selected_values):
       values.add(pivot['value'])
 
   values = sorted(list(values))
-
   augmented = []
 
   for dimension in counts:
@@ -621,12 +620,14 @@ def _augment_pivot_2d(facet_id, counts, selected_values):
     for val in values:
       fq_values = '%s:%s' % (dimension['value'], val)
       fq_fields = '%s:%s' % (dimension['field'], pivot_field)
-
-      fq_filter = selected_values.get((facet_id, fq_fields, 'field'), [])
+      fq_filter = selected_values.get(facet_id, [])
       _selected_values = [f['value'] for f in fq_filter]
 
       augmented.append({
-          "count": count.get(val, 0), "value": val, "cat": dimension['value'], 'selected': fq_values in _selected_values,
+          "count": count.get(val, 0),
+          "value": val,
+          "cat": dimension['value'],
+          'selected': fq_values in _selected_values,
           'exclude': all([f['exclude'] for f in fq_filter if f['value'] == val]),
           'fq_fields': fq_fields,
           'fq_values': fq_values,
@@ -643,7 +644,7 @@ def _augment_pivot_nd(facet_id, counts, selected_values, fields='', values=''):
     if 'pivot' in c:
       _augment_pivot_nd(facet_id, c['pivot'], selected_values, fq_fields, fq_values)
 
-    fq_filter = selected_values.get((facet_id, fq_fields, 'field'), [])
+    fq_filter = selected_values.get(facet_id, [])
     _selected_values = [f['value'] for f in fq_filter]
     c['selected'] = fq_values in _selected_values
     c['exclude'] = False

+ 1 - 1
apps/search/src/search/templates/search.mako

@@ -1060,7 +1060,7 @@ ${ dashboard.layout_skeleton() }
         <a href="javascript:void(0)" class="pull-right" data-bind="click: function() { chartsUpdatingState(); $root.query.removeFilter($data); $root.search(); }">
           <i class="fa fa-times"></i>
         </a>
-        <span data-bind="text: $data.field"></span>
+        <span data-bind="text: $data.field()"></span>
         &nbsp;
       </div>
       <div class="content">

+ 20 - 11
desktop/libs/libsolr/src/libsolr/api.py

@@ -80,8 +80,6 @@ class SolrApi(object):
 
     for fq in merged_fqs:
       if fq['type'] == 'field':
-        # This does not work if spaces in Solr:
-        # params += (('fq', ' '.join([urllib.unquote(utf_quoter('{!tag=%s}{!field f=%s}%s' % (fq['field'], fq['field'], _filter))) for _filter in fq['filter']])),)
         fields = fq['field'].split(':') # 2D facets support
         for field in fields:
           f = []
@@ -94,13 +92,13 @@ class SolrApi(object):
                 f.append('%s%s:"%s"' % (exclude, field, value))
               else:
                 f.append('%s{!field f=%s}%s' % (exclude, field, value))
-          _params ='{!tag=%s}' % field + ' '.join(f)
+          _params ='{!tag=%(id)s}' % fq + ' '.join(f)
           params += (('fq', urllib.unquote(utf_quoter(_params))),)
       elif fq['type'] == 'range':
-        params += (('fq', '{!tag=%s}' % fq['field'] + ' '.join([urllib.unquote(
+        params += (('fq', '{!tag=%(id)s}' % fq + ' '.join([urllib.unquote(
                     utf_quoter('%s%s:[%s TO %s}' % ('-' if field['exclude'] else '', fq['field'], f['from'], f['to']))) for field, f in zip(fq['filter'], fq['properties'])])),)
       elif fq['type'] == 'range-up':
-        params += (('fq', '{!tag=%s}' % fq['field'] + ' '.join([urllib.unquote(
+        params += (('fq', '{!tag=%(id)s}' % fq + ' '.join([urllib.unquote(
                     utf_quoter('%s%s:[%s TO %s}' % ('-' if field['exclude'] else '', fq['field'], f['from'] if fq['is_up'] else '*', '*' if fq['is_up'] else f['from'])))
                                                           for field, f in zip(fq['filter'], fq['properties'])])),)
     return params
@@ -139,6 +137,7 @@ class SolrApi(object):
           params += (('facet.query', '%s' % facet['field']),)
         elif facet['type'] == 'range' or facet['type'] == 'range-up':
           keys = {
+              'id': '%(id)s' % facet,
               'field': facet['field'],
               'key': '%(field)s-%(id)s' % facet,
               'start': facet['properties']['start'],
@@ -147,28 +146,38 @@ class SolrApi(object):
               '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),
+             ('facet.range', '{!key=%(key)s ex=%(id)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 = {
+              'id': '%(id)s' % facet,
               'field': facet['field'],
               'key': '%(field)s-%(id)s' % facet,
               'limit': int(facet['properties'].get('limit', 10)) + (1 if facet['widgetType'] == 'facet-widget' else 0),
               '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=%(id)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':
             fields = facet['field']
+            fields_limits = []
             for f in facet['properties']['facets']:
-              params += (('f.%s.facet.limit' % f['field'], f['limit']),)
+              fields_limits.append('f.%s.facet.limit=%s' % (f['field'], f['limit']))
+              fields_limits.append('f.%s.facet.mincount=%s' % (f['field'], f['mincount']))
               fields += ',' + f['field']
+            keys = {
+                'id': '%(id)s' % facet,
+                'key': '%(field)s-%(id)s' % facet,
+                'field': facet['field'],
+                'fields': fields,
+                'limit': int(facet['properties'].get('limit', 10)),
+                'mincount': int(facet['properties']['mincount']),
+                'fields_limits': ' '.join(fields_limits)
+            }
             params += (
-                ('facet.pivot', '{!ex=%s}%s' % (fields, fields)),
-                ('f.%s.facet.limit' % facet['field'], int(facet['properties'].get('limit', 10))),
-                ('facet.pivot.mincount', int(facet['properties']['mincount'])),
+                ('facet.pivot', '{!key=%(key)s ex=%(id)s f.%(field)s.facet.limit=%(limit)s f.%(field)s.facet.mincount=%(mincount)s %(fields_limits)s}%(fields)s' % keys),
             )
 
     params += self._get_fq(query)