Browse Source

HUE-2236 [search] Make Pivot facet clickable into fq queries

Romain Rigaux 11 years ago
parent
commit
0f0d66b692

+ 14 - 6
apps/search/src/search/models.py

@@ -501,8 +501,7 @@ def augment_solr_response(response, collection, query):
       elif category == 'pivot':
         name = ','.join([facet['field']] + [f['field'] for f in facet['properties']['facets']])
         if 'facet_pivot' in response['facet_counts'] and name in response['facet_counts']['facet_pivot']:
-          _selected_values = selected_values.get((facet['id'], name, category), [])
-          count = _augment_pivot_2d(response['facet_counts']['facet_pivot'][name], _selected_values)
+          count = _augment_pivot_2d(facet['id'], response['facet_counts']['facet_pivot'][name], selected_values)
         else:
           count = []
         facet = {
@@ -543,9 +542,8 @@ def augment_solr_response(response, collection, query):
   return augmented
 
 
-def _augment_pivot_2d(counts, fq_filter):
+def _augment_pivot_2d(facet_id, counts, selected_values):
   values = set()
-  selected_values = [f['value'] for f in fq_filter]
 
   for dimension in counts:
     for pivot in dimension['pivot']:
@@ -557,12 +555,22 @@ def _augment_pivot_2d(counts, fq_filter):
 
   for dimension in counts:
     count = {}
+    pivot_field = ''
     for pivot in dimension['pivot']:
       count[pivot['value']] = pivot['count']
+      pivot_field = pivot['field']
     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'), [])
+      _selected_values = [f['value'] for f in fq_filter]
+
       augmented.append({
-          "count": count.get(val, 0), "value": val, "cat": dimension['value'], 'selected': val in selected_values,
-          'exclude': all([f['exclude'] for f in fq_filter if f['value'] == val])
+          "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,
       })
 
   return augmented

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

@@ -886,10 +886,9 @@ ${ dashboard.layout_skeleton() }
           transformer: pivotChartDataTransformer,
           onStateChange: function(state){ },
           onClick: function(d) {
-            console.log('X:', d.obj.cat, 'Val:', d.obj.value, 'Count:', d.obj.count);
+            $root.query.togglePivotFacet({facet: d.obj, widget_id: id()});
             $(document).find('svg').css('opacity', '1');
           },
-          onSelectRange: function(from, to){ viewModel.collection.selectTimelineFacet({from: from, to: to, cat: field, widget_id: id}) },
           onComplete: function(){ viewModel.getWidgetById(id()).isLoading(false) } }"
         />
       <!-- /ko -->

+ 6 - 0
apps/search/static/js/search.ko.js

@@ -136,6 +136,12 @@ var Query = function (vm, query) {
     vm.search();
   }
   
+  self.togglePivotFacet = function (data) {
+    data.facet.cat = data.facet.fq_fields; 
+    data.facet.value = data.facet.fq_values;
+    self.toggleFacet(data);
+  }
+  
   function _toggleSingleTermFacet(data, exclude) {
     var fq = getFilterByField(data.val.cat);
     var id;

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

@@ -70,20 +70,22 @@ class SolrApi(object):
       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']])),)
-        f = []
-        for _filter in fq['filter']:
-          value = _filter['value']
-          exclude = '-' if _filter['exclude'] else ''
-          if value is not None and ' ' in value:
-            f.append('%s%s:"%s"' % (exclude, fq['field'], value))
-          else:
-            f.append('%s{!field f=%s}%s' % (exclude, fq['field'], value))
-        _params ='{!tag=%s}' % fq['field'] + ' '.join(f)
-        params += (('fq', urllib.unquote(utf_quoter(_params))),)
+        fields = fq['field'].split(':') # 2D facets support
+        for field in fields:
+          f = []
+          for _filter in fq['filter']:
+            values = _filter['value'].split(':')
+            value = values[fields.index(field)]
+            exclude = '-' if _filter['exclude'] else ''
+            if value is not None and ' ' in value:
+              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 += (('fq', urllib.unquote(utf_quoter(_params))),)
       elif fq['type'] == 'range':
         params += (('fq', '{!tag=%s}' % fq['field'] + ' '.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'])])),)
-
     return params
 
   def query(self, collection, query):