diff --git a/swh/search/elasticsearch.py b/swh/search/elasticsearch.py --- a/swh/search/elasticsearch.py +++ b/swh/search/elasticsearch.py @@ -428,8 +428,11 @@ if visit_types is not None: query_filters.append(f"visit_type = {escape(visit_types)}") - combined_filters = f"({' and '.join(query_filters)})" - query = f"{combined_filters}{' and ' if query != '' else ' '}{query}" + combined_filters = " and ".join(query_filters) + if combined_filters and query: + query = f"{combined_filters} and {query}" + else: + query = combined_filters or query parsed_query = self._translator.parse_query(query) query_clauses.append(parsed_query["filters"]) diff --git a/swh/search/tests/test_elasticsearch.py b/swh/search/tests/test_elasticsearch.py --- a/swh/search/tests/test_elasticsearch.py +++ b/swh/search/tests/test_elasticsearch.py @@ -16,6 +16,37 @@ from .test_search import CommonSearchTest +now = datetime.now(tz=timezone.utc).isoformat() +now_minus_5_hours = (datetime.now(tz=timezone.utc) - timedelta(hours=5)).isoformat() +now_plus_5_hours = (datetime.now(tz=timezone.utc) + timedelta(hours=5)).isoformat() + +ORIGINS = [ + { + "url": "http://foobar.1.com", + "nb_visits": 1, + "last_visit_date": now_minus_5_hours, + "last_eventful_visit_date": now_minus_5_hours, + }, + { + "url": "http://foobar.2.com", + "nb_visits": 2, + "last_visit_date": now, + "last_eventful_visit_date": now, + }, + { + "url": "http://foobar.3.com", + "nb_visits": 3, + "last_visit_date": now_plus_5_hours, + "last_eventful_visit_date": now_minus_5_hours, + }, + { + "url": "http://barbaz.4.com", + "nb_visits": 3, + "last_visit_date": now_plus_5_hours, + "last_eventful_visit_date": now_minus_5_hours, + }, +] + class BaseElasticsearchTest(unittest.TestCase): @pytest.fixture(autouse=True) @@ -121,34 +152,6 @@ assert mock.call_args[1]["index"] == "test-read" def test_sort_by_and_limit_query(self): - now = datetime.now(tz=timezone.utc).isoformat() - now_minus_5_hours = ( - datetime.now(tz=timezone.utc) - timedelta(hours=5) - ).isoformat() - now_plus_5_hours = ( - datetime.now(tz=timezone.utc) + timedelta(hours=5) - ).isoformat() - - ORIGINS = [ - { - "url": "http://foobar.1.com", - "nb_visits": 1, - "last_visit_date": now_minus_5_hours, - "last_eventful_visit_date": now_minus_5_hours, - }, - { - "url": "http://foobar.2.com", - "nb_visits": 2, - "last_visit_date": now, - "last_eventful_visit_date": now, - }, - { - "url": "http://foobar.3.com", - "nb_visits": 3, - "last_visit_date": now_plus_5_hours, - "last_eventful_visit_date": now_minus_5_hours, - }, - ] self.search.origin_update(ORIGINS) self.search.flush() @@ -167,11 +170,21 @@ _check_results("sort_by = [last_visit] and limit = 2", [0, 1]) _check_results("sort_by = [-last_eventful_visit, visits] limit = 3", [1, 0, 2]) - def test_query_syntax_error(self): - ORIGINS = [ - {"url": "http://foobar.1.com",}, - ] + def test_search_ql_simple(self): + self.search.origin_update(ORIGINS) + self.search.flush() + results = { + r["url"] + for r in self.search.origin_search(query='origin = "foobar"').results + } + assert results == { + "http://foobar.1.com", + "http://foobar.2.com", + "http://foobar.3.com", + } + + def test_query_syntax_error(self): self.search.origin_update(ORIGINS) self.search.flush()