Skip to content

Commit 9756d8d

Browse files
author
Gerit Wagner
committed
NOT query: require two children
1 parent f197e45 commit 9756d8d

File tree

4 files changed

+23
-10
lines changed

4 files changed

+23
-10
lines changed

search_query/query_not.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
#!/usr/bin/env python
22
"""NOT Query"""
33
import typing
4+
from typing import cast
5+
from typing import List
6+
from typing import Union
47

58
from search_query.constants import Operators
69
from search_query.query import Query
710
from search_query.query import SearchField
11+
from search_query.query_term import Term
812

913
# pylint: disable=duplicate-code
1014

@@ -26,9 +30,13 @@ def __init__(
2630
search field: search field to which the query should be applied
2731
"""
2832

33+
query_children = [
34+
c if isinstance(c, Query) else Term(value=c) for c in children
35+
]
36+
2937
super().__init__(
3038
value=Operators.NOT,
31-
children=children,
39+
children=cast(List[Union[str, Query]], query_children),
3240
search_field=search_field
3341
if isinstance(search_field, SearchField)
3442
else SearchField(search_field)
@@ -38,6 +46,8 @@ def __init__(
3846
platform=platform,
3947
)
4048

49+
self.children = query_children
50+
4151
@property
4252
def children(self) -> typing.List[Query]:
4353
"""Children property."""

test/conftest.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,11 @@ def query_setup() -> dict:
2020
test_node = Term(
2121
"testvalue", position=(1, 10), search_field=SearchField(Fields.TITLE)
2222
)
23-
query_robot = NotQuery(["robot*"], search_field=SearchField(Fields.TITLE))
23+
query_robot = NotQuery(
24+
['"Machine Learning"', "robot*"], search_field=SearchField(Fields.TITLE)
25+
)
2426
query_ai = OrQuery(
25-
['"AI"', '"Artificial Intelligence"', '"Machine Learning"', query_robot],
27+
['"AI"', '"Artificial Intelligence"'],
2628
search_field=SearchField(Fields.TITLE),
2729
)
2830
query_health = OrQuery(

test/test_query.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -292,10 +292,11 @@ def test_children_setter() -> None:
292292

293293
# Test for NotQuery ---------------------------------------------
294294
not_query = NotQuery(
295-
["ethics"],
295+
["AI", "ethics"],
296296
search_field="abstract",
297297
)
298-
assert not_query.children[0].value == "ethics"
298+
assert not_query.children[0].value == "AI"
299+
assert not_query.children[1].value == "ethics"
299300

300301
with pytest.raises(TypeError):
301302
not_query.children = "not_a_list" # type: ignore

test/test_query_translation.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,21 +28,21 @@ def test_or_query(query_setup: dict) -> None:
2828
query_ai = query_setup["query_ai"]
2929
assert (
3030
query_ai.to_generic_string()
31-
== 'OR[title]["AI"[title], "Artificial Intelligence"[title], "Machine Learning"[title], NOT[title][robot*[title]]]'
31+
== 'OR[title]["AI"[title], "Artificial Intelligence"[title]]'
3232
)
3333

3434

3535
def test_and_query(query_setup: dict) -> None:
3636
query_complete = query_setup["query_complete"]
3737
assert (
3838
query_complete.to_generic_string()
39-
== 'AND[title][OR[title]["AI"[title], "Artificial Intelligence"[title], "Machine Learning"[title], NOT[title][robot*[title]]], OR[title]["health care"[title], medicine[title]], OR[abstract][ethic*[abstract], moral*[abstract]]]'
39+
== 'AND[title][OR[title]["AI"[title], "Artificial Intelligence"[title]], OR[title]["health care"[title], medicine[title]], OR[abstract][ethic*[abstract], moral*[abstract]]]'
4040
)
4141

4242

4343
def test_not_query(query_setup: dict) -> None:
4444
query_robot = query_setup["query_robot"]
45-
assert query_robot.to_generic_string() == "NOT[title][robot*[title]]"
45+
assert query_robot.to_generic_string() == 'NOT[title]["Machine Learning", robot*]'
4646

4747

4848
def test_nested_queries(query_setup: dict) -> None:
@@ -67,7 +67,7 @@ def test_translation_wos_part(query_setup: dict) -> None:
6767

6868
def test_translation_wos_complete(query_setup: dict) -> None:
6969
query_complete = query_setup["query_complete"]
70-
expected = '(TI=("AI" OR "Artificial Intelligence" OR "Machine Learning" NOT robot*) AND TI=("health care" OR medicine) AND AB=(ethic* OR moral*))'
70+
expected = 'TI=("AI" OR "Artificial Intelligence") AND TI=("health care" OR medicine) AND AB=(ethic* OR moral*)'
7171
translated_query = query_complete.translate(PLATFORM.WOS.value)
7272
assert translated_query.to_string() == expected
7373

@@ -81,7 +81,7 @@ def test_translation_pubmed_part(query_setup: dict) -> None:
8181

8282
def test_translation_pubmed_complete(query_setup: dict) -> None:
8383
query_complete = query_setup["query_complete"]
84-
expected = '(("AI"[ti] OR "Artificial Intelligence"[ti] OR "Machine Learning"[ti] NOT robot*[ti]) AND ("health care"[ti] OR medicine[ti]) AND (ethic*[tiab] OR moral*[tiab]))'
84+
expected = '(("AI"[ti] OR "Artificial Intelligence"[ti]) AND ("health care"[ti] OR medicine[ti]) AND (ethic*[tiab] OR moral*[tiab]))'
8585
translated_query = query_complete.translate(PLATFORM.PUBMED.value)
8686
assert translated_query.to_string() == expected
8787

0 commit comments

Comments
 (0)