openmetadata-ingestion 1.3.0.0.dev0__py3-none-any.whl → 1.3.1.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.
- metadata/applications/auto_tagger.py +8 -3
- metadata/cli/db_dump.py +1 -0
- metadata/data_insight/processor/reports/cost_analysis_report_data_processor.py +39 -47
- metadata/data_insight/processor/reports/data_processor.py +1 -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 +10 -1
- metadata/data_quality/processor/test_case_runner.py +7 -5
- metadata/data_quality/source/test_suite.py +0 -1
- metadata/data_quality/validations/mixins/pandas_validator_mixin.py +4 -2
- 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/generated/antlr/EntityLinkLexer.py +124 -58
- 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 +1 -1
- 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 +1 -1
- metadata/generated/schema/api/data/createCustomProperty.py +6 -10
- 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 +1 -1
- metadata/generated/schema/api/data/createDatabaseSchema.py +1 -1
- metadata/generated/schema/api/data/createGlossary.py +1 -1
- metadata/generated/schema/api/data/createGlossaryTerm.py +1 -1
- metadata/generated/schema/api/data/createMlModel.py +1 -1
- metadata/generated/schema/api/data/createPipeline.py +1 -1
- metadata/generated/schema/api/data/createQuery.py +1 -1
- metadata/generated/schema/api/data/createSearchIndex.py +1 -1
- metadata/generated/schema/api/data/createStoredProcedure.py +1 -1
- metadata/generated/schema/api/data/createTable.py +1 -1
- 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 +1 -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 +1 -1
- metadata/generated/schema/api/feed/threadCount.py +1 -1
- 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 +1 -1
- metadata/generated/schema/api/teams/createTeam.py +1 -1
- metadata/generated/schema/api/teams/createUser.py +1 -1
- metadata/generated/schema/api/tests/__init__.py +1 -1
- metadata/generated/schema/api/tests/createCustomMetric.py +1 -1
- metadata/generated/schema/api/tests/createLogicalTestCases.py +1 -1
- metadata/generated/schema/api/tests/createTestCase.py +1 -1
- metadata/generated/schema/api/tests/createTestCaseResolutionStatus.py +1 -1
- 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 +1 -1
- 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 +1 -1
- 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/dataQualityConfiguration.py +16 -0
- metadata/generated/schema/configuration/elasticSearchConfiguration.py +4 -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 +1 -1
- 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 +4 -1
- 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 +6 -1
- metadata/generated/schema/entity/applications/configuration/external/__init__.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/autoTaggerAppConfig.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/metaPilotAppConfig.py +1 -16
- metadata/generated/schema/entity/applications/configuration/internal/__init__.py +1 -1
- metadata/generated/schema/entity/applications/configuration/internal/dataInsightsAppConfig.py +1 -1
- metadata/generated/schema/entity/applications/configuration/internal/dataInsightsReportAppConfig.py +1 -1
- metadata/generated/schema/entity/applications/configuration/internal/searchIndexingAppConfig.py +2 -2
- 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 +1 -1
- 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 +1 -1
- metadata/generated/schema/entity/applications/marketplace/createAppMarketPlaceDefinitionReq.py +1 -1
- 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 +1 -1
- metadata/generated/schema/entity/automations/workflow.py +1 -1
- metadata/generated/schema/entity/bot.py +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- metadata/generated/schema/entity/data/databaseSchema.py +1 -1
- 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 +1 -1
- metadata/generated/schema/entity/data/query.py +1 -1
- 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 +1 -1
- metadata/generated/schema/entity/data/table.py +2 -1
- 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 +4 -6
- 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 +1 -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 +1 -1
- 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 +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/powerBIConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/qlikSenseConnection.py +1 -1
- 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 +1 -1
- metadata/generated/schema/entity/services/connections/database/azureSQLConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/bigQueryConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/bigTableConnection.py +41 -0
- metadata/generated/schema/entity/services/connections/database/clickhouseConnection.py +1 -1
- 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 +1 -1
- metadata/generated/schema/entity/services/connections/database/customDatabaseConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/databricksConnection.py +1 -1
- 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 +1 -1
- metadata/generated/schema/entity/services/connections/database/db2Connection.py +1 -1
- 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 +1 -1
- metadata/generated/schema/entity/services/connections/database/druidConnection.py +1 -1
- 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 +1 -1
- metadata/generated/schema/entity/services/connections/database/hiveConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/iceberg/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/database/iceberg/dynamoDbCatalogConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/iceberg/glueCatalogConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/iceberg/hiveCatalogConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/iceberg/icebergCatalog.py +1 -1
- metadata/generated/schema/entity/services/connections/database/iceberg/icebergFileSystem.py +1 -1
- metadata/generated/schema/entity/services/connections/database/iceberg/restCatalogConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/icebergConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/impalaConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/mariaDBConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/mongoDBConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/mssqlConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/mysqlConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/oracleConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/pinotDBConnection.py +8 -6
- metadata/generated/schema/entity/services/connections/database/postgresConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/prestoConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/redshiftConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/salesforceConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/sapHanaConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/sasConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/singleStoreConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/snowflakeConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/sqliteConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/trinoConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/unityCatalogConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/verticaConnection.py +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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/adlsConnection.py +1 -1
- 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 +1 -1
- metadata/generated/schema/entity/services/databaseService.py +4 -4
- metadata/generated/schema/entity/services/ingestionPipelines/__init__.py +1 -1
- metadata/generated/schema/entity/services/ingestionPipelines/ingestionPipeline.py +1 -1
- metadata/generated/schema/entity/services/ingestionPipelines/pipelineServiceClientResponse.py +1 -1
- metadata/generated/schema/entity/services/ingestionPipelines/status.py +1 -1
- 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 +1 -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 +1 -1
- 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 +1 -1
- 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 +1 -1
- metadata/generated/schema/entity/type.py +3 -18
- 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 +1 -1
- metadata/generated/schema/events/api/__init__.py +1 -1
- metadata/generated/schema/events/api/createEventSubscription.py +1 -1
- metadata/generated/schema/events/emailAlertConfig.py +1 -6
- metadata/generated/schema/events/eventFilterRule.py +1 -1
- metadata/generated/schema/events/eventSubscription.py +5 -10
- metadata/generated/schema/events/eventSubscriptionOffset.py +1 -1
- metadata/generated/schema/events/failedEvent.py +1 -1
- metadata/generated/schema/events/filterResourceDescriptor.py +1 -1
- metadata/generated/schema/events/subscriptionResourceDescriptor.py +1 -1
- metadata/generated/schema/metadataIngestion/__init__.py +1 -1
- metadata/generated/schema/metadataIngestion/application.py +4 -1
- metadata/generated/schema/metadataIngestion/applicationPipeline.py +4 -1
- metadata/generated/schema/metadataIngestion/dashboardServiceMetadataPipeline.py +1 -1
- metadata/generated/schema/metadataIngestion/dataInsightPipeline.py +1 -1
- metadata/generated/schema/metadataIngestion/databaseServiceMetadataPipeline.py +1 -1
- metadata/generated/schema/metadataIngestion/databaseServiceProfilerPipeline.py +1 -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 +1 -1
- metadata/generated/schema/metadataIngestion/storage/storageMetadataGCSConfig.py +1 -1
- 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 +1 -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 +16 -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 +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 +1 -1
- metadata/generated/schema/security/secrets/secretsManagerProvider.py +3 -1
- 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 +1 -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 +1 -1
- metadata/generated/schema/system/eventPublisherJob.py +1 -1
- metadata/generated/schema/system/indexingError.py +1 -1
- 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 +1 -1
- metadata/generated/schema/tests/basic.py +1 -1
- metadata/generated/schema/tests/customMetric.py +1 -1
- metadata/generated/schema/tests/resolved.py +1 -1
- metadata/generated/schema/tests/testCase.py +1 -1
- metadata/generated/schema/tests/testCaseResolutionStatus.py +1 -1
- metadata/generated/schema/tests/testDefinition.py +2 -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 +6 -2
- metadata/generated/schema/type/bulkOperationResult.py +1 -1
- metadata/generated/schema/type/changeEvent.py +1 -1
- metadata/generated/schema/type/changeEventType.py +6 -1
- 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 +1 -1
- metadata/generated/schema/type/entityReference.py +1 -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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +7 -17
- metadata/ingestion/api/status.py +4 -0
- metadata/ingestion/api/steps.py +14 -1
- metadata/ingestion/api/topology_runner.py +4 -1
- metadata/ingestion/lineage/parser.py +4 -5
- metadata/ingestion/models/custom_properties.py +0 -1
- metadata/ingestion/models/patch_request.py +3 -2
- metadata/ingestion/ometa/client.py +6 -0
- metadata/ingestion/ometa/mixins/custom_property_mixin.py +11 -11
- metadata/ingestion/ometa/mixins/patch_mixin.py +0 -1
- metadata/ingestion/ometa/mixins/suggestions_mixin.py +41 -0
- metadata/ingestion/ometa/ometa_api.py +16 -8
- metadata/ingestion/ometa/routes.py +7 -0
- metadata/ingestion/sink/metadata_rest.py +2 -2
- metadata/ingestion/source/dashboard/dashboard_service.py +0 -1
- metadata/ingestion/source/dashboard/looker/metadata.py +3 -6
- metadata/ingestion/source/dashboard/metabase/client.py +4 -0
- metadata/ingestion/source/dashboard/metabase/metadata.py +5 -4
- metadata/ingestion/source/dashboard/metabase/models.py +2 -2
- metadata/ingestion/source/dashboard/superset/api_source.py +0 -1
- metadata/ingestion/source/dashboard/superset/db_source.py +1 -3
- metadata/ingestion/source/dashboard/superset/queries.py +1 -1
- metadata/ingestion/source/dashboard/tableau/metadata.py +19 -1
- metadata/ingestion/source/database/athena/client.py +2 -4
- metadata/ingestion/source/database/azuresql/metadata.py +0 -1
- metadata/ingestion/source/database/bigquery/helper.py +68 -1
- metadata/ingestion/source/database/bigquery/metadata.py +12 -3
- metadata/ingestion/source/database/bigquery/queries.py +22 -0
- 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/common_db_source.py +2 -2
- metadata/ingestion/source/database/common_nosql_source.py +22 -4
- metadata/ingestion/source/database/databricks/client.py +0 -1
- metadata/ingestion/source/database/databricks/metadata.py +132 -46
- metadata/ingestion/source/database/databricks/queries.py +3 -4
- metadata/ingestion/source/database/datalake/metadata.py +9 -4
- metadata/ingestion/source/database/dbt/dbt_config.py +5 -0
- metadata/ingestion/source/database/dbt/dbt_service.py +3 -11
- metadata/ingestion/source/database/dbt/dbt_utils.py +3 -1
- metadata/ingestion/source/database/dbt/metadata.py +16 -29
- metadata/ingestion/source/database/extended_sample_data.py +202 -134
- metadata/ingestion/source/database/hive/connection.py +0 -2
- metadata/ingestion/source/database/mssql/metadata.py +0 -1
- metadata/ingestion/source/database/mssql/queries.py +1 -2
- metadata/ingestion/source/database/oracle/queries.py +2 -2
- metadata/ingestion/source/database/oracle/utils.py +0 -1
- metadata/ingestion/source/database/postgres/pgspider/lineage.py +0 -1
- metadata/ingestion/source/database/sample_data.py +0 -1
- metadata/ingestion/source/database/sas/metadata.py +2 -3
- metadata/ingestion/source/database/snowflake/utils.py +2 -6
- metadata/ingestion/source/database/stored_procedures_mixin.py +0 -1
- metadata/ingestion/source/database/unitycatalog/metadata.py +16 -31
- metadata/ingestion/source/messaging/common_broker_source.py +9 -8
- metadata/ingestion/source/messaging/kafka/connection.py +45 -4
- metadata/ingestion/source/mlmodel/sagemaker/metadata.py +20 -8
- metadata/ingestion/source/pipeline/spline/metadata.py +0 -1
- metadata/ingestion/source/search/elasticsearch/metadata.py +0 -1
- metadata/ingestion/source/storage/storage_service.py +8 -8
- metadata/profiler/interface/pandas/profiler_interface.py +7 -2
- metadata/profiler/interface/profiler_interface_factory.py +7 -0
- metadata/profiler/interface/sqlalchemy/db2/profiler_interface.py +38 -0
- metadata/profiler/interface/sqlalchemy/profiler_interface.py +3 -5
- metadata/profiler/metrics/hybrid/histogram.py +1 -0
- metadata/profiler/orm/functions/conn_test.py +1 -0
- metadata/profiler/orm/functions/sum.py +1 -0
- metadata/profiler/orm/functions/table_metric_computer.py +0 -1
- metadata/profiler/orm/registry.py +1 -0
- metadata/profiler/processor/core.py +2 -2
- metadata/profiler/processor/processor.py +0 -2
- metadata/profiler/processor/sample_data_handler.py +6 -2
- metadata/profiler/source/base/profiler_source.py +0 -1
- metadata/profiler/source/bigquery/type_mapper.py +0 -1
- metadata/readers/file/api_reader.py +0 -1
- 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/helpers.py +30 -38
- 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 +148 -0
- metadata/utils/secrets/external_secrets_manager.py +25 -3
- metadata/utils/secrets/secrets_manager_factory.py +13 -31
- metadata/workflow/application.py +10 -10
- metadata/workflow/base.py +4 -1
- metadata/workflow/metadata.py +0 -1
- metadata/workflow/output_handler.py +22 -0
- metadata/workflow/usage.py +0 -1
- {openmetadata_ingestion-1.3.0.0.dev0.dist-info → openmetadata_ingestion-1.3.1.0.dist-info}/METADATA +298 -289
- {openmetadata_ingestion-1.3.0.0.dev0.dist-info → openmetadata_ingestion-1.3.1.0.dist-info}/RECORD +624 -612
- metadata/generated/schema/entity/services/connections/database/duckdbConnection.py +0 -96
- metadata/generated/schema/events/userAlertConfig.py +0 -25
- metadata/ingestion/source/database/duckdb/connection.py +0 -76
- metadata/ingestion/source/database/duckdb/metadata.py +0 -204
- metadata/ingestion/source/database/duckdb/queries.py +0 -141
- metadata/ingestion/source/database/duckdb/utils.py +0 -349
- metadata/utils/secrets/client/loader.py +0 -78
- /metadata/ingestion/source/database/{duckdb → bigtable}/__init__.py +0 -0
- /metadata/{utils/secrets/client → profiler/interface/sqlalchemy/db2}/__init__.py +0 -0
- /metadata/utils/secrets/{noop_secrets_manager.py → db_secrets_manager.py} +0 -0
- {openmetadata_ingestion-1.3.0.0.dev0.dist-info → openmetadata_ingestion-1.3.1.0.dist-info}/LICENSE +0 -0
- {openmetadata_ingestion-1.3.0.0.dev0.dist-info → openmetadata_ingestion-1.3.1.0.dist-info}/WHEEL +0 -0
- {openmetadata_ingestion-1.3.0.0.dev0.dist-info → openmetadata_ingestion-1.3.1.0.dist-info}/entry_points.txt +0 -0
- {openmetadata_ingestion-1.3.0.0.dev0.dist-info → openmetadata_ingestion-1.3.1.0.dist-info}/top_level.txt +0 -0
|
@@ -80,6 +80,7 @@ ALLOWED_COMMON_PATCH_FIELDS = {
|
|
|
80
80
|
"description": True,
|
|
81
81
|
"owner": True,
|
|
82
82
|
"tags": True,
|
|
83
|
+
"sourceHash": True,
|
|
83
84
|
# Table Entity Fields
|
|
84
85
|
"tableType": True,
|
|
85
86
|
"columns": {"__all__": ALLOWED_COLUMN_FIELDS},
|
|
@@ -210,9 +211,9 @@ def _determine_restricted_operation(
|
|
|
210
211
|
Only retain add operation for restrict_update_fields fields
|
|
211
212
|
"""
|
|
212
213
|
path = patch_ops.get("path")
|
|
213
|
-
|
|
214
|
+
ops = patch_ops.get("op")
|
|
214
215
|
for field in restrict_update_fields or []:
|
|
215
|
-
if field in path and
|
|
216
|
+
if field in path and ops != PatchOperation.ADD.value:
|
|
216
217
|
return False
|
|
217
218
|
return True
|
|
218
219
|
|
|
@@ -21,6 +21,7 @@ from requests.exceptions import HTTPError
|
|
|
21
21
|
|
|
22
22
|
from metadata.config.common import ConfigModel
|
|
23
23
|
from metadata.ingestion.ometa.credentials import URL, get_api_version
|
|
24
|
+
from metadata.utils.execution_time_tracker import calculate_execution_time
|
|
24
25
|
from metadata.utils.logger import ometa_logger
|
|
25
26
|
|
|
26
27
|
logger = ometa_logger()
|
|
@@ -251,6 +252,7 @@ class REST:
|
|
|
251
252
|
|
|
252
253
|
return None
|
|
253
254
|
|
|
255
|
+
@calculate_execution_time(context="GET")
|
|
254
256
|
def get(self, path, data=None):
|
|
255
257
|
"""
|
|
256
258
|
GET method
|
|
@@ -264,6 +266,7 @@ class REST:
|
|
|
264
266
|
"""
|
|
265
267
|
return self._request("GET", path, data)
|
|
266
268
|
|
|
269
|
+
@calculate_execution_time(context="POST")
|
|
267
270
|
def post(self, path, data=None):
|
|
268
271
|
"""
|
|
269
272
|
POST method
|
|
@@ -277,6 +280,7 @@ class REST:
|
|
|
277
280
|
"""
|
|
278
281
|
return self._request("POST", path, data)
|
|
279
282
|
|
|
283
|
+
@calculate_execution_time(context="PUT")
|
|
280
284
|
def put(self, path, data=None):
|
|
281
285
|
"""
|
|
282
286
|
PUT method
|
|
@@ -290,6 +294,7 @@ class REST:
|
|
|
290
294
|
"""
|
|
291
295
|
return self._request("PUT", path, data)
|
|
292
296
|
|
|
297
|
+
@calculate_execution_time(context="PATCH")
|
|
293
298
|
def patch(self, path, data=None):
|
|
294
299
|
"""
|
|
295
300
|
PATCH method
|
|
@@ -308,6 +313,7 @@ class REST:
|
|
|
308
313
|
headers={"Content-type": "application/json-patch+json"},
|
|
309
314
|
)
|
|
310
315
|
|
|
316
|
+
@calculate_execution_time(context="DELETE")
|
|
311
317
|
def delete(self, path, data=None):
|
|
312
318
|
"""
|
|
313
319
|
DELETE method
|
|
@@ -15,7 +15,8 @@ To be used by OpenMetadata class
|
|
|
15
15
|
"""
|
|
16
16
|
from typing import Dict
|
|
17
17
|
|
|
18
|
-
from metadata.generated.schema.
|
|
18
|
+
from metadata.generated.schema.type.customProperty import PropertyType
|
|
19
|
+
from metadata.generated.schema.type.entityReference import EntityReference
|
|
19
20
|
from metadata.ingestion.models.custom_properties import (
|
|
20
21
|
CustomPropertyDataTypes,
|
|
21
22
|
CustomPropertyType,
|
|
@@ -54,16 +55,6 @@ class OMetaCustomPropertyMixin:
|
|
|
54
55
|
f"/metadata/types/name/{entity_type}?category=field"
|
|
55
56
|
)
|
|
56
57
|
|
|
57
|
-
# Get the data type of the custom property
|
|
58
|
-
if not ometa_custom_property.createCustomPropertyRequest.propertyType:
|
|
59
|
-
custom_property_type = self.get_custom_property_type(
|
|
60
|
-
data_type=ometa_custom_property.custom_property_type
|
|
61
|
-
)
|
|
62
|
-
property_type = PropertyType(id=custom_property_type.id, type="type")
|
|
63
|
-
ometa_custom_property.createCustomPropertyRequest.propertyType = (
|
|
64
|
-
property_type
|
|
65
|
-
)
|
|
66
|
-
|
|
67
58
|
resp = self.client.put(
|
|
68
59
|
f"/metadata/types/{entity_schema.get('id')}",
|
|
69
60
|
data=ometa_custom_property.createCustomPropertyRequest.json(),
|
|
@@ -78,3 +69,12 @@ class OMetaCustomPropertyMixin:
|
|
|
78
69
|
"""
|
|
79
70
|
resp = self.client.get(f"/metadata/types/name/{data_type.value}?category=field")
|
|
80
71
|
return CustomPropertyType(**resp)
|
|
72
|
+
|
|
73
|
+
def get_property_type_ref(self, data_type: CustomPropertyDataTypes) -> PropertyType:
|
|
74
|
+
"""
|
|
75
|
+
Get the PropertyType for custom properties
|
|
76
|
+
"""
|
|
77
|
+
custom_property_type = self.get_custom_property_type(data_type=data_type)
|
|
78
|
+
return PropertyType(
|
|
79
|
+
__root__=EntityReference(id=custom_property_type.id, type="type")
|
|
80
|
+
)
|
|
@@ -0,0 +1,41 @@
|
|
|
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
|
+
Mixin class containing Suggestions specific methods
|
|
13
|
+
|
|
14
|
+
To be used by OpenMetadata class
|
|
15
|
+
"""
|
|
16
|
+
from metadata.generated.schema.entity.feed.suggestion import Suggestion
|
|
17
|
+
from metadata.ingestion.ometa.client import REST
|
|
18
|
+
from metadata.utils.logger import ometa_logger
|
|
19
|
+
|
|
20
|
+
logger = ometa_logger()
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class OMetaSuggestionsMixin:
|
|
24
|
+
"""
|
|
25
|
+
OpenMetadata API methods related to the Suggestion Entity
|
|
26
|
+
|
|
27
|
+
To be inherited by OpenMetadata
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
client: REST
|
|
31
|
+
|
|
32
|
+
def update_suggestion(self, suggestion: Suggestion) -> Suggestion:
|
|
33
|
+
"""
|
|
34
|
+
Update an existing Suggestion with new fields
|
|
35
|
+
"""
|
|
36
|
+
resp = self.client.put(
|
|
37
|
+
f"{self.get_suffix(Suggestion)}/{str(suggestion.id.__root__)}",
|
|
38
|
+
data=suggestion.json(),
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
return Suggestion(**resp)
|
|
@@ -50,6 +50,7 @@ from metadata.ingestion.ometa.mixins.role_policy_mixin import OMetaRolePolicyMix
|
|
|
50
50
|
from metadata.ingestion.ometa.mixins.search_index_mixin import OMetaSearchIndexMixin
|
|
51
51
|
from metadata.ingestion.ometa.mixins.server_mixin import OMetaServerMixin
|
|
52
52
|
from metadata.ingestion.ometa.mixins.service_mixin import OMetaServiceMixin
|
|
53
|
+
from metadata.ingestion.ometa.mixins.suggestions_mixin import OMetaSuggestionsMixin
|
|
53
54
|
from metadata.ingestion.ometa.mixins.table_mixin import OMetaTableMixin
|
|
54
55
|
from metadata.ingestion.ometa.mixins.tests_mixin import OMetaTestsMixin
|
|
55
56
|
from metadata.ingestion.ometa.mixins.topic_mixin import OMetaTopicMixin
|
|
@@ -108,6 +109,7 @@ class OpenMetadata(
|
|
|
108
109
|
OMetaRolePolicyMixin,
|
|
109
110
|
OMetaSearchIndexMixin,
|
|
110
111
|
OMetaCustomPropertyMixin,
|
|
112
|
+
OMetaSuggestionsMixin,
|
|
111
113
|
Generic[T, C],
|
|
112
114
|
):
|
|
113
115
|
"""
|
|
@@ -246,11 +248,9 @@ class OpenMetadata(
|
|
|
246
248
|
)
|
|
247
249
|
return entity_class
|
|
248
250
|
|
|
249
|
-
def
|
|
251
|
+
def _create(self, data: C, method: str) -> T:
|
|
250
252
|
"""
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
We PUT to the endpoint and return the Entity generated result
|
|
253
|
+
Internal logic to run POST vs. PUT
|
|
254
254
|
"""
|
|
255
255
|
entity = data.__class__
|
|
256
256
|
is_create = "create" in data.__class__.__name__.lower()
|
|
@@ -262,15 +262,23 @@ class OpenMetadata(
|
|
|
262
262
|
raise InvalidEntityException(
|
|
263
263
|
f"PUT operations need a CreateEntity, not {entity}"
|
|
264
264
|
)
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
)
|
|
265
|
+
|
|
266
|
+
fn = getattr(self.client, method)
|
|
267
|
+
resp = fn(self.get_suffix(entity), data=data.json(encoder=show_secrets_encoder))
|
|
268
268
|
if not resp:
|
|
269
269
|
raise EmptyPayloadException(
|
|
270
270
|
f"Got an empty response when trying to PUT to {self.get_suffix(entity)}, {data.json()}"
|
|
271
271
|
)
|
|
272
272
|
return entity_class(**resp)
|
|
273
273
|
|
|
274
|
+
def create_or_update(self, data: C) -> T:
|
|
275
|
+
"""Run a PUT requesting via create request C"""
|
|
276
|
+
return self._create(data=data, method="put")
|
|
277
|
+
|
|
278
|
+
def create(self, data: C) -> T:
|
|
279
|
+
"""Run a POST requesting via create request C"""
|
|
280
|
+
return self._create(data=data, method="post")
|
|
281
|
+
|
|
274
282
|
def get_by_name(
|
|
275
283
|
self,
|
|
276
284
|
entity: Type[T],
|
|
@@ -410,7 +418,7 @@ class OpenMetadata(
|
|
|
410
418
|
self,
|
|
411
419
|
entity: Type[T],
|
|
412
420
|
fields: Optional[List[str]] = None,
|
|
413
|
-
limit: int =
|
|
421
|
+
limit: int = 100,
|
|
414
422
|
params: Optional[Dict[str, str]] = None,
|
|
415
423
|
skip_on_failure: bool = False,
|
|
416
424
|
) -> Iterable[T]:
|
|
@@ -50,6 +50,7 @@ from metadata.generated.schema.api.domains.createDataProduct import (
|
|
|
50
50
|
CreateDataProductRequest,
|
|
51
51
|
)
|
|
52
52
|
from metadata.generated.schema.api.domains.createDomain import CreateDomainRequest
|
|
53
|
+
from metadata.generated.schema.api.feed.createSuggestion import CreateSuggestionRequest
|
|
53
54
|
from metadata.generated.schema.api.lineage.addLineage import AddLineageRequest
|
|
54
55
|
from metadata.generated.schema.api.policies.createPolicy import CreatePolicyRequest
|
|
55
56
|
from metadata.generated.schema.api.services.createDashboardService import (
|
|
@@ -90,6 +91,7 @@ from metadata.generated.schema.api.tests.createTestSuite import CreateTestSuiteR
|
|
|
90
91
|
from metadata.generated.schema.dataInsight.dataInsightChart import DataInsightChart
|
|
91
92
|
from metadata.generated.schema.dataInsight.kpi.kpi import Kpi
|
|
92
93
|
from metadata.generated.schema.entity.automations.workflow import Workflow
|
|
94
|
+
from metadata.generated.schema.entity.bot import Bot
|
|
93
95
|
from metadata.generated.schema.entity.classification.classification import (
|
|
94
96
|
Classification,
|
|
95
97
|
)
|
|
@@ -113,6 +115,7 @@ from metadata.generated.schema.entity.data.table import Table
|
|
|
113
115
|
from metadata.generated.schema.entity.data.topic import Topic
|
|
114
116
|
from metadata.generated.schema.entity.domains.dataProduct import DataProduct
|
|
115
117
|
from metadata.generated.schema.entity.domains.domain import Domain
|
|
118
|
+
from metadata.generated.schema.entity.feed.suggestion import Suggestion
|
|
116
119
|
from metadata.generated.schema.entity.policies.policy import Policy
|
|
117
120
|
from metadata.generated.schema.entity.services.connections.testConnectionDefinition import (
|
|
118
121
|
TestConnectionDefinition,
|
|
@@ -181,6 +184,7 @@ ROUTES = {
|
|
|
181
184
|
User.__name__: "/users",
|
|
182
185
|
CreateUserRequest.__name__: "/users",
|
|
183
186
|
AuthenticationMechanism.__name__: "/users/auth-mechanism",
|
|
187
|
+
Bot.__name__: "/bots", # We won't allow bot creation from the client
|
|
184
188
|
# Roles
|
|
185
189
|
Role.__name__: "/roles",
|
|
186
190
|
CreateRoleRequest.__name__: "/roles",
|
|
@@ -225,4 +229,7 @@ ROUTES = {
|
|
|
225
229
|
CreateDomainRequest.__name__: "/domains",
|
|
226
230
|
DataProduct.__name__: "/dataProducts",
|
|
227
231
|
CreateDataProductRequest.__name__: "/dataProducts",
|
|
232
|
+
# Suggestions
|
|
233
|
+
Suggestion.__name__: "/suggestions",
|
|
234
|
+
CreateSuggestionRequest.__name__: "/suggestions",
|
|
228
235
|
}
|
|
@@ -82,7 +82,7 @@ from metadata.ingestion.ometa.ometa_api import OpenMetadata
|
|
|
82
82
|
from metadata.ingestion.source.dashboard.dashboard_service import DashboardUsage
|
|
83
83
|
from metadata.ingestion.source.database.database_service import DataModelLink
|
|
84
84
|
from metadata.profiler.api.models import ProfilerResponse
|
|
85
|
-
from metadata.utils.
|
|
85
|
+
from metadata.utils.execution_time_tracker import calculate_execution_time
|
|
86
86
|
from metadata.utils.logger import get_log_name, ingestion_logger
|
|
87
87
|
|
|
88
88
|
logger = ingestion_logger()
|
|
@@ -129,7 +129,7 @@ class MetadataRestSink(Sink): # pylint: disable=too-many-public-methods
|
|
|
129
129
|
logger.debug(f"Processing Create request {type(record)}")
|
|
130
130
|
return self.write_create_request(record)
|
|
131
131
|
|
|
132
|
-
@calculate_execution_time
|
|
132
|
+
@calculate_execution_time(store=False)
|
|
133
133
|
def _run(self, record: Entity, *_, **__) -> Either[Any]:
|
|
134
134
|
"""
|
|
135
135
|
Default implementation for the single dispatch
|
|
@@ -531,7 +531,6 @@ class DashboardServiceSource(TopologyRunnerMixin, Source, ABC):
|
|
|
531
531
|
)
|
|
532
532
|
|
|
533
533
|
def check_database_schema_name(self, database_schema_name: str):
|
|
534
|
-
|
|
535
534
|
"""
|
|
536
535
|
Check if the input database schema name is equal to "<default>" and return the input name if it is not.
|
|
537
536
|
|
|
@@ -661,7 +661,7 @@ class LookerSource(DashboardServiceSource):
|
|
|
661
661
|
],
|
|
662
662
|
# Dashboards are created from the UI directly. They are not linked to a project
|
|
663
663
|
# like LookML assets, but rather just organised in folders.
|
|
664
|
-
project=self.
|
|
664
|
+
project=self.get_project_name(dashboard_details),
|
|
665
665
|
sourceUrl=f"{clean_uri(self.service_connection.hostPort)}/dashboards/{dashboard_details.id}",
|
|
666
666
|
service=self.context.dashboard_service,
|
|
667
667
|
owner=self.get_owner_ref(dashboard_details=dashboard_details),
|
|
@@ -669,8 +669,7 @@ class LookerSource(DashboardServiceSource):
|
|
|
669
669
|
yield Either(right=dashboard_request)
|
|
670
670
|
self.register_record(dashboard_request=dashboard_request)
|
|
671
671
|
|
|
672
|
-
|
|
673
|
-
def _get_dashboard_project(dashboard_details: LookerDashboard) -> Optional[str]:
|
|
672
|
+
def get_project_name(self, dashboard_details: LookerDashboard) -> Optional[str]:
|
|
674
673
|
"""
|
|
675
674
|
Get dashboard project if the folder is informed
|
|
676
675
|
"""
|
|
@@ -680,7 +679,7 @@ class LookerSource(DashboardServiceSource):
|
|
|
680
679
|
logger.debug(
|
|
681
680
|
f"Cannot get folder name from dashboard [{dashboard_details.title}] - [{exc}]"
|
|
682
681
|
)
|
|
683
|
-
|
|
682
|
+
return None
|
|
684
683
|
|
|
685
684
|
@staticmethod
|
|
686
685
|
def _clean_table_name(table_name: str) -> str:
|
|
@@ -833,7 +832,6 @@ class LookerSource(DashboardServiceSource):
|
|
|
833
832
|
to_entity.id.__root__
|
|
834
833
|
not in self._added_lineage[from_entity.id.__root__]
|
|
835
834
|
):
|
|
836
|
-
|
|
837
835
|
self._added_lineage[from_entity.id.__root__].append(
|
|
838
836
|
to_entity.id.__root__
|
|
839
837
|
)
|
|
@@ -943,7 +941,6 @@ class LookerSource(DashboardServiceSource):
|
|
|
943
941
|
dashboard_name = self.context.dashboard
|
|
944
942
|
|
|
945
943
|
try:
|
|
946
|
-
|
|
947
944
|
dashboard_fqn = fqn.build(
|
|
948
945
|
metadata=self.metadata,
|
|
949
946
|
entity_type=Dashboard,
|
|
@@ -124,6 +124,10 @@ class MetabaseClient:
|
|
|
124
124
|
try:
|
|
125
125
|
resp_dashboard = self.client.get(f"/dashboard/{dashboard_id}")
|
|
126
126
|
if resp_dashboard:
|
|
127
|
+
# Small hack needed to support Metabase versions older than 0.48
|
|
128
|
+
# https://www.metabase.com/releases/metabase-48#fyi--breaking-changes
|
|
129
|
+
if "ordered_cards" in resp_dashboard:
|
|
130
|
+
resp_dashboard["dashcards"] = resp_dashboard["ordered_cards"]
|
|
127
131
|
return MetabaseDashboardDetails(**resp_dashboard)
|
|
128
132
|
except Exception:
|
|
129
133
|
logger.debug(traceback.format_exc())
|
|
@@ -178,7 +178,7 @@ class MetabaseSource(DashboardServiceSource):
|
|
|
178
178
|
Returns:
|
|
179
179
|
Iterable[CreateChartRequest]
|
|
180
180
|
"""
|
|
181
|
-
charts = dashboard_details.
|
|
181
|
+
charts = dashboard_details.dashcards
|
|
182
182
|
for chart in charts:
|
|
183
183
|
try:
|
|
184
184
|
chart_details = chart.card
|
|
@@ -225,7 +225,7 @@ class MetabaseSource(DashboardServiceSource):
|
|
|
225
225
|
if not db_service_name:
|
|
226
226
|
return
|
|
227
227
|
chart_list, dashboard_name = (
|
|
228
|
-
dashboard_details.
|
|
228
|
+
dashboard_details.dashcards,
|
|
229
229
|
str(dashboard_details.id),
|
|
230
230
|
)
|
|
231
231
|
for chart in chart_list:
|
|
@@ -324,8 +324,9 @@ class MetabaseSource(DashboardServiceSource):
|
|
|
324
324
|
self, chart_details: MetabaseChart, db_service_name: str, dashboard_name: str
|
|
325
325
|
) -> Iterable[Either[AddLineageRequest]]:
|
|
326
326
|
table = self.client.get_table(chart_details.table_id)
|
|
327
|
+
table_name = table.name or table.display_name
|
|
327
328
|
|
|
328
|
-
if table is None or
|
|
329
|
+
if table is None or table_name is None:
|
|
329
330
|
return
|
|
330
331
|
|
|
331
332
|
database_name = table.db.details.db if table.db and table.db.details else None
|
|
@@ -334,7 +335,7 @@ class MetabaseSource(DashboardServiceSource):
|
|
|
334
335
|
database=database_name,
|
|
335
336
|
service_name=db_service_name,
|
|
336
337
|
database_schema=table.table_schema,
|
|
337
|
-
table=
|
|
338
|
+
table=table_name,
|
|
338
339
|
)
|
|
339
340
|
|
|
340
341
|
to_fqn = fqn.build(
|
|
@@ -67,7 +67,7 @@ class MetabaseChart(BaseModel):
|
|
|
67
67
|
display: Optional[str]
|
|
68
68
|
|
|
69
69
|
|
|
70
|
-
class
|
|
70
|
+
class DashCard(BaseModel):
|
|
71
71
|
card: MetabaseChart
|
|
72
72
|
|
|
73
73
|
|
|
@@ -77,7 +77,7 @@ class MetabaseDashboardDetails(BaseModel):
|
|
|
77
77
|
"""
|
|
78
78
|
|
|
79
79
|
description: Optional[str]
|
|
80
|
-
|
|
80
|
+
dashcards: List[DashCard]
|
|
81
81
|
name: Optional[str]
|
|
82
82
|
id: int
|
|
83
83
|
collection_id: Optional[str]
|
|
@@ -192,7 +192,6 @@ class SupersetAPISource(SupersetSourceMixin):
|
|
|
192
192
|
def yield_datamodel(
|
|
193
193
|
self, dashboard_details: DashboardResult
|
|
194
194
|
) -> Iterable[Either[CreateDashboardDataModelRequest]]:
|
|
195
|
-
|
|
196
195
|
if self.source_config.includeDataModels:
|
|
197
196
|
for chart_id in self._get_charts_of_dashboard(dashboard_details):
|
|
198
197
|
try:
|
|
@@ -15,7 +15,6 @@ Superset source module
|
|
|
15
15
|
import traceback
|
|
16
16
|
from typing import Iterable, Optional
|
|
17
17
|
|
|
18
|
-
from sqlalchemy import sql
|
|
19
18
|
from sqlalchemy.engine import Engine
|
|
20
19
|
from sqlalchemy.engine.url import make_url
|
|
21
20
|
|
|
@@ -87,7 +86,7 @@ class SupersetDBSource(SupersetSourceMixin):
|
|
|
87
86
|
try:
|
|
88
87
|
if table_name:
|
|
89
88
|
col_list = self.engine.execute(
|
|
90
|
-
|
|
89
|
+
FETCH_COLUMN, table_name=table_name.lower()
|
|
91
90
|
)
|
|
92
91
|
return [FetchColumn(**col) for col in col_list]
|
|
93
92
|
except Exception as err:
|
|
@@ -216,7 +215,6 @@ class SupersetDBSource(SupersetSourceMixin):
|
|
|
216
215
|
def yield_datamodel(
|
|
217
216
|
self, dashboard_details: FetchDashboard
|
|
218
217
|
) -> Iterable[Either[CreateDashboardDataModelRequest]]:
|
|
219
|
-
|
|
220
218
|
if self.source_config.includeDataModels:
|
|
221
219
|
for chart_id in self._get_charts_of_dashboard(dashboard_details):
|
|
222
220
|
chart_json = self.all_charts.get(chart_id)
|
|
@@ -152,6 +152,23 @@ class TableauSource(DashboardServiceSource):
|
|
|
152
152
|
include_tags=self.source_config.includeTags,
|
|
153
153
|
)
|
|
154
154
|
|
|
155
|
+
def _get_datamodel_sql_query(self, data_model: DataSource) -> Optional[str]:
|
|
156
|
+
"""
|
|
157
|
+
Method to fetch the custom sql query from the tableau datamodels
|
|
158
|
+
"""
|
|
159
|
+
try:
|
|
160
|
+
sql_queries = []
|
|
161
|
+
for table in data_model.upstreamTables or []:
|
|
162
|
+
for referenced_query in table.referencedByQueries or []:
|
|
163
|
+
sql_queries.append(referenced_query.query)
|
|
164
|
+
return "\n\n".join(sql_queries) or None
|
|
165
|
+
except Exception as exc:
|
|
166
|
+
logger.debug(traceback.format_exc())
|
|
167
|
+
logger.warning(
|
|
168
|
+
f"Error processing queries for datamodel [{data_model.id}]: {exc}"
|
|
169
|
+
)
|
|
170
|
+
return None
|
|
171
|
+
|
|
155
172
|
def yield_datamodel(
|
|
156
173
|
self, dashboard_details: TableauDashboard
|
|
157
174
|
) -> Iterable[Either[CreateDashboardDataModelRequest]]:
|
|
@@ -171,6 +188,7 @@ class TableauSource(DashboardServiceSource):
|
|
|
171
188
|
dataModelType=DataModelType.TableauDataModel.value,
|
|
172
189
|
serviceType=DashboardServiceType.Tableau.value,
|
|
173
190
|
columns=self.get_column_info(data_model),
|
|
191
|
+
sql=self._get_datamodel_sql_query(data_model=data_model),
|
|
174
192
|
)
|
|
175
193
|
yield Either(right=data_model_request)
|
|
176
194
|
self.register_record_datamodel(datamodel_request=data_model_request)
|
|
@@ -199,7 +217,7 @@ class TableauSource(DashboardServiceSource):
|
|
|
199
217
|
try:
|
|
200
218
|
dashboard_url = (
|
|
201
219
|
f"{clean_uri(str(self.config.serviceConnection.__root__.config.hostPort))}"
|
|
202
|
-
f"/#{urlparse(dashboard_details.webpageUrl).fragment}"
|
|
220
|
+
f"/#{urlparse(dashboard_details.webpageUrl).fragment}/views"
|
|
203
221
|
)
|
|
204
222
|
dashboard_request = CreateDashboardRequest(
|
|
205
223
|
name=dashboard_details.id,
|
|
@@ -54,9 +54,7 @@ class AthenaLakeFormationClient:
|
|
|
54
54
|
)
|
|
55
55
|
return None
|
|
56
56
|
|
|
57
|
-
def get_table_and_column_tags(
|
|
58
|
-
self, schema_name: str, table_name: str
|
|
59
|
-
) -> Optional[LFTags]:
|
|
57
|
+
def get_table_and_column_tags(self, schema_name: str, table_name: str) -> LFTags:
|
|
60
58
|
"""
|
|
61
59
|
Method to call the API and get the table and column tags
|
|
62
60
|
"""
|
|
@@ -79,4 +77,4 @@ class AthenaLakeFormationClient:
|
|
|
79
77
|
logger.warning(
|
|
80
78
|
f"Unable to get lf tags for table resource [{table_name}] due to: {exc}"
|
|
81
79
|
)
|
|
82
|
-
return
|
|
80
|
+
return LFTags()
|
|
@@ -77,7 +77,6 @@ class AzuresqlSource(CommonDbSourceService, MultiDBSource):
|
|
|
77
77
|
yield from self._execute_database_query(AZURE_SQL_GET_DATABASES)
|
|
78
78
|
|
|
79
79
|
def get_database_names(self) -> Iterable[str]:
|
|
80
|
-
|
|
81
80
|
if not self.config.serviceConnection.__root__.config.ingestAllDatabases:
|
|
82
81
|
configured_db = self.config.serviceConnection.__root__.config.database
|
|
83
82
|
self.set_inspector(database_name=configured_db)
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"""
|
|
13
13
|
Source connection helper
|
|
14
14
|
"""
|
|
15
|
-
|
|
15
|
+
import traceback
|
|
16
16
|
from typing import Any
|
|
17
17
|
|
|
18
18
|
from pydantic import BaseModel
|
|
@@ -26,7 +26,14 @@ from metadata.generated.schema.security.credentials.gcpValues import (
|
|
|
26
26
|
SingleProjectId,
|
|
27
27
|
)
|
|
28
28
|
from metadata.ingestion.source.connections import get_connection
|
|
29
|
+
from metadata.ingestion.source.database.bigquery.queries import (
|
|
30
|
+
BIGQUERY_FOREIGN_CONSTRAINTS,
|
|
31
|
+
BIGQUERY_TABLE_CONSTRAINTS,
|
|
32
|
+
)
|
|
29
33
|
from metadata.utils.bigquery_utils import get_bigquery_client
|
|
34
|
+
from metadata.utils.logger import ingestion_logger
|
|
35
|
+
|
|
36
|
+
logger = ingestion_logger()
|
|
30
37
|
|
|
31
38
|
|
|
32
39
|
class InspectorWrapper(BaseModel):
|
|
@@ -64,3 +71,63 @@ def get_inspector_details(
|
|
|
64
71
|
inspector = inspect(engine)
|
|
65
72
|
|
|
66
73
|
return InspectorWrapper(client=client, engine=engine, inspector=inspector)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def get_pk_constraint(
|
|
77
|
+
self, connection, table_name, schema=None, **kw
|
|
78
|
+
): # pylint: disable=unused-argument
|
|
79
|
+
"""
|
|
80
|
+
This function overrides to get primary key constraint
|
|
81
|
+
"""
|
|
82
|
+
try:
|
|
83
|
+
table_constraints = connection.engine.execute(
|
|
84
|
+
BIGQUERY_TABLE_CONSTRAINTS.format(
|
|
85
|
+
project_id=connection.engine.url.host,
|
|
86
|
+
schema_name=schema,
|
|
87
|
+
table_name=table_name,
|
|
88
|
+
)
|
|
89
|
+
)
|
|
90
|
+
col_name = []
|
|
91
|
+
for table_constraint in table_constraints:
|
|
92
|
+
col_name.append(table_constraint.column_name)
|
|
93
|
+
return {"constrained_columns": tuple(col_name)}
|
|
94
|
+
except Exception as exc:
|
|
95
|
+
logger.debug(traceback.format_exc())
|
|
96
|
+
logger.warning(
|
|
97
|
+
f"Error while fetching primary key constraint error for table [{schema}.{table_name}]: {exc}"
|
|
98
|
+
)
|
|
99
|
+
return {"constrained_columns": []}
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def get_foreign_keys(
|
|
103
|
+
self, connection, table_name, schema=None, **kw
|
|
104
|
+
): # pylint: disable=unused-argument
|
|
105
|
+
"""
|
|
106
|
+
This function overrides to get foreign key constraint
|
|
107
|
+
"""
|
|
108
|
+
try:
|
|
109
|
+
table_constraints = connection.engine.execute(
|
|
110
|
+
BIGQUERY_FOREIGN_CONSTRAINTS.format(
|
|
111
|
+
project_id=connection.engine.url.host,
|
|
112
|
+
schema_name=schema,
|
|
113
|
+
table_name=table_name,
|
|
114
|
+
)
|
|
115
|
+
)
|
|
116
|
+
col_name = []
|
|
117
|
+
for table_constraint in table_constraints:
|
|
118
|
+
col_name.append(
|
|
119
|
+
{
|
|
120
|
+
"name": table_constraint.name,
|
|
121
|
+
"referred_schema": table_constraint.referred_schema,
|
|
122
|
+
"referred_table": table_constraint.referred_table,
|
|
123
|
+
"constrained_columns": [table_constraint.constrained_columns],
|
|
124
|
+
"referred_columns": [table_constraint.referred_columns],
|
|
125
|
+
}
|
|
126
|
+
)
|
|
127
|
+
return col_name
|
|
128
|
+
except Exception as exc:
|
|
129
|
+
logger.debug(traceback.format_exc())
|
|
130
|
+
logger.warning(
|
|
131
|
+
f"Error while fetching foreign key constraint error for table [{schema}.{table_name}]: {exc}"
|
|
132
|
+
)
|
|
133
|
+
return []
|
|
@@ -56,7 +56,11 @@ from metadata.ingestion.api.steps import InvalidSourceException
|
|
|
56
56
|
from metadata.ingestion.models.ometa_classification import OMetaTagAndClassification
|
|
57
57
|
from metadata.ingestion.ometa.ometa_api import OpenMetadata
|
|
58
58
|
from metadata.ingestion.source.connections import get_test_connection_fn
|
|
59
|
-
from metadata.ingestion.source.database.bigquery.helper import
|
|
59
|
+
from metadata.ingestion.source.database.bigquery.helper import (
|
|
60
|
+
get_foreign_keys,
|
|
61
|
+
get_inspector_details,
|
|
62
|
+
get_pk_constraint,
|
|
63
|
+
)
|
|
60
64
|
from metadata.ingestion.source.database.bigquery.models import (
|
|
61
65
|
STORED_PROC_LANGUAGE_MAP,
|
|
62
66
|
BigQueryStoredProcedure,
|
|
@@ -194,6 +198,8 @@ def _build_formatted_table_id(table):
|
|
|
194
198
|
BigQueryDialect._build_formatted_table_id = ( # pylint: disable=protected-access
|
|
195
199
|
_build_formatted_table_id
|
|
196
200
|
)
|
|
201
|
+
BigQueryDialect.get_pk_constraint = get_pk_constraint
|
|
202
|
+
BigQueryDialect.get_foreign_keys = get_foreign_keys
|
|
197
203
|
|
|
198
204
|
|
|
199
205
|
class BigquerySource(
|
|
@@ -245,7 +251,9 @@ class BigquerySource(
|
|
|
245
251
|
test_connection_fn(
|
|
246
252
|
self.metadata, inspector_details.engine, self.service_connection
|
|
247
253
|
)
|
|
248
|
-
|
|
254
|
+
# GOOGLE_CREDENTIALS may not have been set,
|
|
255
|
+
# to avoid key error, we use `get` for dict
|
|
256
|
+
if os.environ.get(GOOGLE_CREDENTIALS):
|
|
249
257
|
self.temp_credentials_file_path.append(os.environ[GOOGLE_CREDENTIALS])
|
|
250
258
|
|
|
251
259
|
def query_table_names_and_types(
|
|
@@ -436,7 +444,8 @@ class BigquerySource(
|
|
|
436
444
|
inspector_details = get_inspector_details(
|
|
437
445
|
database_name=database_name, service_connection=self.service_connection
|
|
438
446
|
)
|
|
439
|
-
|
|
447
|
+
if os.environ.get(GOOGLE_CREDENTIALS):
|
|
448
|
+
self.temp_credentials_file_path.append(os.environ[GOOGLE_CREDENTIALS])
|
|
440
449
|
self.client = inspector_details.client
|
|
441
450
|
self.engine = inspector_details.engine
|
|
442
451
|
self.inspector = inspector_details.inspector
|