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)
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)
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]))
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]))
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
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)
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)
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
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)
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)
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
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