Skip to content

Commit fcc4443

Browse files
benkeannaclaude
andcommitted
feat(gooddata-pipelines): make workspace data filter fields optional
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent efc6b2a commit fcc4443

3 files changed

Lines changed: 77 additions & 18 deletions

File tree

packages/gooddata-pipelines/src/gooddata_pipelines/ldm_extension/input_processor.py

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,34 @@ def datasets_to_ldm(
253253
# Get the data source info
254254
dataset_source_table_id, dataset_sql = self._get_sources(dataset)
255255

256+
# Workspace data filter fields are optional and must be set together
257+
# (validated on the input model). Emit columns/references only when
258+
# both are provided.
259+
wdf_columns: list[CatalogDeclarativeWorkspaceDataFilterColumn] = []
260+
wdf_references: list[
261+
CatalogDeclarativeWorkspaceDataFilterReferences
262+
] = []
263+
if (
264+
dataset.definition.workspace_data_filter_id is not None
265+
and dataset.definition.workspace_data_filter_column_name
266+
is not None
267+
):
268+
wdf_columns.append(
269+
CatalogDeclarativeWorkspaceDataFilterColumn(
270+
name=dataset.definition.workspace_data_filter_column_name,
271+
data_type=ColumnDataType.STRING.value,
272+
)
273+
)
274+
wdf_references.append(
275+
CatalogDeclarativeWorkspaceDataFilterReferences(
276+
filter_id=CatalogDatasetWorkspaceDataFilterIdentifier(
277+
id=dataset.definition.workspace_data_filter_id
278+
),
279+
filter_column=dataset.definition.workspace_data_filter_column_name,
280+
filter_column_data_type=ColumnDataType.STRING.value,
281+
)
282+
)
283+
256284
# Construct the declarative dataset object and append it to the list.
257285
declarative_datasets.append(
258286
CatalogDeclarativeDataset(
@@ -283,21 +311,8 @@ def datasets_to_ldm(
283311
facts=facts,
284312
data_source_table_id=dataset_source_table_id,
285313
sql=dataset_sql,
286-
workspace_data_filter_columns=[
287-
CatalogDeclarativeWorkspaceDataFilterColumn(
288-
name=dataset.definition.workspace_data_filter_column_name,
289-
data_type=ColumnDataType.STRING.value,
290-
)
291-
],
292-
workspace_data_filter_references=[
293-
CatalogDeclarativeWorkspaceDataFilterReferences(
294-
filter_id=CatalogDatasetWorkspaceDataFilterIdentifier(
295-
id=dataset.definition.workspace_data_filter_id
296-
),
297-
filter_column=dataset.definition.workspace_data_filter_column_name,
298-
filter_column_data_type=ColumnDataType.STRING.value,
299-
)
300-
],
314+
workspace_data_filter_columns=wdf_columns or None,
315+
workspace_data_filter_references=wdf_references or None,
301316
tags=_effective_dataset_tags(dataset.definition),
302317
)
303318
)

packages/gooddata-pipelines/src/gooddata_pipelines/ldm_extension/models/custom_data_object.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,12 @@ def check_ids_not_equal(self) -> "CustomFieldDefinition":
6262

6363

6464
class CustomDatasetDefinition(BaseModel):
65-
"""Input model for custom dataset definition."""
65+
"""Input model for custom dataset definition.
66+
67+
Workspace data filter fields are optional. Both must be set together or
68+
both left unset; when set, a single-column WDF binding is emitted on the
69+
declarative dataset.
70+
"""
6671

6772
workspace_id: str
6873
dataset_id: str
@@ -74,8 +79,8 @@ class CustomDatasetDefinition(BaseModel):
7479
parent_dataset_reference_attribute_id: str
7580
dataset_reference_source_column: str
7681
dataset_reference_source_column_data_type: ColumnDataType
77-
workspace_data_filter_id: str
78-
workspace_data_filter_column_name: str
82+
workspace_data_filter_id: str | None = None
83+
workspace_data_filter_column_name: str | None = None
7984
dataset_description: str | None = Field(
8085
default=None,
8186
description="Declarative description on the custom dataset.",
@@ -98,6 +103,18 @@ def check_source(self) -> "CustomDatasetDefinition":
98103
)
99104
return self
100105

106+
@model_validator(mode="after")
107+
def check_wdf_pair(self) -> "CustomDatasetDefinition":
108+
"""Workspace data filter id and column name must be provided together or both omitted."""
109+
has_id = self.workspace_data_filter_id is not None
110+
has_col = self.workspace_data_filter_column_name is not None
111+
if has_id != has_col:
112+
raise ValueError(
113+
"workspace_data_filter_id and workspace_data_filter_column_name "
114+
"must both be set or both be omitted"
115+
)
116+
return self
117+
101118

102119
class CustomDataset(BaseModel):
103120
"""Custom dataset with its definition and custom fields."""

packages/gooddata-pipelines/tests/test_ldm_extension/test_models/test_custom_data_object.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,3 +100,30 @@ def test_custom_dataset_model():
100100
assert dataset.definition.dataset_id == "ds1"
101101
assert len(dataset.custom_fields) == 1
102102
assert dataset.custom_fields[0].custom_field_id == "cf1"
103+
104+
105+
def test_custom_dataset_definition_wdf_optional_both_none():
106+
data = make_valid_dataset_def(
107+
workspace_data_filter_id=None, workspace_data_filter_column_name=None
108+
)
109+
ds = CustomDatasetDefinition(**data)
110+
assert ds.workspace_data_filter_id is None
111+
assert ds.workspace_data_filter_column_name is None
112+
113+
114+
def test_custom_dataset_definition_wdf_only_id_raises():
115+
data = make_valid_dataset_def(
116+
workspace_data_filter_id="wdf1", workspace_data_filter_column_name=None
117+
)
118+
with pytest.raises(ValidationError) as exc:
119+
CustomDatasetDefinition(**data)
120+
assert "both be set or both be omitted" in str(exc.value)
121+
122+
123+
def test_custom_dataset_definition_wdf_only_column_raises():
124+
data = make_valid_dataset_def(
125+
workspace_data_filter_id=None, workspace_data_filter_column_name="col1"
126+
)
127+
with pytest.raises(ValidationError) as exc:
128+
CustomDatasetDefinition(**data)
129+
assert "both be set or both be omitted" in str(exc.value)

0 commit comments

Comments
 (0)