Jelajahi Sumber

[search] Facet toggling on heatmap

Romain Rigaux 11 tahun lalu
induk
melakukan
703009f

+ 17 - 0
apps/search/src/search/models.py

@@ -505,6 +505,7 @@ def augment_solr_response(response, collection, query):
             count = _augment_pivot_2d(facet['id'], response['facet_counts']['facet_pivot'][name], selected_values)
             count = _augment_pivot_2d(facet['id'], response['facet_counts']['facet_pivot'][name], selected_values)
           else:
           else:
             count = response['facet_counts']['facet_pivot'][name]
             count = response['facet_counts']['facet_pivot'][name]
+            _augment_pivot_nd(facet['id'], count, selected_values)
         else:
         else:
           count = []
           count = []
         facet = {
         facet = {
@@ -579,6 +580,22 @@ def _augment_pivot_2d(facet_id, counts, selected_values):
   return augmented
   return augmented
 
 
 
 
+def _augment_pivot_nd(facet_id, counts, selected_values, fields='', values=''):
+
+  for c in counts:
+    fq_fields = (fields + ':' if fields else '') + c['field']
+    fq_values = (values + ':' if values else '') + c['value']
+    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'), [])
+    _selected_values = [f['value'] for f in fq_filter]
+    c['selected'] = fq_values in _selected_values
+    c['exclude'] = False
+    c['fq_fields'] = fq_fields
+    c['fq_values'] = fq_values
+
+
 def augment_solr_exception(response, collection):
 def augment_solr_exception(response, collection):
   response.update(
   response.update(
   {
   {

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

@@ -1334,6 +1334,7 @@ function _partitionChartDataTransformer(counts) {
       _category = {
       _category = {
         name: item.value,
         name: item.value,
         size: item.count,
         size: item.count,
+        obj: item,
         children: []
         children: []
       }
       }
       _categories.push(_category);
       _categories.push(_category);

+ 1 - 1
apps/search/static/js/search.ko.js

@@ -136,7 +136,7 @@ var Query = function (vm, query) {
     vm.search();
     vm.search();
   }
   }
 
 
-  self.togglePivotFacet = function (data) { alert(ko.mapping.toJSON(data));
+  self.togglePivotFacet = function (data) {
     data.facet.cat = data.facet.fq_fields;
     data.facet.cat = data.facet.fq_fields;
     data.facet.value = data.facet.fq_values;
     data.facet.value = data.facet.fq_values;
     self.toggleFacet(data);
     self.toggleFacet(data);

+ 7 - 6
desktop/libs/libsolr/src/libsolr/api.py

@@ -75,12 +75,13 @@ class SolrApi(object):
           f = []
           f = []
           for _filter in fq['filter']:
           for _filter in fq['filter']:
             values = _filter['value'].split(':')
             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))
+            if fields.index(field) < len(values): # Lowest common field denominator
+              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 ='{!tag=%s}' % field + ' '.join(f)
           params += (('fq', urllib.unquote(utf_quoter(_params))),)
           params += (('fq', urllib.unquote(utf_quoter(_params))),)
       elif fq['type'] == 'range':
       elif fq['type'] == 'range':