]> git.parisson.com Git - telemeta.git/commitdiff
Fin recherche booleenne
authormathieu <mathieu.boye28@gmail.com>
Fri, 22 Apr 2016 13:59:24 +0000 (15:59 +0200)
committermathieu <mathieu.boye28@gmail.com>
Fri, 22 Apr 2016 13:59:24 +0000 (15:59 +0200)
Former-commit-id: 195c9451d92ab3916e571d321601ad09ae532f4c

app/sandbox/settings.py
telemeta/forms/haystack_form.py
telemeta/templates/search/advanceSearch.html
telemeta/util/backend.py
telemeta/views/search.py

index 822b655ddcf53ea09acd8f903fc19a5c83e44f1f..2cd8c7e18cc47d4307dd39cc9ec86b7c39cd55a7 100644 (file)
@@ -5,7 +5,6 @@ import os, sys
 from django.core.urlresolvers import reverse_lazy, reverse
 
 import environ
-
 # set default values and casting
 env = environ.Env(DEBUG=(bool, False),
                   CELERY_ALWAYS_EAGER=(bool, False),
index 8a81d77616bad4e42e98ac7e8c839f421093ffdd..db3eaf73edd0cb28458943f4c2921db3ed33c403 100644 (file)
 
 from telemeta.models import *
 from haystack.forms import *
-from haystack.query import SearchQuerySet
+from haystack.query import SearchQuerySet, SQ
 from datetime import date
 from django.utils.translation import ugettext_lazy as _
+import operator
 
 class HaySearchForm(FacetedSearchForm):
 
@@ -154,6 +155,37 @@ class HayAdvanceForm(SearchForm):
     physical_format = forms.CharField(required=False, label=(_('physical format')), widget=forms.Select(attrs={'style': 'width:100%'}, choices=list_physical_format()))
     code = forms.CharField(required=False, label=(_('code')), widget=forms.TextInput(attrs={'class': 'form-control', 'type': 'search'}))
 
+    def filterInstru(self, query):
+        operateur = "ET"
+        if isinstance(query, list):
+            queryTerms = query
+        else:
+            queryTerms = query.split()
+        sqTab = []
+        valeur = ""
+        while len(queryTerms) != 0:
+            term = queryTerms.pop(0)
+            if term == "ET" or term == "OU":
+                if valeur != "":
+                    sqTab.append(('instruments__contains', valeur.strip()))
+                    valeur = ""
+                if term != operateur:
+                    sqTab = [SQ(filtre) for filtre in sqTab]
+                    objet = reduce(operator.or_, sqTab) if operateur == "OU" else reduce(operator.and_, sqTab)
+                    del sqTab[:]
+                    sqTab.append(objet)
+                    operateur = "OU" if operateur == "ET" else "ET"
+            elif term == "(":
+                indexCloseBracket = getclosebracket(queryTerms)
+                sqTab.append(self.filterInstru(queryTerms[:indexCloseBracket]))
+                del queryTerms[:indexCloseBracket + 1]
+            else:
+                valeur += term + " "
+        if valeur != "":
+            sqTab.append(('instruments__contains', valeur.strip()))
+        sqTab = [SQ(filtre) for filtre in sqTab]
+        return SQ(reduce(operator.and_, sqTab) if operateur == "ET" else reduce(operator.or_, sqTab))
+
     def search(self):
         sqs = SearchQuerySet().load_all()
 
@@ -174,7 +206,7 @@ class HayAdvanceForm(SearchForm):
                 sqs = sqs.filter(ethnic_group__contains=self.cleaned_data['ethnic_group'])
 
         if self.cleaned_data.get('instruments'):
-            sqs = sqs.filter(instruments__contains=self.cleaned_data['instruments'])
+            sqs = sqs.filter(self.filterInstru(self.cleaned_data['instruments']))#
 
         if self.cleaned_data.get('collectors'):
             sqs = sqs.filter(collectors__contains=self.cleaned_data['collectors'])
@@ -216,3 +248,17 @@ class HayAdvanceForm(SearchForm):
                 sqs = sqs.filter(physical_format=self.cleaned_data['physical_format'])
 
         return sqs
+
+
+def getclosebracket(tab):
+    index = 0
+    par = 1
+    while par != 0 and index<len(tab):
+        if tab[index]=="(":
+            par += 1
+        elif tab[index]==")":
+            par -= 1
+        if par !=0:
+            index+= 1
+    return index if par == 0 else -1
+#
\ No newline at end of file
index 289340ed3254e4d29ad4a07039ae5845c6bfd7fc..3c2d03a2f6da6d307dfdbc6e4c45ac828fea682c 100644 (file)
@@ -387,11 +387,11 @@ $(function() {
             dataType: 'json',
             data: $(this).serialize(),
             success: function(donnees){
-                if(e.type=='submit' && donnees.result.match(/Requête formée : /g)){
+                if(e.type=='submit' && !donnees.result.match(/\[ERROR\]/g)){
                     $("#dialog").dialog("close");
-                    $('#id_instruments').val(donnees.result.substr(17));
+                    $('#id_instruments').val(donnees.result);
                 }
-                $('#res').text(donnees.result);
+                $('#res').html("Requête formée :<br/><strong>"+donnees.result+'</strong>');
             },
         });
     });
