From 14ef2bc0b5f73b16fd4cd715970f7d68548b2359 Mon Sep 17 00:00:00 2001 From: Vitalii Yarmus Date: Wed, 13 May 2026 17:15:11 +0300 Subject: [PATCH 1/2] HCK-16067: implement FE of tags to DataHub --- forward_engineering/config.json | 29 +++++++++++++++-- forward_engineering/dataHubProvider.js | 43 +++++++++++++++++++++++++- 2 files changed, 69 insertions(+), 3 deletions(-) diff --git a/forward_engineering/config.json b/forward_engineering/config.json index ef7e55f1..88cdf3cb 100644 --- a/forward_engineering/config.json +++ b/forward_engineering/config.json @@ -455,9 +455,27 @@ "name": "database" } }, - "Schema" + { + "type": "Schema", + "source": "container", + "properties": { + "tags": "schemaTags" + } + } + ], + "datasets": [ + { + "type": "Table", + "source": "collection", + "properties": { "tags": "tableTags" } + }, + { + "type": "View", + "source": "view", + "properties": { "tags": "viewTags" } + } ], - "datasets": ["Table", "View"], + "fieldProperties": { "tags": "columnTags" }, "typeMapping": { "DATE": "DateType", "BIGINT": "NumberType", @@ -501,6 +519,13 @@ "convertUrnsToLowerCase": { "use": true, "default": true + }, + "exportTags": { + "use": true, + "type": "select", + "options": ["skip", "with_lineage", "without_lineage"], + "default": "skip", + "propagateTags": "with_lineage" } }, "viewLanguage": "SQL" diff --git a/forward_engineering/dataHubProvider.js b/forward_engineering/dataHubProvider.js index 582232d5..f5d69caf 100644 --- a/forward_engineering/dataHubProvider.js +++ b/forward_engineering/dataHubProvider.js @@ -8,7 +8,6 @@ const { toLower } = require('lodash'); const types = require('./configs/types'); const defaultTypes = require('./configs/defaultTypes'); -const getKeyHelper = require('./helpers/keyHelper'); const getColumnDefinitionHelper = require('./helpers/columnDefinitionHelper'); const { createView, hydrateView, hydrateViewColumn } = require('./helpers/viewHelper'); const { FORMATS } = require('./helpers/constants'); @@ -106,6 +105,48 @@ class DataHubProvider { }, }; } + + getTags({ data, containerAssets, options }) { + if (options.exportTags === 'skip') { + return []; + } + + return data.containers + .flatMap(container => { + const containerObject = this.#mergeTabs(container.containerData); + const containerAsset = containerAssets.find(asset => asset.hackoladeMeta?.bucketId === container.id); + + if (!containerAsset) { + throw new Error( + `The the container asset for the "${containerObject.code ?? containerObject.name}" is not found!`, + ); + } + + if (!containerAsset.hackoladeMeta) { + throw new Error( + `The "database" and "schema" of the container asset "${containerAsset.containerProperties.value.name}" are not found!`, + ); + } + + return (containerObject.tags ?? [])?.flatMap(tag => { + return (tag.allowedValues ?? []).map(tagValue => { + return { + displayName: `${tag.name}: ${tagValue.value}`, + name: `${containerAsset.hackoladeMeta?.database}.${containerAsset.hackoladeMeta?.schema}.${tag.name}:${tagValue.value}`, + resolutionData: { + tagName: tag.name, + tagValue: tagValue.value, + }, + }; + }); + }); + }) + .filter(Boolean); + } + + #mergeTabs(tabsData) { + return tabsData.reduce((acc, current) => Object.assign(acc, current), {}); + } } module.exports = DataHubProvider; From ad93378b278ffdb46bf28a8efd76364e4febca48 Mon Sep 17 00:00:00 2001 From: Vitalii Yarmus Date: Thu, 14 May 2026 11:16:38 +0300 Subject: [PATCH 2/2] Fix DataHub tag detection if a tag with the same name exists in different schemas --- forward_engineering/dataHubProvider.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forward_engineering/dataHubProvider.js b/forward_engineering/dataHubProvider.js index f5d69caf..574b7f9d 100644 --- a/forward_engineering/dataHubProvider.js +++ b/forward_engineering/dataHubProvider.js @@ -134,8 +134,8 @@ class DataHubProvider { displayName: `${tag.name}: ${tagValue.value}`, name: `${containerAsset.hackoladeMeta?.database}.${containerAsset.hackoladeMeta?.schema}.${tag.name}:${tagValue.value}`, resolutionData: { - tagName: tag.name, - tagValue: tagValue.value, + tagName: tag.id, + tagValue: tagValue.id, }, }; });