Эх сурвалжийг харах

[search] Multi search boxes queries

Romain Rigaux 11 жил өмнө
parent
commit
be9a2dd

+ 3 - 1
apps/search/src/search/api.py

@@ -183,9 +183,11 @@ class SolrApi(object):
     solr_query['collection'] = collection['name']
     solr_query['rows'] = 10
     solr_query['start'] = 0
+    
+    q_template = '(%s)' if len(query['qs']) >= 2 else '%s'
           
     params = self._get_params() + (
-        ('q', query['q'] or EMPTY_QUERY.get()),
+        ('q', 'OR'.join([q_template % (q['q'] or EMPTY_QUERY.get()) for q in query['qs']])),
         ('wt', 'json'),
         ('rows', solr_query['rows']),
         ('start', solr_query['start']),

+ 7 - 2
apps/search/src/search/templates/search2.mako

@@ -46,8 +46,13 @@ ${ commonheader(_('Search'), "search", user, "60px") | n,unicode }
         <span class="current-collection">${ collection.label }</span>        
       </div>
 
-      <input data-bind="value: query.q" name="query" maxlength="256" type="text" class="search-query input-xxlarge" id="id_query" style="cursor: auto;">
-      
+      <span data-bind="foreach: query.qs">
+        <input data-bind="value: q" maxlength="256" type="text" class="search-query input-large" style="cursor: auto;">
+        ## if index 1 <a href="javascript:void(0)"><i class="fa fa-plus"></i></a>
+      </span>
+
+      <a class="btn" href="javascript:void(0)" data-bind="click: $root.query.addQ"><i class="fa fa-plus"></i></a>
+
       <button type="submit" id="search-btn" class="btn btn-inverse"><i class="fa fa-search"></i></button>
     </div>
   </form>

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

@@ -63,7 +63,7 @@ def index(request):
       return no_collections(request)
 
   collection = Collection.objects.get(id=collection_id) # TODO perms HUE-1987
-  query = {'q': '', 'fqs': []}
+  query = {'qs': [{'q': ''}], 'fqs': []}
 
   return render('search2.mako', request, {
     'collection': collection,
@@ -73,7 +73,7 @@ def index(request):
 
 def new_search(request):
   collection = Collection(name='twitter_demo', label='New Twitter Template')
-  query = {'q': '', 'fqs': []}
+  query = {'qs': [{'q': ''}], 'fqs': []}
 
   return render('search2.mako', request, {
     'collection': collection,
@@ -492,6 +492,8 @@ def get_timeline(request):
     facet_filter = request.POST.get('d', '{}')
         
     facet_id = facet['id']
+    
+    # qs = only one
   
     # Only care about our current field:value filter
     for fq in query['fqs']:

+ 35 - 18
apps/search/static/js/search.ko.js

@@ -195,21 +195,32 @@ function loadLayout(viewModel, json_layout) {
 var Query = function (vm, query) {
   var self = this;
 
-  self.q = ko.observable(query.q);
+  self.qs = ko.mapping.fromJS(query.qs);
   self.fqs = ko.mapping.fromJS(query.fqs);
   var defaultMultiqGroup = {'id': null, 'label': 'query'};
   self.multiqs = ko.computed(function () { // List of widgets supporting multiqs
     return [defaultMultiqGroup].concat(
     		$.map($.grep(self.fqs(), function(fq, i) {
     			  return fq.type() == 'field';
-    		}), function(fq) {return {'id': fq.id(), 'label': fq.field()}})
+    		}), function(fq) { return {'id': fq.id(), 'label': fq.field()} })
     	);
   });
   self.selectedMultiq = ko.observable(defaultMultiqGroup);
 
+  self.getFacetFilter = function (widget_id) {
+    var _fq = null;
+    $.each(self.fqs(), function (index, fq) { 
+      if (fq.id() == widget_id) {
+        _fq = fq;
+        return false;
+      }
+    });
+    return _fq;
+  };
+
   self.isMultiq = ko.computed(function () {
-	if (self.selectedMultiq() && self.selectedMultiq()['id'] != null) {
-      var facet = self.getFacetFilter(self.selectedMultiq()['id']);
+	if (self.selectedMultiq() && self.selectedMultiq() != null) {
+      var facet = self.getFacetFilter(self.selectedMultiq());
       return facet && facet.filter().length > 0; // todo + histogram there?
     }
 	return false;
@@ -218,6 +229,11 @@ var Query = function (vm, query) {
 	vm.search();
   });
   
+  self.addQ = function (data) {
+	self.qs.push(ko.mapping.fromJS({'q': ''}));
+	vm.search();
+  };
+  
   self.toggleFacet = function (data) {
 	var fq = self.getFacetFilter(data.widget_id);
 
@@ -273,18 +289,7 @@ var Query = function (vm, query) {
         return false;
       }
     });
-  } 
-
-  self.getFacetFilter = function (widget_id) {
-    var _fq = null;
-    $.each(self.fqs(), function (index, fq) { 
-      if (fq.id() == widget_id) {
-        _fq = fq;
-        return false;
-      }
-    });
-    return _fq;
-  }   
+  };   
 };
 
 
@@ -356,6 +361,17 @@ var Collection = function (vm, collection) {
     return _facet;
   }
 
+  self.getHistogramFacet = function () { // might remove when list of available widgets
+    var _facet = null;
+    $.each(self.facets(), function (index, facet) {
+      if (facet.widgetType() == 'histogram-widget') {
+        _facet = facet;
+        return false;
+      }
+    });
+    return _facet;
+  }
+  
   self.template.fields = ko.computed(function () {
     var _fields = [];
     $.each(self.template.fieldsAttributes(), function (index, field) {
@@ -571,7 +587,7 @@ var SearchViewModel = function (collection_json, query_json) {
 
     // self.query.q().slice(1) too ?
     if (self.query.isMultiq()) {
-      var facet = self.query.getFacetFilter(self.query.selectedMultiq()['id']);
+      var facet = self.query.getFacetFilter(self.query.selectedMultiq());
       multiQs = $.map(facet.filter(), function(d) {
     	return $.post("/search/get_timeline", {
             collection: ko.mapping.toJSON(self.collection),
@@ -626,7 +642,8 @@ var SearchViewModel = function (collection_json, query_json) {
     )
     .done(function() {
       if (arguments[0] instanceof Array) { // If multi queries
-    	var histoFacet = self.getFacetFromQuery('e90cc50b-3d55-fb7c-28f3-a0710ca28ae6');    	
+    	var histoFacetId = self.collection.getHistogramFacet().id();
+    	var histoFacet = self.getFacetFromQuery(histoFacetId);	
         for (var i = 1; i < arguments.length; i++) {
           histoFacet.extraSeries.push(arguments[i][0]['series']);
         }