index 13ffd47a4189bdec5de7cd29be30033a27558fab..897f7adcab75e123bdc195b801811a7f7edefe10 100644 (file)
@@ -1,3 +1,5 @@
+# -*- coding: utf-8 -*-
+
 from haystack.backends.elasticsearch_backend import *
 
 class CustomElasticBackend(ElasticsearchSearchBackend):
@@ -15,10 +17,15 @@ class CustomElasticSearchQuery(ElasticsearchSearchQuery):
     def build_query_fragment(self, field, filter_type, value):
         print(field, ' ', filter_type, ' ', value)
         valeur = super(CustomElasticSearchQuery, self).build_query_fragment(field, filter_type, value)
+        #print(valeur)
+        return valeur
+
+    def build_query(self):
+        valeur = super(CustomElasticSearchQuery, self).build_query()
         print(valeur)
         return valeur
 
-class CustomElasticEngine(ElasticsearchSearchEngine):#
+class CustomElasticEngine(ElasticsearchSearchEngine):
     backend = CustomElasticBackend
     query = CustomElasticSearchQuery
 
index 5c24aa1e4073b25c8dee68f2b724694d3b9aaf9a..260111833e9288a6f2a8a1b72649dfdf7712e3aa 100644 (file)
@@ -1,5 +1,4 @@
-# coding: utf-8
-
+# -*- coding: utf-8 -*-
 # Copyright (C) 2015 Angy Fils-Aimé, Killian Mary
 
 # This file is part of Telemeta.
@@ -27,8 +26,6 @@ import simplejson as json
 from django.http import HttpResponse
 from telemeta.forms.boolean_form import *
 from django.forms.formsets import formset_factory
-from django.utils.encoding import smart_str
-
 
 class HaystackSearch(FacetedSearchView, SavedSearchView):
 
@@ -201,7 +198,7 @@ class BooleanSearchView(object):
 
     form = formset_factory(BooleanSearch)
 
-    def getBooleanQuery(self, request):
+    def getBooleanQuery(self, request, type='json'):
         if request.method != 'GET':
             return HttpResponse(json.dumps({'result': '[ERROR]:Not Request GET'}), content_type='application/json')
 
@@ -218,25 +215,28 @@ class BooleanSearchView(object):
             try:
                 self.isCorrectQuery(query.strip())
             except Erreur as e:
-                return HttpResponse(json.dumps({'result': e.message}), content_type='application/json')
-            return HttpResponse(json.dumps({'result': u'Requête formée : '+query.strip()}), content_type='application/json')
+                if type=="json":
+                    return HttpResponse(json.dumps({'result': e.message}), content_type='application/json')
+            if type=="json":
+                return HttpResponse(json.dumps({'result': query.strip()}), content_type='application/json')
         else:
-            return HttpResponse(json.dumps({'result': 'Field(s) missing'}), content_type='application/json')
+            if type=="json":
+                return HttpResponse(json.dumps({'result': '[ERROR]Field(s) missing'}), content_type='application/json')
 
-    def isCorrectQuery(self, query):
+    def isCorrectQuery(self, query):#
         tabQuery = query.split()
         openBracket = 0
         boolean = False
         for mot in tabQuery:
-            if mot ==")":
+            if mot ==")":#
                 if openBracket == 0:
-                    raise Erreur("Open Bracket Is Missing !")
+                    raise Erreur("[ERROR]Open Bracket Is Missing !")
                 else:
                     openBracket -= 1
                     boolean = False
             elif mot=="ET" or mot=="OU":
                 if boolean:
-                    raise Erreur("Two boolean follow")
+                    raise Erreur("[ERROR]Two boolean follow")
                 else:
                     boolean = True
             elif mot == "(":
@@ -244,9 +244,9 @@ class BooleanSearchView(object):
             else:
                 boolean = False
         if boolean:
-            raise Erreur("Boolean at the end of query")
+            raise Erreur("[ERROR]Boolean at the end of query")
         elif openBracket != 0:
-            raise Erreur("Close Bracket Is Missing")
+            raise Erreur("[ERROR]Close Bracket Is Missing")
         else:
             return True