openmetadata-ingestion 1.2.4.0__py3-none-any.whl → 1.3.2.0rc1__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 +7 -3
- metadata/clients/aws_client.py +4 -0
- metadata/clients/azure_client.py +85 -0
- metadata/clients/domo_client.py +0 -2
- metadata/cmd.py +24 -13
- metadata/data_insight/processor/reports/cost_analysis_report_data_processor.py +40 -48
- metadata/data_insight/processor/reports/data_processor.py +1 -0
- 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/producer/cost_analysis_producer.py +78 -14
- metadata/data_insight/producer/entity_producer.py +1 -1
- metadata/data_insight/producer/producer_interface.py +1 -1
- metadata/data_insight/producer/web_analytics_producer.py +1 -1
- metadata/data_insight/source/metadata.py +21 -5
- 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 +10 -4
- 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/data_quality/validations/table/base/tableColumnToMatchSet.py +2 -1
- metadata/data_quality/validations/table/pandas/tableColumnToMatchSet.py +2 -1
- metadata/data_quality/validations/table/sqlalchemy/tableColumnToMatchSet.py +7 -2
- metadata/examples/workflows/bigtable.yaml +32 -0
- metadata/examples/workflows/databricks.yaml +0 -1
- metadata/examples/workflows/datalake_azure_default.yaml +29 -0
- 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 +425 -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 +2 -2
- 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 +7 -12
- 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 +5 -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 +2 -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 +32 -0
- metadata/generated/schema/configuration/authConfig.py +1 -1
- metadata/generated/schema/configuration/authenticationConfiguration.py +13 -2
- metadata/generated/schema/configuration/authorizerConfiguration.py +1 -1
- metadata/generated/schema/configuration/changeEventConfiguration.py +1 -1
- metadata/generated/schema/configuration/dataQualityConfiguration.py +16 -0
- 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 +24 -5
- metadata/generated/schema/entity/applications/appRunRecord.py +2 -7
- 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} +14 -4
- 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 +2 -2
- 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 +17 -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 +35 -2
- metadata/generated/schema/entity/services/connections/database/bigQueryConnection.py +2 -2
- metadata/generated/schema/entity/services/connections/database/bigTableConnection.py +41 -0
- 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/azureConfig.py +20 -0
- 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 +8 -4
- metadata/generated/schema/entity/services/connections/database/oracleConnection.py +2 -2
- metadata/generated/schema/entity/services/connections/database/pinotDBConnection.py +9 -7
- metadata/generated/schema/entity/services/connections/database/postgresConnection.py +8 -4
- 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/sapHana/__init__.py +3 -0
- metadata/generated/schema/entity/services/connections/database/sapHana/sapHanaHDBConnection.py +20 -0
- metadata/generated/schema/entity/services/connections/database/sapHana/sapHanaSQLConnection.py +36 -0
- metadata/generated/schema/entity/services/connections/database/sapHanaConnection.py +7 -41
- 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 +14 -2
- 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 +14 -2
- 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 +2 -2
- 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 +16 -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 +4 -19
- 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 +91 -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 +11 -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/oidcClientConfig.py +46 -0
- 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 +21 -9
- 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 +7 -3
- metadata/generated/schema/security/credentials/gcpExternalAccount.py +37 -0
- metadata/generated/schema/security/credentials/gcpValues.py +2 -2
- 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 +4 -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/system/validationResponse.py +43 -0
- 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 +6 -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 +10 -6
- 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/customProperties/__init__.py +3 -0
- metadata/generated/schema/type/customProperties/enumConfig.py +17 -0
- metadata/generated/schema/type/customProperty.py +52 -0
- 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 +12 -20
- 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 +34 -1
- metadata/ingestion/api/topology_runner.py +117 -168
- metadata/ingestion/bulksink/metadata_usage.py +11 -5
- metadata/ingestion/lineage/models.py +4 -0
- metadata/ingestion/lineage/parser.py +28 -12
- metadata/ingestion/lineage/sql_lineage.py +9 -17
- metadata/ingestion/models/custom_properties.py +0 -1
- metadata/ingestion/models/custom_pydantic.py +4 -2
- metadata/ingestion/models/lf_tags_model.py +33 -0
- metadata/ingestion/models/patch_request.py +160 -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/client.py +12 -3
- metadata/ingestion/ometa/mixins/custom_property_mixin.py +11 -11
- metadata/ingestion/ometa/mixins/es_mixin.py +17 -0
- metadata/ingestion/ometa/mixins/patch_mixin.py +21 -72
- 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 +19 -26
- metadata/ingestion/ometa/routes.py +7 -0
- metadata/ingestion/processor/query_parser.py +9 -2
- metadata/ingestion/sink/metadata_rest.py +29 -8
- 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 +41 -29
- metadata/ingestion/source/dashboard/looker/utils.py +4 -2
- metadata/ingestion/source/dashboard/metabase/client.py +4 -0
- metadata/ingestion/source/dashboard/metabase/metadata.py +28 -10
- metadata/ingestion/source/dashboard/metabase/models.py +2 -2
- 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/client.py +4 -1
- 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 -11
- 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 +76 -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/connection.py +21 -3
- metadata/ingestion/source/database/azuresql/metadata.py +0 -1
- metadata/ingestion/source/database/bigquery/connection.py +24 -3
- metadata/ingestion/source/database/bigquery/helper.py +68 -1
- metadata/ingestion/source/database/bigquery/metadata.py +49 -28
- metadata/ingestion/source/database/bigquery/queries.py +33 -4
- metadata/ingestion/source/database/bigquery/query_parser.py +13 -0
- metadata/ingestion/source/database/bigquery/usage.py +1 -3
- metadata/ingestion/source/database/bigtable/client.py +62 -0
- metadata/ingestion/source/database/bigtable/connection.py +116 -0
- metadata/ingestion/source/database/bigtable/metadata.py +224 -0
- metadata/ingestion/source/database/bigtable/models.py +60 -0
- 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 +33 -8
- metadata/ingestion/source/database/common_nosql_source.py +27 -6
- metadata/ingestion/source/database/database_service.py +89 -7
- metadata/ingestion/source/database/databricks/client.py +55 -103
- 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 +534 -11
- metadata/ingestion/source/database/databricks/queries.py +27 -0
- metadata/ingestion/source/database/databricks/query_parser.py +5 -1
- metadata/ingestion/source/database/databricks/usage.py +3 -3
- metadata/ingestion/source/database/datalake/connection.py +33 -18
- metadata/ingestion/source/database/datalake/metadata.py +113 -27
- metadata/ingestion/source/database/dbt/dbt_config.py +7 -14
- 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 +27 -53
- 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 +3 -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 +178 -1
- metadata/ingestion/source/database/mssql/usage.py +5 -1
- metadata/ingestion/source/database/mssql/utils.py +207 -4
- metadata/ingestion/source/database/mysql/connection.py +14 -0
- 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 +99 -18
- metadata/ingestion/source/database/oracle/utils.py +0 -1
- metadata/ingestion/source/database/postgres/connection.py +15 -0
- 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 +34 -48
- metadata/ingestion/source/database/snowflake/models.py +6 -1
- metadata/ingestion/source/database/snowflake/queries.py +6 -4
- metadata/ingestion/source/database/snowflake/query_parser.py +5 -20
- metadata/ingestion/source/database/snowflake/utils.py +23 -8
- 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 +15 -11
- metadata/ingestion/source/messaging/kafka/connection.py +45 -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/mlmodel/sagemaker/metadata.py +20 -8
- 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/connection.py +1 -5
- metadata/ingestion/source/pipeline/databrickspipeline/metadata.py +14 -11
- 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/pii/scanners/ner_scanner.py +5 -3
- metadata/profiler/api/models.py +19 -1
- metadata/profiler/interface/pandas/profiler_interface.py +59 -18
- metadata/profiler/interface/profiler_interface.py +14 -4
- 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/conn_test.py +1 -0
- metadata/profiler/orm/functions/length.py +1 -0
- metadata/profiler/orm/functions/median.py +9 -1
- metadata/profiler/orm/functions/sum.py +1 -0
- metadata/profiler/orm/functions/table_metric_computer.py +462 -0
- metadata/profiler/orm/registry.py +2 -0
- metadata/profiler/processor/core.py +129 -62
- metadata/profiler/processor/default.py +14 -3
- metadata/profiler/processor/handle_partition.py +2 -2
- metadata/profiler/processor/processor.py +10 -7
- metadata/profiler/processor/sample_data_handler.py +6 -2
- 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/databricks/profiler_source.py +36 -0
- 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 +49 -10
- metadata/profiler/source/metadata_ext.py +16 -50
- metadata/profiler/source/profiler_source_factory.py +8 -0
- 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/credentials.py +36 -19
- metadata/utils/datalake/datalake_utils.py +369 -129
- metadata/utils/entity_link.py +26 -6
- metadata/utils/execution_time_tracker.py +199 -0
- metadata/utils/filters.py +4 -0
- metadata/utils/fqn.py +20 -0
- metadata/utils/helpers.py +34 -39
- 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/aws_based_secrets_manager.py +67 -4
- metadata/utils/secrets/aws_secrets_manager.py +7 -2
- metadata/utils/secrets/aws_ssm_secrets_manager.py +7 -2
- metadata/utils/secrets/azure_kv_secrets_manager.py +132 -0
- metadata/utils/secrets/{noop_secrets_manager.py → db_secrets_manager.py} +4 -3
- metadata/utils/secrets/external_secrets_manager.py +25 -3
- metadata/utils/secrets/secrets_manager_factory.py +15 -33
- 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 -14
- 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 +88 -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 +226 -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.2.0rc1.dist-info/METADATA +758 -0
- {openmetadata_ingestion-1.2.4.0.dist-info → openmetadata_ingestion-1.3.2.0rc1.dist-info}/RECORD +870 -762
- {openmetadata_ingestion-1.2.4.0.dist-info → openmetadata_ingestion-1.3.2.0rc1.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
- metadata/utils/secrets/client/loader.py +0 -78
- openmetadata_ingestion-1.2.4.0.dist-info/METADATA +0 -429
- /metadata/examples/workflows/{datalake_azure.yaml → datalake_azure_client_secret.yaml} +0 -0
- /metadata/ingestion/source/{database/databricks/legacy → dashboard/mstr}/__init__.py +0 -0
- /metadata/ingestion/source/database/{databricks/unity_catalog → bigtable}/__init__.py +0 -0
- /metadata/ingestion/source/{metadata/metadata_elasticsearch → database/doris}/__init__.py +0 -0
- /metadata/{utils/secrets/client → ingestion/source/database/sas}/__init__.py +0 -0
- /metadata/ingestion/source/database/{databricks → unitycatalog}/models.py +0 -0
- {openmetadata_ingestion-1.2.4.0.dist-info → openmetadata_ingestion-1.3.2.0rc1.dist-info}/LICENSE +0 -0
- {openmetadata_ingestion-1.2.4.0.dist-info → openmetadata_ingestion-1.3.2.0rc1.dist-info}/entry_points.txt +0 -0
- {openmetadata_ingestion-1.2.4.0.dist-info → openmetadata_ingestion-1.3.2.0rc1.dist-info}/top_level.txt +0 -0
|
@@ -13,14 +13,12 @@ Mixin to be used by service sources to dynamically
|
|
|
13
13
|
generate the _run based on their topology.
|
|
14
14
|
"""
|
|
15
15
|
import traceback
|
|
16
|
+
from collections import defaultdict
|
|
16
17
|
from functools import singledispatchmethod
|
|
17
|
-
from typing import Any,
|
|
18
|
+
from typing import Any, Generic, Iterable, List, Type, TypeVar
|
|
18
19
|
|
|
19
20
|
from pydantic import BaseModel
|
|
20
21
|
|
|
21
|
-
from metadata.generated.schema.api.data.createStoredProcedure import (
|
|
22
|
-
CreateStoredProcedureRequest,
|
|
23
|
-
)
|
|
24
22
|
from metadata.generated.schema.api.lineage.addLineage import AddLineageRequest
|
|
25
23
|
from metadata.generated.schema.entity.data.database import Database
|
|
26
24
|
from metadata.generated.schema.entity.data.databaseSchema import DatabaseSchema
|
|
@@ -34,25 +32,18 @@ from metadata.ingestion.models.topology import (
|
|
|
34
32
|
ServiceTopology,
|
|
35
33
|
TopologyContext,
|
|
36
34
|
TopologyNode,
|
|
37
|
-
get_ctx_default,
|
|
38
35
|
get_topology_node,
|
|
39
36
|
get_topology_root,
|
|
40
37
|
)
|
|
41
38
|
from metadata.ingestion.ometa.ometa_api import OpenMetadata
|
|
42
39
|
from metadata.ingestion.ometa.utils import model_str
|
|
43
|
-
from metadata.utils import fqn
|
|
44
40
|
from metadata.utils.logger import ingestion_logger
|
|
45
|
-
from metadata.utils.
|
|
46
|
-
SOURCE_HASH_EXCLUDE_FIELDS,
|
|
47
|
-
generate_source_hash,
|
|
48
|
-
)
|
|
41
|
+
from metadata.utils.source_hash import generate_source_hash
|
|
49
42
|
|
|
50
43
|
logger = ingestion_logger()
|
|
51
44
|
|
|
52
45
|
C = TypeVar("C", bound=BaseModel)
|
|
53
46
|
|
|
54
|
-
CACHED_ENTITIES = "cached_entities"
|
|
55
|
-
|
|
56
47
|
|
|
57
48
|
class MissingExpectedEntityAckException(Exception):
|
|
58
49
|
"""
|
|
@@ -71,6 +62,9 @@ class TopologyRunnerMixin(Generic[C]):
|
|
|
71
62
|
context: TopologyContext
|
|
72
63
|
metadata: OpenMetadata
|
|
73
64
|
|
|
65
|
+
# The cache will have the shape {`child_stage.type_`: {`name`: `hash`}}
|
|
66
|
+
cache = defaultdict(dict)
|
|
67
|
+
|
|
74
68
|
def process_nodes(self, nodes: List[TopologyNode]) -> Iterable[Entity]:
|
|
75
69
|
"""
|
|
76
70
|
Given a list of nodes, either roots or children,
|
|
@@ -78,78 +72,116 @@ class TopologyRunnerMixin(Generic[C]):
|
|
|
78
72
|
|
|
79
73
|
The execution tree is created in a depth-first fashion.
|
|
80
74
|
|
|
75
|
+
Note that this is used to handle the metadata ingestion for all our services. Therefore,
|
|
76
|
+
the first Node is always expected to be a Service. This is important because:
|
|
77
|
+
- Services (root Nodes) are flagged with `overwrite=False` -> In `yield_and_update_context` if
|
|
78
|
+
the stage is flagged as `overwrite=False`, we won't send any PUT/PATCH request to the API if
|
|
79
|
+
the service already exists.
|
|
80
|
+
- Then, when we iterate over Services' children (databases, pipelines, dashboards,...), we will
|
|
81
|
+
initialize a cache listing its children. This is used to to compare the fingerprint of the
|
|
82
|
+
stored entity vs. incoming entity and see if we need to:
|
|
83
|
+
1. Create a new entity (PUT) - if no fingerprint is found for the given name
|
|
84
|
+
2. Update some fields from the entity (PATCH) - if there's a fingerprint mismatch
|
|
85
|
+
3. Do nothing - if the fingerprints are the same.
|
|
86
|
+
|
|
87
|
+
The fingerprint is stored in the db in the field `sourceHash` in each entity.
|
|
88
|
+
|
|
81
89
|
:param nodes: Topology Nodes to process
|
|
82
90
|
:return: recursively build the execution tree
|
|
83
91
|
"""
|
|
84
92
|
for node in nodes:
|
|
85
93
|
logger.debug(f"Processing node {node}")
|
|
86
94
|
node_producer = getattr(self, node.producer)
|
|
87
|
-
child_nodes = (
|
|
88
|
-
[get_topology_node(child, self.topology) for child in node.children]
|
|
89
|
-
if node.children
|
|
90
|
-
else []
|
|
91
|
-
)
|
|
95
|
+
child_nodes = self._get_child_nodes(node)
|
|
92
96
|
|
|
93
|
-
|
|
97
|
+
# Each node producer will give us a list of entities that we need
|
|
98
|
+
# to process. Each of the internal stages will sink result to OM API.
|
|
99
|
+
# E.g., in the DB topology, at the Table TopologyNode, the node_entity
|
|
100
|
+
# will be each `table`
|
|
101
|
+
for node_entity in node_producer() or []:
|
|
94
102
|
for stage in node.stages:
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
# yield and make sure the data is updated
|
|
101
|
-
yield from self.sink_request(
|
|
102
|
-
stage=stage, entity_request=entity_request
|
|
103
|
-
)
|
|
104
|
-
except ValueError as err:
|
|
105
|
-
logger.debug(traceback.format_exc())
|
|
106
|
-
logger.warning(
|
|
107
|
-
f"Unexpected value error when processing stage: [{stage}]: {err}"
|
|
108
|
-
)
|
|
109
|
-
|
|
110
|
-
# init the cache dict
|
|
111
|
-
if stage.cache_entities:
|
|
112
|
-
self._init_cache_dict(stage=stage, child_nodes=child_nodes)
|
|
113
|
-
|
|
114
|
-
# processing for all stages completed now cleaning the cache if applicable
|
|
103
|
+
yield from self._process_stage(
|
|
104
|
+
stage=stage, node_entity=node_entity, child_nodes=child_nodes
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
# Once we are done processing all the stages,
|
|
115
108
|
for stage in node.stages:
|
|
116
|
-
if stage.
|
|
117
|
-
self.
|
|
109
|
+
if stage.clear_context:
|
|
110
|
+
self.context.clear_stage(stage=stage)
|
|
118
111
|
|
|
119
112
|
# process all children from the node being run
|
|
120
113
|
yield from self.process_nodes(child_nodes)
|
|
121
114
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
)
|
|
115
|
+
yield from self._run_node_post_process(node=node)
|
|
116
|
+
|
|
117
|
+
def _get_child_nodes(self, node: TopologyNode) -> List[TopologyNode]:
|
|
118
|
+
"""Compute children nodes if any"""
|
|
119
|
+
return (
|
|
120
|
+
[get_topology_node(child, self.topology) for child in node.children]
|
|
121
|
+
if node.children
|
|
122
|
+
else []
|
|
123
|
+
)
|
|
132
124
|
|
|
133
|
-
def
|
|
125
|
+
def _process_stage(
|
|
126
|
+
self, stage: NodeStage, node_entity: Any, child_nodes: List[TopologyNode]
|
|
127
|
+
) -> Iterable[Entity]:
|
|
134
128
|
"""
|
|
135
|
-
|
|
129
|
+
For each entity produced in the Node Producer, iterate over all the Node's Stages and
|
|
130
|
+
yield the assets to pass down the workflow.
|
|
131
|
+
|
|
132
|
+
For each node_entity processed, we will cache - if needed - its children.
|
|
133
|
+
E.g., when processing DB Schemas, we will store its tables to compare the fingerprint
|
|
134
|
+
and decide if we need to PUT or PATCH at the sink.
|
|
136
135
|
"""
|
|
136
|
+
logger.debug(f"Processing stage: {stage}")
|
|
137
|
+
|
|
138
|
+
stage_fn = getattr(self, stage.processor)
|
|
139
|
+
for entity_request in stage_fn(node_entity) or []:
|
|
140
|
+
try:
|
|
141
|
+
# yield and make sure the data is updated
|
|
142
|
+
yield from self.sink_request(stage=stage, entity_request=entity_request)
|
|
143
|
+
except ValueError as err:
|
|
144
|
+
logger.debug(traceback.format_exc())
|
|
145
|
+
logger.warning(
|
|
146
|
+
f"Unexpected value error when processing stage: [{stage}]: {err}"
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
if stage.cache_entities:
|
|
150
|
+
self._init_cache_dict(stage=stage, child_nodes=child_nodes)
|
|
137
151
|
|
|
138
|
-
|
|
139
|
-
|
|
152
|
+
def _run_node_post_process(self, node: TopologyNode) -> Iterable[Entity]:
|
|
153
|
+
"""
|
|
154
|
+
If the node has post_process steps, iterate over them and yield the result
|
|
155
|
+
"""
|
|
156
|
+
if node.post_process:
|
|
157
|
+
logger.debug(f"Post processing node {node}")
|
|
158
|
+
for process in node.post_process:
|
|
159
|
+
try:
|
|
160
|
+
node_post_process = getattr(self, process)
|
|
161
|
+
for entity_request in node_post_process():
|
|
162
|
+
yield entity_request
|
|
163
|
+
except Exception as exc:
|
|
164
|
+
logger.debug(traceback.format_exc())
|
|
165
|
+
logger.warning(
|
|
166
|
+
f"Could not run Post Process `{process}` due to [{exc}]"
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
def _init_cache_dict(
|
|
170
|
+
self, stage: NodeStage, child_nodes: List[TopologyNode]
|
|
171
|
+
) -> None:
|
|
172
|
+
"""
|
|
173
|
+
Method to call the API to fill the entities cache.
|
|
174
|
+
|
|
175
|
+
The cache will be part of the context
|
|
176
|
+
"""
|
|
140
177
|
for child_node in child_nodes or []:
|
|
141
178
|
for child_stage in child_node.stages or []:
|
|
142
179
|
if child_stage.use_cache:
|
|
143
|
-
entity_fqn = self.
|
|
180
|
+
entity_fqn = self.context.fqn_from_stage(
|
|
144
181
|
stage=stage,
|
|
145
182
|
entity_name=self.context.__dict__[stage.context],
|
|
146
183
|
)
|
|
147
184
|
|
|
148
|
-
if not self.context.__dict__[CACHED_ENTITIES].get(
|
|
149
|
-
child_stage.type_
|
|
150
|
-
):
|
|
151
|
-
self.context.__dict__[CACHED_ENTITIES][child_stage.type_] = {}
|
|
152
|
-
|
|
153
185
|
self.get_fqn_source_hash_dict(
|
|
154
186
|
parent_type=stage.type_,
|
|
155
187
|
child_type=child_stage.type_,
|
|
@@ -157,12 +189,11 @@ class TopologyRunnerMixin(Generic[C]):
|
|
|
157
189
|
)
|
|
158
190
|
|
|
159
191
|
def get_fqn_source_hash_dict(
|
|
160
|
-
self, parent_type: Entity, child_type: Entity, entity_fqn: str
|
|
161
|
-
) ->
|
|
192
|
+
self, parent_type: Type[Entity], child_type: Type[Entity], entity_fqn: str
|
|
193
|
+
) -> None:
|
|
162
194
|
"""
|
|
163
195
|
Get all the entities and store them as fqn:sourceHash in a dict
|
|
164
196
|
"""
|
|
165
|
-
params = {}
|
|
166
197
|
if parent_type in (Database, DatabaseSchema):
|
|
167
198
|
if child_type == StoredProcedure:
|
|
168
199
|
params = {"databaseSchema": entity_fqn}
|
|
@@ -177,24 +208,10 @@ class TopologyRunnerMixin(Generic[C]):
|
|
|
177
208
|
)
|
|
178
209
|
for entity in entities_list:
|
|
179
210
|
if entity.sourceHash:
|
|
180
|
-
self.
|
|
211
|
+
self.cache[child_type][
|
|
181
212
|
model_str(entity.fullyQualifiedName)
|
|
182
213
|
] = entity.sourceHash
|
|
183
214
|
|
|
184
|
-
def check_context_and_handle(self, post_process: str):
|
|
185
|
-
"""Based on the post_process step, check context and
|
|
186
|
-
evaluate if we can run it based on available class attributes
|
|
187
|
-
|
|
188
|
-
Args:
|
|
189
|
-
post_process: the name of the post_process step
|
|
190
|
-
"""
|
|
191
|
-
if post_process == "mark_tables_as_deleted" and not self.context.database:
|
|
192
|
-
raise ValueError("No Database found in `self.context`")
|
|
193
|
-
|
|
194
|
-
node_post_process = getattr(self, post_process)
|
|
195
|
-
for entity_request in node_post_process():
|
|
196
|
-
yield entity_request
|
|
197
|
-
|
|
198
215
|
def _iter(self) -> Iterable[Either]:
|
|
199
216
|
"""
|
|
200
217
|
This is the implementation for the entrypoint of our Source classes, which
|
|
@@ -207,56 +224,6 @@ class TopologyRunnerMixin(Generic[C]):
|
|
|
207
224
|
"""
|
|
208
225
|
yield from self.process_nodes(get_topology_root(self.topology))
|
|
209
226
|
|
|
210
|
-
def _replace_context(self, key: str, value: Any) -> None:
|
|
211
|
-
"""
|
|
212
|
-
Update the key of the context with the given value
|
|
213
|
-
:param key: element to update from the source context
|
|
214
|
-
:param value: value to use for the update
|
|
215
|
-
"""
|
|
216
|
-
self.context.__dict__[key] = value
|
|
217
|
-
|
|
218
|
-
def _append_context(self, key: str, value: Any) -> None:
|
|
219
|
-
"""
|
|
220
|
-
Update the key of the context with the given value
|
|
221
|
-
:param key: element to update from the source context
|
|
222
|
-
:param value: value to use for the update
|
|
223
|
-
"""
|
|
224
|
-
self.context.__dict__[key].append(value)
|
|
225
|
-
|
|
226
|
-
def clear_context(self, stage: NodeStage) -> None:
|
|
227
|
-
"""
|
|
228
|
-
Clear the available context
|
|
229
|
-
:param key: element to update from the source context
|
|
230
|
-
"""
|
|
231
|
-
self.context.__dict__[stage.context] = get_ctx_default(stage)
|
|
232
|
-
|
|
233
|
-
def fqn_from_context(self, stage: NodeStage, entity_name: str) -> str:
|
|
234
|
-
"""
|
|
235
|
-
Read the context
|
|
236
|
-
:param stage: Topology node being processed
|
|
237
|
-
:param entity_request: Request sent to the sink
|
|
238
|
-
:return: Entity FQN derived from context
|
|
239
|
-
"""
|
|
240
|
-
context_names = [
|
|
241
|
-
self.context.__dict__[dependency]
|
|
242
|
-
for dependency in stage.consumer or [] # root nodes do not have consumers
|
|
243
|
-
]
|
|
244
|
-
return fqn._build( # pylint: disable=protected-access
|
|
245
|
-
*context_names, entity_name
|
|
246
|
-
)
|
|
247
|
-
|
|
248
|
-
def update_context(
|
|
249
|
-
self, stage: NodeStage, context: Union[str, OMetaTagAndClassification]
|
|
250
|
-
):
|
|
251
|
-
"""Append or update context"""
|
|
252
|
-
# We'll store the entity_name in the topology context instead of the entity_fqn
|
|
253
|
-
# and build the fqn on the fly wherever required.
|
|
254
|
-
# This is mainly because we need the context in other places
|
|
255
|
-
if stage.context and not stage.cache_all:
|
|
256
|
-
self._replace_context(key=stage.context, value=context)
|
|
257
|
-
if stage.context and stage.cache_all:
|
|
258
|
-
self._append_context(key=stage.context, value=context)
|
|
259
|
-
|
|
260
227
|
def create_patch_request(
|
|
261
228
|
self, original_entity: Entity, create_request: C
|
|
262
229
|
) -> PatchRequest:
|
|
@@ -284,30 +251,30 @@ class TopologyRunnerMixin(Generic[C]):
|
|
|
284
251
|
"""
|
|
285
252
|
entity = None
|
|
286
253
|
entity_name = model_str(right.name)
|
|
287
|
-
entity_fqn = self.
|
|
254
|
+
entity_fqn = self.context.fqn_from_stage(stage=stage, entity_name=entity_name)
|
|
288
255
|
|
|
289
|
-
# we
|
|
256
|
+
# If we don't want to write data in OM, we'll return what we fetch from the API.
|
|
290
257
|
# This will be applicable for service entities since we do not want to overwrite the data
|
|
258
|
+
same_fingerprint = False
|
|
291
259
|
if not stage.overwrite and not self._is_force_overwrite_enabled():
|
|
292
260
|
entity = self.metadata.get_by_name(
|
|
293
261
|
entity=stage.type_,
|
|
294
262
|
fqn=entity_fqn,
|
|
295
|
-
fields=["*"],
|
|
263
|
+
fields=["*"],
|
|
296
264
|
)
|
|
265
|
+
if entity:
|
|
266
|
+
same_fingerprint = True
|
|
267
|
+
|
|
297
268
|
create_entity_request_hash = generate_source_hash(
|
|
298
269
|
create_request=entity_request.right,
|
|
299
|
-
exclude_fields=SOURCE_HASH_EXCLUDE_FIELDS,
|
|
300
270
|
)
|
|
301
271
|
|
|
302
272
|
if hasattr(entity_request.right, "sourceHash"):
|
|
303
273
|
entity_request.right.sourceHash = create_entity_request_hash
|
|
304
274
|
|
|
305
|
-
skip_processing_entity = False
|
|
306
275
|
if entity is None and stage.use_cache:
|
|
307
276
|
# check if we find the entity in the entities list
|
|
308
|
-
entity_source_hash = self.
|
|
309
|
-
stage.type_
|
|
310
|
-
].get(entity_fqn)
|
|
277
|
+
entity_source_hash = self.cache[stage.type_].get(entity_fqn)
|
|
311
278
|
if entity_source_hash:
|
|
312
279
|
# if the source hash is present, compare it with new hash
|
|
313
280
|
if entity_source_hash != create_entity_request_hash:
|
|
@@ -315,7 +282,7 @@ class TopologyRunnerMixin(Generic[C]):
|
|
|
315
282
|
entity = self.metadata.get_by_name(
|
|
316
283
|
entity=stage.type_,
|
|
317
284
|
fqn=entity_fqn,
|
|
318
|
-
fields=["*"],
|
|
285
|
+
fields=["*"],
|
|
319
286
|
)
|
|
320
287
|
|
|
321
288
|
# we return the entity for a patch update
|
|
@@ -329,9 +296,9 @@ class TopologyRunnerMixin(Generic[C]):
|
|
|
329
296
|
logger.debug(
|
|
330
297
|
f"No changes detected for {str(stage.type_.__name__)} '{entity_fqn}'"
|
|
331
298
|
)
|
|
332
|
-
|
|
299
|
+
same_fingerprint = True
|
|
333
300
|
|
|
334
|
-
if not
|
|
301
|
+
if not same_fingerprint:
|
|
335
302
|
# We store the generated source hash and yield the request
|
|
336
303
|
|
|
337
304
|
yield entity_request
|
|
@@ -357,7 +324,7 @@ class TopologyRunnerMixin(Generic[C]):
|
|
|
357
324
|
"for the service connection."
|
|
358
325
|
)
|
|
359
326
|
|
|
360
|
-
self.
|
|
327
|
+
self.context.update_context_name(stage=stage, right=right)
|
|
361
328
|
|
|
362
329
|
@yield_and_update_context.register
|
|
363
330
|
def _(
|
|
@@ -373,7 +340,7 @@ class TopologyRunnerMixin(Generic[C]):
|
|
|
373
340
|
lineage has been properly drawn. We'll skip the process for now.
|
|
374
341
|
"""
|
|
375
342
|
yield entity_request
|
|
376
|
-
self.
|
|
343
|
+
self.context.update_context_name(stage=stage, right=right.edge.fromEntity)
|
|
377
344
|
|
|
378
345
|
@yield_and_update_context.register
|
|
379
346
|
def _(
|
|
@@ -382,11 +349,16 @@ class TopologyRunnerMixin(Generic[C]):
|
|
|
382
349
|
stage: NodeStage,
|
|
383
350
|
entity_request: Either[C],
|
|
384
351
|
) -> Iterable[Either[Entity]]:
|
|
385
|
-
"""
|
|
352
|
+
"""
|
|
353
|
+
Tag implementation for the context information.
|
|
354
|
+
|
|
355
|
+
We need the full OMetaTagAndClassification in the context
|
|
356
|
+
to build the TagLabels during the ingestion. We need to bundle
|
|
357
|
+
both CreateClassificationRequest and CreateTagRequest.
|
|
358
|
+
"""
|
|
386
359
|
yield entity_request
|
|
387
360
|
|
|
388
|
-
|
|
389
|
-
self.update_context(stage=stage, context=right)
|
|
361
|
+
self.context.update_context_value(stage=stage, value=right)
|
|
390
362
|
|
|
391
363
|
@yield_and_update_context.register
|
|
392
364
|
def _(
|
|
@@ -398,30 +370,7 @@ class TopologyRunnerMixin(Generic[C]):
|
|
|
398
370
|
"""Custom Property implementation for the context information"""
|
|
399
371
|
yield entity_request
|
|
400
372
|
|
|
401
|
-
|
|
402
|
-
self.update_context(stage=stage, context=right)
|
|
403
|
-
|
|
404
|
-
@yield_and_update_context.register
|
|
405
|
-
def _(
|
|
406
|
-
self,
|
|
407
|
-
right: CreateStoredProcedureRequest,
|
|
408
|
-
stage: NodeStage,
|
|
409
|
-
entity_request: Either[C],
|
|
410
|
-
) -> Iterable[Either[Entity]]:
|
|
411
|
-
"""Tag implementation for the context information"""
|
|
412
|
-
yield entity_request
|
|
413
|
-
|
|
414
|
-
procedure_fqn = fqn.build(
|
|
415
|
-
metadata=self.metadata,
|
|
416
|
-
entity_type=StoredProcedure,
|
|
417
|
-
service_name=self.context.database_service,
|
|
418
|
-
database_name=self.context.database,
|
|
419
|
-
schema_name=self.context.database_schema,
|
|
420
|
-
procedure_name=right.name.__root__,
|
|
421
|
-
)
|
|
422
|
-
|
|
423
|
-
# We'll keep the tag fqn in the context and use if required
|
|
424
|
-
self.update_context(stage=stage, context=procedure_fqn)
|
|
373
|
+
self.context.update_context_value(stage=stage, value=right)
|
|
425
374
|
|
|
426
375
|
def sink_request(
|
|
427
376
|
self, stage: NodeStage, entity_request: Either[C]
|
|
@@ -35,11 +35,13 @@ from metadata.generated.schema.entity.data.table import (
|
|
|
35
35
|
Table,
|
|
36
36
|
TableJoins,
|
|
37
37
|
)
|
|
38
|
+
from metadata.generated.schema.entity.services.ingestionPipelines.status import (
|
|
39
|
+
StackTraceError,
|
|
40
|
+
)
|
|
38
41
|
from metadata.generated.schema.entity.teams.user import User
|
|
39
42
|
from metadata.generated.schema.type.lifeCycle import AccessDetails, LifeCycle
|
|
40
43
|
from metadata.generated.schema.type.tableUsageCount import TableColumn, TableUsageCount
|
|
41
44
|
from metadata.generated.schema.type.usageRequest import UsageRequest
|
|
42
|
-
from metadata.ingestion.api.models import StackTraceError
|
|
43
45
|
from metadata.ingestion.api.steps import BulkSink
|
|
44
46
|
from metadata.ingestion.lineage.sql_lineage import (
|
|
45
47
|
get_column_fqn,
|
|
@@ -86,6 +88,10 @@ class MetadataUsageBulkSink(BulkSink):
|
|
|
86
88
|
self.table_usage_map = {}
|
|
87
89
|
self.today = datetime.today().strftime("%Y-%m-%d")
|
|
88
90
|
|
|
91
|
+
@property
|
|
92
|
+
def name(self) -> str:
|
|
93
|
+
return "OpenMetadata"
|
|
94
|
+
|
|
89
95
|
@classmethod
|
|
90
96
|
def create(cls, config_dict: dict, metadata: OpenMetadata):
|
|
91
97
|
config = MetadataUsageSinkConfig.parse_obj(config_dict)
|
|
@@ -147,7 +153,7 @@ class MetadataUsageBulkSink(BulkSink):
|
|
|
147
153
|
StackTraceError(
|
|
148
154
|
name=value_dict["table_entity"].fullyQualifiedName.__root__,
|
|
149
155
|
error=f"Failed to update usage for {name} :{exc}",
|
|
150
|
-
|
|
156
|
+
stackTrace=traceback.format_exc(),
|
|
151
157
|
)
|
|
152
158
|
)
|
|
153
159
|
|
|
@@ -240,7 +246,7 @@ class MetadataUsageBulkSink(BulkSink):
|
|
|
240
246
|
StackTraceError(
|
|
241
247
|
name=table_usage.table,
|
|
242
248
|
error=error,
|
|
243
|
-
|
|
249
|
+
stackTrace=traceback.format_exc(),
|
|
244
250
|
)
|
|
245
251
|
)
|
|
246
252
|
except Exception as exc:
|
|
@@ -252,7 +258,7 @@ class MetadataUsageBulkSink(BulkSink):
|
|
|
252
258
|
logger.warning(error)
|
|
253
259
|
self.status.failed(
|
|
254
260
|
StackTraceError(
|
|
255
|
-
name=name, error=error,
|
|
261
|
+
name=name, error=error, stackTrace=traceback.format_exc()
|
|
256
262
|
)
|
|
257
263
|
)
|
|
258
264
|
else:
|
|
@@ -379,7 +385,7 @@ class MetadataUsageBulkSink(BulkSink):
|
|
|
379
385
|
StackTraceError(
|
|
380
386
|
name=table_usage.table,
|
|
381
387
|
error=error,
|
|
382
|
-
|
|
388
|
+
stackTrace=traceback.format_exc(),
|
|
383
389
|
)
|
|
384
390
|
)
|
|
385
391
|
|
|
@@ -17,6 +17,9 @@ from typing import Dict
|
|
|
17
17
|
from metadata.generated.schema.entity.services.connections.database.athenaConnection import (
|
|
18
18
|
AthenaType,
|
|
19
19
|
)
|
|
20
|
+
from metadata.generated.schema.entity.services.connections.database.azureSQLConnection import (
|
|
21
|
+
AzureSQLType,
|
|
22
|
+
)
|
|
20
23
|
from metadata.generated.schema.entity.services.connections.database.bigQueryConnection import (
|
|
21
24
|
BigqueryType,
|
|
22
25
|
)
|
|
@@ -105,6 +108,7 @@ MAP_CONNECTION_TYPE_DIALECT: Dict[str, Dialect] = {
|
|
|
105
108
|
str(DeltaLakeType.DeltaLake.value): Dialect.SPARKSQL,
|
|
106
109
|
str(SQLiteType.SQLite.value): Dialect.SQLITE,
|
|
107
110
|
str(MssqlType.Mssql.value): Dialect.TSQL,
|
|
111
|
+
str(AzureSQLType.AzureSQL.value): Dialect.TSQL,
|
|
108
112
|
}
|
|
109
113
|
|
|
110
114
|
|
|
@@ -19,10 +19,10 @@ from typing import Any, Dict, List, Optional, Tuple
|
|
|
19
19
|
|
|
20
20
|
import sqlparse
|
|
21
21
|
from cached_property import cached_property
|
|
22
|
-
from
|
|
23
|
-
from
|
|
24
|
-
from
|
|
25
|
-
from
|
|
22
|
+
from collate_sqllineage import SQLPARSE_DIALECT
|
|
23
|
+
from collate_sqllineage.core.models import Column, Table
|
|
24
|
+
from collate_sqllineage.exceptions import SQLLineageException
|
|
25
|
+
from collate_sqllineage.runner import LineageRunner
|
|
26
26
|
from sqlparse.sql import Comparison, Identifier, Parenthesis, Statement
|
|
27
27
|
|
|
28
28
|
from metadata.generated.schema.type.tableUsageCount import TableColumn, TableColumnJoin
|
|
@@ -98,24 +98,30 @@ class LineageParser:
|
|
|
98
98
|
"""
|
|
99
99
|
Get a list of intermediate tables
|
|
100
100
|
"""
|
|
101
|
-
|
|
102
|
-
|
|
101
|
+
if self.parser:
|
|
102
|
+
# These are @lazy_property, not properly being picked up by IDEs. Ignore the warning
|
|
103
|
+
return self.retrieve_tables(self.parser.intermediate_tables)
|
|
104
|
+
return []
|
|
103
105
|
|
|
104
106
|
@cached_property
|
|
105
107
|
def source_tables(self) -> List[Table]:
|
|
106
108
|
"""
|
|
107
109
|
Get a list of source tables
|
|
108
110
|
"""
|
|
109
|
-
|
|
110
|
-
|
|
111
|
+
if self.parser:
|
|
112
|
+
# These are @lazy_property, not properly being picked up by IDEs. Ignore the warning
|
|
113
|
+
return self.retrieve_tables(self.parser.source_tables)
|
|
114
|
+
return []
|
|
111
115
|
|
|
112
116
|
@cached_property
|
|
113
117
|
def target_tables(self) -> List[Table]:
|
|
114
118
|
"""
|
|
115
119
|
Get a list of target tables
|
|
116
120
|
"""
|
|
117
|
-
|
|
118
|
-
|
|
121
|
+
if self.parser:
|
|
122
|
+
# These are @lazy_property, not properly being picked up by IDEs. Ignore the warning
|
|
123
|
+
return self.retrieve_tables(self.parser.target_tables)
|
|
124
|
+
return []
|
|
119
125
|
|
|
120
126
|
# pylint: disable=protected-access
|
|
121
127
|
@cached_property
|
|
@@ -124,6 +130,8 @@ class LineageParser:
|
|
|
124
130
|
Get a list of tuples of column lineage
|
|
125
131
|
"""
|
|
126
132
|
column_lineage = []
|
|
133
|
+
if self.parser is None:
|
|
134
|
+
return []
|
|
127
135
|
try:
|
|
128
136
|
if self.parser._dialect == SQLPARSE_DIALECT:
|
|
129
137
|
return self.parser.get_column_lineage()
|
|
@@ -311,7 +319,10 @@ class LineageParser:
|
|
|
311
319
|
)
|
|
312
320
|
|
|
313
321
|
if not table_left or not table_right:
|
|
314
|
-
logger.warning(
|
|
322
|
+
logger.warning(
|
|
323
|
+
f"Can't extract table names when parsing JOIN information from {comparison}"
|
|
324
|
+
)
|
|
325
|
+
logger.debug(f"Query: {sql_statement}")
|
|
315
326
|
continue
|
|
316
327
|
|
|
317
328
|
left_table_column = TableColumn(table=table_left, column=column_left)
|
|
@@ -331,6 +342,8 @@ class LineageParser:
|
|
|
331
342
|
:return: for each table name, list all joins against other tables
|
|
332
343
|
"""
|
|
333
344
|
join_data = defaultdict(list)
|
|
345
|
+
if self.parser is None:
|
|
346
|
+
return join_data
|
|
334
347
|
# These are @lazy_property, not properly being picked up by IDEs. Ignore the warning
|
|
335
348
|
for statement in self.parser.statements():
|
|
336
349
|
self.stateful_add_joins_from_statement(join_data, sql_statement=statement)
|
|
@@ -378,7 +391,10 @@ class LineageParser:
|
|
|
378
391
|
@staticmethod
|
|
379
392
|
def _evaluate_best_parser(
|
|
380
393
|
query: str, dialect: Dialect, timeout_seconds: int
|
|
381
|
-
) -> LineageRunner:
|
|
394
|
+
) -> Optional[LineageRunner]:
|
|
395
|
+
if query is None:
|
|
396
|
+
return None
|
|
397
|
+
|
|
382
398
|
@timeout(seconds=timeout_seconds)
|
|
383
399
|
def get_sqlfluff_lineage_runner(qry: str, dlct: str) -> LineageRunner:
|
|
384
400
|
lr_dialect = LineageRunner(qry, dialect=dlct)
|
|
@@ -16,6 +16,9 @@ from typing import Any, Iterable, List, Optional, Tuple
|
|
|
16
16
|
|
|
17
17
|
from metadata.generated.schema.api.lineage.addLineage import AddLineageRequest
|
|
18
18
|
from metadata.generated.schema.entity.data.table import Table
|
|
19
|
+
from metadata.generated.schema.entity.services.ingestionPipelines.status import (
|
|
20
|
+
StackTraceError,
|
|
21
|
+
)
|
|
19
22
|
from metadata.generated.schema.type.entityLineage import (
|
|
20
23
|
ColumnLineage,
|
|
21
24
|
EntitiesEdge,
|
|
@@ -23,7 +26,7 @@ from metadata.generated.schema.type.entityLineage import (
|
|
|
23
26
|
)
|
|
24
27
|
from metadata.generated.schema.type.entityLineage import Source as LineageSource
|
|
25
28
|
from metadata.generated.schema.type.entityReference import EntityReference
|
|
26
|
-
from metadata.ingestion.api.models import Either
|
|
29
|
+
from metadata.ingestion.api.models import Either
|
|
27
30
|
from metadata.ingestion.lineage.models import Dialect
|
|
28
31
|
from metadata.ingestion.lineage.parser import LINEAGE_PARSING_TIMEOUT, LineageParser
|
|
29
32
|
from metadata.ingestion.ometa.ometa_api import OpenMetadata
|
|
@@ -183,19 +186,8 @@ def get_table_entities_from_query(
|
|
|
183
186
|
table_entities = search_table_entities(
|
|
184
187
|
metadata=metadata,
|
|
185
188
|
service_name=service_name,
|
|
186
|
-
database=database_query,
|
|
187
|
-
database_schema=schema_query,
|
|
188
|
-
table=table,
|
|
189
|
-
)
|
|
190
|
-
|
|
191
|
-
if table_entities:
|
|
192
|
-
return table_entities
|
|
193
|
-
|
|
194
|
-
table_entities = search_table_entities(
|
|
195
|
-
metadata=metadata,
|
|
196
|
-
service_name=service_name,
|
|
197
|
-
database=database_name,
|
|
198
|
-
database_schema=database_schema,
|
|
189
|
+
database=database_query if database_query else database_name,
|
|
190
|
+
database_schema=schema_query if schema_query else database_schema,
|
|
199
191
|
table=table,
|
|
200
192
|
)
|
|
201
193
|
|
|
@@ -337,7 +329,7 @@ def _create_lineage_by_table_name(
|
|
|
337
329
|
left=StackTraceError(
|
|
338
330
|
name="Lineage",
|
|
339
331
|
error=f"Error creating lineage for service [{service_name}] from table [{from_table}]: {exc}",
|
|
340
|
-
|
|
332
|
+
stackTrace=traceback.format_exc(),
|
|
341
333
|
)
|
|
342
334
|
)
|
|
343
335
|
|
|
@@ -440,7 +432,7 @@ def get_lineage_by_query(
|
|
|
440
432
|
left=StackTraceError(
|
|
441
433
|
name="Lineage",
|
|
442
434
|
error=f"Ingesting lineage failed for service [{service_name}]: {exc}",
|
|
443
|
-
|
|
435
|
+
stackTrace=traceback.format_exc(),
|
|
444
436
|
)
|
|
445
437
|
)
|
|
446
438
|
|
|
@@ -481,6 +473,6 @@ def get_lineage_via_table_entity(
|
|
|
481
473
|
left=StackTraceError(
|
|
482
474
|
name="Lineage",
|
|
483
475
|
error=f"Failed to create view lineage for database [{database_name}] and table [{table_entity}]: {exc}",
|
|
484
|
-
|
|
476
|
+
stackTrace=traceback.format_exc(),
|
|
485
477
|
)
|
|
486
478
|
)
|