Skip to content

Commit d0ae345

Browse files
authored
Merge pull request #1859 from elementary-data/filter-matching-values
Add get_matching_values method to FilterSchema for enhanced filtering…
2 parents 4d07345 + 73ea5bb commit d0ae345

File tree

2 files changed

+38
-1
lines changed

2 files changed

+38
-1
lines changed

elementary/monitor/data_monitoring/schema.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import re
22
from datetime import datetime
33
from enum import Enum
4-
from typing import Any, Generic, List, Optional, Pattern, Tuple, TypeVar
4+
from typing import Any, Generic, Iterable, List, Optional, Pattern, Set, Tuple, TypeVar
55

66
from elementary.utils.log import get_logger
77
from elementary.utils.pydantic_shim import BaseModel, Field, validator
@@ -97,6 +97,20 @@ def apply_filter_on_values(self, values: List[ValueT]) -> bool:
9797
return all(self.apply_filter_on_value(value) for value in values)
9898
raise ValueError(f"Unsupported filter type: {self.type}")
9999

100+
def get_matching_values(self, values: Iterable[ValueT]) -> Set[ValueT]:
101+
values_list = set(values)
102+
matching_values = set(
103+
value for value in values_list if self.apply_filter_on_value(value)
104+
)
105+
if self.type in ANY_OPERATORS:
106+
return matching_values
107+
elif self.type in ALL_OPERATORS:
108+
if len(matching_values) != len(values_list):
109+
return set()
110+
return matching_values
111+
112+
raise ValueError(f"Unsupported filter type: {self.type}")
113+
100114

101115
class StatusFilterSchema(FilterSchema[Status]):
102116
values: List[Status]

tests/unit/monitor/data_monitoring/test_filter_schema.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,26 @@ def test_filter_schema_apply_filter_on_values_contains_operator():
7171

7272
# Should not match when no values contain any filter values
7373
assert filter_schema.apply_filter_on_values(["abc", "xyz"]) is False
74+
75+
76+
def test_get_matching_values() -> None:
77+
filter_schema = FilterSchema(values=["test1", "test2"], type=FilterType.IS)
78+
values = ["test1", "test3", "test4"]
79+
assert filter_schema.get_matching_values(values) == {"test1"}
80+
81+
filter_schema = FilterSchema(values=["test"], type=FilterType.CONTAINS)
82+
values = ["test1", "testing", "other"]
83+
assert filter_schema.get_matching_values(values) == {"test1", "testing"}
84+
85+
filter_schema = FilterSchema(values=["test1"], type=FilterType.IS_NOT)
86+
values = ["test2", "test3"]
87+
assert filter_schema.get_matching_values(values) == {"test2", "test3"}
88+
89+
filter_schema = FilterSchema(values=["test1"], type=FilterType.IS_NOT)
90+
values = ["test1", "test2", "test3"]
91+
assert filter_schema.get_matching_values(values) == set()
92+
93+
filter_schema = FilterSchema(values=["test"], type=FilterType.IS)
94+
filter_schema.type = "unsupported" # type: ignore
95+
with pytest.raises(ValueError, match="Unsupported filter type: unsupported"):
96+
filter_schema.get_matching_values(values)

0 commit comments

Comments
 (0)