Skip to content

Commit

Permalink
visitor: add escaping support for special characters in query_string …
Browse files Browse the repository at this point in the history
…query

* INSPIR-3553
  • Loading branch information
MJedr committed May 15, 2020
1 parent 9e2952b commit 473813e
Show file tree
Hide file tree
Showing 3 changed files with 208 additions and 205 deletions.
27 changes: 27 additions & 0 deletions inspire_query_parser/utils/visitor_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -492,3 +492,30 @@ def wrap_query_in_nested_if_field_is_nested(query, field, nested_fields):
return generate_nested_query(element, query)

return query


def escape_special_characters(value):
return value.translate(str.maketrans({"+": "\\+",
" ": "\\ ",
"-": "\\-",
"=": "\\=",
"&": "\\&",
"|": "\\|",
">": "\\>",
"<": "\\<",
"!": "\\!",
"(": "\\(",
")": "\\)",
"{": "\\{",
"}": "\\}",
"[": "\\[",
"]": "\\]",
"^": "\\^",
"\"": "\\\"",
"~": "\\~",
"*": "\\*",
"?": "\\?",
":": "\\:",
"\\": "\\\\",
"/": "\\/"
}))
17 changes: 10 additions & 7 deletions inspire_query_parser/visitors/elastic_search_visitor.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,8 @@
wrap_queries_in_bool_clauses_if_more_than_one,
wrap_query_in_nested_if_field_is_nested,
is_initial_of_a_name,
retokenize_first_names
retokenize_first_names,
escape_special_characters
)
from inspire_query_parser.visitors.visitor_impl import Visitor

Expand Down Expand Up @@ -439,7 +440,7 @@ def _generate_query_string_query(self, value, fieldnames, analyze_wildcard):

query = {
'query_string': {
'query': value,
'query': escape_special_characters(value),
field_specifier: field_specifier_value,
}
}
Expand Down Expand Up @@ -761,15 +762,17 @@ def handle_value_wildcard(self, node, fieldnames=None):
bai_field_variation=FieldVariations.search,
query_bai_field_if_dots_in_name=True
)
query = self._generate_wildcard_query(
query = self._generate_query_string_query(
node.value,
fieldnames=bai_fieldnames or fieldnames
fieldnames=bai_fieldnames or fieldnames,
analyze_wildcard=True
)
return self._generate_nested_author_query(query, fieldnames)

query = self._generate_wildcard_query(
query = self._generate_query_string_query(
node.value,
fieldnames=fieldnames
fieldnames=fieldnames,
analyze_wildcard=True
)
return query

Expand Down Expand Up @@ -938,7 +941,7 @@ def visit_partial_match_value(self, node, fieldnames=None):
query_bai_field_if_dots_in_name=True
)

query = self._generate_wildcard_query(value, fieldnames=bai_fieldnames or fieldnames)
query = self._generate_query_string_query(value, fieldnames=bai_fieldnames or fieldnames, analyze_wildcard=True)
if self._are_fieldnames_author_or_first_author(bai_fieldnames) or self._are_fieldnames_author_or_first_author(fieldnames):
return self._generate_nested_author_query(query, fieldnames)

Expand Down
Loading

0 comments on commit 473813e

Please sign in to comment.