Skip to content

Commit

Permalink
Merge pull request #136 from MJedr/date-queries
Browse files Browse the repository at this point in the history
visitor: support range queries for date-added and date-updated
  • Loading branch information
MJedr committed Jul 28, 2020
2 parents 1795ade + 51f7f52 commit 9f36c6d
Show file tree
Hide file tree
Showing 2 changed files with 114 additions and 10 deletions.
22 changes: 12 additions & 10 deletions inspire_query_parser/visitors/elastic_search_visitor.py
Original file line number Diff line number Diff line change
Expand Up @@ -493,12 +493,15 @@ def _generate_range_queries(self, fieldnames, operator_value_pairs):
Additionally, in the aforementioned case, if a malformed date has been given, then the the method will
return an empty dictionary.
"""
if self.KEYWORD_TO_ES_FIELDNAME['date'] == fieldnames:
if self.KEYWORD_TO_ES_FIELDNAME['date'] == fieldnames or all(
field in [self.KEYWORD_TO_ES_FIELDNAME['date-added'],
self.KEYWORD_TO_ES_FIELDNAME['date-updated']] for field in fieldnames
):
range_queries = []
for fieldname in fieldnames:
updated_operator_value_pairs = \
update_date_value_in_operator_value_pairs_for_fieldname(fieldname, operator_value_pairs)

updated_operator_value_pairs = update_date_value_in_operator_value_pairs_for_fieldname(
fieldname, operator_value_pairs
)
if not updated_operator_value_pairs:
break # Malformed date
else:
Expand Down Expand Up @@ -791,13 +794,12 @@ def visit_value(self, node, fieldnames=None):

if node.contains_wildcard:
return self.handle_value_wildcard(node, fieldnames=fieldnames)

if fieldnames in [self.KEYWORD_TO_ES_FIELDNAME['date'], self.KEYWORD_TO_ES_FIELDNAME['date-added'],
self.KEYWORD_TO_ES_FIELDNAME['date-updated']]:
# Date queries with simple values are transformed into range queries, among the given and the exact
# next date, according to the granularity of the given date.
return self._generate_range_queries(force_list(fieldnames), {ES_RANGE_EQ_OPERATOR: node.value})
if isinstance(fieldnames, list):
if self.KEYWORD_TO_ES_FIELDNAME['date'] == fieldnames:
# Date queries with simple values are transformed into range queries, among the given and the exact
# next date, according to the granularity of the given date.
return self._generate_range_queries(force_list(fieldnames), {ES_RANGE_EQ_OPERATOR: node.value})

if self.KEYWORD_TO_ES_FIELDNAME['journal'] == fieldnames:
return self._generate_journal_nested_queries(node.value)

Expand Down
102 changes: 102 additions & 0 deletions tests/test_elastic_search_visitor.py
Original file line number Diff line number Diff line change
Expand Up @@ -3429,3 +3429,105 @@ def test_range_date_queries_are_nested():

generated_es_query = _parse_query(query_str)
assert generated_es_query == expected_es_query


def test_date_updated_keyword_is_handled_with_range_query():
query_str = 'du 2019->2020'
expected_es_query = {
"range": {
"_updated": {
"gte": "2019||/y",
"lte": "2020||/y"
}
}
}

generated_es_query = _parse_query(query_str)
assert generated_es_query == expected_es_query


def test_date_added_keyword_is_handled_with_range_query():
query_str = 'da 1997'
expected_es_query = {
"range": {
"_created": {
"gte": "1997||/y",
"lt": "1998||/y"
}
}
}

generated_es_query = _parse_query(query_str)
assert generated_es_query == expected_es_query


def test_all_date_fields_are_handled_correctly_with_range_query():
query_str = 'du 2000 and date 1997'
expected_es_query = {
"bool": {
"must": [
{
"range": {
"_updated": {
"gte": "2000||/y",
"lt": "2001||/y"
}
}
},
{
"bool": {
"should": [
{
"range": {
"earliest_date": {
"gte": "1997||/y",
"lt": "1998||/y"
}
}
},
{
"range": {
"imprints.date": {
"gte": "1997||/y",
"lt": "1998||/y"
}
}
},
{
"range": {
"preprint_date": {
"gte": "1997||/y",
"lt": "1998||/y"
}
}
},
{
"nested": {
"path": "publication_info",
"query": {
"range": {
"publication_info.year": {
"gte": "1997||/y",
"lt": "1998||/y"
}
}
}
}
},
{
"range": {
"thesis_info.date": {
"gte": "1997||/y",
"lt": "1998||/y"
}
}
}
]
}
}
]
}
}

generated_es_query = _parse_query(query_str)
assert generated_es_query == expected_es_query

0 comments on commit 9f36c6d

Please sign in to comment.