Skip to content

Commit 05ef3b9

Browse files
feat: Add 'Not Verified' query filter
- Add notlike field to QueryConstraint dataclass - Create NotVerifiedConstraintResult class - Add "Not Verified" filter to QueryDialog filters list - Add tests for notlike constraint functionality Co-authored-by: kevinsbarnard <[email protected]>
1 parent 5245cd7 commit 05ef3b9

3 files changed

Lines changed: 49 additions & 0 deletions

File tree

src/vars_gridview/lib/m3/query.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ class QueryConstraint:
1616
in_: list[str] | None = None
1717
isnull: bool | None = None
1818
like: str | None = None
19+
notlike: str | None = None
1920
max: float | None = None
2021
min: float | None = None
2122
minmax: list[float] | None = None
@@ -29,6 +30,7 @@ def to_dict(self, skip_null: bool = True) -> dict:
2930
"in": self.in_,
3031
"isnull": self.isnull,
3132
"like": self.like,
33+
"notlike": self.notlike,
3234
"max": self.max,
3335
"min": self.min,
3436
"minmax": self.minmax,

src/vars_gridview/ui/QueryDialog.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,19 @@ def __str__(self) -> str:
199199
return "Verified"
200200

201201

202+
class NotVerifiedConstraintResult(BaseResult):
203+
"""
204+
A constraint result that creates a constraint to check if the verifier field is NOT present (i.e., not verified).
205+
"""
206+
207+
@property
208+
def constraints(self) -> Iterable[QueryConstraint]:
209+
yield QueryConstraint(column="link_value", notlike='%"verifier":%')
210+
211+
def __str__(self) -> str:
212+
return "Not Verified"
213+
214+
202215
class ConceptInConstraintResult(InConstraintResult):
203216
"""
204217
A constraint result that creates an IN constraint for a list of concepts.
@@ -880,6 +893,7 @@ def _create_default_filters(self) -> List[BaseFilter]:
880893
GeneratorFilter(self, "Generator", "generator", prompt="Generator"),
881894
VerifierFilter(self, "Verifier", "verifier", prompt="Verifier"),
882895
FunctionalFilter(self, "Verified", lambda: VerifiedConstraintResult()),
896+
FunctionalFilter(self, "Not Verified", lambda: NotVerifiedConstraintResult()),
883897
]
884898

885899
@pyqtSlot()

tests/test_query_constraints.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,38 @@ def test_constraint_to_dict_skip_null(self):
5151
self.assertNotIn("equals", result_dict)
5252

5353

54+
class TestLikeConstraints(unittest.TestCase):
55+
"""Test the like and notlike constraints functionality."""
56+
57+
def test_like_constraint(self):
58+
"""Test that a like constraint is created correctly."""
59+
constraint = QueryConstraint(column="link_value", like='%"verifier":%')
60+
result_dict = constraint.to_dict()
61+
62+
self.assertEqual(result_dict["column"], "link_value")
63+
self.assertEqual(result_dict["like"], '%"verifier":%')
64+
self.assertNotIn("notlike", result_dict)
65+
66+
def test_notlike_constraint(self):
67+
"""Test that a notlike constraint is created correctly."""
68+
constraint = QueryConstraint(column="link_value", notlike='%"verifier":%')
69+
result_dict = constraint.to_dict()
70+
71+
self.assertEqual(result_dict["column"], "link_value")
72+
self.assertEqual(result_dict["notlike"], '%"verifier":%')
73+
self.assertNotIn("like", result_dict)
74+
75+
def test_notlike_skip_null(self):
76+
"""Test that null notlike value is excluded when skip_null=True."""
77+
constraint = QueryConstraint(
78+
column="link_value",
79+
notlike=None
80+
)
81+
result_dict = constraint.to_dict(skip_null=True)
82+
83+
self.assertIn("column", result_dict)
84+
self.assertNotIn("notlike", result_dict)
85+
86+
5487
if __name__ == "__main__":
5588
unittest.main()

0 commit comments

Comments
 (0)