Skip to content

Commit 7effe1e

Browse files
committed
feat(gooddata-sdk): [AUTO] Add DashboardArbitraryAttributeFilter and DashboardMatchAttributeFilter
1 parent d7f50b7 commit 7effe1e

2 files changed

Lines changed: 67 additions & 3 deletions

File tree

packages/gooddata-sdk/src/gooddata_sdk/compute/model/filter.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,17 @@ def _to_identifier(val: Union[ObjId, str]) -> Union[afm_models.AfmLocalIdentifie
9696

9797

9898
class AttributeFilter(Filter):
99-
def __init__(self, label: Union[ObjId, str, Attribute], values: list[str] | None = None) -> None:
99+
def __init__(
100+
self,
101+
label: Union[ObjId, str, Attribute],
102+
values: list[str] | None = None,
103+
uses_arbitrary_values: bool | None = None,
104+
) -> None:
100105
super().__init__()
101106

102107
self._label = _extract_id_or_local_id(label)
103108
self._values = values or []
109+
self._uses_arbitrary_values = uses_arbitrary_values
104110

105111
@property
106112
def label(self) -> Union[ObjId, str]:
@@ -114,6 +120,10 @@ def label(self, label: Union[ObjId, str]) -> None:
114120
def values(self) -> list[str]:
115121
return self._values
116122

123+
@property
124+
def uses_arbitrary_values(self) -> bool | None:
125+
return self._uses_arbitrary_values
126+
117127
def is_noop(self) -> bool:
118128
return False
119129

@@ -128,7 +138,10 @@ class PositiveAttributeFilter(AttributeFilter):
128138
def as_api_model(self) -> afm_models.PositiveAttributeFilter:
129139
label_id = _to_identifier(self._label)
130140
elements = afm_models.AttributeFilterElements(values=self.values)
131-
body = PositiveAttributeFilterBody(label=label_id, _in=elements, _check_type=False)
141+
kwargs: dict[str, Any] = {}
142+
if self._uses_arbitrary_values is not None:
143+
kwargs["uses_arbitrary_values"] = self._uses_arbitrary_values
144+
body = PositiveAttributeFilterBody(label=label_id, _in=elements, _check_type=False, **kwargs)
132145
return afm_models.PositiveAttributeFilter(body, _check_type=False)
133146

134147
def description(self, labels: dict[str, str], format_locale: str | None = None) -> str:
@@ -144,7 +157,10 @@ def is_noop(self) -> bool:
144157
def as_api_model(self) -> afm_models.NegativeAttributeFilter:
145158
label_id = _to_identifier(self._label)
146159
elements = afm_models.AttributeFilterElements(values=self.values)
147-
body = NegativeAttributeFilterBody(label=label_id, not_in=elements, _check_type=False)
160+
kwargs: dict[str, Any] = {}
161+
if self._uses_arbitrary_values is not None:
162+
kwargs["uses_arbitrary_values"] = self._uses_arbitrary_values
163+
body = NegativeAttributeFilterBody(label=label_id, not_in=elements, _check_type=False, **kwargs)
148164
return afm_models.NegativeAttributeFilter(body)
149165

150166
def description(self, labels: dict[str, str], format_locale: str | None = None) -> str:

packages/gooddata-sdk/tests/compute_model/test_attribute_filters.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,3 +188,51 @@ def test_match_filter_inequality_different_case_sensitive():
188188
f1 = MatchAttributeFilter(label="test", literal="foo", match_type="CONTAINS")
189189
f2 = MatchAttributeFilter(label="test", literal="foo", match_type="CONTAINS", case_sensitive=True)
190190
assert f1 != f2
191+
192+
193+
def test_positive_filter_uses_arbitrary_values_true():
194+
f = PositiveAttributeFilter(label="local_id", values=["val1"], uses_arbitrary_values=True)
195+
assert f.uses_arbitrary_values is True
196+
api_model = f.as_api_model()
197+
body = api_model.positive_attribute_filter
198+
assert body.uses_arbitrary_values is True
199+
200+
201+
def test_positive_filter_uses_arbitrary_values_false():
202+
f = PositiveAttributeFilter(label="local_id", values=["val1"], uses_arbitrary_values=False)
203+
assert f.uses_arbitrary_values is False
204+
api_model = f.as_api_model()
205+
body = api_model.positive_attribute_filter
206+
assert body.uses_arbitrary_values is False
207+
208+
209+
def test_positive_filter_uses_arbitrary_values_default_none():
210+
f = PositiveAttributeFilter(label="local_id", values=["val1"])
211+
assert f.uses_arbitrary_values is None
212+
api_model = f.as_api_model()
213+
body = api_model.positive_attribute_filter
214+
assert not hasattr(body, "uses_arbitrary_values") or body.uses_arbitrary_values is None
215+
216+
217+
def test_negative_filter_uses_arbitrary_values_true():
218+
f = NegativeAttributeFilter(label="local_id", values=["val1"], uses_arbitrary_values=True)
219+
assert f.uses_arbitrary_values is True
220+
api_model = f.as_api_model()
221+
body = api_model.negative_attribute_filter
222+
assert body.uses_arbitrary_values is True
223+
224+
225+
def test_negative_filter_uses_arbitrary_values_false():
226+
f = NegativeAttributeFilter(label="local_id", values=["val1"], uses_arbitrary_values=False)
227+
assert f.uses_arbitrary_values is False
228+
api_model = f.as_api_model()
229+
body = api_model.negative_attribute_filter
230+
assert body.uses_arbitrary_values is False
231+
232+
233+
def test_negative_filter_uses_arbitrary_values_default_none():
234+
f = NegativeAttributeFilter(label="local_id", values=["val1"])
235+
assert f.uses_arbitrary_values is None
236+
api_model = f.as_api_model()
237+
body = api_model.negative_attribute_filter
238+
assert not hasattr(body, "uses_arbitrary_values") or body.uses_arbitrary_values is None

0 commit comments

Comments
 (0)