Changeset 460 in main


Ignore:
Timestamp:
11/09/11 16:59:19 (8 years ago)
Author:
pcosquer
Message:

search: change the query language --> new dependancy lepl (pip install lepl)
xapian may now be replaced by another search engine supported by haystack

Location:
trunk/openPLM
Files:
2 added
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/openPLM/plmapp/forms.py

    r440 r460  
    217217get_search_form.cache = {}     
    218218 
    219 import xapian 
    220 from haystack.query import SearchQuerySet, EmptySearchQuerySet 
    221 from haystack import backend as search_backend 
    222 from haystack.constants import DJANGO_CT 
     219from haystack.query import EmptySearchQuerySet 
     220from openPLM.plmapp.search import SmartSearchQuerySet 
    223221 
    224222class SimpleSearchForm(forms.Form): 
     
    228226        if self.is_valid(): 
    229227            query = self.cleaned_data["q"].strip() 
    230             sqs = SearchQuerySet().highlight().models(*models) 
     228            sqs = SmartSearchQuerySet().highlight().models(*models) 
    231229            if not query or query == "*": 
    232230                return sqs 
    233             if models: 
    234                 models = sorted(['%s:%s.%s' % (DJANGO_CT, model._meta.app_label, model._meta.module_name) for model in models]) 
    235                 models_clause = ' OR '.join(models) 
    236                 final_query = '(%s) AND (%s)' % (query, models_clause) 
    237             else: 
    238                 final_query = query 
    239  
    240             try: 
    241                 sb = search_backend.SearchBackend() 
    242                 xqr = sb.parse_query(final_query) 
    243                 results = sqs.raw_search(xqr) 
    244             except xapian.QueryParserError: 
    245                 results = sqs.auto_query(query) 
     231            results = sqs.auto_query(query) 
    246232            return results 
    247233        else: 
  • trunk/openPLM/plmapp/tests/views.py

    r457 r460  
    585585                    delegatee=self.brian) 
    586586     
     587def sorted_objects(l): 
     588    return sorted(l, key=lambda x: x.id) 
    587589 
    588590from django.core.management import call_command 
    589 class SearchViewTest(CommonViewTest): 
    590  
    591     def search(self, request): 
    592         # rebuild the index 
    593         call_command("rebuild_index", interactive=False) 
    594  
     591class SearchViewTestCase(CommonViewTest): 
     592 
     593    def get_query(self, request): 
     594        if isinstance(request, basestring): 
     595            return request 
    595596        query = u" ".join(u"%s:%s" % q for q in request.iteritems() if q[0] != "type") 
    596597        query = query or "*" 
    597         response = self.client.get("/user/user/attributes/", {"type" : request["type"], 
    598                 "q" : query})  
     598        return query 
     599 
     600    def search(self, request, type=None): 
     601        # rebuild the index 
     602        call_command("rebuild_index", interactive=False, verbosity=0) 
     603         
     604        query = self.get_query(request) 
     605        t = type or request["type"] 
     606        response = self.client.get("/user/user/attributes/", 
     607                {"type" : t, "q" : query})  
    599608        self.assertEqual(response.status_code, 200) 
    600609        results = list(response.context["results"]) 
     
    611620    def test_session_forms(self): 
    612621        "Tests if form field are kept between two search" 
    613         response = self.client.get("/user/user/attributes/", {"type" : "Part", 
    614                                 "revision" : "c", "name" : "a name"}) 
    615         self.assertEqual(response.status_code, 200) 
    616         response = self.client.get("/user/user/attributes/") 
    617         self.assertEqual(response.status_code, 200) 
    618         af = response.context["attributes_form"] 
    619         self.assertEqual(af.data["revision"], "c") 
    620         eaf = response.context["attributes_form"] 
    621         self.assertEqual(af.data["name"], "a name") 
     622        data =  {"type" : "Part", "revision" : "c", "name" : "a name"} 
     623        self.search(data) 
     624        query = self.get_query(data) 
     625        for x in range(4): 
     626            response = self.client.get("/user/user/attributes/") 
     627            self.assertEqual(response.status_code, 200) 
     628            af = response.context["attributes_form"] 
     629            self.assertEqual(af.data["q"], query) 
    622630 
    623631    def test_empty(self): 
     
    665673        results = self.search({"type" : self.TYPE}) 
    666674        c = self.controller 
    667         wanted = [c.object, c2.object] if c.pk < c2.pk else [c2.object, c.object] 
    668         self.assertEqual(results, wanted) 
    669  
    670     # TODO : error cases 
     675        self.assertEqual(results, sorted_objects([c.object, c2.object])) 
     676 
     677    def test_search_or(self): 
     678        c2 = self.CONTROLLER.create("value2", self.TYPE, "c", self.user, self.DATA) 
     679        c3 = self.CONTROLLER.create("value3", self.TYPE, "c", self.user, self.DATA) 
     680        results = self.search("%s OR %s" % (self.controller.reference, c2.reference), 
     681                self.TYPE) 
     682        self.assertEqual(sorted_objects([self.controller.object, c2.object]), 
     683                         sorted_objects(results))  
     684 
     685    def test_search_and(self): 
     686        c2 = self.CONTROLLER.create("value2", self.TYPE, "c", self.user, self.DATA) 
     687        c3 = self.CONTROLLER.create("value3", self.TYPE, "c", self.user, self.DATA) 
     688        results = self.search("%s AND %s" % (self.controller.reference, c2.reference), 
     689                self.TYPE) 
     690        self.assertEqual([], results)  
     691        results = self.search("value2 AND revision:c", self.TYPE) 
     692        self.assertEqual([c2.object], results) 
     693 
     694    def test_search_lisp_is_back(self): 
     695        c2 = self.CONTROLLER.create("value2", self.TYPE, "c", self.user, self.DATA) 
     696        c3 = self.CONTROLLER.create("value3", self.TYPE, "c", self.user, self.DATA) 
     697        results = self.search("((%s) AND (%s) ) OR (*)" % (self.controller.reference, 
     698            c2.reference), self.TYPE) 
     699        self.assertEqual(3, len(results)) 
     700 
     701    def test_search_dash(self): 
     702        for i in xrange(6): 
     703            self.CONTROLLER.create("val-0%d" % i, self.TYPE, "c", 
     704                    self.user, self.DATA) 
     705         
     706        self.CONTROLLER.create("val-0i-5", self.TYPE, "c", self.user, self.DATA) 
     707        c = self.CONTROLLER.create("0i-5", self.TYPE, "c", self.user, self.DATA) 
     708        results = self.search("val-0*", self.TYPE) 
     709        self.assertEqual(7, len(results)) 
     710        self.assertTrue(c.object not in results)  
     711 
     712    def test_search_all(self): 
     713        for i in xrange(6): 
     714            self.CONTROLLER.create("val-0%d" % i, self.TYPE, "c", 
     715                    self.user, self.DATA) 
     716        results = self.search("*", self.TYPE) 
     717        self.assertEqual(set(Part.objects.all()), set(results)) 
     718 
     719    def test_search_not(self): 
     720        results = self.search("NOT %s" % self.controller.name, self.TYPE) 
     721        self.assertEqual([], results) 
     722        results = self.search("NOT nothing", self.TYPE) 
     723        self.assertEqual([self.controller.object], results) 
     724 
    671725 
    672726class HardDiskViewTest(ViewTest): 
  • trunk/openPLM/xapian_backend.py

    r410 r460  
    10471047        else: 
    10481048            if is_not: 
    1049                 return xapian.Query(xapian.Query.OP_AND_NOT, self._all_query(), self._term_query(term)) 
     1049                return xapian.Query(xapian.Query.OP_AND_NOT, self._all_query(), self.backend.parse_query(term)) 
    10501050            else: 
    1051                 return self._term_query(term) 
     1051                return self.backend.parse_query(term) 
    10521052     
    10531053    def _filter_exact(self, term, field, is_not): 
Note: See TracChangeset for help on using the changeset viewer.