Преглед изворни кода

HUE-2218 [search] Invalidate field analysis stats when query changes

Romain Rigaux пре 11 година
родитељ
комит
3f78670f86

+ 11 - 5
apps/search/src/search/templates/search.mako

@@ -366,7 +366,7 @@ ${ dashboard.layout_skeleton() }
           <div style="margin-bottom: 3px">
             <input type="checkbox" data-bind="checkedValue: name, checked: $root.collection.template.fieldsSelected" style="margin: 0" />
             <div data-bind="text: name, css:{'field-selector': true, 'hoverable': $root.collection.template.fieldsSelected.indexOf(name()) > -1}, click: highlightColumn"></div>
-            <i class="fa fa-question-circle pull-right muted pointer analysis" data-bind="click: function() { $root.fieldAnalysesName(name()); $root.showFieldAnalysis(); }"></i>
+            <i class="fa fa-question-circle pull-right muted pointer analysis" title="${ _('Click to analyse field') }" data-bind="click: function() { $root.fieldAnalysesName(name()); $root.showFieldAnalysis(); }"></i>
           </div>
         </div>
         <div data-bind="visible: $root.collection.template.filteredAttributeFields().length == 0" style="padding-left: 4px; padding-top: 5px; font-size: 40px; color: #CCC">
@@ -864,8 +864,8 @@ ${ dashboard.layout_skeleton() }
   <!-- ko if: $root.fieldAnalysesName() -->
   <div data-bind="with: $root.getFieldAnalysis()">
     <div class="pull-right">
-        <input type="text" data-bind="visible: section() == 'terms', clearable: terms.prefix, valueUpdate:'afterkeydown'" />
-        <input type="text" data-bind="visible: section() == 'stats', clearable: stats.facet" />
+        <input type="text" data-bind="visible: section() == 'terms', clearable: terms.prefix, valueUpdate:'afterkeydown'" placeholder="${ _('Prefix filter...') }"/>
+        <input type="text" data-bind="visible: section() == 'stats', clearable: stats.facet" placeholder="${ _('Field name...') }"/>
     </div>
     <ul class="nav nav-tabs" role="tablist">
       <li class="active"><a href="#analysis-terms" role="tab" data-toggle="tab" data-bind="click: function() { section('terms'); }">${ _('Terms') }</a></li>
@@ -883,7 +883,10 @@ ${ dashboard.layout_skeleton() }
           <tr>
             <td data-bind="text: val.value"></td>
             <td style="width: 40px">
-              <div class="progress"><div class="bar-label" data-bind="text:val.count"></div><div class="bar bar-info" style="margin-top:-20px;" data-bind="style: {'width': ((val.count / $parent.data()[0].val.count)*100) + '%'}"></div></div>
+              <div class="progress">
+                <div class="bar-label" data-bind="text:val.count"></div>
+                <div class="bar bar-info" style="margin-top:-20px;" data-bind="style: {'width': ((val.count / $parent.data()[0].val.count) * 100) + '%'}"></div>
+              </div>
             </td>
           </tr>
           </tbody>
@@ -995,7 +998,10 @@ ${ dashboard.layout_skeleton() }
 
 <div id="fieldAnalysis" class="popover mega-popover right">
   <div class="arrow"></div>
-  <h3 class="popover-title" style="text-align: left"><a class="pull-right pointer" data-bind="click: function(){ $('#fieldAnalysis').hide(); }">&times;</a> ${ _('Micro analysis for') } <strong data-bind="text: $root.fieldAnalysesName"></strong></h3>
+  <h3 class="popover-title" style="text-align: left">
+    <a class="pull-right pointer" data-bind="click: function(){ $('#fieldAnalysis').hide(); $root.fieldAnalysesName(''); }"><i class="fa fa-times"></i></a>
+    <strong data-bind="text: $root.fieldAnalysesName"></strong> ${ _(' field analysis') }
+  </h3>
   <div class="popover-content" data-bind="template: { name: 'analysis-window' }" style="text-align: left"></div>
 </div>
 

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

