mirror of
https://github.com/open-metadata/OpenMetadata.git
synced 2025-10-13 01:38:13 +00:00
Fix#10584: Add filters for data models (#11008)
* Fix#10584: Add filters for data models * Minor UI error * fix unit test --------- Co-authored-by: Ashish Gupta <ashish@getcollate.io>
This commit is contained in:
parent
dbd8da6a29
commit
673573a512
@ -78,7 +78,7 @@ from metadata.ingestion.source.dashboard.looker.models import (
|
|||||||
from metadata.ingestion.source.dashboard.looker.parser import LkmlParser
|
from metadata.ingestion.source.dashboard.looker.parser import LkmlParser
|
||||||
from metadata.readers.github import GitHubReader
|
from metadata.readers.github import GitHubReader
|
||||||
from metadata.utils import fqn
|
from metadata.utils import fqn
|
||||||
from metadata.utils.filters import filter_by_chart
|
from metadata.utils.filters import filter_by_chart, filter_by_datamodel
|
||||||
from metadata.utils.helpers import clean_uri, get_standard_chart_type
|
from metadata.utils.helpers import clean_uri, get_standard_chart_type
|
||||||
from metadata.utils.logger import ingestion_logger
|
from metadata.utils.logger import ingestion_logger
|
||||||
|
|
||||||
@ -183,48 +183,55 @@ class LookerSource(DashboardServiceSource):
|
|||||||
Get the Explore and View information and prepare
|
Get the Explore and View information and prepare
|
||||||
the model creation request
|
the model creation request
|
||||||
"""
|
"""
|
||||||
try:
|
if self.source_config.includeDataModels:
|
||||||
explore_datamodel = CreateDashboardDataModelRequest(
|
try:
|
||||||
name=build_datamodel_name(model.model_name, model.name),
|
datamodel_name = build_datamodel_name(model.model_name, model.name)
|
||||||
displayName=model.name,
|
if filter_by_datamodel(
|
||||||
description=model.description,
|
self.source_config.dataModelFilterPattern, datamodel_name
|
||||||
service=self.context.dashboard_service.fullyQualifiedName.__root__,
|
):
|
||||||
dataModelType=DataModelType.LookMlExplore.value,
|
self.status.filter(datamodel_name, "Data model filtered out.")
|
||||||
serviceType=DashboardServiceType.Looker.value,
|
else:
|
||||||
columns=get_columns_from_model(model),
|
explore_datamodel = CreateDashboardDataModelRequest(
|
||||||
sql=self._get_explore_sql(model),
|
name=datamodel_name,
|
||||||
)
|
displayName=model.name,
|
||||||
yield explore_datamodel
|
description=model.description,
|
||||||
self.status.scanned(f"Data Model Scanned: {model.name}")
|
service=self.context.dashboard_service.fullyQualifiedName.__root__,
|
||||||
|
dataModelType=DataModelType.LookMlExplore.value,
|
||||||
# Maybe use the project_name as key too?
|
serviceType=DashboardServiceType.Looker.value,
|
||||||
# Save the explores for when we create the lineage with the dashboards and views
|
columns=get_columns_from_model(model),
|
||||||
self._explores_cache[
|
sql=self._get_explore_sql(model),
|
||||||
explore_datamodel.name.__root__
|
|
||||||
] = self.context.dataModel # This is the newly created explore
|
|
||||||
|
|
||||||
# We can get VIEWs from the JOINs to know the dependencies
|
|
||||||
# We will only try and fetch if we have the credentials
|
|
||||||
if self.service_connection.githubCredentials:
|
|
||||||
for view in model.joins:
|
|
||||||
yield from self._process_view(
|
|
||||||
view_name=ViewName(view.name), explore=model
|
|
||||||
)
|
)
|
||||||
|
yield explore_datamodel
|
||||||
|
self.status.scanned(f"Data Model Scanned: {model.name}")
|
||||||
|
|
||||||
except ValidationError as err:
|
# Maybe use the project_name as key too?
|
||||||
error = f"Validation error yielding Data Model [{model.name}]: {err}"
|
# Save the explores for when we create the lineage with the dashboards and views
|
||||||
logger.debug(traceback.format_exc())
|
self._explores_cache[
|
||||||
logger.error(error)
|
explore_datamodel.name.__root__
|
||||||
self.status.failed(
|
] = self.context.dataModel # This is the newly created explore
|
||||||
name=model.name, error=error, stack_trace=traceback.format_exc()
|
|
||||||
)
|
# We can get VIEWs from the JOINs to know the dependencies
|
||||||
except Exception as err:
|
# We will only try and fetch if we have the credentials
|
||||||
error = f"Wild error yielding Data Model [{model.name}]: {err}"
|
if self.service_connection.githubCredentials:
|
||||||
logger.debug(traceback.format_exc())
|
for view in model.joins:
|
||||||
logger.error(error)
|
yield from self._process_view(
|
||||||
self.status.failed(
|
view_name=ViewName(view.name), explore=model
|
||||||
name=model.name, error=error, stack_trace=traceback.format_exc()
|
)
|
||||||
)
|
|
||||||
|
except ValidationError as err:
|
||||||
|
error = f"Validation error yielding Data Model [{model.name}]: {err}"
|
||||||
|
logger.debug(traceback.format_exc())
|
||||||
|
logger.error(error)
|
||||||
|
self.status.failed(
|
||||||
|
name=model.name, error=error, stack_trace=traceback.format_exc()
|
||||||
|
)
|
||||||
|
except Exception as err:
|
||||||
|
error = f"Wild error yielding Data Model [{model.name}]: {err}"
|
||||||
|
logger.debug(traceback.format_exc())
|
||||||
|
logger.error(error)
|
||||||
|
self.status.failed(
|
||||||
|
name=model.name, error=error, stack_trace=traceback.format_exc()
|
||||||
|
)
|
||||||
|
|
||||||
def _get_explore_sql(self, explore: LookmlModelExplore) -> Optional[str]:
|
def _get_explore_sql(self, explore: LookmlModelExplore) -> Optional[str]:
|
||||||
"""
|
"""
|
||||||
|
@ -59,7 +59,7 @@ from metadata.ingestion.source.dashboard.tableau.models import (
|
|||||||
)
|
)
|
||||||
from metadata.ingestion.source.database.column_type_parser import ColumnTypeParser
|
from metadata.ingestion.source.database.column_type_parser import ColumnTypeParser
|
||||||
from metadata.utils import fqn, tag_utils
|
from metadata.utils import fqn, tag_utils
|
||||||
from metadata.utils.filters import filter_by_chart
|
from metadata.utils.filters import filter_by_chart, filter_by_datamodel
|
||||||
from metadata.utils.helpers import get_standard_chart_type
|
from metadata.utils.helpers import get_standard_chart_type
|
||||||
from metadata.utils.logger import ingestion_logger
|
from metadata.utils.logger import ingestion_logger
|
||||||
|
|
||||||
@ -198,45 +198,56 @@ class TableauSource(DashboardServiceSource):
|
|||||||
def yield_datamodel(
|
def yield_datamodel(
|
||||||
self, dashboard_details: TableauDashboard
|
self, dashboard_details: TableauDashboard
|
||||||
) -> Iterable[CreateDashboardDataModelRequest]:
|
) -> Iterable[CreateDashboardDataModelRequest]:
|
||||||
data_models: TableauSheets = TableauSheets()
|
if self.source_config.includeDataModels:
|
||||||
|
data_models: TableauSheets = TableauSheets()
|
||||||
for chart in dashboard_details.charts:
|
for chart in dashboard_details.charts:
|
||||||
try:
|
|
||||||
data_models = self.client.get_sheets(chart.id)
|
|
||||||
except Exception as exc:
|
|
||||||
error_msg = f"Error fetching Data Model for sheet {chart.name} - {exc}"
|
|
||||||
self.status.failed(
|
|
||||||
name=chart.name, error=error_msg, stack_trace=traceback.format_exc()
|
|
||||||
)
|
|
||||||
logger.error(error_msg)
|
|
||||||
logger.debug(traceback.format_exc())
|
|
||||||
|
|
||||||
for data_model in data_models.sheets:
|
|
||||||
try:
|
try:
|
||||||
data_model_request = CreateDashboardDataModelRequest(
|
data_models = self.client.get_sheets(chart.id)
|
||||||
name=data_model.id,
|
|
||||||
displayName=data_model.name,
|
|
||||||
description=data_model.description,
|
|
||||||
service=self.context.dashboard_service.fullyQualifiedName.__root__,
|
|
||||||
dataModelType=DataModelType.TableauSheet.value,
|
|
||||||
serviceType=DashboardServiceType.Tableau.value,
|
|
||||||
columns=self.get_column_info(data_model),
|
|
||||||
)
|
|
||||||
yield data_model_request
|
|
||||||
self.sheets.add(data_model)
|
|
||||||
self.status.scanned(
|
|
||||||
f"Data Model Scanned: {data_model_request.name.__root__}"
|
|
||||||
)
|
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
error_msg = f"Error yeilding Data Model - {data_model.name} - {exc}"
|
error_msg = (
|
||||||
|
f"Error fetching Data Model for sheet {chart.name} - {exc}"
|
||||||
|
)
|
||||||
self.status.failed(
|
self.status.failed(
|
||||||
name=data_model.name,
|
name=chart.name,
|
||||||
error=error_msg,
|
error=error_msg,
|
||||||
stack_trace=traceback.format_exc(),
|
stack_trace=traceback.format_exc(),
|
||||||
)
|
)
|
||||||
logger.error(error_msg)
|
logger.error(error_msg)
|
||||||
logger.debug(traceback.format_exc())
|
logger.debug(traceback.format_exc())
|
||||||
|
|
||||||
|
for data_model in data_models.sheets:
|
||||||
|
if filter_by_datamodel(
|
||||||
|
self.source_config.dataModelFilterPattern, data_model.name
|
||||||
|
):
|
||||||
|
self.status.filter(data_model.name, "Data model filtered out.")
|
||||||
|
continue
|
||||||
|
try:
|
||||||
|
data_model_request = CreateDashboardDataModelRequest(
|
||||||
|
name=data_model.id,
|
||||||
|
displayName=data_model.name,
|
||||||
|
description=data_model.description,
|
||||||
|
service=self.context.dashboard_service.fullyQualifiedName.__root__,
|
||||||
|
dataModelType=DataModelType.TableauSheet.value,
|
||||||
|
serviceType=DashboardServiceType.Tableau.value,
|
||||||
|
columns=self.get_column_info(data_model),
|
||||||
|
)
|
||||||
|
yield data_model_request
|
||||||
|
self.sheets.add(data_model)
|
||||||
|
self.status.scanned(
|
||||||
|
f"Data Model Scanned: {data_model_request.displayName}"
|
||||||
|
)
|
||||||
|
except Exception as exc:
|
||||||
|
error_msg = (
|
||||||
|
f"Error yielding Data Model [{data_model.name}]: {exc}"
|
||||||
|
)
|
||||||
|
self.status.failed(
|
||||||
|
name=data_model.name,
|
||||||
|
error=error_msg,
|
||||||
|
stack_trace=traceback.format_exc(),
|
||||||
|
)
|
||||||
|
logger.error(error_msg)
|
||||||
|
logger.debug(traceback.format_exc())
|
||||||
|
|
||||||
def yield_dashboard(
|
def yield_dashboard(
|
||||||
self, dashboard_details: TableauDashboard
|
self, dashboard_details: TableauDashboard
|
||||||
) -> Iterable[CreateDashboardRequest]:
|
) -> Iterable[CreateDashboardRequest]:
|
||||||
@ -389,7 +400,7 @@ class TableauSource(DashboardServiceSource):
|
|||||||
),
|
),
|
||||||
service=self.context.dashboard_service.fullyQualifiedName.__root__,
|
service=self.context.dashboard_service.fullyQualifiedName.__root__,
|
||||||
)
|
)
|
||||||
self.status.scanned(chart.id)
|
self.status.scanned(chart.name)
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
logger.debug(traceback.format_exc())
|
logger.debug(traceback.format_exc())
|
||||||
logger.warning(f"Error to yield dashboard chart [{chart}]: {exc}")
|
logger.warning(f"Error to yield dashboard chart [{chart}]: {exc}")
|
||||||
@ -400,15 +411,14 @@ class TableauSource(DashboardServiceSource):
|
|||||||
except ConnectionError as err:
|
except ConnectionError as err:
|
||||||
logger.debug(f"Error closing connection - {err}")
|
logger.debug(f"Error closing connection - {err}")
|
||||||
|
|
||||||
def _get_database_table(self, db_service_name, table) -> Table:
|
def _get_database_table(self, db_service_name: str, table: DatabaseTable) -> Table:
|
||||||
database_schema_table = fqn.split_table_name(table.name)
|
|
||||||
table_fqn = fqn.build(
|
table_fqn = fqn.build(
|
||||||
self.metadata,
|
self.metadata,
|
||||||
entity_type=Table,
|
entity_type=Table,
|
||||||
service_name=db_service_name,
|
service_name=db_service_name,
|
||||||
schema_name=table.schema_,
|
schema_name=table.schema_,
|
||||||
table_name=database_schema_table.get("table"),
|
table_name=table.name,
|
||||||
database_name=database_schema_table.get("database"),
|
database_name=table.database.name,
|
||||||
)
|
)
|
||||||
return self.metadata.get_by_name(
|
return self.metadata.get_by_name(
|
||||||
entity=Table,
|
entity=Table,
|
||||||
@ -456,5 +466,6 @@ class TableauSource(DashboardServiceSource):
|
|||||||
for colum in sheet.datasourceFields:
|
for colum in sheet.datasourceFields:
|
||||||
for table in colum.upstreamTables:
|
for table in colum.upstreamTables:
|
||||||
if table.schema_ and table.name:
|
if table.schema_ and table.name:
|
||||||
|
table.name = table.name.split(" ")[0].strip()
|
||||||
tables.add(table)
|
tables.add(table)
|
||||||
return tables
|
return tables
|
||||||
|
@ -122,7 +122,7 @@ class DatabaseTable(TableauBaseModel):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
schema_: str = Field(..., alias="schema")
|
schema_: str = Field(..., alias="schema")
|
||||||
upstreamDatabases: Optional[List[TableauBaseModel]]
|
database: TableauBaseModel
|
||||||
referencedByQueries: Optional[List[CustomSQLTable]]
|
referencedByQueries: Optional[List[CustomSQLTable]]
|
||||||
|
|
||||||
|
|
||||||
|
@ -27,6 +27,20 @@ query SheetQuery {{
|
|||||||
__typename
|
__typename
|
||||||
name
|
name
|
||||||
id
|
id
|
||||||
|
description
|
||||||
|
datasource {{
|
||||||
|
id
|
||||||
|
name
|
||||||
|
}}
|
||||||
|
... on ColumnField {{
|
||||||
|
dataType
|
||||||
|
}}
|
||||||
|
... on CalculatedField {{
|
||||||
|
dataType
|
||||||
|
}}
|
||||||
|
... on GroupField {{
|
||||||
|
dataType
|
||||||
|
}}
|
||||||
... on DatasourceField {{
|
... on DatasourceField {{
|
||||||
upstreamTables {{
|
upstreamTables {{
|
||||||
upstreamDatabases {{
|
upstreamDatabases {{
|
||||||
@ -41,9 +55,15 @@ query SheetQuery {{
|
|||||||
id
|
id
|
||||||
name
|
name
|
||||||
schema
|
schema
|
||||||
|
database {{
|
||||||
|
id
|
||||||
|
name
|
||||||
|
}}
|
||||||
}}
|
}}
|
||||||
remoteField {{
|
remoteField {{
|
||||||
id
|
id
|
||||||
|
name
|
||||||
|
description
|
||||||
__typename
|
__typename
|
||||||
... on ColumnField {{
|
... on ColumnField {{
|
||||||
dataType
|
dataType
|
||||||
|
@ -223,3 +223,18 @@ def filter_by_container(
|
|||||||
:return: True for filtering, False otherwise
|
:return: True for filtering, False otherwise
|
||||||
"""
|
"""
|
||||||
return _filter(container_filter_pattern, container_name)
|
return _filter(container_filter_pattern, container_name)
|
||||||
|
|
||||||
|
|
||||||
|
def filter_by_datamodel(
|
||||||
|
datamodel_filter_pattern: Optional[FilterPattern], datamodel_name: str
|
||||||
|
) -> bool:
|
||||||
|
"""
|
||||||
|
Return True if the chart needs to be filtered, False otherwise
|
||||||
|
|
||||||
|
Include takes precedence over exclude
|
||||||
|
|
||||||
|
:param datamodel_filter_pattern: Model defining data model filtering logic
|
||||||
|
:param datamodel_name: data model name
|
||||||
|
:return: True for filtering, False otherwise
|
||||||
|
"""
|
||||||
|
return _filter(datamodel_filter_pattern, datamodel_name)
|
||||||
|
@ -18,11 +18,15 @@
|
|||||||
"default": "DashboardMetadata"
|
"default": "DashboardMetadata"
|
||||||
},
|
},
|
||||||
"dashboardFilterPattern": {
|
"dashboardFilterPattern": {
|
||||||
"description": "Regex to only fetch tables or databases that matches the pattern.",
|
"description": "Regex to exclude or include dashboards that matches the pattern.",
|
||||||
"$ref": "../type/filterPattern.json#/definitions/filterPattern"
|
"$ref": "../type/filterPattern.json#/definitions/filterPattern"
|
||||||
},
|
},
|
||||||
"chartFilterPattern": {
|
"chartFilterPattern": {
|
||||||
"description": "Regex exclude tables or databases that matches the pattern.",
|
"description": "Regex exclude or include charts that matches the pattern.",
|
||||||
|
"$ref": "../type/filterPattern.json#/definitions/filterPattern"
|
||||||
|
},
|
||||||
|
"dataModelFilterPattern": {
|
||||||
|
"description": "Regex exclude or include data models that matches the pattern.",
|
||||||
"$ref": "../type/filterPattern.json#/definitions/filterPattern"
|
"$ref": "../type/filterPattern.json#/definitions/filterPattern"
|
||||||
},
|
},
|
||||||
"dbServiceNames": {
|
"dbServiceNames": {
|
||||||
@ -45,6 +49,11 @@
|
|||||||
"description": "Optional configuration to toggle the tags ingestion.",
|
"description": "Optional configuration to toggle the tags ingestion.",
|
||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
"default": true
|
"default": true
|
||||||
|
},
|
||||||
|
"includeDataModels": {
|
||||||
|
"description": "Optional configuration to toggle the ingestion of data models.",
|
||||||
|
"type": "boolean",
|
||||||
|
"default": true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"additionalProperties": false
|
"additionalProperties": false
|
||||||
|
@ -160,6 +160,7 @@ const AddIngestion = ({
|
|||||||
showSchemaFilter: !isUndefined(sourceConfig?.schemaFilterPattern),
|
showSchemaFilter: !isUndefined(sourceConfig?.schemaFilterPattern),
|
||||||
showTableFilter: !isUndefined(sourceConfig?.tableFilterPattern),
|
showTableFilter: !isUndefined(sourceConfig?.tableFilterPattern),
|
||||||
showTopicFilter: !isUndefined(sourceConfig?.topicFilterPattern),
|
showTopicFilter: !isUndefined(sourceConfig?.topicFilterPattern),
|
||||||
|
showDataModelFilter: !isUndefined(sourceConfig?.dataModelFilterPattern),
|
||||||
showChartFilter: !isUndefined(sourceConfig?.chartFilterPattern),
|
showChartFilter: !isUndefined(sourceConfig?.chartFilterPattern),
|
||||||
showPipelineFilter: !isUndefined(sourceConfig?.pipelineFilterPattern),
|
showPipelineFilter: !isUndefined(sourceConfig?.pipelineFilterPattern),
|
||||||
showMlModelFilter: !isUndefined(sourceConfig?.mlModelFilterPattern),
|
showMlModelFilter: !isUndefined(sourceConfig?.mlModelFilterPattern),
|
||||||
@ -172,6 +173,8 @@ const AddIngestion = ({
|
|||||||
markDeletedTables: isDatabaseService
|
markDeletedTables: isDatabaseService
|
||||||
? Boolean(sourceConfig?.markDeletedTables ?? true)
|
? Boolean(sourceConfig?.markDeletedTables ?? true)
|
||||||
: undefined,
|
: undefined,
|
||||||
|
dataModelFilterPattern:
|
||||||
|
sourceConfig?.dataModelFilterPattern ?? INITIAL_FILTER_PATTERN,
|
||||||
dashboardFilterPattern:
|
dashboardFilterPattern:
|
||||||
sourceConfig?.dashboardFilterPattern ?? INITIAL_FILTER_PATTERN,
|
sourceConfig?.dashboardFilterPattern ?? INITIAL_FILTER_PATTERN,
|
||||||
containerFilterPattern:
|
containerFilterPattern:
|
||||||
@ -191,6 +194,7 @@ const AddIngestion = ({
|
|||||||
markDeletedPipelines: sourceConfig?.markDeletedDashboards ?? true,
|
markDeletedPipelines: sourceConfig?.markDeletedDashboards ?? true,
|
||||||
includeView: Boolean(sourceConfig?.includeViews),
|
includeView: Boolean(sourceConfig?.includeViews),
|
||||||
includeTags: sourceConfig?.includeTags ?? true,
|
includeTags: sourceConfig?.includeTags ?? true,
|
||||||
|
includeDataModels: sourceConfig?.includeDataModels ?? true,
|
||||||
overrideOwner: Boolean(sourceConfig?.overrideOwner),
|
overrideOwner: Boolean(sourceConfig?.overrideOwner),
|
||||||
includeLineage: Boolean(sourceConfig?.includeLineage ?? true),
|
includeLineage: Boolean(sourceConfig?.includeLineage ?? true),
|
||||||
enableDebugLog: data?.loggerLevel === LogLevels.Debug,
|
enableDebugLog: data?.loggerLevel === LogLevels.Debug,
|
||||||
@ -328,12 +332,14 @@ const AddIngestion = ({
|
|||||||
const getMetadataIngestionFields = () => {
|
const getMetadataIngestionFields = () => {
|
||||||
const {
|
const {
|
||||||
chartFilterPattern,
|
chartFilterPattern,
|
||||||
|
dataModelFilterPattern,
|
||||||
dashboardFilterPattern,
|
dashboardFilterPattern,
|
||||||
databaseFilterPattern,
|
databaseFilterPattern,
|
||||||
databaseServiceNames,
|
databaseServiceNames,
|
||||||
includeLineage,
|
includeLineage,
|
||||||
includeTags,
|
includeTags,
|
||||||
includeView,
|
includeView,
|
||||||
|
includeDataModels,
|
||||||
showContainerFilter,
|
showContainerFilter,
|
||||||
ingestSampleData,
|
ingestSampleData,
|
||||||
markAllDeletedTables,
|
markAllDeletedTables,
|
||||||
@ -348,6 +354,7 @@ const AddIngestion = ({
|
|||||||
schemaFilterPattern,
|
schemaFilterPattern,
|
||||||
showChartFilter,
|
showChartFilter,
|
||||||
showDashboardFilter,
|
showDashboardFilter,
|
||||||
|
showDataModelFilter,
|
||||||
showDatabaseFilter,
|
showDatabaseFilter,
|
||||||
showMlModelFilter,
|
showMlModelFilter,
|
||||||
showPipelineFilter,
|
showPipelineFilter,
|
||||||
@ -404,11 +411,16 @@ const AddIngestion = ({
|
|||||||
dashboardFilterPattern,
|
dashboardFilterPattern,
|
||||||
showDashboardFilter
|
showDashboardFilter
|
||||||
),
|
),
|
||||||
|
dataModelFilterPattern: getFilterPatternData(
|
||||||
|
dataModelFilterPattern,
|
||||||
|
showDataModelFilter
|
||||||
|
),
|
||||||
dbServiceNames: databaseServiceNames,
|
dbServiceNames: databaseServiceNames,
|
||||||
overrideOwner,
|
overrideOwner,
|
||||||
type: ConfigType.DashboardMetadata,
|
type: ConfigType.DashboardMetadata,
|
||||||
markDeletedDashboards,
|
markDeletedDashboards,
|
||||||
includeTags,
|
includeTags,
|
||||||
|
includeDataModels,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
case ServiceCategory.PIPELINE_SERVICES: {
|
case ServiceCategory.PIPELINE_SERVICES: {
|
||||||
|
@ -129,7 +129,7 @@ describe('Test ConfigureIngestion component', () => {
|
|||||||
container,
|
container,
|
||||||
'FilterPattern.component'
|
'FilterPattern.component'
|
||||||
);
|
);
|
||||||
const toggleSwitchs = await findAllByText(
|
const toggleSwitch = await findAllByText(
|
||||||
container,
|
container,
|
||||||
'ToggleSwitchV1.component'
|
'ToggleSwitchV1.component'
|
||||||
);
|
);
|
||||||
@ -138,6 +138,6 @@ describe('Test ConfigureIngestion component', () => {
|
|||||||
expect(backButton).toBeInTheDocument();
|
expect(backButton).toBeInTheDocument();
|
||||||
expect(nextButton).toBeInTheDocument();
|
expect(nextButton).toBeInTheDocument();
|
||||||
expect(filterPatternComponents).toHaveLength(3);
|
expect(filterPatternComponents).toHaveLength(3);
|
||||||
expect(toggleSwitchs).toHaveLength(5);
|
expect(toggleSwitch).toHaveLength(6);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -50,6 +50,7 @@ const ConfigureIngestion = ({
|
|||||||
const markdownRef = useRef<EditorContentRef>();
|
const markdownRef = useRef<EditorContentRef>();
|
||||||
|
|
||||||
const {
|
const {
|
||||||
|
dataModelFilterPattern,
|
||||||
chartFilterPattern,
|
chartFilterPattern,
|
||||||
dashboardFilterPattern,
|
dashboardFilterPattern,
|
||||||
databaseFilterPattern,
|
databaseFilterPattern,
|
||||||
@ -61,6 +62,7 @@ const ConfigureIngestion = ({
|
|||||||
includeLineage,
|
includeLineage,
|
||||||
includeTags,
|
includeTags,
|
||||||
includeView,
|
includeView,
|
||||||
|
includeDataModels,
|
||||||
ingestionName,
|
ingestionName,
|
||||||
ingestSampleData,
|
ingestSampleData,
|
||||||
markAllDeletedTables,
|
markAllDeletedTables,
|
||||||
@ -76,6 +78,7 @@ const ConfigureIngestion = ({
|
|||||||
queryLogDuration,
|
queryLogDuration,
|
||||||
resultLimit,
|
resultLimit,
|
||||||
schemaFilterPattern,
|
schemaFilterPattern,
|
||||||
|
showDataModelFilter,
|
||||||
showChartFilter,
|
showChartFilter,
|
||||||
showDashboardFilter,
|
showDashboardFilter,
|
||||||
showDatabaseFilter,
|
showDatabaseFilter,
|
||||||
@ -95,6 +98,7 @@ const ConfigureIngestion = ({
|
|||||||
overrideOwner,
|
overrideOwner,
|
||||||
} = useMemo(
|
} = useMemo(
|
||||||
() => ({
|
() => ({
|
||||||
|
dataModelFilterPattern: data.dataModelFilterPattern,
|
||||||
chartFilterPattern: data.chartFilterPattern,
|
chartFilterPattern: data.chartFilterPattern,
|
||||||
dashboardFilterPattern: data.dashboardFilterPattern,
|
dashboardFilterPattern: data.dashboardFilterPattern,
|
||||||
databaseFilterPattern: data.databaseFilterPattern,
|
databaseFilterPattern: data.databaseFilterPattern,
|
||||||
@ -106,6 +110,7 @@ const ConfigureIngestion = ({
|
|||||||
includeLineage: data.includeLineage,
|
includeLineage: data.includeLineage,
|
||||||
includeTags: data.includeTags,
|
includeTags: data.includeTags,
|
||||||
includeView: data.includeView,
|
includeView: data.includeView,
|
||||||
|
includeDataModels: data.includeDataModels,
|
||||||
ingestionName: data.ingestionName,
|
ingestionName: data.ingestionName,
|
||||||
ingestSampleData: data.ingestSampleData,
|
ingestSampleData: data.ingestSampleData,
|
||||||
markAllDeletedTables: data.markAllDeletedTables,
|
markAllDeletedTables: data.markAllDeletedTables,
|
||||||
@ -117,6 +122,7 @@ const ConfigureIngestion = ({
|
|||||||
queryLogDuration: data.queryLogDuration,
|
queryLogDuration: data.queryLogDuration,
|
||||||
resultLimit: data.resultLimit,
|
resultLimit: data.resultLimit,
|
||||||
schemaFilterPattern: data.schemaFilterPattern,
|
schemaFilterPattern: data.schemaFilterPattern,
|
||||||
|
showDataModelFilter: data.showDataModelFilter,
|
||||||
showChartFilter: data.showChartFilter,
|
showChartFilter: data.showChartFilter,
|
||||||
showDashboardFilter: data.showDashboardFilter,
|
showDashboardFilter: data.showDashboardFilter,
|
||||||
showDatabaseFilter: data.showDatabaseFilter,
|
showDatabaseFilter: data.showDatabaseFilter,
|
||||||
@ -193,6 +199,8 @@ const ConfigureIngestion = ({
|
|||||||
|
|
||||||
const handleIncludeTags = () => toggleField('includeTags');
|
const handleIncludeTags = () => toggleField('includeTags');
|
||||||
|
|
||||||
|
const handleIncludeDataModels = () => toggleField('includeDataModels');
|
||||||
|
|
||||||
const handleIncludeViewToggle = () => toggleField('includeView');
|
const handleIncludeViewToggle = () => toggleField('includeView');
|
||||||
|
|
||||||
const handleIngestSampleToggle = () => toggleField('ingestSampleData');
|
const handleIngestSampleToggle = () => toggleField('ingestSampleData');
|
||||||
@ -297,7 +305,34 @@ const ConfigureIngestion = ({
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<p className="tw-text-grey-muted tw-mt-3">
|
<p className="tw-text-grey-muted tw-mt-3">
|
||||||
{t('message.include-assets-message')}
|
{t('message.include-assets-message', {
|
||||||
|
assets: t('label.tag-plural'),
|
||||||
|
})}
|
||||||
|
</p>
|
||||||
|
{getSeparator('')}
|
||||||
|
</Field>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const getIncludesDataModelsToggle = () => {
|
||||||
|
return (
|
||||||
|
<Field>
|
||||||
|
<div className="tw-flex tw-gap-1">
|
||||||
|
<label>
|
||||||
|
{t('label.include-entity', {
|
||||||
|
entity: t('label.data-model-plural'),
|
||||||
|
})}
|
||||||
|
</label>
|
||||||
|
<ToggleSwitchV1
|
||||||
|
checked={includeDataModels}
|
||||||
|
handleCheck={handleIncludeDataModels}
|
||||||
|
testId="include-data-models"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<p className="tw-text-grey-muted tw-mt-3">
|
||||||
|
{t('message.include-assets-message', {
|
||||||
|
assets: t('label.data-model-plural'),
|
||||||
|
})}
|
||||||
</p>
|
</p>
|
||||||
{getSeparator('')}
|
{getSeparator('')}
|
||||||
</Field>
|
</Field>
|
||||||
@ -453,6 +488,7 @@ const ConfigureIngestion = ({
|
|||||||
{getSeparator('')}
|
{getSeparator('')}
|
||||||
</Field>
|
</Field>
|
||||||
{getIncludesTagToggle()}
|
{getIncludesTagToggle()}
|
||||||
|
{getIncludesDataModelsToggle()}
|
||||||
{getDebugLogToggle()}
|
{getDebugLogToggle()}
|
||||||
{getMarkDeletedEntitiesToggle(
|
{getMarkDeletedEntitiesToggle(
|
||||||
t('label.mark-deleted-table-plural'),
|
t('label.mark-deleted-table-plural'),
|
||||||
@ -668,11 +704,24 @@ const ConfigureIngestion = ({
|
|||||||
showSeparator={false}
|
showSeparator={false}
|
||||||
type={FilterPatternEnum.CHART}
|
type={FilterPatternEnum.CHART}
|
||||||
/>
|
/>
|
||||||
|
<FilterPattern
|
||||||
|
checked={showDataModelFilter}
|
||||||
|
excludePattern={dataModelFilterPattern.excludes ?? []}
|
||||||
|
getExcludeValue={getExcludeValue}
|
||||||
|
getIncludeValue={getIncludeValue}
|
||||||
|
handleChecked={(value) =>
|
||||||
|
handleShowFilter(value, ShowFilter.showDataModelFilter)
|
||||||
|
}
|
||||||
|
includePattern={dataModelFilterPattern.includes ?? []}
|
||||||
|
showSeparator={false}
|
||||||
|
type={FilterPatternEnum.DASHBOARD_DATAMODEL}
|
||||||
|
/>
|
||||||
{getSeparator('')}
|
{getSeparator('')}
|
||||||
{getDashboardDBServiceName()}
|
{getDashboardDBServiceName()}
|
||||||
{getDebugLogToggle()}
|
{getDebugLogToggle()}
|
||||||
{getOverrideOwnerToggle()}
|
{getOverrideOwnerToggle()}
|
||||||
{getIncludesTagToggle()}
|
{getIncludesTagToggle()}
|
||||||
|
{getIncludesDataModelsToggle()}
|
||||||
{getMarkDeletedEntitiesToggle(
|
{getMarkDeletedEntitiesToggle(
|
||||||
t('label.mark-deleted-entity', {
|
t('label.mark-deleted-entity', {
|
||||||
entity: t('label.dashboard-plural'),
|
entity: t('label.dashboard-plural'),
|
||||||
|
@ -93,6 +93,7 @@ export type ModifiedDbtConfig = DbtConfig &
|
|||||||
>;
|
>;
|
||||||
|
|
||||||
export interface AddIngestionState {
|
export interface AddIngestionState {
|
||||||
|
dataModelFilterPattern: FilterPattern;
|
||||||
chartFilterPattern: FilterPattern;
|
chartFilterPattern: FilterPattern;
|
||||||
database?: string;
|
database?: string;
|
||||||
dashboardFilterPattern: FilterPattern;
|
dashboardFilterPattern: FilterPattern;
|
||||||
@ -110,6 +111,7 @@ export interface AddIngestionState {
|
|||||||
includeLineage: boolean;
|
includeLineage: boolean;
|
||||||
includeTags: boolean;
|
includeTags: boolean;
|
||||||
includeView: boolean;
|
includeView: boolean;
|
||||||
|
includeDataModels: boolean;
|
||||||
ingestionName: string;
|
ingestionName: string;
|
||||||
ingestSampleData: boolean;
|
ingestSampleData: boolean;
|
||||||
markAllDeletedTables: boolean | undefined;
|
markAllDeletedTables: boolean | undefined;
|
||||||
@ -128,6 +130,7 @@ export interface AddIngestionState {
|
|||||||
resultLimit: number;
|
resultLimit: number;
|
||||||
saveState: LoadingState;
|
saveState: LoadingState;
|
||||||
schemaFilterPattern: FilterPattern;
|
schemaFilterPattern: FilterPattern;
|
||||||
|
showDataModelFilter: boolean;
|
||||||
showChartFilter: boolean;
|
showChartFilter: boolean;
|
||||||
showDashboardFilter: boolean;
|
showDashboardFilter: boolean;
|
||||||
showDatabaseFilter: boolean;
|
showDatabaseFilter: boolean;
|
||||||
@ -159,4 +162,5 @@ export enum ShowFilter {
|
|||||||
showTableFilter = 'showTableFilter',
|
showTableFilter = 'showTableFilter',
|
||||||
showTopicFilter = 'showTopicFilter',
|
showTopicFilter = 'showTopicFilter',
|
||||||
showContainerFilter = 'showContainerFilter',
|
showContainerFilter = 'showContainerFilter',
|
||||||
|
showDataModelFilter = 'showDataModelFilter',
|
||||||
}
|
}
|
||||||
|
@ -22,4 +22,5 @@ export enum FilterPatternEnum {
|
|||||||
PIPELINE = 'pipeline',
|
PIPELINE = 'pipeline',
|
||||||
MLMODEL = 'mlModel',
|
MLMODEL = 'mlModel',
|
||||||
CONTAINER = 'container',
|
CONTAINER = 'container',
|
||||||
|
DASHBOARD_DATAMODEL = 'dataModel',
|
||||||
}
|
}
|
||||||
|
@ -1037,7 +1037,7 @@
|
|||||||
"has-been-created-successfully": "has been created successfully",
|
"has-been-created-successfully": "has been created successfully",
|
||||||
"import-glossary-help": "Save time & effort by uploading a CSV file with several glossary terms in one go.",
|
"import-glossary-help": "Save time & effort by uploading a CSV file with several glossary terms in one go.",
|
||||||
"in-this-database": "In this Database",
|
"in-this-database": "In this Database",
|
||||||
"include-assets-message": "Optional configuration to toggle the tags ingestion.",
|
"include-assets-message": "Enable extracting {{assets}} from the data source.",
|
||||||
"include-database-filter-extra-information": "Database which was added while creating service.",
|
"include-database-filter-extra-information": "Database which was added while creating service.",
|
||||||
"include-lineage-message": "Configuration to turn off fetching lineage from pipelines.",
|
"include-lineage-message": "Configuration to turn off fetching lineage from pipelines.",
|
||||||
"ingest-sample-data-for-entity": "Extract sample data from each {{entity}}.",
|
"ingest-sample-data-for-entity": "Extract sample data from each {{entity}}.",
|
||||||
|
@ -1037,7 +1037,7 @@
|
|||||||
"has-been-created-successfully": "se ha creado exitosamente",
|
"has-been-created-successfully": "se ha creado exitosamente",
|
||||||
"import-glossary-help": "Ahorre tiempo y esfuerzo cargando un archivo CSV con varios términos de glosario de una sola vez.",
|
"import-glossary-help": "Ahorre tiempo y esfuerzo cargando un archivo CSV con varios términos de glosario de una sola vez.",
|
||||||
"in-this-database": "En esta base de datos",
|
"in-this-database": "En esta base de datos",
|
||||||
"include-assets-message": "Configuración opcional para cambiar la ingestión de etiquetas.",
|
"include-assets-message": "Configuración opcional para activar la ingesta de {{assets}}.",
|
||||||
"include-database-filter-extra-information": "Base de datos que se agregó al crear el servicio.",
|
"include-database-filter-extra-information": "Base de datos que se agregó al crear el servicio.",
|
||||||
"include-lineage-message": "Configuración para desactivar la obtención de linaje desde pipelines.",
|
"include-lineage-message": "Configuración para desactivar la obtención de linaje desde pipelines.",
|
||||||
"ingest-sample-data-for-entity": "Extraer datos de muestra de cada {{entity}}.",
|
"ingest-sample-data-for-entity": "Extraer datos de muestra de cada {{entity}}.",
|
||||||
|
@ -886,6 +886,8 @@ export const getFilterTypes = (
|
|||||||
return 'tableFilterPattern' as keyof AddIngestionState;
|
return 'tableFilterPattern' as keyof AddIngestionState;
|
||||||
case FilterPatternEnum.CONTAINER:
|
case FilterPatternEnum.CONTAINER:
|
||||||
return 'containerFilterPattern' as keyof AddIngestionState;
|
return 'containerFilterPattern' as keyof AddIngestionState;
|
||||||
|
case FilterPatternEnum.DASHBOARD_DATAMODEL:
|
||||||
|
return 'dataModelFilterPattern' as keyof AddIngestionState;
|
||||||
default:
|
default:
|
||||||
return 'topicFilterPattern' as keyof AddIngestionState;
|
return 'topicFilterPattern' as keyof AddIngestionState;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user