Browse Source

HUE-2683 [search] Link response value to hit widget

Romain Rigaux 10 năm trước cách đây
mục cha
commit
030ca4a

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

@@ -690,6 +690,20 @@ def augment_solr_response(response, collection, query):
             'counts': value,
             'counts': value,
           }
           }
           normalized_facets.append(facet)
           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':
       elif category == 'pivot':
         name = NAME % facet
         name = NAME % facet
         if 'facet_pivot' in response['facet_counts'] and name in response['facet_counts']['facet_pivot']:
         if 'facet_pivot' in response['facet_counts'] and name in response['facet_counts']['facet_pivot']:

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

@@ -1044,7 +1044,7 @@ var SearchViewModel = function (collection_json, query_json, initial_json) {
   self.draggableFilter = ko.observable(bareWidgetBuilder("Filter Bar", "filter-widget"));
   self.draggableFilter = ko.observable(bareWidgetBuilder("Filter Bar", "filter-widget"));
   self.draggableTree = ko.observable(bareWidgetBuilder("Tree", "tree-widget"));
   self.draggableTree = ko.observable(bareWidgetBuilder("Tree", "tree-widget"));
   self.draggableHeatmap = ko.observable(bareWidgetBuilder("Heatmap", "heatmap-widget"));
   self.draggableHeatmap = ko.observable(bareWidgetBuilder("Heatmap", "heatmap-widget"));
-  self.draggableCounter = ko.observable(bareWidgetBuilder("Counter", "counter-widget"));
+  self.draggableCounter = ko.observable(bareWidgetBuilder("Counter", "hit-widget"));
 
 
   self.availableDateFields = ko.computed(function() {
   self.availableDateFields = ko.computed(function() {
     return $.grep(self.collection.availableFacetFields(), function(field) { return DATE_TYPES.indexOf(field.type()) != -1; });
     return $.grep(self.collection.availableFacetFields(), function(field) { return DATE_TYPES.indexOf(field.type()) != -1; });

+ 19 - 29
apps/search/src/search/templates/search.mako

@@ -145,6 +145,16 @@ ${ commonheader(_('Search'), "search", user, "80px") | n,unicode }
          </a>
          </a>
     </div>
     </div>
 
 
+    <div data-bind="css: { 'draggable-widget': true, 'disabled': !availableDraggableNumbers() },
+                    draggable: {data: draggableCounter(), isEnabled: availableDraggableNumbers,
+                    options: {'start': function(event, ui){lastWindowScrollPosition = $(window).scrollTop();$('.card-body').slideUp('fast');},
+                              'stop': function(event, ui){$('.card-body').slideDown('fast', function(){$(window).scrollTop(lastWindowScrollPosition)});}}}"
+         title="${_('Counter')}" rel="tooltip" data-placement="top">
+         <a data-bind="style: { cursor: $root.availableDraggableNumbers() ? 'move' : 'default' }">
+                       <i class="fa fa-calculator"></i>
+         </a>
+    </div>
+
     <div data-bind="css: { 'draggable-widget': true, 'disabled': !availableDraggableLeaflet()},
     <div data-bind="css: { 'draggable-widget': true, 'disabled': !availableDraggableLeaflet()},
                     draggable: {data: draggableLeafletMap(), isEnabled: availableDraggableLeaflet,
                     draggable: {data: draggableLeafletMap(), isEnabled: availableDraggableLeaflet,
                     options: {'start': function(event, ui){lastWindowScrollPosition = $(window).scrollTop();$('.card-body').slideUp('fast');},
                     options: {'start': function(event, ui){lastWindowScrollPosition = $(window).scrollTop();$('.card-body').slideUp('fast');},
@@ -153,7 +163,8 @@ ${ commonheader(_('Search'), "search", user, "80px") | n,unicode }
          <a data-bind="style: { cursor: 'move' }">
          <a data-bind="style: { cursor: 'move' }">
              <i class="fa fa-map-marker"></i>
              <i class="fa fa-map-marker"></i>
          </a>
          </a>
-   </div>
+    </div>
+
 
 
       </%def>
       </%def>
       <%def name="widgets()">
       <%def name="widgets()">
@@ -229,15 +240,6 @@ ${ commonheader(_('Search'), "search", user, "80px") | n,unicode }
                        <i class="hcha hcha-map-chart"></i>
                        <i class="hcha hcha-map-chart"></i>
          </a>
          </a>
    </div>
    </div>
-    <div data-bind="css: { 'draggable-widget': true, 'disabled': !availableDraggableNumbers() },
-                    draggable: {data: draggableCounter(), isEnabled: availableDraggableNumbers,
-                    options: {'start': function(event, ui){lastWindowScrollPosition = $(window).scrollTop();$('.card-body').slideUp('fast');},
-                              'stop': function(event, ui){$('.card-body').slideDown('fast', function(){$(window).scrollTop(lastWindowScrollPosition)});}}}"
-         title="${_('Counter')}" rel="tooltip" data-placement="top">
-         <a data-bind="style: { cursor: $root.availableDraggableNumbers() ? 'move' : 'default' }">
-                       <i class="fa fa-tachometer"></i>
-         </a>
-    </div>
       </%def>
       </%def>
 </%dashboard:layout_toolbar>
 </%dashboard:layout_toolbar>
 
 
@@ -249,19 +251,6 @@ ${ dashboard.layout_skeleton() }
 </script>
 </script>
 
 
 
 
-<script type="text/html" id="hit-widget">
-  <!-- ko if: $root.getFacetFromQuery(id()).has_data() -->
-  <div class="row-fluid" data-bind="with: $root.getFacetFromQuery(id())">
-    <div data-bind="visible: $root.isEditing, with: $root.collection.getFacetById($parent.id())" style="margin-bottom: 20px">
-      ${ _('Label') }: <input type="text" data-bind="value: label" />
-    </div>
-
-    <span data-bind="text: query" />: <span data-bind="text: count" />
-  </div>
-  <!-- /ko -->
-</script>
-
-
 <script type="text/html" id="facet-toggle">
 <script type="text/html" id="facet-toggle">
   <div class="facet-field-tile">
   <div class="facet-field-tile">
     <div class="facet-field-cnt">
     <div class="facet-field-cnt">
@@ -1087,8 +1076,8 @@ ${ dashboard.layout_skeleton() }
 </script>
 </script>
 
 
 
 
-<script type="text/html" id="counter-widget">
-  <div class="widget-spinner" data-bind="visible: isLoading()">
+<script type="text/html" id="hit-widget">
+  <div class="widget-spinner" data-bind="visible: ! $root.hasRetrievedResults()">
     <!--[if !IE]> --><i class="fa fa-spinner fa-spin"></i><!-- <![endif]-->
     <!--[if !IE]> --><i class="fa fa-spinner fa-spin"></i><!-- <![endif]-->
     <!--[if IE]><img src="${ static('desktop/art/spinner.gif') }" /><![endif]-->
     <!--[if IE]><img src="${ static('desktop/art/spinner.gif') }" /><![endif]-->
   </div>
   </div>
@@ -1096,7 +1085,8 @@ ${ dashboard.layout_skeleton() }
   <!-- ko if: $root.getFacetFromQuery(id()).has_data() -->
   <!-- ko if: $root.getFacetFromQuery(id()).has_data() -->
   <div class="row-fluid" data-bind="with: $root.getFacetFromQuery(id())">
   <div class="row-fluid" data-bind="with: $root.getFacetFromQuery(id())">
     <div data-bind="visible: $root.isEditing, with: $root.collection.getFacetById($parent.id())" style="margin-bottom: 20px">
     <div data-bind="visible: $root.isEditing, with: $root.collection.getFacetById($parent.id())" style="margin-bottom: 20px">
-      <span class="facet-field-label">${ _('Metric') }</span> <select>
+      <span class="facet-field-label">${ _('Metric') }</span>
+      <select>
         <option value="0" selected="selected" label="Count">Count</option>
         <option value="0" selected="selected" label="Count">Count</option>
         <option value="1" label="Average">Average</option>
         <option value="1" label="Average">Average</option>
         <option value="2" label="Sum">Sum</option>
         <option value="2" label="Sum">Sum</option>
@@ -1107,9 +1097,9 @@ ${ dashboard.layout_skeleton() }
         <option value="7" label="Percentiles">Percentiles</option>
         <option value="7" label="Percentiles">Percentiles</option>
       </select>
       </select>
     </div>
     </div>
-    <div data-bind="with: $root.collection.getFacetById($parent.id())">
-        <div class="big-counter">2312323</div>
-    </div>
+
+    <span data-bind="text: 'max', visible: ! $root.isEditing()"></span>
+    <span class="big-counter" data-bind="text: counts"></span>
   </div>
   </div>
   <!-- /ko -->
   <!-- /ko -->
 </script>
 </script>

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

@@ -484,6 +484,8 @@ def _create_facet(collection, user, facet_id, facet_label, facet_field, widget_t
 
 
   if widget_type in ('tree-widget', 'heatmap-widget', 'map-widget'):
   if widget_type in ('tree-widget', 'heatmap-widget', 'map-widget'):
     facet_type = 'pivot'
     facet_type = 'pivot'
+  elif widget_type == 'hit-widget':
+    facet_type = 'function'
   else:
   else:
     solr_api = SolrApi(SOLR_URL.get(), user)
     solr_api = SolrApi(SOLR_URL.get(), user)
     range_properties = _new_range_facet(solr_api, collection, facet_field, widget_type)
     range_properties = _new_range_facet(solr_api, collection, facet_field, widget_type)
@@ -494,8 +496,6 @@ def _create_facet(collection, user, facet_id, facet_label, facet_field, widget_t
       properties['initial_gap'] = properties['gap']
       properties['initial_gap'] = properties['gap']
       properties['initial_start'] = properties['start']
       properties['initial_start'] = properties['start']
       properties['initial_end'] = properties['end']
       properties['initial_end'] = properties['end']
-    elif widget_type == 'hit-widget':
-      facet_type = 'query'
     else:
     else:
       facet_type = 'field'
       facet_type = 'field'
 
 

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

@@ -160,6 +160,10 @@ class SolrApi(object):
           params += (
           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),
               ('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'] == 'function':
+          params += (
+              ('json.facet', "{%(field)s-%(id)s: 'avg(%(field)s)'}" % facet),
+          )        
         elif facet['type'] == 'pivot':
         elif facet['type'] == 'pivot':
           if facet['properties']['facets'] or facet['widgetType'] == 'map-widget':
           if facet['properties']['facets'] or facet['widgetType'] == 'map-widget':
             fields = facet['field']
             fields = facet['field']