Skip to content

Commit 53a8255

Browse files
Merge pull request #1611 from gooddata/snapshot-master-c713a9a0-to-rel/dev
[bot] Merge master/c713a9a0 into rel/dev
2 parents 0c2756c + c713a9a commit 53a8255

4 files changed

Lines changed: 76 additions & 19 deletions

File tree

docs/content/en/latest/pipelines/ldm_extension/_index.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ The custom dataset represents a new dataset appended to the child LDM. It is def
4444
| dataset_reference_source_column | string \| None | **Deprecated** — use `parent_dataset_references` instead. |
4545
| dataset_reference_source_column_data_type | [ColumnDataType](#columndatatype) \| None | **Deprecated** — use `parent_dataset_references` instead. |
4646
| parent_dataset_references | [ParentDatasetReference](#parentdatasetreference)[] \| None | List of references to the parent dataset. |
47-
| workspace_data_filter_id | string | ID of the workspace data filter to use. |
48-
| workspace_data_filter_column_name | string | Name of the column in custom dataset used for filtering. |
47+
| workspace_data_filter_id | string \| None | ID of the workspace data filter to use. Optional; when omitted the dataset participates in no workspace data filter. |
48+
| workspace_data_filter_column_name | string \| None | Name of the column in custom dataset used for filtering. Optional; must be set whenever `workspace_data_filter_id` is set. |
4949
| dataset_description | string \| None | Optional declarative description on the custom dataset. |
5050
| dataset_tags | string[] \| None | Optional tag list; when omitted, defaults to a single tag derived from the dataset display name. |
5151

@@ -55,6 +55,8 @@ Either `dataset_source_table` or `dataset_source_sql` must be specified with a t
5555

5656
`parent_dataset_references` must contain at least one entry.
5757

58+
`workspace_data_filter_id` and `workspace_data_filter_column_name` must be provided together or both left unset. Setting only one of them raises a `ValidationError`. When both are unset, the resulting dataset is emitted without a workspace data filter binding.
59+
5860
#### ParentDatasetReference
5961

6062
Bundles one column of a (possibly composite) join to the parent dataset. Pass a list of these on `CustomDatasetDefinition.parent_dataset_references`, one entry per join column.

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

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,35 @@ def datasets_to_ldm(
297297
dataset.definition
298298
)
299299

300+
wdf_columns: (
301+
list[CatalogDeclarativeWorkspaceDataFilterColumn] | None
302+
) = None
303+
wdf_references: (
304+
list[CatalogDeclarativeWorkspaceDataFilterReferences] | None
305+
) = None
306+
wdf_id = dataset.definition.workspace_data_filter_id
307+
wdf_column_name = (
308+
dataset.definition.workspace_data_filter_column_name
309+
)
310+
# `check_wdf_pair` on the model guarantees both fields are set
311+
# together or both omitted.
312+
if wdf_id is not None and wdf_column_name is not None:
313+
wdf_columns = [
314+
CatalogDeclarativeWorkspaceDataFilterColumn(
315+
name=wdf_column_name,
316+
data_type=ColumnDataType.STRING.value,
317+
)
318+
]
319+
wdf_references = [
320+
CatalogDeclarativeWorkspaceDataFilterReferences(
321+
filter_id=CatalogDatasetWorkspaceDataFilterIdentifier(
322+
id=wdf_id
323+
),
324+
filter_column=wdf_column_name,
325+
filter_column_data_type=ColumnDataType.STRING.value,
326+
)
327+
]
328+
300329
# Construct the declarative dataset object and append it to the list.
301330
declarative_datasets.append(
302331
CatalogDeclarativeDataset(
@@ -318,21 +347,8 @@ def datasets_to_ldm(
318347
facts=facts,
319348
data_source_table_id=dataset_source_table_id,
320349
sql=dataset_sql,
321-
workspace_data_filter_columns=[
322-
CatalogDeclarativeWorkspaceDataFilterColumn(
323-
name=dataset.definition.workspace_data_filter_column_name,
324-
data_type=ColumnDataType.STRING.value,
325-
)
326-
],
327-
workspace_data_filter_references=[
328-
CatalogDeclarativeWorkspaceDataFilterReferences(
329-
filter_id=CatalogDatasetWorkspaceDataFilterIdentifier(
330-
id=dataset.definition.workspace_data_filter_id
331-
),
332-
filter_column=dataset.definition.workspace_data_filter_column_name,
333-
filter_column_data_type=ColumnDataType.STRING.value,
334-
)
335-
],
350+
workspace_data_filter_columns=wdf_columns,
351+
workspace_data_filter_references=wdf_references,
336352
tags=_effective_dataset_tags(dataset.definition),
337353
)
338354
)

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

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,8 @@ class CustomDatasetDefinition(BaseModel):
115115
default=None,
116116
description="List of references to the parent dataset.",
117117
)
118-
workspace_data_filter_id: str
119-
workspace_data_filter_column_name: str
118+
workspace_data_filter_id: str | None = None
119+
workspace_data_filter_column_name: str | None = None
120120
dataset_description: str | None = Field(
121121
default=None,
122122
description="Declarative description on the custom dataset.",
@@ -164,6 +164,18 @@ def check_reference_form(self) -> "CustomDatasetDefinition":
164164
)
165165
return self
166166

167+
@model_validator(mode="after")
168+
def check_wdf_pair(self) -> "CustomDatasetDefinition":
169+
"""Workspace data filter id and column name must be provided together or both omitted."""
170+
has_id = self.workspace_data_filter_id is not None
171+
has_col = self.workspace_data_filter_column_name is not None
172+
if has_id != has_col:
173+
raise ValueError(
174+
"workspace_data_filter_id and workspace_data_filter_column_name "
175+
"must both be set or both be omitted"
176+
)
177+
return self
178+
167179

168180
class CustomDataset(BaseModel):
169181
"""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
@@ -179,3 +179,30 @@ def test_custom_dataset_definition_legacy_reference_fields_optional():
179179
ds = CustomDatasetDefinition(**data)
180180
assert ds.dataset_reference_source_column is None
181181
assert ds.parent_dataset_references is not None
182+
183+
184+
def test_custom_dataset_definition_wdf_optional_both_none():
185+
data = make_valid_dataset_def(
186+
workspace_data_filter_id=None, workspace_data_filter_column_name=None
187+
)
188+
ds = CustomDatasetDefinition(**data)
189+
assert ds.workspace_data_filter_id is None
190+
assert ds.workspace_data_filter_column_name is None
191+
192+
193+
def test_custom_dataset_definition_wdf_only_id_raises():
194+
data = make_valid_dataset_def(
195+
workspace_data_filter_id="wdf1", workspace_data_filter_column_name=None
196+
)
197+
with pytest.raises(ValidationError) as exc:
198+
CustomDatasetDefinition(**data)
199+
assert "both be set or both be omitted" in str(exc.value)
200+
201+
202+
def test_custom_dataset_definition_wdf_only_column_raises():
203+
data = make_valid_dataset_def(
204+
workspace_data_filter_id=None, workspace_data_filter_column_name="col1"
205+
)
206+
with pytest.raises(ValidationError) as exc:
207+
CustomDatasetDefinition(**data)
208+
assert "both be set or both be omitted" in str(exc.value)

0 commit comments

Comments
 (0)