@@ -353,6 +353,7 @@ def get_terms(request):
 
     field = analysis['name']
     properties = {
+      'terms.limit': 25,
       'terms.prefix': analysis['terms']['prefix']
       # lower
       # limit

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

@@ -826,7 +826,7 @@ var SearchViewModel = function (collection_json, query_json, initial_json) {
   self.columns = ko.observable([]);
   loadLayout(self, collection_json.layout);
 
-  self.isEditing = ko.observable(true);
+  self.isEditing = ko.observable(false);
   self.toggleEditing = function () {
     self.isEditing(! self.isEditing());
   };
@@ -922,6 +922,13 @@ var SearchViewModel = function (collection_json, query_json, initial_json) {
       });
     }
 
+    $.each(self.fieldAnalyses(), function (index, analyse) { // Invalidate stats analysis
+      analyse.stats.data.removeAll();
+    });
+    if (self.getFieldAnalysis()) {
+      self.getFieldAnalysis().update();
+    }
+
     $.when.apply($, [
       $.post("/search/search", {
         collection: ko.mapping.toJSON(self.collection),

+ 25 - 14
desktop/libs/libsolr/src/libsolr/api.py

@@ -63,6 +63,25 @@ class SolrApi(object):
     return 'OR'.join([q_template % (q['q'] or EMPTY_QUERY.get()) for q in query['qs']]).encode('utf-8')
 
 
+  def _get_fq(self, query):
+    params = ()
+
+    for fq in query['fqs']:
+      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']:
+          if _filter is not None and ' ' in _filter:
+            f.append('%s:"%s"' % (fq['field'], _filter))
+          else:
+            f.append('{!field f=%s}%s' % (fq['field'], _filter))
+        params += (('fq', urllib.unquote(utf_quoter('{!tag=%s}' % fq['field'] + ' '.join(f)))),)
+      elif fq['type'] == 'range':
+        params += (('fq', '{!tag=%s}' % fq['field'] + ' '.join([urllib.unquote(utf_quoter('%s:[%s TO %s}' % (fq['field'], f['from'], f['to']))) for f in fq['properties']])),)
+
+    return params
+
   def query(self, collection, query):
     solr_query = {}
 
@@ -109,7 +128,7 @@ class SolrApi(object):
               ('f.%s.facet.limit' % facet['field'], int(facet['properties'].get('limit', 10)) + 1),
               ('f.%s.facet.mincount' % facet['field'], int(facet['properties']['mincount'])),
           )
-        elif facet['type'] == 'pivot':  
+        elif facet['type'] == 'pivot':
           if facet['properties']['facets']:
             fields = facet['field']
             for f in facet['properties']['facets']:
@@ -120,19 +139,8 @@ class SolrApi(object):
                 ('f.%s.facet.limit' % facet['field'], int(facet['properties'].get('limit', 10)) + 1),
                 ('facet.pivot.mincount', int(facet['properties']['mincount'])),
             )
-    for fq in query['fqs']:
-      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']:
-          if _filter is not None and ' ' in _filter:
-            f.append('%s:"%s"' % (fq['field'], _filter))
-          else:
-            f.append('{!field f=%s}%s' % (fq['field'], _filter))
-        params += (('fq', urllib.unquote(utf_quoter('{!tag=%s}' % fq['field'] + ' '.join(f)))),)
-      elif fq['type'] == 'range':
-        params += (('fq', '{!tag=%s}' % fq['field'] + ' '.join([urllib.unquote(utf_quoter('%s:[%s TO %s}' % (fq['field'], f['from'], f['to']))) for f in fq['properties']])),)
+
+    params += self._get_fq(query)
 
     if collection['template']['fieldsSelected'] and collection['template']['isGridLayout']:
       fields = collection['template']['fieldsSelected'] + [collection['idField']] if collection['idField'] else []
@@ -358,6 +366,9 @@ class SolrApi(object):
           ('rows', 0),
           ('stats', 'true'),
       )
+
+      params += self._get_fq(query)
+
       if facet:
         params += (('stats.facet', facet),)