Browse Source

HUE-5417 [search] Manage counts from each dimension

Romain Rigaux 9 năm trước cách đây
mục cha
commit
cd4c5c9

+ 13 - 10
apps/search/src/search/models.py

@@ -867,23 +867,24 @@ def augment_solr_response(response, collection, query):
           else:
             legend = facet['field'] # 'count(%s)' % legend
             agg_keys = [column]
-          
+
           _augment_stats_2d(name, facet, counts, selected_values, agg_keys, rows)
-          
+
           counts = [_v for _f in counts for _v in (_f['val'], _f[column])] # TODO: Create additional ordered dict for table view + download
-          counts = pairwise2(legend, selected_values.get(facet['id'], []), counts) # TODO use 'cat' for legend in graph 
+          counts = pairwise2(legend, selected_values.get(facet['id'], []), counts) # TODO use 'cat' for legend in graph
         else:
           # Dimension 2 with analytics or 1 with N aggregates
           dimension = 2
-          agg_keys = [key for key, value in counts[0].items() if key.lower().startswith('agg_') or key.lower().startswith('dim_')] # TODO sort
+          agg_keys = [key for key, value in counts[0].items() if key.lower().startswith('agg_') or key.lower().startswith('dim_')]
           agg_keys.sort(key=lambda a: a[4:])
 
+          if len(agg_keys) == 1 and agg_keys[0].lower().startswith('dim_'):
+            agg_keys.insert(0, 'count')
           counts = _augment_stats_2d(name, facet, counts, selected_values, agg_keys, rows)
           actual_dimension = 1 + sum([_f['aggregate']['function'] == 'count' for _f in collection_facet['properties']['facets']])
 
           counts = filter(lambda a: len(a['fq_fields']) == actual_dimension, counts)
 
-
         facet = {
           'id': collection_facet['id'],
           'field': facet['field'],
@@ -1018,8 +1019,9 @@ def __augment_stats_2d(counts, label, fq_fields, fq_values, fq_filter, _selected
         augmented.append(_get_augmented(count, val, label, _fq_values, _fq_fields, fq_filter, _selected_values))
       elif agg_key.startswith('agg_'):
         label = fq_values[0] if len(_fq_fields) >= 2 else agg_key.split(':', 2)[1]
-        dim_row.append(count) 
-        dim_row.append(bucket[agg_key])        
+        if agg_keys.index(agg_key) == 0: # One count by dimension
+          dim_row.append(count)
+        dim_row.append(bucket[agg_key])
         augmented.append(_get_augmented(bucket[agg_key], val, label, _fq_values, _fq_fields, fq_filter, _selected_values))
       else:
         augmented.append(_get_augmented(count, val, label, _fq_values, _fq_fields, fq_filter, _selected_values)) # Needed?
@@ -1027,12 +1029,13 @@ def __augment_stats_2d(counts, label, fq_fields, fq_values, fq_filter, _selected
         # Go rec
         _agg_keys = [key for key, value in bucket[agg_key]['buckets'][0].items() if key.lower().startswith('agg_') or key.lower().startswith('dim_')]
         _agg_keys.sort(key=lambda a: a[4:])
-        if not _agg_keys:
-          _agg_keys.append('count')
+
+        if not _agg_keys or len(_agg_keys) == 1 and _agg_keys[0].lower().startswith('dim_'):
+          _agg_keys.insert(0, 'count')
         next_dim = []
         new_rows = []
         augmented += __augment_stats_2d(bucket[agg_key]['buckets'], val, _fq_fields, _fq_values, fq_filter, _selected_values, _fields[1:], _agg_keys, next_dim)
-        for row in next_dim:          
+        for row in next_dim:
           new_rows.append(dim_row + row)
         dim_row = new_rows
 

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

@@ -177,8 +177,8 @@ def search(request):
       response = augment_solr_response(response, collection, query)
     except RestException, e:
       try:
-        message = json.loads(e.message)['error']
-        response['error'] = message.get('msg', message['trace'])
+        message = json.loads(e.message)
+        response['error'] = message['error'].get('msg', message['error']['trace'])
       except Exception, e2:
         LOG.exception('failed to extract json message: %s' % force_unicode(e2))
         LOG.exception('failed to parse json response: %s' % force_unicode(e))

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

@@ -257,9 +257,11 @@ class SolrApi(object):
     f_name = 'dim_%02d:%s' % (dim, facet['field'])
 
     if facet['aggregate']['function'] == 'count':
-      if dim == 1:
+      if 'facet' not in _f:
         _f['facet'] = {f_name: {}}
-        _f = _f['facet']
+      else:
+        _f['facet'][f_name] = {}
+      _f = _f['facet']
 
       _f[f_name] = {
           'type': 'terms',
@@ -272,7 +274,7 @@ class SolrApi(object):
 
       if len(facets) > 1: # Get n+1 dimension
         if facets[1]['aggregate']['function'] == 'count':
-          self._n_facet_dimension(widget, _f['facet'][f_name], facets[1:], dim + 1)
+          self._n_facet_dimension(widget, _f[f_name], facets[1:], dim + 1)
         else:
           self._n_facet_dimension(widget, _f[f_name], facets[1:], dim)
     else:
@@ -285,7 +287,7 @@ class SolrApi(object):
           agg_function = self._get_aggregate_function(_f_agg)
           _f['facet']['agg_%02d_%02d:%s' % (dim, i, agg_function)] = agg_function
         else:
-          self._n_facet_dimension(widget, _f['facet'], facets[i:], dim + 1) # Get n+1 dimension
+          self._n_facet_dimension(widget, _f, facets[i:], dim + 1) # Get n+1 dimension
           break