Exemplo n.º 1
0
    def testSphinxKeywordsEscaping(self):
        """
        a SENTENCE b means "a" and "b" in one sentence.
        a PARAGRAPH b means "a" and "b" in same html block.
        """
        self.obj.sphinx_field = ('<H1>Paragraph is not a word.</H1>\n'
                                 '<P>Sentence also.</P>')
        self.obj.save()
        # text contains word paragraph
        res = self.query("PARAGRAPH")
        self.assertEqual(len(res), 1)
        text = sphinx_escape("PARAGRAPH")
        # "paragraph" and "is" in one sentence
        res = self.query('%s SENTENCE is' % text, escape=False)
        self.assertTrue(len(res), 1)

        # text contains word sentence
        res = self.query("SENTENCE")
        self.assertEqual(len(res), 1)
        text = sphinx_escape("SENTENCE")
        # "sentence" and "also" in one paragraph
        res = self.query('%s PARAGRAPH also' % text, escape=False)
        self.assertTrue(len(res), 1)

        if not self.cloned_index:
            # in zero-conf index something goes wrong
            # "not" and "sentence" in one paragraph (actually, false)
            res = self.query('not PARAGRAPH %s' % text, escape=False)
            self.assertEqual(len(res), 0)
Exemplo n.º 2
0
    def testSphinxKeywordsEscaping(self):
        """
        a SENTENCE b means "a" and "b" in one sentence.
        a PARAGRAPH b means "a" and "b" in same html block.
        """
        self.obj.sphinx_field = ('<H1>Paragraph is not a word.</H1>\n'
                                 '<P>Sentence also.</P>')
        self.obj.save()
        # text contains word paragraph
        res = self.query("PARAGRAPH")
        self.assertEqual(len(res), 1)
        text = sphinx_escape("PARAGRAPH")
        # "paragraph" and "is" in one sentence
        res = self.query('%s SENTENCE is' % text, escape=False)
        self.assertTrue(len(res), 1)

        # text contains word sentence
        res = self.query("SENTENCE")
        self.assertEqual(len(res), 1)
        text = sphinx_escape("SENTENCE")
        # "sentence" and "also" in one paragraph
        res = self.query('%s PARAGRAPH also' % text, escape=False)
        self.assertTrue(len(res), 1)

        # "not" and "sentence" in one paragraph (actually, false)
        res = self.query('not PARAGRAPH %s' % text, escape=False)
        self.assertEqual(len(res), 0)
Exemplo n.º 3
0
 def query(self, text, escape=True):
     escaped = sphinx_escape(text) if escape else text
     for c in text:
         self.assertIn(c, escaped)
     try:
         return list(self.model.objects.match(escaped))
     except ProgrammingError as e:  # pragma: no cover
         self.fail("Escaping text %s with %s failed: %s" %
                   (text, escaped, e.args[1]))
Exemplo n.º 4
0
 def query(self, text, escape=True):
     escaped = sphinx_escape(text) if escape else text
     for c in text:
         self.assertIn(c, escaped)
     try:
         return list(self.model.objects.match(escaped))
     except ProgrammingError as e:
         self.fail("Escaping text %s with %s failed: %s" %
                   (text, escaped, e.args[1]))
Exemplo n.º 5
0
    def compile(self, node, select_format=False):
        sql, params = super(SphinxQLCompiler, self).compile(node, select_format)

        # substitute MATCH() arguments with sphinx-escaped params
        if isinstance(node, Search):
            search_text = sphinx_escape(params[0])
            sql = sql % search_text
            params = []

        return sql, params
Exemplo n.º 6
0
 def testSphinxCharactersEscaping(self):
     """
     Any sphinxql operator should not match document if escaped properly.
     """
     operators = '=<>()|!@~&/^$-\'\"\\'
     for o in operators:
         res = self.query("sphinx operators %s" % o)
         self.assertEqual(len(res), 0)
         text = sphinx_escape("sphinx operators %s" % o)
         res = self.query('"%s"/1' % text, escape=False)
         self.assertEqual(len(res), 1)
Exemplo n.º 7
0
 def testSphinxCharactersEscaping(self):
     """
     Any sphinxql operator should not match document if escaped properly.
     """
     operators = '=<>()|!@~&/^$\-\'\"\\'
     for o in operators:
         res = self.query("sphinx operators %s" % o)
         self.assertEqual(len(res), 0)
         text = sphinx_escape("sphinx operators %s" % o)
         res = self.query('"%s"/1' % text, escape=False)
         self.assertEqual(len(res), 1)
Exemplo n.º 8
0
    def compile(self, node, select_format=False):
        sql, params = super(SphinxQLCompiler,
                            self).compile(node, select_format)

        # substitute MATCH() arguments with sphinx-escaped params
        if isinstance(node, Search):
            search_text = sphinx_escape(params[0])
            sql = sql % search_text
            params = []

        return sql, params
Exemplo n.º 9
0
    def filter_queryset(self, request, queryset, view):
        search_fields = self.get_search_fields(request, view)
        search_terms = self.get_search_terms(request)
        if search_terms:
            queryset = queryset.match(logline='"%s"' % ' '.join(search_terms))

        match_terms = self.get_match_terms(request, search_fields)
        for field, values in match_terms.items():
            if len(values) == 1:
                queryset = queryset.filter(**{field: values[0]})
            else:
                values = '|'.join('"%s"' % sphinx_escape(v) for v in values)
                queryset = queryset.match(**{"%s" % field: values})

        select = dict(logline_snippet="SNIPPET(logline, %s, 'limit=1000000')")
        params = [' '.join(self.get_search_terms(request, escape=False))]
        return queryset.extra(select=select, select_params=params)
Exemplo n.º 10
0
    def filter_queryset(self, request, queryset, view):
        search_fields = self.get_search_fields(request, view)
        search_terms = self.get_search_terms(request)
        if search_terms:
            queryset = queryset.match(logline='"%s"' % ' '.join(search_terms))

        match_terms = self.get_match_terms(request, search_fields)
        for field, values in match_terms.items():
            if len(values) == 1:
                queryset = queryset.filter(**{field: values[0]})
            else:
                values = '|'.join('"%s"' % sphinx_escape(v) for v in values)
                queryset = queryset.match(**{"%s" % field: values})

        select = dict(logline_snippet="SNIPPET(logline, %s, 'limit=1000000')")
        params = [' '.join(self.get_search_terms(request, escape=False))]
        return queryset.extra(select=select, select_params=params)
Exemplo n.º 11
0
 def __check_search_lookup(self, field, lookup, value):
     """ Replaces field__search lookup with MATCH() call."""
     if lookup != 'search':
         return False
     self.query.add_match(**{field.name: sphinx_escape(value)})
     return True
Exemplo n.º 12
0
 def __check_search_lookup(self, field, lookup, value):
     """ Replaces field__search lookup with MATCH() call."""
     if lookup != "search":
         return False
     self.query.add_match(**{field.name: sphinx_escape(value)})
     return True