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
|
@@ -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
|
+
)
|
|
124
|
+
|
|
125
|
+
def _process_stage(
|
|
126
|
+
self, stage: NodeStage, node_entity: Any, child_nodes: List[TopologyNode]
|
|
127
|
+
) -> Iterable[Entity]:
|
|
128
|
+
"""
|
|
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.
|
|
132
131
|
|
|
133
|
-
|
|
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.
|
|
134
135
|
"""
|
|
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)
|
|
151
|
+
|
|
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:
|
|
136
172
|
"""
|
|
173
|
+
Method to call the API to fill the entities cache.
|
|
137
174
|
|
|
138
|
-
|
|
139
|
-
|
|
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,27 @@ 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
|
|
291
258
|
if not stage.overwrite and not self._is_force_overwrite_enabled():
|
|
292
259
|
entity = self.metadata.get_by_name(
|
|
293
260
|
entity=stage.type_,
|
|
294
261
|
fqn=entity_fqn,
|
|
295
|
-
fields=["*"],
|
|
262
|
+
fields=["*"],
|
|
296
263
|
)
|
|
297
264
|
create_entity_request_hash = generate_source_hash(
|
|
298
265
|
create_request=entity_request.right,
|
|
299
|
-
exclude_fields=SOURCE_HASH_EXCLUDE_FIELDS,
|
|
300
266
|
)
|
|
301
267
|
|
|
302
268
|
if hasattr(entity_request.right, "sourceHash"):
|
|
303
269
|
entity_request.right.sourceHash = create_entity_request_hash
|
|
304
270
|
|
|
305
|
-
|
|
271
|
+
same_fingerprint = False
|
|
306
272
|
if entity is None and stage.use_cache:
|
|
307
273
|
# check if we find the entity in the entities list
|
|
308
|
-
entity_source_hash = self.
|
|
309
|
-
stage.type_
|
|
310
|
-
].get(entity_fqn)
|
|
274
|
+
entity_source_hash = self.cache[stage.type_].get(entity_fqn)
|
|
311
275
|
if entity_source_hash:
|
|
312
276
|
# if the source hash is present, compare it with new hash
|
|
313
277
|
if entity_source_hash != create_entity_request_hash:
|
|
@@ -315,7 +279,7 @@ class TopologyRunnerMixin(Generic[C]):
|
|
|
315
279
|
entity = self.metadata.get_by_name(
|
|
316
280
|
entity=stage.type_,
|
|
317
281
|
fqn=entity_fqn,
|
|
318
|
-
fields=["*"],
|
|
282
|
+
fields=["*"],
|
|
319
283
|
)
|
|
320
284
|
|
|
321
285
|
# we return the entity for a patch update
|
|
@@ -329,9 +293,9 @@ class TopologyRunnerMixin(Generic[C]):
|
|
|
329
293
|
logger.debug(
|
|
330
294
|
f"No changes detected for {str(stage.type_.__name__)} '{entity_fqn}'"
|
|
331
295
|
)
|
|
332
|
-
|
|
296
|
+
same_fingerprint = True
|
|
333
297
|
|
|
334
|
-
if not
|
|
298
|
+
if not same_fingerprint:
|
|
335
299
|
# We store the generated source hash and yield the request
|
|
336
300
|
|
|
337
301
|
yield entity_request
|
|
@@ -357,7 +321,7 @@ class TopologyRunnerMixin(Generic[C]):
|
|
|
357
321
|
"for the service connection."
|
|
358
322
|
)
|
|
359
323
|
|
|
360
|
-
self.
|
|
324
|
+
self.context.update_context_name(stage=stage, right=right)
|
|
361
325
|
|
|
362
326
|
@yield_and_update_context.register
|
|
363
327
|
def _(
|
|
@@ -373,7 +337,7 @@ class TopologyRunnerMixin(Generic[C]):
|
|
|
373
337
|
lineage has been properly drawn. We'll skip the process for now.
|
|
374
338
|
"""
|
|
375
339
|
yield entity_request
|
|
376
|
-
self.
|
|
340
|
+
self.context.update_context_name(stage=stage, right=right.edge.fromEntity)
|
|
377
341
|
|
|
378
342
|
@yield_and_update_context.register
|
|
379
343
|
def _(
|
|
@@ -382,11 +346,16 @@ class TopologyRunnerMixin(Generic[C]):
|
|
|
382
346
|
stage: NodeStage,
|
|
383
347
|
entity_request: Either[C],
|
|
384
348
|
) -> Iterable[Either[Entity]]:
|
|
385
|
-
"""
|
|
349
|
+
"""
|
|
350
|
+
Tag implementation for the context information.
|
|
351
|
+
|
|
352
|
+
We need the full OMetaTagAndClassification in the context
|
|
353
|
+
to build the TagLabels during the ingestion. We need to bundle
|
|
354
|
+
both CreateClassificationRequest and CreateTagRequest.
|
|
355
|
+
"""
|
|
386
356
|
yield entity_request
|
|
387
357
|
|
|
388
|
-
|
|
389
|
-
self.update_context(stage=stage, context=right)
|
|
358
|
+
self.context.update_context_value(stage=stage, value=right)
|
|
390
359
|
|
|
391
360
|
@yield_and_update_context.register
|
|
392
361
|
def _(
|
|
@@ -398,30 +367,7 @@ class TopologyRunnerMixin(Generic[C]):
|
|
|
398
367
|
"""Custom Property implementation for the context information"""
|
|
399
368
|
yield entity_request
|
|
400
369
|
|
|
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)
|
|
370
|
+
self.context.update_context_value(stage=stage, value=right)
|
|
425
371
|
|
|
426
372
|
def sink_request(
|
|
427
373
|
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
|
|
@@ -389,7 +389,6 @@ class LineageParser:
|
|
|
389
389
|
def _evaluate_best_parser(
|
|
390
390
|
query: str, dialect: Dialect, timeout_seconds: int
|
|
391
391
|
) -> Optional[LineageRunner]:
|
|
392
|
-
|
|
393
392
|
if query is None:
|
|
394
393
|
return None
|
|
395
394
|
|
|
@@ -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
|
)
|
|
@@ -25,6 +25,8 @@ from pydantic.validators import constr_length_validator, str_validator
|
|
|
25
25
|
|
|
26
26
|
logger = logging.getLogger("metadata")
|
|
27
27
|
|
|
28
|
+
SECRET = "secret:"
|
|
29
|
+
|
|
28
30
|
|
|
29
31
|
class CustomSecretStr(SecretStr):
|
|
30
32
|
"""
|
|
@@ -91,10 +93,10 @@ class CustomSecretStr(SecretStr):
|
|
|
91
93
|
|
|
92
94
|
if (
|
|
93
95
|
not skip_secret_manager
|
|
94
|
-
and self._secret_value.startswith(
|
|
96
|
+
and self._secret_value.startswith(SECRET)
|
|
95
97
|
and SecretsManagerFactory().get_secrets_manager()
|
|
96
98
|
):
|
|
97
|
-
secret_id = self._secret_value.replace(
|
|
99
|
+
secret_id = self._secret_value.replace(SECRET, "")
|
|
98
100
|
try:
|
|
99
101
|
return (
|
|
100
102
|
SecretsManagerFactory()
|
|
@@ -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
|
+
Custom models for LF tags
|
|
13
|
+
"""
|
|
14
|
+
from typing import List, Optional
|
|
15
|
+
|
|
16
|
+
from pydantic import BaseModel
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class TagItem(BaseModel):
|
|
20
|
+
CatalogId: str
|
|
21
|
+
TagKey: str
|
|
22
|
+
TagValues: List[str]
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class LFTagsOnColumnsItem(BaseModel):
|
|
26
|
+
Name: str
|
|
27
|
+
LFTags: List[TagItem]
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class LFTags(BaseModel):
|
|
31
|
+
LFTagOnDatabase: Optional[List[TagItem]]
|
|
32
|
+
LFTagsOnTable: Optional[List[TagItem]]
|
|
33
|
+
LFTagsOnColumns: Optional[List[LFTagsOnColumnsItem]]
|