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

[search] Optimize range multi facet queries

Romain Rigaux пре 11 година
родитељ
комит
ffa280769d
2 измењених фајлова са 18 додато и 8 уклоњено
  1. 9 0
      apps/search/src/search/views.py
  2. 9 8
      apps/search/static/js/search.ko.js

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

@@ -86,6 +86,7 @@ def search(request):
   
   collection = json.loads(request.POST.get('collection', '{}')) # TODO decorator with doc model perms
   query = json.loads(request.POST.get('query', '{}'))
+  # todo: remove the selected histo facet if multiq
 
   if collection['id']:
     hue_collection = Collection.objects.get(id=collection['id']) # TODO perms
@@ -494,6 +495,14 @@ def get_timeline(request):
     if multiQ == 'query':
       label = qdata['q'] 
       query['qs'] = [qdata]
+    elif facet['type'] == 'range':      
+      _prop = filter(lambda prop: prop['from'] == qdata, facet['properties'])[0]
+      label = '%(from)s - %(to)s ' % _prop
+      facet_id = facet['id']
+      # Only care about our current field:value filter
+      for fq in query['fqs']:
+        if fq['id'] == facet_id:
+          fq['properties'] = [_prop]
     else:
       label = qdata
       facet_id = facet['id']

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

@@ -199,9 +199,10 @@ var Query = function (vm, query) {
   self.fqs = ko.mapping.fromJS(query.fqs);
   var defaultMultiqGroup = {'id': 'query', 'label': 'query'};
   self.multiqs = ko.computed(function () { // List of widgets supporting multiqs
+	var histogram_id = vm.collection.getHistogramFacet().id();
     return [defaultMultiqGroup].concat(
         $.map($.grep(self.fqs(), function(fq, i) {
-            return fq.type() == 'field' || fq.type() == 'range';
+            return (fq.type() == 'field' || fq.type() == 'range') && histogram_id != fq.id();
         }), function(fq) { return {'id': fq.id(), 'label': fq.field()} })
       );
   });
@@ -620,18 +621,18 @@ var SearchViewModel = function (collection_json, query_json) {
       if (multiQ == 'query') {
         queries = self.query.qs();
       } else {
-        facet = facet = self.query.getFacetFilter(self.query.selectedMultiq());
+        facet = self.query.getFacetFilter(self.query.selectedMultiq());
         queries = facet.filter();       
       }
       
       multiQs = $.map(queries, function(qdata) {
         return $.post("/search/get_timeline", {
-              collection: ko.mapping.toJSON(self.collection),
-              query: ko.mapping.toJSON(self.query),
-              facet: ko.mapping.toJSON(facet),
-              qdata: ko.mapping.toJSON(qdata),
-              multiQ: multiQ
-            }, function (data) {return data});
+            collection: ko.mapping.toJSON(self.collection),
+            query: ko.mapping.toJSON(self.query),
+            facet: ko.mapping.toJSON(facet),
+            qdata: ko.mapping.toJSON(qdata),
+            multiQ: multiQ
+          }, function (data) {return data});
       });              
     }