@@ -154,6 +154,49 @@ def _date_ref_from_field(
154154 ],
155155 )
156156
157+ @staticmethod
158+ def _build_parent_reference_sources (
159+ definition : CustomDatasetDefinition ,
160+ ) -> list [CatalogDeclarativeReferenceSource ]:
161+ """Resolve the list of parent reference sources.
162+
163+ Precedence:
164+ * If ``parent_dataset_references`` is set and non-empty, use it as-is.
165+ * Otherwise fall back to the legacy single-column fields wrapped in a
166+ one-element list. Missing legacy fields yield an empty list, which
167+ will be rejected downstream by the GoodData API.
168+ """
169+ if definition .parent_dataset_references :
170+ return [
171+ CatalogDeclarativeReferenceSource (
172+ column = ref .source_column ,
173+ data_type = ref .data_type .value ,
174+ target = CatalogGrainIdentifier (
175+ id = ref .attribute_id ,
176+ type = CustomFieldType .ATTRIBUTE .value ,
177+ ),
178+ )
179+ for ref in definition .parent_dataset_references
180+ ]
181+
182+ if (
183+ definition .dataset_reference_source_column is not None
184+ and definition .dataset_reference_source_column_data_type is not None
185+ and definition .parent_dataset_reference_attribute_id is not None
186+ ):
187+ return [
188+ CatalogDeclarativeReferenceSource (
189+ column = definition .dataset_reference_source_column ,
190+ data_type = definition .dataset_reference_source_column_data_type .value ,
191+ target = CatalogGrainIdentifier (
192+ id = definition .parent_dataset_reference_attribute_id ,
193+ type = CustomFieldType .ATTRIBUTE .value ,
194+ ),
195+ )
196+ ]
197+
198+ return []
199+
157200 @staticmethod
158201 def _get_sources (
159202 dataset : CustomDataset ,
@@ -253,6 +296,41 @@ def datasets_to_ldm(
253296 # Get the data source info
254297 dataset_source_table_id , dataset_sql = self ._get_sources (dataset )
255298
299+ # Build the parent reference source list. The composite-friendly
300+ # `parent_dataset_references` list takes precedence when set and
301+ # non-empty; otherwise fall back to the legacy single-column fields.
302+ parent_reference_sources = self ._build_parent_reference_sources (
303+ dataset .definition
304+ )
305+
306+ # Workspace data filter fields are optional and must be set together
307+ # (validated on the input model). Emit columns/references only when
308+ # both are provided.
309+ wdf_columns : list [CatalogDeclarativeWorkspaceDataFilterColumn ] = []
310+ wdf_references : list [
311+ CatalogDeclarativeWorkspaceDataFilterReferences
312+ ] = []
313+ if (
314+ dataset .definition .workspace_data_filter_id is not None
315+ and dataset .definition .workspace_data_filter_column_name
316+ is not None
317+ ):
318+ wdf_columns .append (
319+ CatalogDeclarativeWorkspaceDataFilterColumn (
320+ name = dataset .definition .workspace_data_filter_column_name ,
321+ data_type = ColumnDataType .STRING .value ,
322+ )
323+ )
324+ wdf_references .append (
325+ CatalogDeclarativeWorkspaceDataFilterReferences (
326+ filter_id = CatalogDatasetWorkspaceDataFilterIdentifier (
327+ id = dataset .definition .workspace_data_filter_id
328+ ),
329+ filter_column = dataset .definition .workspace_data_filter_column_name ,
330+ filter_column_data_type = ColumnDataType .STRING .value ,
331+ )
332+ )
333+
256334 # Construct the declarative dataset object and append it to the list.
257335 declarative_datasets .append (
258336 CatalogDeclarativeDataset (
@@ -265,16 +343,7 @@ def datasets_to_ldm(
265343 id = dataset .definition .parent_dataset_reference ,
266344 ),
267345 multivalue = True ,
268- sources = [
269- CatalogDeclarativeReferenceSource (
270- column = dataset .definition .dataset_reference_source_column ,
271- data_type = dataset .definition .dataset_reference_source_column_data_type .value ,
272- target = CatalogGrainIdentifier (
273- id = dataset .definition .parent_dataset_reference_attribute_id ,
274- type = CustomFieldType .ATTRIBUTE .value ,
275- ),
276- )
277- ],
346+ sources = parent_reference_sources ,
278347 ),
279348 ]
280349 + date_references ,
@@ -283,21 +352,8 @@ def datasets_to_ldm(
283352 facts = facts ,
284353 data_source_table_id = dataset_source_table_id ,
285354 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- ],
355+ workspace_data_filter_columns = wdf_columns or None ,
356+ workspace_data_filter_references = wdf_references or None ,
301357 tags = _effective_dataset_tags (dataset .definition ),
302358 )
303359 )
0 commit comments