Beispiel #1
0
    def test_query_combined_mismatch(self):
        msg = "SearchQuery can only be combined with other SearchQuerys, got"
        with self.assertRaisesMessage(TypeError, msg):
            Line.objects.filter(dialogue__search=None | SearchQuery('kneecaps'))

        with self.assertRaisesMessage(TypeError, msg):
            Line.objects.filter(dialogue__search=None & SearchQuery('kneecaps'))
Beispiel #2
0
    def test_weights_in_vector(self):
        vector = SearchVector('dialogue', weight='A') + SearchVector('character__name', weight='D')
        searched = Line.objects.filter(scene=self.witch_scene).annotate(
            rank=SearchRank(vector, SearchQuery('witch')),
        ).order_by('-rank')[:2]
        self.assertSequenceEqual(searched, [self.crowd, self.witch])

        vector = SearchVector('dialogue', weight='D') + SearchVector('character__name', weight='A')
        searched = Line.objects.filter(scene=self.witch_scene).annotate(
            rank=SearchRank(vector, SearchQuery('witch')),
        ).order_by('-rank')[:2]
        self.assertSequenceEqual(searched, [self.witch, self.crowd])
Beispiel #3
0
    def test_query_multiple_and(self):
        searched = Line.objects.annotate(
            search=SearchVector('scene__setting', 'dialogue'),
        ).filter(search=SearchQuery('bedemir') & SearchQuery('scales') & SearchQuery('nostrils'))
        self.assertSequenceEqual(searched, [])

        searched = Line.objects.annotate(
            search=SearchVector('scene__setting', 'dialogue'),
        ).filter(search=SearchQuery('shall') & SearchQuery('use') & SearchQuery('larger'))
        self.assertSequenceEqual(searched, [self.bedemir0])
Beispiel #4
0
 def test_str(self):
     tests = (
         (~SearchQuery('a'), '~SearchQuery(a)'),
         (
             (SearchQuery('a') | SearchQuery('b')) & (SearchQuery('c') | SearchQuery('d')),
             '((SearchQuery(a) || SearchQuery(b)) && (SearchQuery(c) || SearchQuery(d)))',
         ),
         (
             SearchQuery('a') & (SearchQuery('b') | SearchQuery('c')),
             '(SearchQuery(a) && (SearchQuery(b) || SearchQuery(c)))',
         ),
         (
             (SearchQuery('a') | SearchQuery('b')) & SearchQuery('c'),
             '((SearchQuery(a) || SearchQuery(b)) && SearchQuery(c))'
         ),
         (
             SearchQuery('a') & (SearchQuery('b') & (SearchQuery('c') | SearchQuery('d'))),
             '(SearchQuery(a) && (SearchQuery(b) && (SearchQuery(c) || SearchQuery(d))))',
         ),
     )
     for query, expected_str in tests:
         with self.subTest(query=query):
             self.assertEqual(str(query), expected_str)
Beispiel #5
0
 def test_ranking_chaining(self):
     searched = Line.objects.filter(character=self.minstrel).annotate(
         rank=SearchRank(SearchVector('dialogue'), SearchQuery('brave sir robin')),
     ).filter(rank__gt=0.3)
     self.assertSequenceEqual(searched, [self.verse0])
Beispiel #6
0
 def test_query_config_mismatch(self):
     with self.assertRaisesMessage(TypeError, "SearchQuery configs don't match."):
         Line.objects.filter(
             dialogue__search=SearchQuery('kneecaps', config='german') |
             SearchQuery('nostrils', config='english')
         )
Beispiel #7
0
 def test_query_invert(self):
     searched = Line.objects.filter(character=self.minstrel, dialogue__search=~SearchQuery('kneecaps'))
     self.assertEqual(set(searched), {self.verse0, self.verse2})
Beispiel #8
0
 def test_query_multiple_or(self):
     searched = Line.objects.filter(
         dialogue__search=SearchQuery('kneecaps') | SearchQuery('nostrils') | SearchQuery('Sir Robin')
     )
     self.assertEqual(set(searched), {self.verse1, self.verse2, self.verse0})
Beispiel #9
0
 def test_query_and(self):
     searched = Line.objects.annotate(
         search=SearchVector('scene__setting', 'dialogue'),
     ).filter(search=SearchQuery('bedemir') & SearchQuery('scales'))
     self.assertSequenceEqual(searched, [self.bedemir0])
Beispiel #10
0
 def test_config_from_field_explicit(self):
     searched = Line.objects.annotate(
         search=SearchVector('scene__setting', 'dialogue', config=F('dialogue_config')),
     ).filter(search=SearchQuery('cadeaux', config=F('dialogue_config')))
     self.assertSequenceEqual(searched, [self.french])
Beispiel #11
0
 def test_existing_vector_config_explicit(self):
     Line.objects.update(dialogue_search_vector=SearchVector('dialogue'))
     searched = Line.objects.filter(dialogue_search_vector=SearchQuery('cadeaux', config='french'))
     self.assertSequenceEqual(searched, [self.french])
Beispiel #12
0
 def test_existing_vector(self):
     Line.objects.update(dialogue_search_vector=SearchVector('dialogue'))
     searched = Line.objects.filter(dialogue_search_vector=SearchQuery('Robin killed'))
     self.assertSequenceEqual(searched, [self.verse0])