openmetadata-ingestion 1.2.5.2__py3-none-any.whl → 1.3.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of openmetadata-ingestion might be problematic. Click here for more details.
- airflow_provider_openmetadata/lineage/runner.py +44 -5
- airflow_provider_openmetadata/lineage/status.py +1 -1
- metadata/antlr/split_listener.py +1 -4
- metadata/applications/auto_tagger.py +212 -0
- metadata/cli/app.py +47 -0
- metadata/cli/db_dump.py +6 -3
- metadata/clients/aws_client.py +4 -0
- metadata/clients/domo_client.py +0 -2
- metadata/cmd.py +24 -13
- metadata/data_insight/processor/reports/entity_report_data_processor.py +8 -2
- metadata/data_insight/processor/reports/web_analytic_report_data_processor.py +4 -0
- metadata/data_insight/source/metadata.py +11 -4
- metadata/data_quality/interface/sqlalchemy/databricks/test_suite_interface.py +29 -0
- metadata/data_quality/interface/sqlalchemy/snowflake/test_suite_interface.py +29 -0
- metadata/data_quality/interface/sqlalchemy/sqa_test_suite_interface.py +6 -6
- metadata/data_quality/interface/sqlalchemy/unity_catalog/test_suite_interface.py +35 -0
- metadata/data_quality/interface/test_suite_interface_factory.py +40 -0
- metadata/data_quality/processor/test_case_runner.py +17 -8
- metadata/data_quality/source/test_suite.py +8 -2
- metadata/data_quality/validations/base_test_handler.py +21 -17
- metadata/data_quality/validations/column/base/columnValueLengthsToBeBetween.py +38 -1
- metadata/data_quality/validations/column/base/columnValuesToBeBetween.py +36 -1
- metadata/data_quality/validations/column/base/columnValuesToBeInSet.py +27 -0
- metadata/data_quality/validations/column/base/columnValuesToBeNotInSet.py +27 -0
- metadata/data_quality/validations/column/base/columnValuesToBeNotNull.py +27 -0
- metadata/data_quality/validations/column/base/columnValuesToBeUnique.py +15 -0
- metadata/data_quality/validations/column/base/columnValuesToMatchRegex.py +27 -0
- metadata/data_quality/validations/column/base/columnValuesToNotMatchRegex.py +27 -0
- metadata/data_quality/validations/column/pandas/columnValueLengthsToBeBetween.py +23 -0
- metadata/data_quality/validations/column/pandas/columnValuesToBeBetween.py +23 -0
- metadata/data_quality/validations/column/pandas/columnValuesToBeInSet.py +11 -0
- metadata/data_quality/validations/column/pandas/columnValuesToBeNotInSet.py +11 -0
- metadata/data_quality/validations/column/pandas/columnValuesToBeNotNull.py +11 -0
- metadata/data_quality/validations/column/pandas/columnValuesToMatchRegex.py +11 -0
- metadata/data_quality/validations/column/pandas/columnValuesToNotMatchRegex.py +11 -0
- metadata/data_quality/validations/column/sqlalchemy/columnValueLengthsToBeBetween.py +27 -0
- metadata/data_quality/validations/column/sqlalchemy/columnValuesToBeBetween.py +23 -0
- metadata/data_quality/validations/column/sqlalchemy/columnValuesToBeInSet.py +11 -0
- metadata/data_quality/validations/column/sqlalchemy/columnValuesToBeNotInSet.py +11 -0
- metadata/data_quality/validations/column/sqlalchemy/columnValuesToBeNotNull.py +11 -0
- metadata/data_quality/validations/column/sqlalchemy/columnValuesToMatchRegex.py +11 -0
- metadata/data_quality/validations/column/sqlalchemy/columnValuesToNotMatchRegex.py +11 -0
- metadata/data_quality/validations/mixins/pandas_validator_mixin.py +13 -2
- metadata/data_quality/validations/mixins/sqa_validator_mixin.py +40 -0
- metadata/examples/workflows/databricks.yaml +0 -1
- metadata/examples/workflows/mongodb.yaml +4 -2
- metadata/examples/workflows/mstr.yaml +24 -0
- metadata/examples/workflows/sas.yaml +28 -0
- metadata/examples/workflows/unity_catalog.yaml +27 -0
- metadata/examples/workflows/unity_catalog_lineage.yaml +18 -0
- metadata/examples/workflows/unity_catalog_usage.yaml +35 -0
- metadata/generated/antlr/EntityLinkLexer.py +391 -292
- metadata/generated/antlr/EntityLinkListener.py +12 -12
- metadata/generated/antlr/EntityLinkParser.py +228 -103
- metadata/generated/schema/analytics/__init__.py +1 -1
- metadata/generated/schema/analytics/basic.py +1 -1
- metadata/generated/schema/analytics/reportData.py +1 -1
- metadata/generated/schema/analytics/reportDataType/__init__.py +1 -1
- metadata/generated/schema/analytics/reportDataType/aggregatedCostAnalysisReportData.py +1 -1
- metadata/generated/schema/analytics/reportDataType/entityReportData.py +1 -1
- metadata/generated/schema/analytics/reportDataType/rawCostAnalysisReportData.py +1 -1
- metadata/generated/schema/analytics/reportDataType/webAnalyticEntityViewReportData.py +1 -1
- metadata/generated/schema/analytics/reportDataType/webAnalyticUserActivityReportData.py +1 -1
- metadata/generated/schema/analytics/webAnalyticEvent.py +1 -1
- metadata/generated/schema/analytics/webAnalyticEventData.py +1 -1
- metadata/generated/schema/analytics/webAnalyticEventType/__init__.py +1 -1
- metadata/generated/schema/analytics/webAnalyticEventType/customEvent.py +1 -1
- metadata/generated/schema/analytics/webAnalyticEventType/pageViewEvent.py +1 -1
- metadata/generated/schema/api/__init__.py +1 -1
- metadata/generated/schema/api/addGlossaryToAssetsRequest.py +1 -1
- metadata/generated/schema/api/analytics/__init__.py +1 -1
- metadata/generated/schema/api/analytics/createWebAnalyticEvent.py +1 -1
- metadata/generated/schema/api/automations/__init__.py +1 -1
- metadata/generated/schema/api/automations/createWorkflow.py +1 -1
- metadata/generated/schema/api/bulkAssets.py +1 -1
- metadata/generated/schema/api/classification/__init__.py +1 -1
- metadata/generated/schema/api/classification/createClassification.py +1 -1
- metadata/generated/schema/api/classification/createTag.py +1 -1
- metadata/generated/schema/api/classification/loadTags.py +1 -1
- metadata/generated/schema/api/createBot.py +2 -3
- metadata/generated/schema/api/createEventPublisherJob.py +1 -1
- metadata/generated/schema/api/createType.py +1 -1
- metadata/generated/schema/api/data/__init__.py +1 -1
- metadata/generated/schema/api/data/createChart.py +1 -1
- metadata/generated/schema/api/data/createContainer.py +2 -2
- metadata/generated/schema/api/data/createCustomProperty.py +2 -3
- metadata/generated/schema/api/data/createDashboard.py +1 -1
- metadata/generated/schema/api/data/createDashboardDataModel.py +1 -1
- metadata/generated/schema/api/data/createDatabase.py +2 -3
- metadata/generated/schema/api/data/createDatabaseSchema.py +2 -3
- metadata/generated/schema/api/data/createGlossary.py +2 -3
- metadata/generated/schema/api/data/createGlossaryTerm.py +2 -3
- metadata/generated/schema/api/data/createMlModel.py +1 -1
- metadata/generated/schema/api/data/createPipeline.py +2 -2
- metadata/generated/schema/api/data/createQuery.py +2 -2
- metadata/generated/schema/api/data/createSearchIndex.py +1 -1
- metadata/generated/schema/api/data/createStoredProcedure.py +2 -4
- metadata/generated/schema/api/data/createTable.py +2 -2
- metadata/generated/schema/api/data/createTableProfile.py +1 -1
- metadata/generated/schema/api/data/createTopic.py +1 -1
- metadata/generated/schema/api/data/loadGlossary.py +1 -1
- metadata/generated/schema/api/data/restoreEntity.py +1 -1
- metadata/generated/schema/api/dataInsight/__init__.py +1 -1
- metadata/generated/schema/api/dataInsight/createDataInsightChart.py +1 -1
- metadata/generated/schema/api/dataInsight/kpi/__init__.py +1 -1
- metadata/generated/schema/api/dataInsight/kpi/createKpiRequest.py +1 -1
- metadata/generated/schema/api/docStore/__init__.py +1 -1
- metadata/generated/schema/api/docStore/createDocument.py +1 -1
- metadata/generated/schema/api/domains/__init__.py +1 -1
- metadata/generated/schema/api/domains/createDataProduct.py +1 -1
- metadata/generated/schema/api/domains/createDomain.py +1 -1
- metadata/generated/schema/api/feed/__init__.py +1 -1
- metadata/generated/schema/api/feed/closeTask.py +8 -1
- metadata/generated/schema/api/feed/createPost.py +1 -1
- metadata/generated/schema/api/feed/createSuggestion.py +30 -0
- metadata/generated/schema/api/feed/createThread.py +1 -1
- metadata/generated/schema/api/feed/resolveTask.py +12 -1
- metadata/generated/schema/api/feed/threadCount.py +18 -14
- metadata/generated/schema/api/lineage/__init__.py +1 -1
- metadata/generated/schema/api/lineage/addLineage.py +1 -1
- metadata/generated/schema/api/openMetadataServerVersion.py +1 -1
- metadata/generated/schema/api/policies/__init__.py +1 -1
- metadata/generated/schema/api/policies/createPolicy.py +1 -1
- metadata/generated/schema/api/services/__init__.py +1 -1
- metadata/generated/schema/api/services/createDashboardService.py +1 -1
- metadata/generated/schema/api/services/createDatabaseService.py +1 -1
- metadata/generated/schema/api/services/createMessagingService.py +1 -1
- metadata/generated/schema/api/services/createMetadataService.py +1 -1
- metadata/generated/schema/api/services/createMlModelService.py +1 -1
- metadata/generated/schema/api/services/createPipelineService.py +1 -1
- metadata/generated/schema/api/services/createSearchService.py +1 -1
- metadata/generated/schema/api/services/createStorageService.py +1 -1
- metadata/generated/schema/api/services/ingestionPipelines/__init__.py +1 -1
- metadata/generated/schema/api/services/ingestionPipelines/createIngestionPipeline.py +1 -1
- metadata/generated/schema/api/setOwner.py +1 -1
- metadata/generated/schema/api/teams/__init__.py +1 -1
- metadata/generated/schema/api/teams/createPersona.py +1 -1
- metadata/generated/schema/api/teams/createRole.py +2 -3
- metadata/generated/schema/api/teams/createTeam.py +1 -1
- metadata/generated/schema/api/teams/createUser.py +2 -2
- metadata/generated/schema/api/tests/__init__.py +1 -1
- metadata/generated/schema/api/tests/createCustomMetric.py +4 -2
- metadata/generated/schema/api/tests/createLogicalTestCases.py +1 -1
- metadata/generated/schema/api/tests/createTestCase.py +4 -1
- metadata/generated/schema/api/tests/createTestCaseResolutionStatus.py +31 -0
- metadata/generated/schema/api/tests/createTestDefinition.py +1 -1
- metadata/generated/schema/api/tests/createTestSuite.py +1 -1
- metadata/generated/schema/api/voteRequest.py +1 -1
- metadata/generated/schema/auth/__init__.py +1 -1
- metadata/generated/schema/auth/basicAuth.py +1 -1
- metadata/generated/schema/auth/basicLoginRequest.py +1 -1
- metadata/generated/schema/auth/changePasswordRequest.py +1 -1
- metadata/generated/schema/auth/createPersonalToken.py +1 -1
- metadata/generated/schema/auth/emailRequest.py +1 -1
- metadata/generated/schema/auth/emailVerificationToken.py +1 -1
- metadata/generated/schema/auth/generateToken.py +1 -1
- metadata/generated/schema/auth/jwtAuth.py +1 -1
- metadata/generated/schema/auth/loginRequest.py +1 -1
- metadata/generated/schema/auth/logoutRequest.py +1 -1
- metadata/generated/schema/auth/passwordResetRequest.py +3 -3
- metadata/generated/schema/auth/passwordResetToken.py +1 -1
- metadata/generated/schema/auth/personalAccessToken.py +1 -1
- metadata/generated/schema/auth/refreshToken.py +1 -1
- metadata/generated/schema/auth/registrationRequest.py +2 -2
- metadata/generated/schema/auth/revokePersonalToken.py +1 -1
- metadata/generated/schema/auth/revokeToken.py +1 -1
- metadata/generated/schema/auth/serviceTokenEnum.py +1 -1
- metadata/generated/schema/auth/ssoAuth.py +1 -1
- metadata/generated/schema/auth/tokenRefreshRequest.py +1 -1
- metadata/generated/schema/configuration/__init__.py +1 -1
- metadata/generated/schema/configuration/appsPrivateConfiguration.py +28 -0
- metadata/generated/schema/configuration/authConfig.py +1 -1
- metadata/generated/schema/configuration/authenticationConfiguration.py +1 -1
- metadata/generated/schema/configuration/authorizerConfiguration.py +1 -1
- metadata/generated/schema/configuration/changeEventConfiguration.py +1 -1
- metadata/generated/schema/configuration/elasticSearchConfiguration.py +7 -1
- metadata/generated/schema/configuration/eventHandlerConfiguration.py +1 -1
- metadata/generated/schema/configuration/fernetConfiguration.py +1 -1
- metadata/generated/schema/configuration/jwtTokenConfiguration.py +1 -1
- metadata/generated/schema/configuration/kafkaEventConfiguration.py +1 -1
- metadata/generated/schema/configuration/ldapConfiguration.py +28 -2
- metadata/generated/schema/configuration/ldapTrustStoreConfig/__init__.py +1 -1
- metadata/generated/schema/configuration/ldapTrustStoreConfig/customTrustManagerConfig.py +1 -1
- metadata/generated/schema/configuration/ldapTrustStoreConfig/hostNameConfig.py +1 -1
- metadata/generated/schema/configuration/ldapTrustStoreConfig/jvmDefaultConfig.py +1 -1
- metadata/generated/schema/configuration/ldapTrustStoreConfig/trustAllConfig.py +1 -1
- metadata/generated/schema/configuration/ldapTrustStoreConfig/truststoreConfig.py +1 -1
- metadata/generated/schema/configuration/loginConfiguration.py +1 -1
- metadata/generated/schema/configuration/logoConfiguration.py +1 -1
- metadata/generated/schema/configuration/pipelineServiceClientConfiguration.py +1 -1
- metadata/generated/schema/configuration/slackAppConfiguration.py +1 -1
- metadata/generated/schema/configuration/taskNotificationConfiguration.py +1 -1
- metadata/generated/schema/configuration/testResultNotificationConfiguration.py +1 -1
- metadata/generated/schema/dataInsight/__init__.py +1 -1
- metadata/generated/schema/dataInsight/dataInsightChart.py +1 -1
- metadata/generated/schema/dataInsight/dataInsightChartResult.py +1 -1
- metadata/generated/schema/dataInsight/kpi/__init__.py +1 -1
- metadata/generated/schema/dataInsight/kpi/basic.py +1 -1
- metadata/generated/schema/dataInsight/kpi/kpi.py +1 -1
- metadata/generated/schema/dataInsight/type/__init__.py +1 -1
- metadata/generated/schema/dataInsight/type/aggregatedUnusedAssetsCount.py +1 -1
- metadata/generated/schema/dataInsight/type/aggregatedUnusedAssetsSize.py +1 -1
- metadata/generated/schema/dataInsight/type/aggregatedUsedVsUnusedAssetsCount.py +1 -1
- metadata/generated/schema/dataInsight/type/aggregatedUsedVsUnusedAssetsSize.py +1 -1
- metadata/generated/schema/dataInsight/type/dailyActiveUsers.py +1 -1
- metadata/generated/schema/dataInsight/type/mostActiveUsers.py +1 -1
- metadata/generated/schema/dataInsight/type/mostViewedEntities.py +1 -1
- metadata/generated/schema/dataInsight/type/pageViewsByEntities.py +1 -1
- metadata/generated/schema/dataInsight/type/percentageOfEntitiesWithDescriptionByType.py +1 -1
- metadata/generated/schema/dataInsight/type/percentageOfEntitiesWithOwnerByType.py +1 -1
- metadata/generated/schema/dataInsight/type/percentageOfServicesWithDescription.py +1 -1
- metadata/generated/schema/dataInsight/type/percentageOfServicesWithOwner.py +1 -1
- metadata/generated/schema/dataInsight/type/totalEntitiesByTier.py +1 -1
- metadata/generated/schema/dataInsight/type/totalEntitiesByType.py +1 -1
- metadata/generated/schema/dataInsight/type/unusedAssets.py +1 -1
- metadata/generated/schema/email/__init__.py +1 -1
- metadata/generated/schema/email/emailRequest.py +1 -1
- metadata/generated/schema/email/smtpSettings.py +1 -1
- metadata/generated/schema/entity/__init__.py +1 -1
- metadata/generated/schema/entity/applications/__init__.py +1 -1
- metadata/generated/schema/entity/applications/app.py +18 -4
- metadata/generated/schema/entity/applications/appRunRecord.py +1 -1
- metadata/generated/schema/entity/applications/configuration/__init__.py +1 -1
- metadata/generated/schema/entity/applications/configuration/applicationConfig.py +30 -0
- metadata/generated/schema/entity/{services/connections/database/mongoDB → applications/configuration/external}/__init__.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/autoTaggerAppConfig.py +28 -0
- metadata/generated/schema/entity/applications/configuration/external/metaPilotAppConfig.py +46 -0
- metadata/generated/schema/entity/applications/configuration/internal/__init__.py +3 -0
- metadata/generated/schema/entity/applications/configuration/internal/dataInsightsAppConfig.py +14 -0
- metadata/generated/schema/entity/applications/configuration/internal/dataInsightsReportAppConfig.py +27 -0
- metadata/generated/schema/entity/applications/configuration/{searchIndexingApp.py → internal/searchIndexingAppConfig.py} +13 -3
- metadata/generated/schema/entity/applications/configuration/private/external/__init__.py +3 -0
- metadata/generated/schema/entity/applications/configuration/private/external/metaPilotAppPrivateConfig.py +26 -0
- metadata/generated/schema/entity/applications/createAppRequest.py +1 -1
- metadata/generated/schema/entity/applications/jobStatus.py +3 -3
- metadata/generated/schema/entity/applications/liveExecutionContext.py +1 -1
- metadata/generated/schema/entity/applications/marketplace/__init__.py +1 -1
- metadata/generated/schema/entity/applications/marketplace/appMarketPlaceDefinition.py +12 -3
- metadata/generated/schema/entity/applications/marketplace/createAppMarketPlaceDefinitionReq.py +12 -3
- metadata/generated/schema/entity/applications/scheduledExecutionContext.py +1 -1
- metadata/generated/schema/entity/automations/__init__.py +1 -1
- metadata/generated/schema/entity/automations/testServiceConnection.py +2 -2
- metadata/generated/schema/entity/automations/workflow.py +1 -1
- metadata/generated/schema/entity/bot.py +2 -3
- metadata/generated/schema/entity/classification/__init__.py +1 -1
- metadata/generated/schema/entity/classification/classification.py +1 -1
- metadata/generated/schema/entity/classification/tag.py +2 -2
- metadata/generated/schema/entity/data/__init__.py +1 -1
- metadata/generated/schema/entity/data/chart.py +1 -1
- metadata/generated/schema/entity/data/container.py +4 -9
- metadata/generated/schema/entity/data/dashboard.py +1 -1
- metadata/generated/schema/entity/data/dashboardDataModel.py +1 -1
- metadata/generated/schema/entity/data/database.py +4 -8
- metadata/generated/schema/entity/data/databaseSchema.py +2 -8
- metadata/generated/schema/entity/data/glossary.py +1 -1
- metadata/generated/schema/entity/data/glossaryTerm.py +1 -1
- metadata/generated/schema/entity/data/metrics.py +1 -1
- metadata/generated/schema/entity/data/mlmodel.py +1 -1
- metadata/generated/schema/entity/data/pipeline.py +6 -9
- metadata/generated/schema/entity/data/query.py +2 -2
- metadata/generated/schema/entity/data/report.py +1 -1
- metadata/generated/schema/entity/data/searchIndex.py +1 -1
- metadata/generated/schema/entity/data/storedProcedure.py +3 -9
- metadata/generated/schema/entity/data/table.py +18 -12
- metadata/generated/schema/entity/data/topic.py +1 -1
- metadata/generated/schema/entity/docStore/__init__.py +1 -1
- metadata/generated/schema/entity/docStore/document.py +1 -1
- metadata/generated/schema/entity/domains/__init__.py +1 -1
- metadata/generated/schema/entity/domains/dataProduct.py +1 -1
- metadata/generated/schema/entity/domains/domain.py +1 -1
- metadata/generated/schema/entity/events/__init__.py +1 -1
- metadata/generated/schema/entity/events/webhook.py +6 -3
- metadata/generated/schema/entity/feed/__init__.py +1 -1
- metadata/generated/schema/entity/feed/suggestion.py +61 -0
- metadata/generated/schema/entity/feed/thread.py +6 -1
- metadata/generated/schema/entity/policies/__init__.py +1 -1
- metadata/generated/schema/entity/policies/accessControl/__init__.py +1 -1
- metadata/generated/schema/entity/policies/accessControl/resourceDescriptor.py +1 -1
- metadata/generated/schema/entity/policies/accessControl/resourcePermission.py +1 -1
- metadata/generated/schema/entity/policies/accessControl/rule.py +1 -1
- metadata/generated/schema/entity/policies/filters.py +2 -5
- metadata/generated/schema/entity/policies/policy.py +1 -1
- metadata/generated/schema/entity/services/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/common/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/common/sslCertPaths.py +1 -1
- metadata/generated/schema/entity/services/connections/common/sslCertValues.py +1 -1
- metadata/generated/schema/entity/services/connections/common/sslConfig.py +1 -1
- metadata/generated/schema/entity/services/connections/connectionBasicType.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/customDashboardConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/domoDashboardConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/lightdashConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/lookerConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/metabaseConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/modeConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/mstrConnection.py +46 -0
- metadata/generated/schema/entity/services/connections/dashboard/powerBIConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/qlikSenseConnection.py +2 -2
- metadata/generated/schema/entity/services/connections/dashboard/quickSightConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/redashConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/supersetConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/tableauConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/database/athenaConnection.py +2 -2
- metadata/generated/schema/entity/services/connections/database/azureSQLConnection.py +2 -2
- metadata/generated/schema/entity/services/connections/database/bigQueryConnection.py +2 -2
- metadata/generated/schema/entity/services/connections/database/clickhouseConnection.py +2 -2
- metadata/generated/schema/entity/services/connections/database/common/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/database/common/basicAuth.py +1 -1
- metadata/generated/schema/entity/services/connections/database/common/iamAuthConfig.py +1 -1
- metadata/generated/schema/entity/services/connections/database/common/jwtAuth.py +1 -1
- metadata/generated/schema/entity/services/connections/database/couchbaseConnection.py +6 -1
- metadata/generated/schema/entity/services/connections/database/customDatabaseConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/databricksConnection.py +2 -7
- metadata/generated/schema/entity/services/connections/database/datalake/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/database/datalake/azureConfig.py +1 -1
- metadata/generated/schema/entity/services/connections/database/datalake/gcsConfig.py +1 -1
- metadata/generated/schema/entity/services/connections/database/datalake/s3Config.py +1 -1
- metadata/generated/schema/entity/services/connections/database/datalakeConnection.py +2 -2
- metadata/generated/schema/entity/services/connections/database/db2Connection.py +3 -2
- metadata/generated/schema/entity/services/connections/database/deltaLakeConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/domoDatabaseConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/dorisConnection.py +86 -0
- metadata/generated/schema/entity/services/connections/database/druidConnection.py +2 -2
- metadata/generated/schema/entity/services/connections/database/dynamoDBConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/glueConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/greenplumConnection.py +2 -2
- metadata/generated/schema/entity/services/connections/database/hiveConnection.py +2 -2
- metadata/generated/schema/entity/services/connections/database/iceberg/__init__.py +3 -0
- metadata/generated/schema/entity/services/connections/database/iceberg/dynamoDbCatalogConnection.py +17 -0
- metadata/generated/schema/entity/services/connections/database/iceberg/glueCatalogConnection.py +16 -0
- metadata/generated/schema/entity/services/connections/database/iceberg/hiveCatalogConnection.py +23 -0
- metadata/generated/schema/entity/services/connections/database/iceberg/icebergCatalog.py +43 -0
- metadata/generated/schema/entity/services/connections/database/iceberg/icebergFileSystem.py +20 -0
- metadata/generated/schema/entity/services/connections/database/iceberg/restCatalogConnection.py +69 -0
- metadata/generated/schema/entity/services/connections/database/icebergConnection.py +35 -0
- metadata/generated/schema/entity/services/connections/database/impalaConnection.py +2 -2
- metadata/generated/schema/entity/services/connections/database/mariaDBConnection.py +2 -2
- metadata/generated/schema/entity/services/connections/database/mongoDBConnection.py +24 -14
- metadata/generated/schema/entity/services/connections/database/mssqlConnection.py +5 -2
- metadata/generated/schema/entity/services/connections/database/mysqlConnection.py +2 -2
- metadata/generated/schema/entity/services/connections/database/oracleConnection.py +2 -2
- metadata/generated/schema/entity/services/connections/database/pinotDBConnection.py +2 -2
- metadata/generated/schema/entity/services/connections/database/postgresConnection.py +2 -2
- metadata/generated/schema/entity/services/connections/database/prestoConnection.py +2 -2
- metadata/generated/schema/entity/services/connections/database/redshiftConnection.py +2 -2
- metadata/generated/schema/entity/services/connections/database/salesforceConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/sapHanaConnection.py +2 -2
- metadata/generated/schema/entity/services/connections/database/sasConnection.py +48 -0
- metadata/generated/schema/entity/services/connections/database/singleStoreConnection.py +2 -2
- metadata/generated/schema/entity/services/connections/database/snowflakeConnection.py +2 -2
- metadata/generated/schema/entity/services/connections/database/sqliteConnection.py +2 -2
- metadata/generated/schema/entity/services/connections/database/trinoConnection.py +2 -2
- metadata/generated/schema/entity/services/connections/database/unityCatalogConnection.py +90 -0
- metadata/generated/schema/entity/services/connections/database/verticaConnection.py +2 -2
- metadata/generated/schema/entity/services/connections/messaging/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/messaging/customMessagingConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/messaging/kafkaConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/messaging/kinesisConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/messaging/pulsarConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/messaging/redpandaConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/messaging/saslMechanismType.py +1 -1
- metadata/generated/schema/entity/services/connections/metadata/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/metadata/alationConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/metadata/amundsenConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/metadata/atlasConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/metadata/metadataESConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/metadata/openMetadataConnection.py +5 -20
- metadata/generated/schema/entity/services/connections/mlmodel/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/mlmodel/customMlModelConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/mlmodel/mlflowConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/mlmodel/sageMakerConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/mlmodel/sklearnConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/airbyteConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/airflowConnection.py +2 -8
- metadata/generated/schema/entity/services/connections/pipeline/backendConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/customPipelineConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/dagsterConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/databricksPipelineConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/domoPipelineConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/fivetranConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/gluePipelineConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/nifiConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/sparkConnection.py +23 -0
- metadata/generated/schema/entity/services/connections/pipeline/splineConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/search/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/search/customSearchConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/search/elasticSearch/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/search/elasticSearch/apiAuth.py +1 -1
- metadata/generated/schema/entity/services/connections/search/elasticSearch/basicAuth.py +1 -1
- metadata/generated/schema/entity/services/connections/search/elasticSearchConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/search/openSearchConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/serviceConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/storage/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/storage/{adlsConection.py → adlsConnection.py} +2 -2
- metadata/generated/schema/entity/services/connections/storage/customStorageConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/storage/gcsConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/storage/s3Connection.py +1 -1
- metadata/generated/schema/entity/services/connections/testConnectionDefinition.py +1 -1
- metadata/generated/schema/entity/services/connections/testConnectionResult.py +1 -1
- metadata/generated/schema/entity/services/dashboardService.py +4 -1
- metadata/generated/schema/entity/services/databaseService.py +13 -1
- metadata/generated/schema/entity/services/ingestionPipelines/__init__.py +1 -1
- metadata/generated/schema/entity/services/ingestionPipelines/ingestionPipeline.py +27 -22
- metadata/generated/schema/entity/services/ingestionPipelines/pipelineServiceClientResponse.py +1 -1
- metadata/generated/schema/entity/services/ingestionPipelines/status.py +56 -0
- metadata/generated/schema/entity/services/messagingService.py +1 -1
- metadata/generated/schema/entity/services/metadataService.py +1 -1
- metadata/generated/schema/entity/services/mlmodelService.py +1 -1
- metadata/generated/schema/entity/services/pipelineService.py +4 -1
- metadata/generated/schema/entity/services/searchService.py +1 -1
- metadata/generated/schema/entity/services/serviceType.py +1 -1
- metadata/generated/schema/entity/services/storageService.py +10 -3
- metadata/generated/schema/entity/teams/__init__.py +1 -1
- metadata/generated/schema/entity/teams/persona.py +1 -1
- metadata/generated/schema/entity/teams/role.py +2 -6
- metadata/generated/schema/entity/teams/team.py +1 -1
- metadata/generated/schema/entity/teams/teamHierarchy.py +1 -1
- metadata/generated/schema/entity/teams/user.py +3 -10
- metadata/generated/schema/entity/type.py +2 -2
- metadata/generated/schema/entity/utils/__init__.py +1 -1
- metadata/generated/schema/entity/utils/entitiesCount.py +1 -1
- metadata/generated/schema/entity/utils/servicesCount.py +1 -1
- metadata/generated/schema/entity/utils/supersetApiConnection.py +1 -1
- metadata/generated/schema/events/__init__.py +1 -1
- metadata/generated/schema/events/alertMetrics.py +27 -0
- metadata/generated/schema/events/api/__init__.py +1 -1
- metadata/generated/schema/events/api/createEventSubscription.py +14 -12
- metadata/generated/schema/events/emailAlertConfig.py +1 -1
- metadata/generated/schema/events/eventFilterRule.py +13 -2
- metadata/generated/schema/events/eventSubscription.py +89 -49
- metadata/generated/schema/events/eventSubscriptionOffset.py +21 -0
- metadata/generated/schema/events/failedEvent.py +26 -0
- metadata/generated/schema/events/filterResourceDescriptor.py +27 -0
- metadata/generated/schema/events/subscriptionResourceDescriptor.py +11 -10
- metadata/generated/schema/metadataIngestion/__init__.py +1 -1
- metadata/generated/schema/metadataIngestion/application.py +40 -0
- metadata/generated/schema/metadataIngestion/applicationPipeline.py +15 -6
- metadata/generated/schema/metadataIngestion/dashboardServiceMetadataPipeline.py +1 -1
- metadata/generated/schema/metadataIngestion/dataInsightPipeline.py +1 -1
- metadata/generated/schema/metadataIngestion/databaseServiceMetadataPipeline.py +6 -1
- metadata/generated/schema/metadataIngestion/databaseServiceProfilerPipeline.py +6 -1
- metadata/generated/schema/metadataIngestion/databaseServiceQueryLineagePipeline.py +1 -1
- metadata/generated/schema/metadataIngestion/databaseServiceQueryUsagePipeline.py +1 -1
- metadata/generated/schema/metadataIngestion/dbtPipeline.py +1 -1
- metadata/generated/schema/metadataIngestion/dbtconfig/__init__.py +1 -1
- metadata/generated/schema/metadataIngestion/dbtconfig/dbtAzureConfig.py +6 -3
- metadata/generated/schema/metadataIngestion/dbtconfig/dbtBucketDetails.py +1 -1
- metadata/generated/schema/metadataIngestion/dbtconfig/dbtCloudConfig.py +1 -1
- metadata/generated/schema/metadataIngestion/dbtconfig/dbtGCSConfig.py +6 -3
- metadata/generated/schema/metadataIngestion/dbtconfig/dbtHttpConfig.py +1 -1
- metadata/generated/schema/metadataIngestion/dbtconfig/dbtLocalConfig.py +1 -1
- metadata/generated/schema/metadataIngestion/dbtconfig/dbtS3Config.py +6 -3
- metadata/generated/schema/metadataIngestion/messagingServiceMetadataPipeline.py +1 -1
- metadata/generated/schema/metadataIngestion/metadataToElasticSearchPipeline.py +1 -1
- metadata/generated/schema/metadataIngestion/mlmodelServiceMetadataPipeline.py +1 -1
- metadata/generated/schema/metadataIngestion/pipelineServiceMetadataPipeline.py +1 -1
- metadata/generated/schema/metadataIngestion/searchServiceMetadataPipeline.py +1 -1
- metadata/generated/schema/metadataIngestion/storage/__init__.py +1 -1
- metadata/generated/schema/metadataIngestion/storage/containerMetadataConfig.py +1 -1
- metadata/generated/schema/metadataIngestion/storage/manifestMetadataConfig.py +1 -1
- metadata/generated/schema/metadataIngestion/storage/storageBucketDetails.py +1 -1
- metadata/generated/schema/metadataIngestion/storage/storageMetadataADLSConfig.py +2 -2
- metadata/generated/schema/metadataIngestion/storage/storageMetadataGCSConfig.py +24 -0
- metadata/generated/schema/metadataIngestion/storage/storageMetadataHttpConfig.py +1 -1
- metadata/generated/schema/metadataIngestion/storage/storageMetadataLocalConfig.py +1 -1
- metadata/generated/schema/metadataIngestion/storage/storageMetadataS3Config.py +1 -1
- metadata/generated/schema/metadataIngestion/storageServiceMetadataPipeline.py +8 -1
- metadata/generated/schema/metadataIngestion/testSuitePipeline.py +1 -1
- metadata/generated/schema/metadataIngestion/workflow.py +1 -1
- metadata/generated/schema/monitoring/__init__.py +1 -1
- metadata/generated/schema/monitoring/eventMonitorProvider.py +1 -1
- metadata/generated/schema/security/__init__.py +1 -1
- metadata/generated/schema/security/client/__init__.py +1 -1
- metadata/generated/schema/security/client/auth0SSOClientConfig.py +1 -1
- metadata/generated/schema/security/client/azureSSOClientConfig.py +1 -1
- metadata/generated/schema/security/client/customOidcSSOClientConfig.py +1 -1
- metadata/generated/schema/security/client/googleSSOClientConfig.py +1 -1
- metadata/generated/schema/security/client/oktaSSOClientConfig.py +1 -1
- metadata/generated/schema/security/client/openMetadataJWTClientConfig.py +1 -1
- metadata/generated/schema/security/client/samlSSOClientConfig.py +1 -1
- metadata/generated/schema/security/credentials/__init__.py +1 -1
- metadata/generated/schema/security/credentials/accessTokenAuth.py +1 -1
- metadata/generated/schema/security/credentials/apiAccessTokenAuth.py +1 -1
- metadata/generated/schema/security/credentials/awsCredentials.py +1 -1
- metadata/generated/schema/security/credentials/azureCredentials.py +1 -1
- metadata/generated/schema/security/credentials/basicAuth.py +1 -1
- metadata/generated/schema/security/credentials/bitbucketCredentials.py +1 -1
- metadata/generated/schema/security/credentials/gcpCredentials.py +1 -1
- metadata/generated/schema/security/credentials/gcpValues.py +1 -1
- metadata/generated/schema/security/credentials/gitCredentials.py +1 -1
- metadata/generated/schema/security/credentials/githubCredentials.py +1 -1
- metadata/generated/schema/security/secrets/__init__.py +1 -1
- metadata/generated/schema/security/secrets/secretsManagerClientLoader.py +1 -1
- metadata/generated/schema/security/secrets/secretsManagerConfiguration.py +14 -4
- metadata/generated/schema/security/secrets/secretsManagerProvider.py +2 -2
- metadata/generated/schema/security/securityConfiguration.py +1 -1
- metadata/generated/schema/security/ssl/__init__.py +1 -1
- metadata/generated/schema/security/ssl/validateSSLClientConfig.py +1 -1
- metadata/generated/schema/security/ssl/verifySSLConfig.py +4 -1
- metadata/generated/schema/settings/__init__.py +1 -1
- metadata/generated/schema/settings/settings.py +1 -1
- metadata/generated/schema/system/__init__.py +1 -1
- metadata/generated/schema/system/entityError.py +17 -0
- metadata/generated/schema/system/eventPublisherJob.py +5 -19
- metadata/generated/schema/system/indexingError.py +34 -0
- metadata/generated/schema/system/ui/__init__.py +1 -1
- metadata/generated/schema/system/ui/knowledgePanel.py +1 -1
- metadata/generated/schema/system/ui/page.py +1 -1
- metadata/generated/schema/tests/__init__.py +1 -1
- metadata/generated/schema/tests/assigned.py +18 -0
- metadata/generated/schema/tests/basic.py +17 -39
- metadata/generated/schema/tests/customMetric.py +4 -2
- metadata/generated/schema/tests/resolved.py +35 -0
- metadata/generated/schema/tests/testCase.py +11 -2
- metadata/generated/schema/tests/testCaseResolutionStatus.py +63 -0
- metadata/generated/schema/tests/testDefinition.py +5 -1
- metadata/generated/schema/tests/testSuite.py +1 -1
- metadata/generated/schema/type/__init__.py +1 -1
- metadata/generated/schema/type/auditLog.py +1 -1
- metadata/generated/schema/type/basic.py +5 -5
- metadata/generated/schema/type/bulkOperationResult.py +1 -1
- metadata/generated/schema/type/changeEvent.py +5 -75
- metadata/generated/schema/type/changeEventType.py +29 -0
- metadata/generated/schema/type/collectionDescriptor.py +1 -1
- metadata/generated/schema/type/csvDocumentation.py +1 -1
- metadata/generated/schema/type/csvErrorType.py +1 -1
- metadata/generated/schema/type/csvFile.py +1 -1
- metadata/generated/schema/type/csvImportResult.py +1 -1
- metadata/generated/schema/type/dailyCount.py +1 -1
- metadata/generated/schema/type/databaseConnectionConfig.py +1 -1
- metadata/generated/schema/type/entityHistory.py +1 -1
- metadata/generated/schema/type/entityLineage.py +2 -1
- metadata/generated/schema/type/entityReference.py +5 -1
- metadata/generated/schema/type/entityReferenceList.py +1 -1
- metadata/generated/schema/type/entityRelationship.py +1 -1
- metadata/generated/schema/type/entityUsage.py +1 -1
- metadata/generated/schema/type/filterPattern.py +1 -1
- metadata/generated/schema/type/function.py +7 -6
- metadata/generated/schema/type/include.py +1 -1
- metadata/generated/schema/type/jdbcConnection.py +1 -1
- metadata/generated/schema/type/lifeCycle.py +1 -1
- metadata/generated/schema/type/paging.py +1 -1
- metadata/generated/schema/type/profile.py +1 -1
- metadata/generated/schema/type/queryParserData.py +2 -2
- metadata/generated/schema/type/reaction.py +1 -1
- metadata/generated/schema/type/schedule.py +1 -1
- metadata/generated/schema/type/schema.py +1 -1
- metadata/generated/schema/type/tableQuery.py +2 -2
- metadata/generated/schema/type/tableUsageCount.py +1 -1
- metadata/generated/schema/type/tagLabel.py +1 -1
- metadata/generated/schema/type/usageDetails.py +1 -1
- metadata/generated/schema/type/usageRequest.py +1 -1
- metadata/generated/schema/type/votes.py +1 -1
- metadata/great_expectations/action.py +3 -2
- metadata/ingestion/api/delete.py +5 -2
- metadata/ingestion/api/models.py +4 -10
- metadata/ingestion/api/parser.py +3 -37
- metadata/ingestion/api/status.py +15 -4
- metadata/ingestion/api/step.py +39 -6
- metadata/ingestion/api/steps.py +20 -0
- metadata/ingestion/api/topology_runner.py +114 -168
- metadata/ingestion/bulksink/metadata_usage.py +11 -5
- metadata/ingestion/lineage/models.py +4 -0
- metadata/ingestion/lineage/parser.py +4 -5
- metadata/ingestion/lineage/sql_lineage.py +9 -17
- metadata/ingestion/models/custom_pydantic.py +4 -2
- metadata/ingestion/models/lf_tags_model.py +33 -0
- metadata/ingestion/models/patch_request.py +108 -2
- metadata/ingestion/models/tests_data.py +9 -0
- metadata/ingestion/models/topology.py +177 -60
- metadata/ingestion/ometa/auth_provider.py +0 -349
- metadata/ingestion/ometa/mixins/es_mixin.py +17 -0
- metadata/ingestion/ometa/mixins/patch_mixin.py +17 -68
- metadata/ingestion/ometa/mixins/suggestions_mixin.py +41 -0
- metadata/ingestion/ometa/mixins/table_mixin.py +18 -0
- metadata/ingestion/ometa/mixins/tests_mixin.py +24 -3
- metadata/ingestion/ometa/mixins/user_mixin.py +117 -22
- metadata/ingestion/ometa/ometa_api.py +18 -25
- metadata/ingestion/ometa/routes.py +7 -0
- metadata/ingestion/processor/query_parser.py +9 -2
- metadata/ingestion/sink/metadata_rest.py +25 -6
- metadata/ingestion/source/dashboard/dashboard_service.py +38 -61
- metadata/ingestion/source/dashboard/domodashboard/metadata.py +13 -14
- metadata/ingestion/source/dashboard/lightdash/metadata.py +2 -1
- metadata/ingestion/source/dashboard/looker/metadata.py +38 -25
- metadata/ingestion/source/dashboard/metabase/metadata.py +23 -6
- metadata/ingestion/source/dashboard/mode/client.py +10 -23
- metadata/ingestion/source/dashboard/mode/connection.py +6 -1
- metadata/ingestion/source/dashboard/mode/metadata.py +8 -4
- metadata/ingestion/source/dashboard/mstr/client.py +208 -0
- metadata/ingestion/source/dashboard/mstr/connection.py +53 -0
- metadata/ingestion/source/dashboard/mstr/metadata.py +182 -0
- metadata/ingestion/source/dashboard/mstr/models.py +144 -0
- metadata/ingestion/source/dashboard/powerbi/metadata.py +15 -10
- metadata/ingestion/source/dashboard/qliksense/metadata.py +11 -7
- metadata/ingestion/source/dashboard/quicksight/metadata.py +9 -5
- metadata/ingestion/source/dashboard/redash/metadata.py +23 -14
- metadata/ingestion/source/dashboard/superset/api_source.py +11 -8
- metadata/ingestion/source/dashboard/superset/client.py +16 -9
- metadata/ingestion/source/dashboard/superset/connection.py +3 -3
- metadata/ingestion/source/dashboard/superset/db_source.py +14 -10
- metadata/ingestion/source/dashboard/superset/mixin.py +22 -18
- metadata/ingestion/source/dashboard/superset/queries.py +1 -1
- metadata/ingestion/source/dashboard/tableau/client.py +91 -11
- metadata/ingestion/source/dashboard/tableau/connection.py +10 -1
- metadata/ingestion/source/dashboard/tableau/metadata.py +58 -70
- metadata/ingestion/source/dashboard/tableau/models.py +0 -8
- metadata/ingestion/source/dashboard/tableau/queries.py +5 -5
- metadata/ingestion/source/database/athena/client.py +80 -0
- metadata/ingestion/source/database/athena/connection.py +7 -0
- metadata/ingestion/source/database/athena/metadata.py +161 -19
- metadata/ingestion/source/database/azuresql/metadata.py +0 -1
- metadata/ingestion/source/database/bigquery/connection.py +24 -3
- metadata/ingestion/source/database/bigquery/metadata.py +39 -27
- metadata/ingestion/source/database/bigquery/queries.py +11 -4
- metadata/ingestion/source/database/bigquery/query_parser.py +13 -0
- metadata/ingestion/source/database/bigquery/usage.py +1 -3
- metadata/ingestion/source/database/column_helpers.py +0 -10
- metadata/ingestion/source/database/column_type_parser.py +11 -5
- metadata/ingestion/source/database/common_db_source.py +8 -2
- metadata/ingestion/source/database/common_nosql_source.py +8 -4
- metadata/ingestion/source/database/database_service.py +89 -7
- metadata/ingestion/source/database/databricks/client.py +5 -10
- metadata/ingestion/source/database/databricks/connection.py +16 -55
- metadata/ingestion/source/database/databricks/lineage.py +29 -26
- metadata/ingestion/source/database/databricks/metadata.py +448 -11
- metadata/ingestion/source/database/databricks/queries.py +28 -0
- metadata/ingestion/source/database/databricks/query_parser.py +5 -1
- metadata/ingestion/source/database/databricks/usage.py +2 -2
- metadata/ingestion/source/database/datalake/connection.py +31 -4
- metadata/ingestion/source/database/datalake/metadata.py +113 -27
- metadata/ingestion/source/database/dbt/dbt_config.py +5 -0
- metadata/ingestion/source/database/dbt/dbt_service.py +10 -14
- metadata/ingestion/source/database/dbt/dbt_utils.py +3 -1
- metadata/ingestion/source/database/dbt/metadata.py +11 -25
- metadata/ingestion/source/database/deltalake/metadata.py +6 -3
- metadata/ingestion/source/database/domodatabase/metadata.py +7 -6
- metadata/ingestion/source/database/doris/connection.py +72 -0
- metadata/ingestion/source/database/doris/metadata.py +315 -0
- metadata/ingestion/source/database/doris/queries.py +54 -0
- metadata/ingestion/source/database/doris/utils.py +64 -0
- metadata/ingestion/source/database/extended_sample_data.py +532 -0
- metadata/ingestion/source/database/glue/metadata.py +8 -5
- metadata/ingestion/source/database/hive/connection.py +0 -2
- metadata/ingestion/source/database/hive/utils.py +3 -0
- metadata/ingestion/source/database/iceberg/catalog/__init__.py +65 -0
- metadata/ingestion/source/database/iceberg/catalog/base.py +40 -0
- metadata/ingestion/source/database/iceberg/catalog/dynamodb.py +102 -0
- metadata/ingestion/source/database/iceberg/catalog/glue.py +88 -0
- metadata/ingestion/source/database/iceberg/catalog/hive.py +51 -0
- metadata/ingestion/source/database/iceberg/catalog/rest.py +84 -0
- metadata/ingestion/source/database/iceberg/connection.py +68 -0
- metadata/ingestion/source/database/iceberg/fs/__init__.py +52 -0
- metadata/ingestion/source/database/iceberg/fs/azure.py +44 -0
- metadata/ingestion/source/database/iceberg/fs/base.py +30 -0
- metadata/ingestion/source/database/iceberg/fs/s3.py +77 -0
- metadata/ingestion/source/database/iceberg/helper.py +124 -0
- metadata/ingestion/source/database/iceberg/metadata.py +311 -0
- metadata/ingestion/source/database/iceberg/models.py +66 -0
- metadata/ingestion/source/database/life_cycle_query_mixin.py +72 -3
- metadata/ingestion/source/database/mongodb/connection.py +1 -5
- metadata/ingestion/source/database/mssql/lineage.py +2 -0
- metadata/ingestion/source/database/mssql/metadata.py +108 -4
- metadata/ingestion/source/database/mssql/models.py +30 -0
- metadata/ingestion/source/database/mssql/queries.py +179 -1
- metadata/ingestion/source/database/mssql/utils.py +207 -4
- metadata/ingestion/source/database/mysql/metadata.py +0 -2
- metadata/ingestion/source/database/oracle/metadata.py +108 -2
- metadata/ingestion/source/database/oracle/models.py +30 -0
- metadata/ingestion/source/database/oracle/queries.py +98 -17
- metadata/ingestion/source/database/oracle/utils.py +0 -1
- metadata/ingestion/source/database/postgres/lineage.py +32 -14
- metadata/ingestion/source/database/postgres/metadata.py +15 -7
- metadata/ingestion/source/database/postgres/pgspider/lineage.py +0 -1
- metadata/ingestion/source/database/postgres/queries.py +4 -2
- metadata/ingestion/source/database/postgres/query_parser.py +4 -72
- metadata/ingestion/source/database/postgres/usage.py +41 -0
- metadata/ingestion/source/database/postgres/utils.py +34 -0
- metadata/ingestion/source/database/query_parser_source.py +8 -2
- metadata/ingestion/source/database/redshift/metadata.py +14 -4
- metadata/ingestion/source/database/redshift/queries.py +10 -4
- metadata/ingestion/source/database/redshift/query_parser.py +16 -0
- metadata/ingestion/source/database/redshift/usage.py +0 -2
- metadata/ingestion/source/database/salesforce/metadata.py +32 -3
- metadata/ingestion/source/database/sample_data.py +120 -6
- metadata/ingestion/source/database/sas/client.py +184 -0
- metadata/ingestion/source/database/sas/connection.py +47 -0
- metadata/ingestion/source/database/sas/extension_attr.py +103 -0
- metadata/ingestion/source/database/sas/metadata.py +914 -0
- metadata/ingestion/source/database/snowflake/metadata.py +8 -51
- metadata/ingestion/source/database/snowflake/models.py +6 -1
- metadata/ingestion/source/database/snowflake/queries.py +0 -4
- metadata/ingestion/source/database/snowflake/query_parser.py +5 -20
- metadata/ingestion/source/database/snowflake/utils.py +2 -6
- metadata/ingestion/source/database/stored_procedures_mixin.py +12 -8
- metadata/ingestion/source/database/unitycatalog/__init__.py +0 -0
- metadata/ingestion/source/database/unitycatalog/client.py +87 -0
- metadata/ingestion/source/database/unitycatalog/connection.py +97 -0
- metadata/ingestion/source/database/{databricks/unity_catalog → unitycatalog}/lineage.py +11 -11
- metadata/ingestion/source/database/{databricks/unity_catalog → unitycatalog}/metadata.py +42 -49
- metadata/ingestion/source/database/unitycatalog/query_parser.py +60 -0
- metadata/ingestion/source/database/unitycatalog/usage.py +31 -0
- metadata/ingestion/source/database/usage_source.py +3 -2
- metadata/ingestion/source/messaging/common_broker_source.py +6 -4
- metadata/ingestion/source/messaging/kinesis/metadata.py +6 -3
- metadata/ingestion/source/messaging/messaging_service.py +6 -2
- metadata/ingestion/source/metadata/amundsen/metadata.py +10 -7
- metadata/ingestion/source/metadata/atlas/metadata.py +5 -5
- metadata/ingestion/source/mlmodel/mlflow/metadata.py +5 -2
- metadata/ingestion/source/mlmodel/mlmodel_service.py +6 -2
- metadata/ingestion/source/pipeline/airflow/connection.py +0 -12
- metadata/ingestion/source/pipeline/airflow/lineage_parser.py +12 -6
- metadata/ingestion/source/pipeline/airflow/metadata.py +63 -34
- metadata/ingestion/source/pipeline/airflow/models.py +5 -4
- metadata/ingestion/source/pipeline/dagster/metadata.py +7 -4
- metadata/ingestion/source/pipeline/databrickspipeline/metadata.py +12 -9
- metadata/ingestion/source/pipeline/domopipeline/metadata.py +7 -4
- metadata/ingestion/source/pipeline/gluepipeline/metadata.py +5 -2
- metadata/ingestion/source/pipeline/pipeline_service.py +6 -2
- metadata/ingestion/source/pipeline/spline/metadata.py +0 -1
- metadata/ingestion/source/search/elasticsearch/connection.py +4 -1
- metadata/ingestion/source/search/elasticsearch/metadata.py +1 -2
- metadata/ingestion/source/search/search_service.py +6 -2
- metadata/ingestion/source/storage/s3/metadata.py +22 -17
- metadata/ingestion/source/storage/storage_service.py +53 -11
- metadata/ingestion/stage/table_usage.py +9 -2
- metadata/mixins/sqalchemy/sqa_mixin.py +14 -7
- metadata/parsers/protobuf_parser.py +29 -11
- metadata/pii/processor.py +9 -2
- metadata/profiler/api/models.py +19 -1
- metadata/profiler/interface/pandas/profiler_interface.py +59 -18
- metadata/profiler/interface/profiler_interface.py +13 -2
- metadata/profiler/interface/profiler_interface_factory.py +49 -14
- metadata/profiler/interface/sqlalchemy/bigquery/profiler_interface.py +3 -0
- metadata/profiler/interface/sqlalchemy/databricks/profiler_interface.py +26 -0
- metadata/profiler/interface/sqlalchemy/db2/__init__.py +0 -0
- metadata/profiler/interface/sqlalchemy/db2/profiler_interface.py +38 -0
- metadata/profiler/interface/sqlalchemy/mariadb/profiler_interface.py +85 -0
- metadata/profiler/interface/sqlalchemy/profiler_interface.py +77 -34
- metadata/profiler/interface/sqlalchemy/single_store/profiler_interface.py +2 -2
- metadata/profiler/interface/sqlalchemy/snowflake/profiler_interface.py +7 -0
- metadata/profiler/interface/sqlalchemy/trino/profiler_interface.py +2 -2
- metadata/profiler/interface/sqlalchemy/unity_catalog/profiler_interface.py +33 -0
- metadata/profiler/metrics/composed/null_ratio.py +1 -1
- metadata/profiler/metrics/hybrid/histogram.py +1 -0
- metadata/profiler/metrics/static/max.py +4 -1
- metadata/profiler/metrics/static/min.py +4 -1
- metadata/profiler/metrics/system/queries/snowflake.py +89 -17
- metadata/profiler/metrics/system/system.py +62 -20
- metadata/profiler/orm/functions/length.py +1 -0
- metadata/profiler/orm/functions/median.py +7 -0
- metadata/profiler/orm/functions/table_metric_computer.py +462 -0
- metadata/profiler/orm/registry.py +1 -0
- metadata/profiler/processor/core.py +116 -52
- metadata/profiler/processor/default.py +14 -3
- metadata/profiler/processor/handle_partition.py +2 -2
- metadata/profiler/processor/processor.py +9 -4
- metadata/profiler/processor/sampler/sqlalchemy/bigquery/sampler.py +31 -3
- metadata/profiler/processor/sampler/sqlalchemy/sampler.py +29 -6
- metadata/profiler/processor/sampler/sqlalchemy/trino/sampler.py +10 -4
- metadata/profiler/source/base/profiler_source.py +5 -2
- metadata/profiler/source/bigquery/type_mapper.py +0 -1
- metadata/profiler/source/mariadb/functions/median.py +20 -0
- metadata/profiler/source/mariadb/metrics/window/first_quartile.py +10 -0
- metadata/profiler/source/mariadb/metrics/window/median.py +10 -0
- metadata/profiler/source/mariadb/metrics/window/third_quartile.py +10 -0
- metadata/profiler/source/metadata.py +43 -10
- metadata/profiler/source/metadata_ext.py +16 -50
- metadata/py.typed +0 -0
- metadata/readers/dataframe/json.py +5 -4
- metadata/readers/file/api_reader.py +0 -1
- metadata/utils/constants.py +5 -0
- metadata/utils/datalake/datalake_utils.py +363 -129
- metadata/utils/entity_link.py +26 -6
- metadata/utils/fqn.py +20 -0
- metadata/utils/helpers.py +55 -9
- metadata/utils/importer.py +2 -3
- metadata/utils/life_cycle_utils.py +4 -4
- metadata/utils/logger.py +13 -2
- metadata/utils/partition.py +10 -5
- metadata/utils/secrets/client/loader.py +0 -1
- metadata/utils/secrets/noop_secrets_manager.py +4 -3
- metadata/utils/secrets/secrets_manager_factory.py +3 -4
- metadata/utils/{source_hash_utils.py → source_hash.py} +10 -1
- metadata/utils/sqlalchemy_utils.py +21 -0
- metadata/utils/storage_metadata_config.py +42 -1
- metadata/utils/tag_utils.py +5 -2
- metadata/workflow/application.py +154 -0
- metadata/workflow/application_output_handler.py +34 -0
- metadata/workflow/base.py +84 -153
- metadata/workflow/data_insight.py +8 -7
- metadata/workflow/data_quality.py +3 -2
- metadata/workflow/ingestion.py +203 -0
- metadata/workflow/metadata.py +2 -3
- metadata/workflow/output_handler.py +204 -0
- metadata/workflow/profiler.py +2 -2
- metadata/workflow/usage.py +3 -4
- metadata/workflow/workflow_output_handler.py +15 -255
- metadata/workflow/workflow_status_mixin.py +44 -52
- openmetadata_ingestion-1.3.0.0.dist-info/METADATA +749 -0
- {openmetadata_ingestion-1.2.5.2.dist-info → openmetadata_ingestion-1.3.0.0.dist-info}/RECORD +812 -725
- {openmetadata_ingestion-1.2.5.2.dist-info → openmetadata_ingestion-1.3.0.0.dist-info}/WHEEL +1 -1
- metadata/generated/schema/entity/applications/appConfig.py +0 -21
- metadata/generated/schema/entity/applications/configuration/dataInsightsApp.py +0 -17
- metadata/generated/schema/entity/applications/configuration/externalAppIngestionConfig.py +0 -38
- metadata/generated/schema/entity/services/connections/database/mongoDB/mongoDBValues.py +0 -44
- metadata/generated/schema/events/dataInsightAlertConfig.py +0 -17
- metadata/generated/schema/events/entitySpelFilters.py +0 -19
- metadata/ingestion/models/es_documents.py +0 -339
- metadata/ingestion/ometa/mixins/glossary_mixin.py +0 -501
- metadata/ingestion/ometa/provider_registry.py +0 -144
- metadata/ingestion/source/database/databricks/legacy/lineage.py +0 -51
- metadata/ingestion/source/database/databricks/legacy/metadata.py +0 -339
- metadata/ingestion/source/metadata/metadata_elasticsearch/metadata.py +0 -144
- metadata/profiler/orm/functions/table_metric_construct.py +0 -365
- openmetadata_ingestion-1.2.5.2.dist-info/METADATA +0 -426
- /metadata/ingestion/source/{database/databricks/legacy → dashboard/mstr}/__init__.py +0 -0
- /metadata/ingestion/source/database/{databricks/unity_catalog → doris}/__init__.py +0 -0
- /metadata/ingestion/source/{metadata/metadata_elasticsearch → database/sas}/__init__.py +0 -0
- /metadata/ingestion/source/database/{databricks → unitycatalog}/models.py +0 -0
- {openmetadata_ingestion-1.2.5.2.dist-info → openmetadata_ingestion-1.3.0.0.dist-info}/LICENSE +0 -0
- {openmetadata_ingestion-1.2.5.2.dist-info → openmetadata_ingestion-1.3.0.0.dist-info}/entry_points.txt +0 -0
- {openmetadata_ingestion-1.2.5.2.dist-info → openmetadata_ingestion-1.3.0.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Copyright 2021 Collate
|
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
# you may not use this file except in compliance with the License.
|
|
4
|
+
# You may obtain a copy of the License at
|
|
5
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
6
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
7
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
8
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
9
|
+
# See the License for the specific language governing permissions and
|
|
10
|
+
# limitations under the License.
|
|
11
|
+
|
|
12
|
+
"""
|
|
13
|
+
Interfaces with database for all database engine
|
|
14
|
+
supporting sqlalchemy abstraction layer
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
from metadata.profiler.interface.sqlalchemy.profiler_interface import (
|
|
19
|
+
SQAProfilerInterface,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class DatabricksProfilerInterface(SQAProfilerInterface):
|
|
24
|
+
def __init__(self, service_connection_config, **kwargs):
|
|
25
|
+
super().__init__(service_connection_config=service_connection_config, **kwargs)
|
|
26
|
+
self.set_catalog(self.session)
|
|
File without changes
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Copyright 2021 Collate
|
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
# you may not use this file except in compliance with the License.
|
|
4
|
+
# You may obtain a copy of the License at
|
|
5
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
6
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
7
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
8
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
9
|
+
# See the License for the specific language governing permissions and
|
|
10
|
+
# limitations under the License.
|
|
11
|
+
|
|
12
|
+
"""
|
|
13
|
+
Interfaces with database for all database engine
|
|
14
|
+
supporting sqlalchemy abstraction layer
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from metadata.profiler.interface.sqlalchemy.profiler_interface import (
|
|
18
|
+
SQAProfilerInterface,
|
|
19
|
+
)
|
|
20
|
+
from metadata.utils.logger import profiler_interface_registry_logger
|
|
21
|
+
|
|
22
|
+
logger = profiler_interface_registry_logger()
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class DB2ProfilerInterface(SQAProfilerInterface):
|
|
26
|
+
"""
|
|
27
|
+
Interface to interact with registry supporting
|
|
28
|
+
sqlalchemy.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
def _programming_error_static_metric(self, runner, column, exc, session, metrics):
|
|
32
|
+
# pylint: disable=protected-access
|
|
33
|
+
if exc.orig and "overflow" in exc.orig._message:
|
|
34
|
+
logger.info(
|
|
35
|
+
f"Computing metrics without sum for {runner.table.__tablename__}.{column.name}"
|
|
36
|
+
)
|
|
37
|
+
return self._compute_static_metrics_wo_sum(metrics, runner, session, column)
|
|
38
|
+
return None
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Copyright 2021 Collate
|
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
# you may not use this file except in compliance with the License.
|
|
4
|
+
# You may obtain a copy of the License at
|
|
5
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
6
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
7
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
8
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
9
|
+
# See the License for the specific language governing permissions and
|
|
10
|
+
# limitations under the License.
|
|
11
|
+
|
|
12
|
+
"""
|
|
13
|
+
Interfaces with database for all database engine
|
|
14
|
+
supporting sqlalchemy abstraction layer
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from typing import List
|
|
18
|
+
|
|
19
|
+
from sqlalchemy.exc import ProgrammingError
|
|
20
|
+
|
|
21
|
+
from metadata.profiler.interface.sqlalchemy.profiler_interface import (
|
|
22
|
+
SQAProfilerInterface,
|
|
23
|
+
handle_query_exception,
|
|
24
|
+
)
|
|
25
|
+
from metadata.profiler.metrics.registry import Metrics
|
|
26
|
+
from metadata.profiler.processor.runner import QueryRunner
|
|
27
|
+
from metadata.profiler.source.mariadb.metrics.window.first_quartile import (
|
|
28
|
+
MariaDBFirstQuartile,
|
|
29
|
+
)
|
|
30
|
+
from metadata.profiler.source.mariadb.metrics.window.median import MariaDBMedian
|
|
31
|
+
from metadata.profiler.source.mariadb.metrics.window.third_quartile import (
|
|
32
|
+
MariaDBThirdQuartile,
|
|
33
|
+
)
|
|
34
|
+
from metadata.utils.logger import profiler_interface_registry_logger
|
|
35
|
+
|
|
36
|
+
logger = profiler_interface_registry_logger()
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class MariaDBProfilerInterface(SQAProfilerInterface):
|
|
40
|
+
"""
|
|
41
|
+
Interface to interact with registry supporting
|
|
42
|
+
sqlalchemy.
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
def _compute_window_metrics(
|
|
46
|
+
self,
|
|
47
|
+
metrics: List[Metrics],
|
|
48
|
+
runner: QueryRunner,
|
|
49
|
+
*args,
|
|
50
|
+
**kwargs,
|
|
51
|
+
):
|
|
52
|
+
"""Given a list of metrics, compute the given results
|
|
53
|
+
and returns the values
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
column: the column to compute the metrics against
|
|
57
|
+
metrics: list of metrics to compute
|
|
58
|
+
Returns:
|
|
59
|
+
dictionnary of results
|
|
60
|
+
"""
|
|
61
|
+
session = kwargs.get("session")
|
|
62
|
+
column = kwargs.get("column")
|
|
63
|
+
|
|
64
|
+
if not metrics:
|
|
65
|
+
return None
|
|
66
|
+
|
|
67
|
+
try:
|
|
68
|
+
# we patch the metrics at runtime to use the MariaDB specific functions
|
|
69
|
+
# as we can't compile the query based on the dialect as it return `mysql`
|
|
70
|
+
metrics = [MariaDBFirstQuartile, MariaDBMedian, MariaDBThirdQuartile] # type: ignore
|
|
71
|
+
row = runner.select_first_from_sample(
|
|
72
|
+
*[metric(column).fn() for metric in metrics],
|
|
73
|
+
)
|
|
74
|
+
if row:
|
|
75
|
+
return dict(row)
|
|
76
|
+
except ProgrammingError:
|
|
77
|
+
logger.info(
|
|
78
|
+
f"Skipping window metrics for {runner.table.__tablename__}.{column.name} due to overflow"
|
|
79
|
+
)
|
|
80
|
+
return None
|
|
81
|
+
|
|
82
|
+
except Exception as exc:
|
|
83
|
+
msg = f"Error trying to compute profile for {runner.table.__tablename__}.{column.name}: {exc}"
|
|
84
|
+
handle_query_exception(msg, exc, session)
|
|
85
|
+
return None
|
|
@@ -22,26 +22,27 @@ from collections import defaultdict
|
|
|
22
22
|
from datetime import datetime, timezone
|
|
23
23
|
from typing import Dict, List, Optional
|
|
24
24
|
|
|
25
|
-
from sqlalchemy import Column, inspect
|
|
26
|
-
from sqlalchemy.exc import ProgrammingError, ResourceClosedError
|
|
25
|
+
from sqlalchemy import Column, inspect, text
|
|
26
|
+
from sqlalchemy.exc import DBAPIError, ProgrammingError, ResourceClosedError
|
|
27
27
|
from sqlalchemy.orm import scoped_session
|
|
28
28
|
|
|
29
|
-
from metadata.generated.schema.entity.data.table import TableData
|
|
29
|
+
from metadata.generated.schema.entity.data.table import CustomMetricProfile, TableData
|
|
30
|
+
from metadata.generated.schema.tests.customMetric import CustomMetric
|
|
30
31
|
from metadata.ingestion.connections.session import create_and_bind_thread_safe_session
|
|
31
32
|
from metadata.mixins.sqalchemy.sqa_mixin import SQAInterfaceMixin
|
|
33
|
+
from metadata.profiler.api.models import ThreadPoolMetrics
|
|
32
34
|
from metadata.profiler.interface.profiler_interface import ProfilerInterface
|
|
33
35
|
from metadata.profiler.metrics.core import MetricTypes
|
|
34
36
|
from metadata.profiler.metrics.registry import Metrics
|
|
35
37
|
from metadata.profiler.metrics.static.mean import Mean
|
|
36
38
|
from metadata.profiler.metrics.static.stddev import StdDev
|
|
37
39
|
from metadata.profiler.metrics.static.sum import Sum
|
|
38
|
-
from metadata.profiler.orm.functions.
|
|
39
|
-
table_metric_construct_factory,
|
|
40
|
-
)
|
|
40
|
+
from metadata.profiler.orm.functions.table_metric_computer import TableMetricComputer
|
|
41
41
|
from metadata.profiler.orm.registry import Dialects
|
|
42
42
|
from metadata.profiler.processor.runner import QueryRunner
|
|
43
43
|
from metadata.utils.constants import SAMPLE_DATA_DEFAULT_COUNT
|
|
44
44
|
from metadata.utils.custom_thread_pool import CustomThreadPoolExecutor
|
|
45
|
+
from metadata.utils.helpers import is_safe_sql_query
|
|
45
46
|
from metadata.utils.logger import profiler_interface_registry_logger
|
|
46
47
|
|
|
47
48
|
logger = profiler_interface_registry_logger()
|
|
@@ -101,10 +102,11 @@ class SQAProfilerInterface(ProfilerInterface, SQAInterfaceMixin):
|
|
|
101
102
|
)
|
|
102
103
|
|
|
103
104
|
self._table = self._convert_table_to_orm_object(sqa_metadata)
|
|
105
|
+
self.create_session()
|
|
106
|
+
|
|
107
|
+
def create_session(self):
|
|
104
108
|
self.session_factory = self._session_factory()
|
|
105
109
|
self.session = self.session_factory()
|
|
106
|
-
self.set_session_tag(self.session)
|
|
107
|
-
self.set_catalog(self.session)
|
|
108
110
|
|
|
109
111
|
@property
|
|
110
112
|
def table(self):
|
|
@@ -182,12 +184,13 @@ class SQAProfilerInterface(ProfilerInterface, SQAInterfaceMixin):
|
|
|
182
184
|
# pylint: disable=protected-access
|
|
183
185
|
try:
|
|
184
186
|
dialect = runner._session.get_bind().dialect.name
|
|
185
|
-
|
|
187
|
+
table_metric_computer: TableMetricComputer = TableMetricComputer(
|
|
186
188
|
dialect,
|
|
187
189
|
runner=runner,
|
|
188
190
|
metrics=metrics,
|
|
189
191
|
conn_config=self.service_connection_config,
|
|
190
192
|
)
|
|
193
|
+
row = table_metric_computer.compute()
|
|
191
194
|
if row:
|
|
192
195
|
return dict(row)
|
|
193
196
|
return None
|
|
@@ -227,7 +230,7 @@ class SQAProfilerInterface(ProfilerInterface, SQAInterfaceMixin):
|
|
|
227
230
|
],
|
|
228
231
|
)
|
|
229
232
|
return dict(row)
|
|
230
|
-
except ProgrammingError as exc:
|
|
233
|
+
except (ProgrammingError, DBAPIError) as exc:
|
|
231
234
|
return self._programming_error_static_metric(
|
|
232
235
|
runner, column, exc, session, metrics
|
|
233
236
|
)
|
|
@@ -307,6 +310,8 @@ class SQAProfilerInterface(ProfilerInterface, SQAInterfaceMixin):
|
|
|
307
310
|
row = runner.select_first_from_sample(
|
|
308
311
|
*[metric(column).fn() for metric in metrics],
|
|
309
312
|
)
|
|
313
|
+
if row:
|
|
314
|
+
return dict(row)
|
|
310
315
|
except ProgrammingError as exc:
|
|
311
316
|
logger.info(
|
|
312
317
|
f"Skipping metrics for {runner.table.__tablename__}.{column.name} due to {exc}"
|
|
@@ -314,8 +319,43 @@ class SQAProfilerInterface(ProfilerInterface, SQAInterfaceMixin):
|
|
|
314
319
|
except Exception as exc:
|
|
315
320
|
msg = f"Error trying to compute profile for {runner.table.__tablename__}.{column.name}: {exc}"
|
|
316
321
|
handle_query_exception(msg, exc, session)
|
|
317
|
-
|
|
318
|
-
|
|
322
|
+
return None
|
|
323
|
+
|
|
324
|
+
def _compute_custom_metrics(
|
|
325
|
+
self, metrics: List[CustomMetric], runner, session, *args, **kwargs
|
|
326
|
+
):
|
|
327
|
+
"""Compute custom metrics
|
|
328
|
+
|
|
329
|
+
Args:
|
|
330
|
+
metrics (List[Metrics]): list of customMetrics
|
|
331
|
+
runner (_type_): runner
|
|
332
|
+
"""
|
|
333
|
+
if not metrics:
|
|
334
|
+
return None
|
|
335
|
+
|
|
336
|
+
custom_metrics = []
|
|
337
|
+
|
|
338
|
+
for metric in metrics:
|
|
339
|
+
try:
|
|
340
|
+
if not is_safe_sql_query(metric.expression):
|
|
341
|
+
raise RuntimeError(
|
|
342
|
+
f"SQL expression is not safe\n\n{metric.expression}"
|
|
343
|
+
)
|
|
344
|
+
|
|
345
|
+
crs = session.execute(text(metric.expression))
|
|
346
|
+
row = (
|
|
347
|
+
crs.scalar()
|
|
348
|
+
) # raise MultipleResultsFound if more than one row is returned
|
|
349
|
+
custom_metrics.append(
|
|
350
|
+
CustomMetricProfile(name=metric.name.__root__, value=row)
|
|
351
|
+
)
|
|
352
|
+
|
|
353
|
+
except Exception as exc:
|
|
354
|
+
msg = f"Error trying to compute profile for {runner.table.__tablename__}.{metric.columnName}: {exc}"
|
|
355
|
+
logger.debug(traceback.format_exc())
|
|
356
|
+
logger.warning(msg)
|
|
357
|
+
if custom_metrics:
|
|
358
|
+
return {"customMetrics": custom_metrics}
|
|
319
359
|
return None
|
|
320
360
|
|
|
321
361
|
def _compute_system_metrics(
|
|
@@ -372,18 +412,17 @@ class SQAProfilerInterface(ProfilerInterface, SQAInterfaceMixin):
|
|
|
372
412
|
partition_details=self.partition_details,
|
|
373
413
|
profile_sample_query=self.profile_query,
|
|
374
414
|
)
|
|
415
|
+
return thread_local.runner
|
|
416
|
+
thread_local.runner._sample = sample # pylint: disable=protected-access
|
|
375
417
|
return thread_local.runner
|
|
376
418
|
|
|
377
419
|
def compute_metrics_in_thread(
|
|
378
420
|
self,
|
|
379
|
-
|
|
380
|
-
metric_type,
|
|
381
|
-
column,
|
|
382
|
-
table,
|
|
421
|
+
metric_func: ThreadPoolMetrics,
|
|
383
422
|
):
|
|
384
423
|
"""Run metrics in processor worker"""
|
|
385
424
|
logger.debug(
|
|
386
|
-
f"Running profiler for {table.__tablename__} on thread {threading.current_thread()}"
|
|
425
|
+
f"Running profiler for {metric_func.table.__tablename__} on thread {threading.current_thread()}"
|
|
387
426
|
)
|
|
388
427
|
Session = self.session_factory # pylint: disable=invalid-name
|
|
389
428
|
with Session() as session:
|
|
@@ -391,36 +430,40 @@ class SQAProfilerInterface(ProfilerInterface, SQAInterfaceMixin):
|
|
|
391
430
|
self.set_catalog(session)
|
|
392
431
|
sampler = self._create_thread_safe_sampler(
|
|
393
432
|
session,
|
|
394
|
-
table,
|
|
433
|
+
metric_func.table,
|
|
395
434
|
)
|
|
396
|
-
sample = sampler.random_sample()
|
|
435
|
+
sample = sampler.random_sample(metric_func.column)
|
|
397
436
|
runner = self._create_thread_safe_runner(
|
|
398
437
|
session,
|
|
399
|
-
table,
|
|
438
|
+
metric_func.table,
|
|
400
439
|
sample,
|
|
401
440
|
)
|
|
402
441
|
row = None
|
|
403
442
|
|
|
404
443
|
try:
|
|
405
|
-
row = self._get_metric_fn[metric_type.value](
|
|
406
|
-
metrics,
|
|
444
|
+
row = self._get_metric_fn[metric_func.metric_type.value](
|
|
445
|
+
metric_func.metrics,
|
|
407
446
|
runner=runner,
|
|
408
447
|
session=session,
|
|
409
|
-
column=column,
|
|
448
|
+
column=metric_func.column,
|
|
410
449
|
sample=sample,
|
|
411
450
|
)
|
|
412
451
|
except Exception as exc:
|
|
413
|
-
error =
|
|
452
|
+
error = (
|
|
453
|
+
f"{metric_func.column if metric_func.column is not None else metric_func.table.__tablename__} "
|
|
454
|
+
f"metric_type.value: {exc}"
|
|
455
|
+
)
|
|
414
456
|
logger.error(error)
|
|
415
457
|
self.status.failed_profiler(error, traceback.format_exc())
|
|
416
458
|
|
|
417
|
-
if column is not None:
|
|
418
|
-
column = column.name
|
|
419
|
-
self.status.scanned(f"{table.__tablename__}.{column}")
|
|
459
|
+
if metric_func.column is not None:
|
|
460
|
+
column = metric_func.column.name
|
|
461
|
+
self.status.scanned(f"{metric_func.table.__tablename__}.{column}")
|
|
420
462
|
else:
|
|
421
|
-
self.status.scanned(table.__tablename__)
|
|
463
|
+
self.status.scanned(metric_func.table.__tablename__)
|
|
464
|
+
column = None
|
|
422
465
|
|
|
423
|
-
return row, column, metric_type.value
|
|
466
|
+
return row, column, metric_func.metric_type.value
|
|
424
467
|
|
|
425
468
|
# pylint: disable=use-dict-literal
|
|
426
469
|
def get_all_metrics(
|
|
@@ -434,7 +477,7 @@ class SQAProfilerInterface(ProfilerInterface, SQAInterfaceMixin):
|
|
|
434
477
|
futures = [
|
|
435
478
|
pool.submit(
|
|
436
479
|
self.compute_metrics_in_thread,
|
|
437
|
-
|
|
480
|
+
metric_func,
|
|
438
481
|
)
|
|
439
482
|
for metric_func in metric_funcs
|
|
440
483
|
]
|
|
@@ -455,6 +498,8 @@ class SQAProfilerInterface(ProfilerInterface, SQAInterfaceMixin):
|
|
|
455
498
|
profile_results["table"].update(profile)
|
|
456
499
|
elif metric_type == MetricTypes.System.value:
|
|
457
500
|
profile_results["system"] = profile
|
|
501
|
+
elif metric_type == MetricTypes.Custom.value and column is None:
|
|
502
|
+
profile_results["table"].update(profile)
|
|
458
503
|
else:
|
|
459
504
|
profile_results["columns"][column].update(
|
|
460
505
|
{
|
|
@@ -521,7 +566,7 @@ class SQAProfilerInterface(ProfilerInterface, SQAInterfaceMixin):
|
|
|
521
566
|
dictionnary of results
|
|
522
567
|
"""
|
|
523
568
|
sampler = self._get_sampler(table=kwargs.get("table"))
|
|
524
|
-
sample = sampler.random_sample()
|
|
569
|
+
sample = sampler.random_sample(column)
|
|
525
570
|
try:
|
|
526
571
|
return metric(column).fn(sample, column_results, self.session)
|
|
527
572
|
except Exception as exc:
|
|
@@ -534,9 +579,7 @@ class SQAProfilerInterface(ProfilerInterface, SQAInterfaceMixin):
|
|
|
534
579
|
"""
|
|
535
580
|
Override Programming Error for Static Metrics
|
|
536
581
|
"""
|
|
537
|
-
|
|
538
|
-
f"Skipping metrics due to {exc} for {runner.table.__tablename__}.{column.name}"
|
|
539
|
-
)
|
|
582
|
+
raise exc
|
|
540
583
|
|
|
541
584
|
def get_columns(self):
|
|
542
585
|
"""get columns from entity"""
|
|
@@ -72,6 +72,8 @@ class SingleStoreProfilerInterface(SQAProfilerInterface):
|
|
|
72
72
|
row = runner.select_first_from_sample(
|
|
73
73
|
*[metric(column).fn() for metric in metrics],
|
|
74
74
|
)
|
|
75
|
+
if row:
|
|
76
|
+
return dict(row)
|
|
75
77
|
except ProgrammingError:
|
|
76
78
|
logger.info(
|
|
77
79
|
f"Skipping window metrics for {runner.table.__tablename__}.{column.name} due to overflow"
|
|
@@ -81,6 +83,4 @@ class SingleStoreProfilerInterface(SQAProfilerInterface):
|
|
|
81
83
|
except Exception as exc:
|
|
82
84
|
msg = f"Error trying to compute profile for {runner.table.__tablename__}.{column.name}: {exc}"
|
|
83
85
|
handle_query_exception(msg, exc, session)
|
|
84
|
-
if row:
|
|
85
|
-
return dict(row)
|
|
86
86
|
return None
|
|
@@ -29,6 +29,13 @@ class SnowflakeProfilerInterface(SQAProfilerInterface):
|
|
|
29
29
|
sqlalchemy.
|
|
30
30
|
"""
|
|
31
31
|
|
|
32
|
+
def __init__(self, *args, **kwargs):
|
|
33
|
+
super().__init__(*args, **kwargs)
|
|
34
|
+
|
|
35
|
+
def create_session(self):
|
|
36
|
+
super().create_session()
|
|
37
|
+
self.set_session_tag(self.session)
|
|
38
|
+
|
|
32
39
|
def _programming_error_static_metric(self, runner, column, exc, session, metrics):
|
|
33
40
|
if exc.orig and exc.orig.errno in OVERFLOW_ERROR_CODES.get(
|
|
34
41
|
session.bind.dialect.name
|
|
@@ -67,6 +67,8 @@ class TrinoProfilerInterface(SQAProfilerInterface):
|
|
|
67
67
|
row = runner.select_first_from_sample(
|
|
68
68
|
*[metric(column).fn() for metric in metrics], **runner_kwargs
|
|
69
69
|
)
|
|
70
|
+
if row:
|
|
71
|
+
return dict(row)
|
|
70
72
|
except ProgrammingError as err:
|
|
71
73
|
logger.info(
|
|
72
74
|
f"Skipping window metrics for {runner.table.__tablename__}.{column.name} due to {err}"
|
|
@@ -76,6 +78,4 @@ class TrinoProfilerInterface(SQAProfilerInterface):
|
|
|
76
78
|
except Exception as exc:
|
|
77
79
|
msg = f"Error trying to compute profile for {runner.table.__tablename__}.{column.name}: {exc}"
|
|
78
80
|
handle_query_exception(msg, exc, session)
|
|
79
|
-
if row:
|
|
80
|
-
return dict(row)
|
|
81
81
|
return None
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Copyright 2021 Collate
|
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
# you may not use this file except in compliance with the License.
|
|
4
|
+
# You may obtain a copy of the License at
|
|
5
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
6
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
7
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
8
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
9
|
+
# See the License for the specific language governing permissions and
|
|
10
|
+
# limitations under the License.
|
|
11
|
+
|
|
12
|
+
"""
|
|
13
|
+
Interfaces with database for all database engine
|
|
14
|
+
supporting sqlalchemy abstraction layer
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
from metadata.ingestion.source.database.databricks.connection import (
|
|
19
|
+
get_connection as databricks_get_connection,
|
|
20
|
+
)
|
|
21
|
+
from metadata.profiler.interface.sqlalchemy.profiler_interface import (
|
|
22
|
+
SQAProfilerInterface,
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class UnityCatalogProfilerInterface(SQAProfilerInterface):
|
|
27
|
+
def __init__(self, service_connection_config, **kwargs):
|
|
28
|
+
super().__init__(service_connection_config=service_connection_config, **kwargs)
|
|
29
|
+
|
|
30
|
+
def create_session(self):
|
|
31
|
+
self.connection = databricks_get_connection(self.service_connection_config)
|
|
32
|
+
super().create_session()
|
|
33
|
+
self.set_catalog(self.session)
|
|
@@ -51,7 +51,7 @@ class NullRatio(ComposedMetric):
|
|
|
51
51
|
res_count = res.get(Count.name())
|
|
52
52
|
res_null = res.get(NullCount.name())
|
|
53
53
|
|
|
54
|
-
if res_count and res_null is not None:
|
|
54
|
+
if res_count is not None and res_null is not None:
|
|
55
55
|
return res_null / (res_null + res_count)
|
|
56
56
|
|
|
57
57
|
return None
|
|
@@ -90,6 +90,9 @@ class Max(StaticMetric):
|
|
|
90
90
|
|
|
91
91
|
def df_fn(self, dfs=None):
|
|
92
92
|
"""pandas function"""
|
|
93
|
-
if is_quantifiable(self.col.type)
|
|
93
|
+
if is_quantifiable(self.col.type):
|
|
94
94
|
return max((df[self.col.name].max() for df in dfs))
|
|
95
|
+
if is_date_time(self.col.type):
|
|
96
|
+
max_ = max((df[self.col.name].max() for df in dfs))
|
|
97
|
+
return int(max_.timestamp() * 1000)
|
|
95
98
|
return 0
|
|
@@ -90,6 +90,9 @@ class Min(StaticMetric):
|
|
|
90
90
|
|
|
91
91
|
def df_fn(self, dfs=None):
|
|
92
92
|
"""pandas function"""
|
|
93
|
-
if is_quantifiable(self.col.type)
|
|
93
|
+
if is_quantifiable(self.col.type):
|
|
94
94
|
return min((df[self.col.name].min() for df in dfs))
|
|
95
|
+
if is_date_time(self.col.type):
|
|
96
|
+
min_ = min((df[self.col.name].min() for df in dfs))
|
|
97
|
+
return int(min_.timestamp() * 1000)
|
|
95
98
|
return 0
|
|
@@ -15,10 +15,13 @@ Snowflake System Metric Queries and query operations
|
|
|
15
15
|
|
|
16
16
|
import re
|
|
17
17
|
import traceback
|
|
18
|
-
from typing import Optional
|
|
18
|
+
from typing import Optional, Tuple
|
|
19
19
|
|
|
20
20
|
from sqlalchemy.engine.row import Row
|
|
21
21
|
|
|
22
|
+
from metadata.generated.schema.entity.services.databaseService import DatabaseService
|
|
23
|
+
from metadata.ingestion.lineage.sql_lineage import search_table_entities
|
|
24
|
+
from metadata.ingestion.ometa.ometa_api import OpenMetadata
|
|
22
25
|
from metadata.utils.logger import profiler_logger
|
|
23
26
|
from metadata.utils.profiler_utils import (
|
|
24
27
|
SnowflakeQueryResult,
|
|
@@ -55,20 +58,92 @@ RESULT_SCAN = """
|
|
|
55
58
|
"""
|
|
56
59
|
|
|
57
60
|
|
|
61
|
+
QUERY_PATTERN = r"(?:(INSERT\s*INTO\s*|INSERT\s*OVERWRITE\s*INTO\s*|UPDATE\s*|MERGE\s*INTO\s*|DELETE\s*FROM\s*))([\w._\"\'()]+)(?=[\s*\n])" # pylint: disable=line-too-long
|
|
62
|
+
IDENTIFIER_PATTERN = r"(IDENTIFIER\(\')([\w._\"]+)(\'\))"
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def _parse_query(query: str) -> Optional[str]:
|
|
66
|
+
"""Parse snowflake queries to extract the identifiers"""
|
|
67
|
+
match = re.match(QUERY_PATTERN, query, re.IGNORECASE)
|
|
68
|
+
try:
|
|
69
|
+
# This will match results like `DATABASE.SCHEMA.TABLE1` or IDENTIFIER('TABLE1')
|
|
70
|
+
# If we have `IDENTIFIER` type of queries coming from Stored Procedures, we'll need to further clean it up.
|
|
71
|
+
identifier = match.group(2)
|
|
72
|
+
|
|
73
|
+
match_internal_identifier = re.match(
|
|
74
|
+
IDENTIFIER_PATTERN, identifier, re.IGNORECASE
|
|
75
|
+
)
|
|
76
|
+
internal_identifier = (
|
|
77
|
+
match_internal_identifier.group(2) if match_internal_identifier else None
|
|
78
|
+
)
|
|
79
|
+
if internal_identifier:
|
|
80
|
+
return internal_identifier
|
|
81
|
+
|
|
82
|
+
return identifier
|
|
83
|
+
except (IndexError, AttributeError):
|
|
84
|
+
logger.debug("Could not find identifier in query. Skipping row.")
|
|
85
|
+
return None
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def get_identifiers(
|
|
89
|
+
identifier: str, ometa_client: OpenMetadata, db_service: DatabaseService
|
|
90
|
+
) -> Tuple[Optional[str], Optional[str], Optional[str]]:
|
|
91
|
+
"""Get query identifiers and if needed, fetch them from ES"""
|
|
92
|
+
database_name, schema_name, table_name = get_identifiers_from_string(identifier)
|
|
93
|
+
|
|
94
|
+
if not table_name:
|
|
95
|
+
logger.debug("Could not extract the table name. Skipping operation.")
|
|
96
|
+
return database_name, schema_name, table_name
|
|
97
|
+
|
|
98
|
+
if not all([database_name, schema_name]):
|
|
99
|
+
logger.debug(
|
|
100
|
+
"Missing database or schema info from the query. We'll look for it in ES."
|
|
101
|
+
)
|
|
102
|
+
es_tables = search_table_entities(
|
|
103
|
+
metadata=ometa_client,
|
|
104
|
+
service_name=db_service.fullyQualifiedName.__root__,
|
|
105
|
+
database=database_name,
|
|
106
|
+
database_schema=schema_name,
|
|
107
|
+
table=table_name,
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
if not es_tables:
|
|
111
|
+
logger.debug("No tables match the search criteria.")
|
|
112
|
+
return database_name, schema_name, table_name
|
|
113
|
+
|
|
114
|
+
if len(es_tables) > 1:
|
|
115
|
+
logger.debug(
|
|
116
|
+
"Found more than 1 table matching the search criteria."
|
|
117
|
+
" Skipping the computation to not mix system data."
|
|
118
|
+
)
|
|
119
|
+
return database_name, schema_name, table_name
|
|
120
|
+
|
|
121
|
+
matched_table = es_tables[0]
|
|
122
|
+
database_name = matched_table.database.name
|
|
123
|
+
schema_name = matched_table.databaseSchema.name
|
|
124
|
+
|
|
125
|
+
return database_name, schema_name, table_name
|
|
126
|
+
|
|
127
|
+
|
|
58
128
|
def get_snowflake_system_queries(
|
|
59
|
-
row: Row,
|
|
129
|
+
row: Row,
|
|
130
|
+
database: str,
|
|
131
|
+
schema: str,
|
|
132
|
+
ometa_client: OpenMetadata,
|
|
133
|
+
db_service: DatabaseService,
|
|
60
134
|
) -> Optional[SnowflakeQueryResult]:
|
|
61
|
-
"""
|
|
62
|
-
|
|
63
|
-
fails we'll fall back to regex lookup
|
|
135
|
+
"""
|
|
136
|
+
Run a regex lookup on the query to identify which operation ran against the table.
|
|
64
137
|
|
|
65
|
-
|
|
66
|
-
|
|
138
|
+
If the query does not have the complete set of `database.schema.table` when it runs,
|
|
139
|
+
we'll use ES to pick up the table, if we find it.
|
|
67
140
|
|
|
68
141
|
Args:
|
|
69
142
|
row (dict): row from the snowflake system queries table
|
|
70
143
|
database (str): database name
|
|
71
144
|
schema (str): schema name
|
|
145
|
+
ometa_client (OpenMetadata): OpenMetadata client to search against ES
|
|
146
|
+
db_service (DatabaseService): DB service where the process is running against
|
|
72
147
|
Returns:
|
|
73
148
|
QueryResult: namedtuple with the query result
|
|
74
149
|
"""
|
|
@@ -78,20 +153,17 @@ def get_snowflake_system_queries(
|
|
|
78
153
|
query_text = dict_row.get("QUERY_TEXT", dict_row.get("query_text"))
|
|
79
154
|
logger.debug(f"Trying to parse query:\n{query_text}\n")
|
|
80
155
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
try:
|
|
84
|
-
identifier = match.group(2)
|
|
85
|
-
except (IndexError, AttributeError):
|
|
86
|
-
logger.debug("Could not find identifier in query. Skipping row.")
|
|
156
|
+
identifier = _parse_query(query_text)
|
|
157
|
+
if not identifier:
|
|
87
158
|
return None
|
|
88
159
|
|
|
89
|
-
database_name, schema_name, table_name =
|
|
160
|
+
database_name, schema_name, table_name = get_identifiers(
|
|
161
|
+
identifier=identifier,
|
|
162
|
+
ometa_client=ometa_client,
|
|
163
|
+
db_service=db_service,
|
|
164
|
+
)
|
|
90
165
|
|
|
91
166
|
if not all([database_name, schema_name, table_name]):
|
|
92
|
-
logger.debug(
|
|
93
|
-
"Missing database, schema, or table. Can't link operation to table entity in OpenMetadata."
|
|
94
|
-
)
|
|
95
167
|
return None
|
|
96
168
|
|
|
97
169
|
if (
|