소스 검색

HUE-2173 [search] Support json terms facets

Romain Rigaux 10 년 전
부모
커밋
04a50aec45
4개의 변경된 파일74개의 추가작업 그리고 19개의 파일을 삭제
  1. 41 14
      apps/search/src/search/models.py
  2. 12 0
      apps/search/src/search/templates/search.mako
  3. 2 1
      apps/search/src/search/views.py
  4. 19 4
      desktop/libs/libsolr/src/libsolr/api.py

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

@@ -690,20 +690,6 @@ def augment_solr_response(response, collection, query):
             'counts': value,
           }
           normalized_facets.append(facet)
-      elif category == 'function' and response['facets']:
-        for name, value in response['facets'].iteritems(): # flat
-          collection_facet = get_facet_field(category, name, collection['facets'])
-          if collection_facet:
-            facet = {
-              'id': collection_facet['id'],
-              'query': name,
-              'type': category,
-              'label': name,
-              'counts': value,
-            }
-            normalized_facets.append(facet)
-          else:
-            print name, value
       elif category == 'pivot':
         name = NAME % facet
         if 'facet_pivot' in response['facet_counts'] and name in response['facet_counts']['facet_pivot']:
@@ -723,6 +709,47 @@ def augment_solr_response(response, collection, query):
         }
         normalized_facets.append(facet)
 
+  if response and response.get('facets'):
+    for facet in collection['facets']:
+      category = facet['type']
+      name = NAME % facet
+      
+      if category == 'function' and name in response['facets']:
+        value = response['facets'][name]
+        collection_facet = get_facet_field(category, name, collection['facets'])
+        if collection_facet:
+          facet = {
+            'id': collection_facet['id'],
+            'query': name,
+            'type': category,
+            'label': name,
+            'counts': value,
+          }
+          normalized_facets.append(facet)
+        else:
+          print name, value
+      elif category == 'terms' and name in response['facets']:
+        value = response['facets'][name]
+        collection_facet = get_facet_field(category, name, collection['facets'])
+
+        # if 2D
+        buckets = []
+        for bucket in response['facets'][name]['buckets']:
+          buckets.append(bucket['val'])
+          buckets.append(bucket['count'])
+
+        counts = pairwise2(facet['field'], selected_values.get(facet['id'], []), buckets)
+        if collection_facet['properties']['sort'] == 'asc':
+          counts.reverse()
+        facet = {
+          'id': collection_facet['id'],
+          'field': facet['field'],
+          'type': category,
+          'label': collection_facet['label'],
+          'counts': counts,
+        }
+        normalized_facets.append(facet)
+
     # Remove unnecessary facet data
     if response:
       response.pop('facet_counts')

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

@@ -807,6 +807,18 @@ ${ dashboard.layout_skeleton() }
       <a href="javascript:void(0)" data-bind="click: $root.collection.rangeZoomOut"><i class="fa fa-search-minus"></i> ${ _('reset') }</a>
       <span class="facet-field-label" data-bind="visible: $root.query.multiqs().length > 1">${ _('Group by') }</span>
       <select class="input-medium" data-bind="visible: $root.query.multiqs().length > 1, options: $root.query.multiqs, optionsValue: 'id', optionsText: 'label', value: $root.query.selectedMultiq"></select>
+      
+      <select data-bind="value: 'count'">
+        <option value="count" label="${ _('Count') }">${ _('Count') }</option>
+        <option value="unique" label="${ _('Unique Count') }">${ _('Unique Count') }</option>
+        <option value="avg" label="${ _('Average') }">${ _('Average') }</option>
+        <option value="sum" label="${ _('Sum') }">${ _('Sum') }</option>
+        <option value="min" label="${ _('Min') }">${ _('Min') }</option>
+        <option value="max" label="${ _('Max') }">${ _('Max') }</option>
+        <option value="sumsq" label="${ _('Sum of square') }">${ _('Sum of square') }</option>
+        <option value="percentile" label="${ _('Percentiles') }">${ _('Percentiles') }</option>
+      </select>      
+      
     </div>
     <!-- ko if: $root.collection.getFacetById($parent.id()) -->
     <div data-bind="timelineChart: {datum: {counts: counts(), extraSeries: extraSeries(), widget_id: $parent.id(), label: label()}, stacked: $root.collection.getFacetById($parent.id()).properties.stacked(), field: field, label: label(), transformer: timelineChartDataTransformer,

+ 2 - 1
apps/search/src/search/views.py

@@ -498,7 +498,8 @@ def _create_facet(collection, user, facet_id, facet_label, facet_field, widget_t
       properties['initial_start'] = properties['start']
       properties['initial_end'] = properties['end']
     else:
-      facet_type = 'field'
+      #facet_type = 'field'
+      facet_type = 'terms' # if 5.2+
 
   if widget_type in ('tree-widget', 'heatmap-widget', 'map-widget'):
     properties['mincount'] = 1

+ 19 - 4
desktop/libs/libsolr/src/libsolr/api.py

@@ -132,6 +132,7 @@ class SolrApi(object):
         ('facet.mincount', 0),
         ('facet.limit', 10),
       )
+      json_facets = {}
 
       for facet in collection['facets']:
         if facet['type'] == 'query':
@@ -160,6 +161,16 @@ class SolrApi(object):
           params += (
               ('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'] == 'terms':
+          props = {
+              'key': '%(field)s-%(id)s' % facet
+          }
+          props.update(facet)
+         
+          json_facets['%(key)s' % props] = {
+              'type': 'terms',
+              'field': facet['field']
+          }
         elif facet['type'] == 'function':
           props = {
               'function': facet['properties']['function'],
@@ -170,9 +181,7 @@ class SolrApi(object):
             props['formula'] = '%(function)s(%(field)s,25,50,75,90,99)' % props
           else:
             props['formula'] = '%(function)s(%(field)s)' % props          
-          params += (
-              ('json.facet', "{%(key)s: '%(formula)s'}" % props),
-          )        
+          json_facets['%(key)s' % props] = '%(formula)s' % props
         elif facet['type'] == 'pivot':
           if facet['properties']['facets'] or facet['widgetType'] == 'map-widget':
             fields = facet['field']
@@ -194,8 +203,14 @@ class SolrApi(object):
                 ('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)
+      if json_facets:
+        params += (
+            ('json.facet', json.dumps(json_facets)),
+        )
+        print json.dumps(json_facets)
 
+    params += self._get_fq(query)
+    
     if collection['template']['fieldsSelected'] and collection['template']['isGridLayout']:
       fields = set(collection['template']['fieldsSelected'] + [collection['idField']] if collection['idField'] else [])
       # Add field if needed