openmetadata-ingestion 1.1.4.0__py3-none-any.whl → 1.1.6.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.

Files changed (445) hide show
  1. metadata/data_insight/api/workflow.py +57 -1
  2. metadata/data_quality/interface/pandas/pandas_test_suite_interface.py +1 -1
  3. metadata/data_quality/interface/sqlalchemy/sqa_test_suite_interface.py +1 -1
  4. metadata/generated/schema/analytics/__init__.py +1 -1
  5. metadata/generated/schema/analytics/basic.py +1 -1
  6. metadata/generated/schema/analytics/reportData.py +1 -1
  7. metadata/generated/schema/analytics/reportDataType/__init__.py +1 -1
  8. metadata/generated/schema/analytics/reportDataType/entityReportData.py +1 -1
  9. metadata/generated/schema/analytics/reportDataType/webAnalyticEntityViewReportData.py +1 -1
  10. metadata/generated/schema/analytics/reportDataType/webAnalyticUserActivityReportData.py +1 -1
  11. metadata/generated/schema/analytics/webAnalyticEvent.py +1 -1
  12. metadata/generated/schema/analytics/webAnalyticEventData.py +1 -1
  13. metadata/generated/schema/analytics/webAnalyticEventType/__init__.py +1 -1
  14. metadata/generated/schema/analytics/webAnalyticEventType/customEvent.py +1 -1
  15. metadata/generated/schema/analytics/webAnalyticEventType/pageViewEvent.py +1 -1
  16. metadata/generated/schema/api/__init__.py +1 -1
  17. metadata/generated/schema/api/analytics/__init__.py +1 -1
  18. metadata/generated/schema/api/analytics/createWebAnalyticEvent.py +1 -1
  19. metadata/generated/schema/api/automations/__init__.py +1 -1
  20. metadata/generated/schema/api/automations/createWorkflow.py +1 -1
  21. metadata/generated/schema/api/classification/__init__.py +1 -1
  22. metadata/generated/schema/api/classification/createClassification.py +1 -1
  23. metadata/generated/schema/api/classification/createTag.py +1 -1
  24. metadata/generated/schema/api/classification/loadTags.py +1 -1
  25. metadata/generated/schema/api/createBot.py +1 -1
  26. metadata/generated/schema/api/createEventPublisherJob.py +1 -1
  27. metadata/generated/schema/api/createType.py +1 -1
  28. metadata/generated/schema/api/data/__init__.py +1 -1
  29. metadata/generated/schema/api/data/createChart.py +1 -1
  30. metadata/generated/schema/api/data/createContainer.py +1 -1
  31. metadata/generated/schema/api/data/createDashboard.py +1 -1
  32. metadata/generated/schema/api/data/createDashboardDataModel.py +1 -1
  33. metadata/generated/schema/api/data/createDatabase.py +1 -1
  34. metadata/generated/schema/api/data/createDatabaseSchema.py +1 -1
  35. metadata/generated/schema/api/data/createGlossary.py +1 -1
  36. metadata/generated/schema/api/data/createGlossaryTerm.py +1 -1
  37. metadata/generated/schema/api/data/createMlModel.py +1 -1
  38. metadata/generated/schema/api/data/createPipeline.py +1 -1
  39. metadata/generated/schema/api/data/createQuery.py +6 -1
  40. metadata/generated/schema/api/data/createTable.py +1 -1
  41. metadata/generated/schema/api/data/createTableProfile.py +1 -1
  42. metadata/generated/schema/api/data/createTopic.py +1 -1
  43. metadata/generated/schema/api/data/restoreEntity.py +1 -1
  44. metadata/generated/schema/api/dataInsight/__init__.py +1 -1
  45. metadata/generated/schema/api/dataInsight/createDataInsightChart.py +1 -1
  46. metadata/generated/schema/api/dataInsight/kpi/__init__.py +1 -1
  47. metadata/generated/schema/api/dataInsight/kpi/createKpiRequest.py +1 -1
  48. metadata/generated/schema/api/feed/__init__.py +1 -1
  49. metadata/generated/schema/api/feed/closeTask.py +1 -1
  50. metadata/generated/schema/api/feed/createPost.py +1 -1
  51. metadata/generated/schema/api/feed/createThread.py +1 -1
  52. metadata/generated/schema/api/feed/resolveTask.py +1 -1
  53. metadata/generated/schema/api/feed/threadCount.py +1 -1
  54. metadata/generated/schema/api/lineage/__init__.py +1 -1
  55. metadata/generated/schema/api/lineage/addLineage.py +1 -1
  56. metadata/generated/schema/api/openMetadataServerVersion.py +1 -1
  57. metadata/generated/schema/api/policies/__init__.py +1 -1
  58. metadata/generated/schema/api/policies/createPolicy.py +1 -1
  59. metadata/generated/schema/api/services/__init__.py +1 -1
  60. metadata/generated/schema/api/services/createDashboardService.py +1 -1
  61. metadata/generated/schema/api/services/createDatabaseService.py +1 -1
  62. metadata/generated/schema/api/services/createMessagingService.py +1 -1
  63. metadata/generated/schema/api/services/createMetadataService.py +1 -1
  64. metadata/generated/schema/api/services/createMlModelService.py +1 -1
  65. metadata/generated/schema/api/services/createPipelineService.py +1 -1
  66. metadata/generated/schema/api/services/createStorageService.py +1 -1
  67. metadata/generated/schema/api/services/ingestionPipelines/__init__.py +1 -1
  68. metadata/generated/schema/api/services/ingestionPipelines/createIngestionPipeline.py +1 -1
  69. metadata/generated/schema/api/setOwner.py +1 -1
  70. metadata/generated/schema/api/teams/__init__.py +1 -1
  71. metadata/generated/schema/api/teams/createRole.py +1 -1
  72. metadata/generated/schema/api/teams/createTeam.py +1 -1
  73. metadata/generated/schema/api/teams/createUser.py +1 -1
  74. metadata/generated/schema/api/tests/__init__.py +1 -1
  75. metadata/generated/schema/api/tests/createCustomMetric.py +1 -1
  76. metadata/generated/schema/api/tests/createLogicalTestCases.py +1 -1
  77. metadata/generated/schema/api/tests/createTestCase.py +1 -1
  78. metadata/generated/schema/api/tests/createTestDefinition.py +1 -1
  79. metadata/generated/schema/api/tests/createTestSuite.py +1 -1
  80. metadata/generated/schema/api/voteRequest.py +1 -1
  81. metadata/generated/schema/auth/__init__.py +1 -1
  82. metadata/generated/schema/auth/basicAuth.py +1 -1
  83. metadata/generated/schema/auth/basicLoginRequest.py +1 -1
  84. metadata/generated/schema/auth/changePasswordRequest.py +1 -1
  85. metadata/generated/schema/auth/createPersonalToken.py +1 -1
  86. metadata/generated/schema/auth/emailRequest.py +1 -1
  87. metadata/generated/schema/auth/emailVerificationToken.py +1 -1
  88. metadata/generated/schema/auth/generateToken.py +1 -1
  89. metadata/generated/schema/auth/jwtAuth.py +1 -1
  90. metadata/generated/schema/auth/loginRequest.py +1 -1
  91. metadata/generated/schema/auth/logoutRequest.py +1 -1
  92. metadata/generated/schema/auth/passwordResetRequest.py +1 -1
  93. metadata/generated/schema/auth/passwordResetToken.py +1 -1
  94. metadata/generated/schema/auth/personalAccessToken.py +1 -1
  95. metadata/generated/schema/auth/refreshToken.py +1 -1
  96. metadata/generated/schema/auth/registrationRequest.py +1 -1
  97. metadata/generated/schema/auth/revokePersonalToken.py +1 -1
  98. metadata/generated/schema/auth/revokeToken.py +1 -1
  99. metadata/generated/schema/auth/serviceTokenEnum.py +1 -1
  100. metadata/generated/schema/auth/ssoAuth.py +1 -1
  101. metadata/generated/schema/auth/tokenRefreshRequest.py +1 -1
  102. metadata/generated/schema/configuration/__init__.py +1 -1
  103. metadata/generated/schema/configuration/applicationConfiguration.py +1 -1
  104. metadata/generated/schema/configuration/authConfig.py +1 -1
  105. metadata/generated/schema/configuration/authenticationConfiguration.py +1 -1
  106. metadata/generated/schema/configuration/authorizerConfiguration.py +1 -1
  107. metadata/generated/schema/configuration/changeEventConfiguration.py +1 -1
  108. metadata/generated/schema/configuration/elasticSearchConfiguration.py +1 -1
  109. metadata/generated/schema/configuration/eventHandlerConfiguration.py +1 -1
  110. metadata/generated/schema/configuration/extensionConfiguration.py +1 -1
  111. metadata/generated/schema/configuration/fernetConfiguration.py +1 -1
  112. metadata/generated/schema/configuration/jwtTokenConfiguration.py +1 -1
  113. metadata/generated/schema/configuration/kafkaEventConfiguration.py +1 -1
  114. metadata/generated/schema/configuration/ldapConfiguration.py +1 -1
  115. metadata/generated/schema/configuration/ldapTrustStoreConfig/__init__.py +1 -1
  116. metadata/generated/schema/configuration/ldapTrustStoreConfig/customTrustManagerConfig.py +1 -1
  117. metadata/generated/schema/configuration/ldapTrustStoreConfig/hostNameConfig.py +1 -1
  118. metadata/generated/schema/configuration/ldapTrustStoreConfig/jvmDefaultConfig.py +1 -1
  119. metadata/generated/schema/configuration/ldapTrustStoreConfig/trustAllConfig.py +1 -1
  120. metadata/generated/schema/configuration/ldapTrustStoreConfig/truststoreConfig.py +1 -1
  121. metadata/generated/schema/configuration/pipelineServiceClientConfiguration.py +1 -1
  122. metadata/generated/schema/configuration/slackAppConfiguration.py +1 -1
  123. metadata/generated/schema/configuration/taskNotificationConfiguration.py +1 -1
  124. metadata/generated/schema/configuration/testResultNotificationConfiguration.py +1 -1
  125. metadata/generated/schema/dataInsight/__init__.py +1 -1
  126. metadata/generated/schema/dataInsight/dataInsightChart.py +1 -1
  127. metadata/generated/schema/dataInsight/dataInsightChartResult.py +1 -1
  128. metadata/generated/schema/dataInsight/kpi/__init__.py +1 -1
  129. metadata/generated/schema/dataInsight/kpi/basic.py +1 -1
  130. metadata/generated/schema/dataInsight/kpi/kpi.py +1 -1
  131. metadata/generated/schema/dataInsight/type/__init__.py +1 -1
  132. metadata/generated/schema/dataInsight/type/dailyActiveUsers.py +1 -1
  133. metadata/generated/schema/dataInsight/type/mostActiveUsers.py +1 -1
  134. metadata/generated/schema/dataInsight/type/mostViewedEntities.py +1 -1
  135. metadata/generated/schema/dataInsight/type/pageViewsByEntities.py +1 -1
  136. metadata/generated/schema/dataInsight/type/percentageOfEntitiesWithDescriptionByType.py +1 -1
  137. metadata/generated/schema/dataInsight/type/percentageOfEntitiesWithOwnerByType.py +1 -1
  138. metadata/generated/schema/dataInsight/type/percentageOfServicesWithDescription.py +1 -1
  139. metadata/generated/schema/dataInsight/type/percentageOfServicesWithOwner.py +1 -1
  140. metadata/generated/schema/dataInsight/type/totalEntitiesByTier.py +1 -1
  141. metadata/generated/schema/dataInsight/type/totalEntitiesByType.py +1 -1
  142. metadata/generated/schema/email/__init__.py +1 -1
  143. metadata/generated/schema/email/emailRequest.py +1 -1
  144. metadata/generated/schema/email/smtpSettings.py +1 -1
  145. metadata/generated/schema/entity/__init__.py +1 -1
  146. metadata/generated/schema/entity/automations/__init__.py +1 -1
  147. metadata/generated/schema/entity/automations/testServiceConnection.py +1 -1
  148. metadata/generated/schema/entity/automations/workflow.py +1 -1
  149. metadata/generated/schema/entity/bot.py +1 -1
  150. metadata/generated/schema/entity/classification/__init__.py +1 -1
  151. metadata/generated/schema/entity/classification/classification.py +1 -1
  152. metadata/generated/schema/entity/classification/tag.py +1 -1
  153. metadata/generated/schema/entity/data/__init__.py +1 -1
  154. metadata/generated/schema/entity/data/chart.py +1 -1
  155. metadata/generated/schema/entity/data/container.py +1 -1
  156. metadata/generated/schema/entity/data/dashboard.py +1 -1
  157. metadata/generated/schema/entity/data/dashboardDataModel.py +1 -1
  158. metadata/generated/schema/entity/data/database.py +1 -1
  159. metadata/generated/schema/entity/data/databaseSchema.py +1 -1
  160. metadata/generated/schema/entity/data/glossary.py +1 -1
  161. metadata/generated/schema/entity/data/glossaryTerm.py +1 -1
  162. metadata/generated/schema/entity/data/metrics.py +1 -1
  163. metadata/generated/schema/entity/data/mlmodel.py +1 -1
  164. metadata/generated/schema/entity/data/pipeline.py +1 -1
  165. metadata/generated/schema/entity/data/query.py +6 -1
  166. metadata/generated/schema/entity/data/report.py +1 -1
  167. metadata/generated/schema/entity/data/table.py +1 -1
  168. metadata/generated/schema/entity/data/topic.py +1 -1
  169. metadata/generated/schema/entity/events/__init__.py +1 -1
  170. metadata/generated/schema/entity/events/webhook.py +1 -1
  171. metadata/generated/schema/entity/feed/__init__.py +1 -1
  172. metadata/generated/schema/entity/feed/thread.py +1 -1
  173. metadata/generated/schema/entity/policies/__init__.py +1 -1
  174. metadata/generated/schema/entity/policies/accessControl/__init__.py +1 -1
  175. metadata/generated/schema/entity/policies/accessControl/resourceDescriptor.py +1 -1
  176. metadata/generated/schema/entity/policies/accessControl/resourcePermission.py +1 -1
  177. metadata/generated/schema/entity/policies/accessControl/rule.py +1 -1
  178. metadata/generated/schema/entity/policies/filters.py +1 -1
  179. metadata/generated/schema/entity/policies/policy.py +1 -1
  180. metadata/generated/schema/entity/services/__init__.py +1 -1
  181. metadata/generated/schema/entity/services/connections/__init__.py +1 -1
  182. metadata/generated/schema/entity/services/connections/connectionBasicType.py +1 -1
  183. metadata/generated/schema/entity/services/connections/dashboard/__init__.py +1 -1
  184. metadata/generated/schema/entity/services/connections/dashboard/customDashboardConnection.py +1 -1
  185. metadata/generated/schema/entity/services/connections/dashboard/domoDashboardConnection.py +1 -1
  186. metadata/generated/schema/entity/services/connections/dashboard/lookerConnection.py +1 -1
  187. metadata/generated/schema/entity/services/connections/dashboard/metabaseConnection.py +1 -1
  188. metadata/generated/schema/entity/services/connections/dashboard/modeConnection.py +1 -1
  189. metadata/generated/schema/entity/services/connections/dashboard/powerBIConnection.py +1 -1
  190. metadata/generated/schema/entity/services/connections/dashboard/qlikSenseConnection.py +1 -1
  191. metadata/generated/schema/entity/services/connections/dashboard/quickSightConnection.py +1 -1
  192. metadata/generated/schema/entity/services/connections/dashboard/redashConnection.py +1 -1
  193. metadata/generated/schema/entity/services/connections/dashboard/supersetConnection.py +1 -1
  194. metadata/generated/schema/entity/services/connections/dashboard/tableauConnection.py +1 -1
  195. metadata/generated/schema/entity/services/connections/database/__init__.py +1 -1
  196. metadata/generated/schema/entity/services/connections/database/athenaConnection.py +1 -1
  197. metadata/generated/schema/entity/services/connections/database/azureSQLConnection.py +1 -1
  198. metadata/generated/schema/entity/services/connections/database/bigQueryConnection.py +1 -1
  199. metadata/generated/schema/entity/services/connections/database/clickhouseConnection.py +1 -1
  200. metadata/generated/schema/entity/services/connections/database/common/__init__.py +1 -1
  201. metadata/generated/schema/entity/services/connections/database/common/basicAuth.py +1 -1
  202. metadata/generated/schema/entity/services/connections/database/common/iamAuthConfig.py +1 -1
  203. metadata/generated/schema/entity/services/connections/database/common/jwtAuth.py +1 -1
  204. metadata/generated/schema/entity/services/connections/database/customDatabaseConnection.py +1 -1
  205. metadata/generated/schema/entity/services/connections/database/databricksConnection.py +1 -1
  206. metadata/generated/schema/entity/services/connections/database/datalake/__init__.py +1 -1
  207. metadata/generated/schema/entity/services/connections/database/datalake/azureConfig.py +1 -1
  208. metadata/generated/schema/entity/services/connections/database/datalake/gcsConfig.py +1 -1
  209. metadata/generated/schema/entity/services/connections/database/datalake/s3Config.py +1 -1
  210. metadata/generated/schema/entity/services/connections/database/datalakeConnection.py +1 -1
  211. metadata/generated/schema/entity/services/connections/database/db2Connection.py +1 -1
  212. metadata/generated/schema/entity/services/connections/database/deltaLakeConnection.py +1 -1
  213. metadata/generated/schema/entity/services/connections/database/domoDatabaseConnection.py +1 -1
  214. metadata/generated/schema/entity/services/connections/database/druidConnection.py +1 -1
  215. metadata/generated/schema/entity/services/connections/database/dynamoDBConnection.py +1 -1
  216. metadata/generated/schema/entity/services/connections/database/glueConnection.py +1 -1
  217. metadata/generated/schema/entity/services/connections/database/hiveConnection.py +2 -2
  218. metadata/generated/schema/entity/services/connections/database/impalaConnection.py +1 -1
  219. metadata/generated/schema/entity/services/connections/database/mariaDBConnection.py +1 -1
  220. metadata/generated/schema/entity/services/connections/database/mongoDB/__init__.py +1 -1
  221. metadata/generated/schema/entity/services/connections/database/mongoDB/mongoDBValues.py +1 -1
  222. metadata/generated/schema/entity/services/connections/database/mongoDBConnection.py +1 -1
  223. metadata/generated/schema/entity/services/connections/database/mssqlConnection.py +1 -1
  224. metadata/generated/schema/entity/services/connections/database/mysqlConnection.py +1 -1
  225. metadata/generated/schema/entity/services/connections/database/oracleConnection.py +1 -1
  226. metadata/generated/schema/entity/services/connections/database/pinotDBConnection.py +1 -1
  227. metadata/generated/schema/entity/services/connections/database/postgresConnection.py +1 -1
  228. metadata/generated/schema/entity/services/connections/database/prestoConnection.py +1 -1
  229. metadata/generated/schema/entity/services/connections/database/redshiftConnection.py +1 -1
  230. metadata/generated/schema/entity/services/connections/database/salesforceConnection.py +1 -1
  231. metadata/generated/schema/entity/services/connections/database/sapHanaConnection.py +1 -1
  232. metadata/generated/schema/entity/services/connections/database/singleStoreConnection.py +1 -1
  233. metadata/generated/schema/entity/services/connections/database/snowflakeConnection.py +1 -1
  234. metadata/generated/schema/entity/services/connections/database/sqliteConnection.py +1 -1
  235. metadata/generated/schema/entity/services/connections/database/trinoConnection.py +1 -1
  236. metadata/generated/schema/entity/services/connections/database/verticaConnection.py +1 -1
  237. metadata/generated/schema/entity/services/connections/messaging/__init__.py +1 -1
  238. metadata/generated/schema/entity/services/connections/messaging/customMessagingConnection.py +1 -1
  239. metadata/generated/schema/entity/services/connections/messaging/kafkaConnection.py +1 -1
  240. metadata/generated/schema/entity/services/connections/messaging/kinesisConnection.py +1 -1
  241. metadata/generated/schema/entity/services/connections/messaging/pulsarConnection.py +1 -1
  242. metadata/generated/schema/entity/services/connections/messaging/redpandaConnection.py +1 -1
  243. metadata/generated/schema/entity/services/connections/messaging/saslMechanismType.py +1 -1
  244. metadata/generated/schema/entity/services/connections/metadata/__init__.py +1 -1
  245. metadata/generated/schema/entity/services/connections/metadata/amundsenConnection.py +1 -1
  246. metadata/generated/schema/entity/services/connections/metadata/atlasConnection.py +1 -1
  247. metadata/generated/schema/entity/services/connections/metadata/metadataESConnection.py +1 -1
  248. metadata/generated/schema/entity/services/connections/metadata/openMetadataConnection.py +1 -1
  249. metadata/generated/schema/entity/services/connections/mlmodel/__init__.py +1 -1
  250. metadata/generated/schema/entity/services/connections/mlmodel/customMlModelConnection.py +1 -1
  251. metadata/generated/schema/entity/services/connections/mlmodel/mlflowConnection.py +1 -1
  252. metadata/generated/schema/entity/services/connections/mlmodel/sageMakerConnection.py +1 -1
  253. metadata/generated/schema/entity/services/connections/mlmodel/sklearnConnection.py +1 -1
  254. metadata/generated/schema/entity/services/connections/pipeline/__init__.py +1 -1
  255. metadata/generated/schema/entity/services/connections/pipeline/airbyteConnection.py +1 -1
  256. metadata/generated/schema/entity/services/connections/pipeline/airflowConnection.py +1 -1
  257. metadata/generated/schema/entity/services/connections/pipeline/backendConnection.py +1 -1
  258. metadata/generated/schema/entity/services/connections/pipeline/customPipelineConnection.py +1 -1
  259. metadata/generated/schema/entity/services/connections/pipeline/dagsterConnection.py +1 -1
  260. metadata/generated/schema/entity/services/connections/pipeline/databricksPipelineConnection.py +1 -1
  261. metadata/generated/schema/entity/services/connections/pipeline/domoPipelineConnection.py +1 -1
  262. metadata/generated/schema/entity/services/connections/pipeline/fivetranConnection.py +1 -1
  263. metadata/generated/schema/entity/services/connections/pipeline/gluePipelineConnection.py +1 -1
  264. metadata/generated/schema/entity/services/connections/pipeline/nifiConnection.py +1 -1
  265. metadata/generated/schema/entity/services/connections/pipeline/splineConnection.py +1 -1
  266. metadata/generated/schema/entity/services/connections/search/__init__.py +1 -1
  267. metadata/generated/schema/entity/services/connections/search/elasticSearchConnection.py +1 -1
  268. metadata/generated/schema/entity/services/connections/serviceConnection.py +1 -1
  269. metadata/generated/schema/entity/services/connections/storage/__init__.py +1 -1
  270. metadata/generated/schema/entity/services/connections/storage/adlsConection.py +1 -1
  271. metadata/generated/schema/entity/services/connections/storage/customStorageConnection.py +1 -1
  272. metadata/generated/schema/entity/services/connections/storage/gcsConnection.py +1 -1
  273. metadata/generated/schema/entity/services/connections/storage/s3Connection.py +1 -1
  274. metadata/generated/schema/entity/services/connections/testConnectionDefinition.py +1 -1
  275. metadata/generated/schema/entity/services/connections/testConnectionResult.py +1 -1
  276. metadata/generated/schema/entity/services/dashboardService.py +1 -1
  277. metadata/generated/schema/entity/services/databaseService.py +1 -1
  278. metadata/generated/schema/entity/services/ingestionPipelines/__init__.py +1 -1
  279. metadata/generated/schema/entity/services/ingestionPipelines/ingestionPipeline.py +1 -1
  280. metadata/generated/schema/entity/services/ingestionPipelines/pipelineServiceClientResponse.py +1 -1
  281. metadata/generated/schema/entity/services/messagingService.py +1 -1
  282. metadata/generated/schema/entity/services/metadataService.py +1 -1
  283. metadata/generated/schema/entity/services/mlmodelService.py +1 -1
  284. metadata/generated/schema/entity/services/pipelineService.py +1 -1
  285. metadata/generated/schema/entity/services/serviceType.py +1 -1
  286. metadata/generated/schema/entity/services/storageService.py +1 -1
  287. metadata/generated/schema/entity/teams/__init__.py +1 -1
  288. metadata/generated/schema/entity/teams/role.py +1 -1
  289. metadata/generated/schema/entity/teams/team.py +1 -1
  290. metadata/generated/schema/entity/teams/teamHierarchy.py +1 -1
  291. metadata/generated/schema/entity/teams/user.py +1 -1
  292. metadata/generated/schema/entity/type.py +1 -1
  293. metadata/generated/schema/entity/utils/__init__.py +1 -1
  294. metadata/generated/schema/entity/utils/entitiesCount.py +1 -1
  295. metadata/generated/schema/entity/utils/servicesCount.py +1 -1
  296. metadata/generated/schema/entity/utils/supersetApiConnection.py +1 -1
  297. metadata/generated/schema/events/__init__.py +1 -1
  298. metadata/generated/schema/events/api/__init__.py +1 -1
  299. metadata/generated/schema/events/api/createEventSubscription.py +1 -1
  300. metadata/generated/schema/events/dataInsightAlertConfig.py +1 -1
  301. metadata/generated/schema/events/emailAlertConfig.py +1 -1
  302. metadata/generated/schema/events/entitySpelFilters.py +1 -1
  303. metadata/generated/schema/events/eventFilterRule.py +1 -1
  304. metadata/generated/schema/events/eventSubscription.py +29 -29
  305. metadata/generated/schema/events/subscriptionResourceDescriptor.py +1 -1
  306. metadata/generated/schema/metadataIngestion/__init__.py +1 -1
  307. metadata/generated/schema/metadataIngestion/dashboardServiceMetadataPipeline.py +1 -1
  308. metadata/generated/schema/metadataIngestion/dataInsightPipeline.py +1 -1
  309. metadata/generated/schema/metadataIngestion/databaseServiceMetadataPipeline.py +1 -1
  310. metadata/generated/schema/metadataIngestion/databaseServiceProfilerPipeline.py +1 -1
  311. metadata/generated/schema/metadataIngestion/databaseServiceQueryLineagePipeline.py +1 -1
  312. metadata/generated/schema/metadataIngestion/databaseServiceQueryUsagePipeline.py +1 -1
  313. metadata/generated/schema/metadataIngestion/dbtPipeline.py +1 -1
  314. metadata/generated/schema/metadataIngestion/dbtconfig/__init__.py +1 -1
  315. metadata/generated/schema/metadataIngestion/dbtconfig/dbtAzureConfig.py +1 -1
  316. metadata/generated/schema/metadataIngestion/dbtconfig/dbtBucketDetails.py +1 -1
  317. metadata/generated/schema/metadataIngestion/dbtconfig/dbtCloudConfig.py +1 -1
  318. metadata/generated/schema/metadataIngestion/dbtconfig/dbtGCSConfig.py +1 -1
  319. metadata/generated/schema/metadataIngestion/dbtconfig/dbtHttpConfig.py +1 -1
  320. metadata/generated/schema/metadataIngestion/dbtconfig/dbtLocalConfig.py +1 -1
  321. metadata/generated/schema/metadataIngestion/dbtconfig/dbtS3Config.py +1 -1
  322. metadata/generated/schema/metadataIngestion/messagingServiceMetadataPipeline.py +1 -1
  323. metadata/generated/schema/metadataIngestion/metadataToElasticSearchPipeline.py +1 -1
  324. metadata/generated/schema/metadataIngestion/mlmodelServiceMetadataPipeline.py +1 -1
  325. metadata/generated/schema/metadataIngestion/pipelineServiceMetadataPipeline.py +1 -1
  326. metadata/generated/schema/metadataIngestion/storage/__init__.py +1 -1
  327. metadata/generated/schema/metadataIngestion/storage/containerMetadataConfig.py +1 -1
  328. metadata/generated/schema/metadataIngestion/storageServiceMetadataPipeline.py +1 -1
  329. metadata/generated/schema/metadataIngestion/testSuitePipeline.py +1 -1
  330. metadata/generated/schema/metadataIngestion/workflow.py +1 -1
  331. metadata/generated/schema/monitoring/__init__.py +1 -1
  332. metadata/generated/schema/monitoring/eventMonitorProvider.py +1 -1
  333. metadata/generated/schema/security/__init__.py +1 -1
  334. metadata/generated/schema/security/client/__init__.py +1 -1
  335. metadata/generated/schema/security/client/auth0SSOClientConfig.py +1 -1
  336. metadata/generated/schema/security/client/azureSSOClientConfig.py +1 -1
  337. metadata/generated/schema/security/client/customOidcSSOClientConfig.py +1 -1
  338. metadata/generated/schema/security/client/googleSSOClientConfig.py +1 -1
  339. metadata/generated/schema/security/client/oktaSSOClientConfig.py +1 -1
  340. metadata/generated/schema/security/client/openMetadataJWTClientConfig.py +1 -1
  341. metadata/generated/schema/security/client/samlSSOClientConfig.py +1 -1
  342. metadata/generated/schema/security/credentials/__init__.py +1 -1
  343. metadata/generated/schema/security/credentials/accessTokenAuth.py +1 -1
  344. metadata/generated/schema/security/credentials/awsCredentials.py +1 -1
  345. metadata/generated/schema/security/credentials/azureCredentials.py +1 -1
  346. metadata/generated/schema/security/credentials/basicAuth.py +1 -1
  347. metadata/generated/schema/security/credentials/bitbucketCredentials.py +1 -1
  348. metadata/generated/schema/security/credentials/gcpCredentials.py +1 -1
  349. metadata/generated/schema/security/credentials/gcpValues.py +1 -1
  350. metadata/generated/schema/security/credentials/gitCredentials.py +1 -1
  351. metadata/generated/schema/security/credentials/githubCredentials.py +1 -1
  352. metadata/generated/schema/security/secrets/__init__.py +1 -1
  353. metadata/generated/schema/security/secrets/secretsManagerClientLoader.py +1 -1
  354. metadata/generated/schema/security/secrets/secretsManagerConfiguration.py +1 -1
  355. metadata/generated/schema/security/secrets/secretsManagerProvider.py +1 -1
  356. metadata/generated/schema/security/securityConfiguration.py +1 -1
  357. metadata/generated/schema/security/ssl/__init__.py +1 -1
  358. metadata/generated/schema/security/ssl/validateSSLClientConfig.py +1 -1
  359. metadata/generated/schema/security/ssl/verifySSLConfig.py +1 -1
  360. metadata/generated/schema/settings/__init__.py +1 -1
  361. metadata/generated/schema/settings/settings.py +1 -1
  362. metadata/generated/schema/system/__init__.py +1 -1
  363. metadata/generated/schema/system/eventPublisherJob.py +1 -1
  364. metadata/generated/schema/system/sqlMigrationScript.py +1 -1
  365. metadata/generated/schema/tests/__init__.py +1 -1
  366. metadata/generated/schema/tests/basic.py +7 -7
  367. metadata/generated/schema/tests/customMetric.py +1 -1
  368. metadata/generated/schema/tests/testCase.py +1 -1
  369. metadata/generated/schema/tests/testDefinition.py +1 -1
  370. metadata/generated/schema/tests/testSuite.py +1 -1
  371. metadata/generated/schema/type/__init__.py +1 -1
  372. metadata/generated/schema/type/auditLog.py +1 -1
  373. metadata/generated/schema/type/basic.py +1 -1
  374. metadata/generated/schema/type/changeEvent.py +1 -1
  375. metadata/generated/schema/type/collectionDescriptor.py +1 -1
  376. metadata/generated/schema/type/csvDocumentation.py +1 -1
  377. metadata/generated/schema/type/csvErrorType.py +1 -1
  378. metadata/generated/schema/type/csvFile.py +1 -1
  379. metadata/generated/schema/type/csvImportResult.py +1 -1
  380. metadata/generated/schema/type/dailyCount.py +1 -1
  381. metadata/generated/schema/type/databaseConnectionConfig.py +1 -1
  382. metadata/generated/schema/type/entityHistory.py +1 -1
  383. metadata/generated/schema/type/entityLineage.py +1 -1
  384. metadata/generated/schema/type/entityReference.py +1 -1
  385. metadata/generated/schema/type/entityReferenceList.py +1 -1
  386. metadata/generated/schema/type/entityRelationship.py +1 -1
  387. metadata/generated/schema/type/entityUsage.py +1 -1
  388. metadata/generated/schema/type/filterPattern.py +1 -1
  389. metadata/generated/schema/type/function.py +1 -1
  390. metadata/generated/schema/type/include.py +1 -1
  391. metadata/generated/schema/type/jdbcConnection.py +1 -1
  392. metadata/generated/schema/type/paging.py +1 -1
  393. metadata/generated/schema/type/profile.py +1 -1
  394. metadata/generated/schema/type/queryParserData.py +1 -1
  395. metadata/generated/schema/type/reaction.py +1 -1
  396. metadata/generated/schema/type/schedule.py +1 -1
  397. metadata/generated/schema/type/schema.py +1 -1
  398. metadata/generated/schema/type/tableQuery.py +1 -1
  399. metadata/generated/schema/type/tableUsageCount.py +1 -1
  400. metadata/generated/schema/type/tagLabel.py +1 -1
  401. metadata/generated/schema/type/usageDetails.py +1 -1
  402. metadata/generated/schema/type/usageRequest.py +1 -1
  403. metadata/generated/schema/type/votes.py +1 -1
  404. metadata/ingestion/lineage/sql_lineage.py +30 -7
  405. metadata/ingestion/ometa/mixins/data_insight_mixin.py +12 -1
  406. metadata/ingestion/ometa/mixins/query_mixin.py +40 -4
  407. metadata/ingestion/ometa/mixins/table_mixin.py +0 -5
  408. metadata/ingestion/processor/query_parser.py +6 -6
  409. metadata/ingestion/source/dashboard/tableau/models.py +0 -1
  410. metadata/ingestion/source/dashboard/tableau/queries.py +0 -1
  411. metadata/ingestion/source/database/bigquery/connection.py +27 -38
  412. metadata/ingestion/source/database/bigquery/helper.py +66 -0
  413. metadata/ingestion/source/database/bigquery/metadata.py +69 -64
  414. metadata/ingestion/source/database/bigquery/queries.py +2 -2
  415. metadata/ingestion/source/database/bigquery/query_parser.py +19 -1
  416. metadata/ingestion/source/database/common_db_source.py +0 -3
  417. metadata/ingestion/source/database/database_service.py +27 -3
  418. metadata/ingestion/source/database/lineage_source.py +21 -18
  419. metadata/ingestion/source/database/query_parser_source.py +3 -0
  420. metadata/ingestion/source/database/sample_data.py +17 -9
  421. metadata/ingestion/source/database/usage_source.py +30 -29
  422. metadata/ingestion/stage/table_usage.py +42 -34
  423. metadata/profiler/interface/pandas/profiler_interface.py +24 -41
  424. metadata/profiler/interface/profiler_interface.py +62 -2
  425. metadata/profiler/interface/profiler_interface_factory.py +9 -0
  426. metadata/profiler/interface/sqlalchemy/profiler_interface.py +19 -36
  427. metadata/profiler/interface/sqlalchemy/single_store/__init__.py +0 -0
  428. metadata/profiler/interface/sqlalchemy/single_store/profiler_interface.py +86 -0
  429. metadata/profiler/metrics/system/queries/redshift.py +3 -5
  430. metadata/profiler/metrics/system/system.py +0 -4
  431. metadata/profiler/metrics/window/first_quartile.py +4 -4
  432. metadata/profiler/metrics/window/median.py +4 -4
  433. metadata/profiler/metrics/window/percentille_mixin.py +9 -0
  434. metadata/profiler/metrics/window/third_quartile.py +4 -4
  435. metadata/profiler/processor/core.py +1 -1
  436. metadata/profiler/source/single_store/functions/median.py +17 -0
  437. metadata/profiler/source/single_store/metrics/window/first_quartile.py +10 -0
  438. metadata/profiler/source/single_store/metrics/window/median.py +10 -0
  439. metadata/profiler/source/single_store/metrics/window/third_quartile.py +10 -0
  440. {openmetadata_ingestion-1.1.4.0.dist-info → openmetadata_ingestion-1.1.6.0.dist-info}/METADATA +176 -176
  441. {openmetadata_ingestion-1.1.4.0.dist-info → openmetadata_ingestion-1.1.6.0.dist-info}/RECORD +445 -437
  442. {openmetadata_ingestion-1.1.4.0.dist-info → openmetadata_ingestion-1.1.6.0.dist-info}/LICENSE +0 -0
  443. {openmetadata_ingestion-1.1.4.0.dist-info → openmetadata_ingestion-1.1.6.0.dist-info}/WHEEL +0 -0
  444. {openmetadata_ingestion-1.1.4.0.dist-info → openmetadata_ingestion-1.1.6.0.dist-info}/entry_points.txt +0 -0
  445. {openmetadata_ingestion-1.1.4.0.dist-info → openmetadata_ingestion-1.1.6.0.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: type/votes.json
3
- # timestamp: 2023-08-31T15:54:58+00:00
3
+ # timestamp: 2023-09-25T11:57:29+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -12,7 +12,7 @@
12
12
  Helper functions to handle SQL lineage operations
13
13
  """
14
14
  import traceback
15
- from typing import Any, Iterable, Iterator, List, Optional
15
+ from typing import Any, Iterable, Iterator, 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
@@ -118,6 +118,34 @@ def search_table_entities(
118
118
  return None
119
119
 
120
120
 
121
+ def get_table_fqn_from_query_name(
122
+ table_name: str,
123
+ ) -> Tuple[Optional[str], Optional[str], Optional[str]]:
124
+ """
125
+ Method to extract database, schema and table name
126
+ from raw table name used in query
127
+ """
128
+
129
+ split_table = table_name.split(".")
130
+ empty_list: List[Any] = [None] # Otherwise, there's a typing error in the concat
131
+
132
+ if len(split_table) > 3:
133
+ # In case of bigquery, it is possible that tables within information schema when
134
+ # referred with their fully qualified name may look like this
135
+ # `project-id.dataset-id.information_schema.table-name` in such cases there
136
+ # will be 4 values to unpack vs the expected 3 values, hence in such case we
137
+ # just pick the table name and keep the database and schema name as none
138
+
139
+ table = split_table[-1]
140
+ database_query, schema_query = None, None
141
+ else:
142
+ database_query, schema_query, table = (
143
+ empty_list * (3 - len(split_table))
144
+ ) + split_table
145
+
146
+ return database_query, schema_query, table
147
+
148
+
121
149
  def get_table_entities_from_query(
122
150
  metadata: OpenMetadata,
123
151
  service_name: str,
@@ -141,12 +169,7 @@ def get_table_entities_from_query(
141
169
  # First try to find the data from the given db and schema (with table name as given or uppercase)
142
170
  # Otherwise, pick it up from the table_name str (with table name as given or uppercase)
143
171
 
144
- split_table = table_name.split(".")
145
- empty_list: List[Any] = [None] # Otherwise, there's a typing error in the concat
146
-
147
- database_query, schema_query, table = (
148
- empty_list * (3 - len(split_table))
149
- ) + split_table
172
+ database_query, schema_query, table = get_table_fqn_from_query_name(table_name)
150
173
 
151
174
  table_entities = search_table_entities(
152
175
  metadata=metadata,
@@ -19,7 +19,7 @@ from __future__ import annotations
19
19
  from typing import List, Optional
20
20
 
21
21
  from metadata.generated.schema.analytics.basic import WebAnalyticEventType
22
- from metadata.generated.schema.analytics.reportData import ReportData
22
+ from metadata.generated.schema.analytics.reportData import ReportData, ReportDataType
23
23
  from metadata.generated.schema.analytics.webAnalyticEventData import (
24
24
  WebAnalyticEventData,
25
25
  )
@@ -174,3 +174,14 @@ class DataInsightMixin:
174
174
  """
175
175
  event_type_value = event_type.value
176
176
  self.client.delete(f"/analytics/web/events/{event_type_value}/{tmsp}/collect")
177
+
178
+ def delete_report_data(self, report_data_type: ReportDataType, date: str) -> None:
179
+ """Delete report data at a specific date for a specific report data type
180
+
181
+ Args:
182
+ report_data_type (ReportDataType): report date type to delete
183
+ date (str): date for which to delete the report data
184
+ """
185
+ self.client.delete(
186
+ f"/analytics/dataInsights/data/{report_data_type.value}/{date}"
187
+ )
@@ -13,7 +13,8 @@ Mixin class containing Query specific methods
13
13
 
14
14
  To be used by OpenMetadata class
15
15
  """
16
-
16
+ import hashlib
17
+ import json
17
18
  from typing import List, Optional, Union
18
19
 
19
20
  from metadata.generated.schema.api.data.createQuery import CreateQueryRequest
@@ -22,6 +23,7 @@ from metadata.generated.schema.entity.data.query import Query
22
23
  from metadata.generated.schema.entity.data.table import Table
23
24
  from metadata.generated.schema.type.basic import Uuid
24
25
  from metadata.generated.schema.type.entityReference import EntityReference
26
+ from metadata.ingestion.ometa.client import REST
25
27
  from metadata.ingestion.ometa.utils import model_str
26
28
 
27
29
 
@@ -32,6 +34,21 @@ class OMetaQueryMixin:
32
34
  To be inherited by OpenMetadata
33
35
  """
34
36
 
37
+ client: REST
38
+
39
+ def _get_query_hash(self, query: str) -> str:
40
+ result = hashlib.md5(query.encode())
41
+ return str(result.hexdigest())
42
+
43
+ def _get_or_create_query(self, query: CreateQueryRequest) -> Optional[Query]:
44
+ query_hash = self._get_query_hash(query=query.query.__root__)
45
+ query_entity = self.get_by_name(entity=Query, fqn=query_hash)
46
+ if query_entity is None:
47
+ resp = self.client.put(self.get_suffix(Query), data=query.json())
48
+ if resp and resp.get("id"):
49
+ query_entity = Query(**resp)
50
+ return query_entity
51
+
35
52
  def ingest_entity_queries_data(
36
53
  self, entity: Union[Table, Dashboard], queries: List[CreateQueryRequest]
37
54
  ) -> None:
@@ -42,16 +59,35 @@ class OMetaQueryMixin:
42
59
  :param queries: CreateQueryRequest to add
43
60
  """
44
61
  for create_query in queries:
45
- query = self.client.put(self.get_suffix(Query), data=create_query.json())
46
- if query and query.get("id"):
62
+ query = self._get_or_create_query(create_query)
63
+ if query:
64
+ # Add Query Usage
47
65
  table_ref = EntityReference(id=entity.id.__root__, type="table")
48
66
  # convert object to json array string
49
67
  table_ref_json = "[" + table_ref.json() + "]"
50
68
  self.client.put(
51
- f"{self.get_suffix(Query)}/{query.get('id')}/usage",
69
+ f"{self.get_suffix(Query)}/{model_str(query.id)}/usage",
52
70
  data=table_ref_json,
53
71
  )
54
72
 
73
+ # Add Query Users
74
+ user_fqn_list = create_query.users
75
+ if user_fqn_list:
76
+ self.client.put(
77
+ f"{self.get_suffix(Query)}/{model_str(query.id)}/users",
78
+ data=json.dumps(
79
+ [model_str(user_fqn) for user_fqn in user_fqn_list]
80
+ ),
81
+ )
82
+
83
+ # Add Query used by
84
+ user_list = create_query.usedBy
85
+ if user_list:
86
+ self.client.put(
87
+ f"{self.get_suffix(Query)}/{model_str(query.id)}/usedBy",
88
+ data=json.dumps(user_list),
89
+ )
90
+
55
91
  def get_entity_queries(
56
92
  self, entity_id: Union[Uuid, str], fields: Optional[List[str]] = None
57
93
  ) -> Optional[List[Query]]:
@@ -254,11 +254,6 @@ class OMetaTableMixin:
254
254
  url_after = f"&after={after}" if after else ""
255
255
  profile_type_url = profile_type.__name__[0].lower() + profile_type.__name__[1:]
256
256
 
257
- # system profile uses milliseconds
258
- if profile_type is not SystemProfile:
259
- start_ts = start_ts // 1000
260
- end_ts = end_ts // 1000
261
-
262
257
  resp = self.client.get(
263
258
  f"{self.get_suffix(Table)}/{fqn}/{profile_type_url}?limit={limit}{url_after}",
264
259
  data={"startTs": start_ts, "endTs": end_ts},
@@ -20,6 +20,7 @@ from metadata.config.common import ConfigModel
20
20
  from metadata.generated.schema.entity.services.connections.metadata.openMetadataConnection import (
21
21
  OpenMetadataConnection,
22
22
  )
23
+ from metadata.generated.schema.type.basic import DateTime
23
24
  from metadata.generated.schema.type.queryParserData import ParsedData, QueryParserData
24
25
  from metadata.generated.schema.type.tableQuery import TableQueries, TableQuery
25
26
  from metadata.ingestion.api.processor import Processor
@@ -40,11 +41,10 @@ def parse_sql_statement(record: TableQuery, dialect: Dialect) -> Optional[Parsed
40
41
  :return: QueryParserData
41
42
  """
42
43
 
43
- start_date = record.analysisDate
44
- if isinstance(record.analysisDate, str):
45
- start_date = datetime.datetime.strptime(
46
- str(record.analysisDate), "%Y-%m-%d %H:%M:%S"
47
- ).date()
44
+ start_time = record.analysisDate
45
+ if isinstance(start_time, DateTime):
46
+ start_date = start_time.__root__.date()
47
+ start_time = datetime.datetime.strptime(str(start_date.isoformat()), "%Y-%m-%d")
48
48
 
49
49
  lineage_parser = LineageParser(record.query, dialect=dialect)
50
50
 
@@ -58,7 +58,7 @@ def parse_sql_statement(record: TableQuery, dialect: Dialect) -> Optional[Parsed
58
58
  databaseSchema=record.databaseSchema,
59
59
  sql=record.query,
60
60
  userName=record.userName,
61
- date=int(start_date.__root__.timestamp()),
61
+ date=int(start_time.timestamp()),
62
62
  serviceName=record.serviceName,
63
63
  duration=record.duration,
64
64
  )
@@ -96,7 +96,6 @@ class DatasourceField(BaseModel):
96
96
  id: str
97
97
  name: Optional[str]
98
98
  upstreamColumns: Optional[List[Union[UpstreamColumn, None]]]
99
- fullyQualifiedName: Optional[str]
100
99
  description: Optional[str]
101
100
 
102
101
 
@@ -27,7 +27,6 @@ TABLEAU_DATASOURCES_QUERY = """
27
27
  name
28
28
  remoteType
29
29
  }}
30
- fullyQualifiedName
31
30
  description
32
31
  }}
33
32
  workbook {{
@@ -16,7 +16,6 @@ import os
16
16
  from functools import partial
17
17
  from typing import Optional
18
18
 
19
- from google import auth
20
19
  from google.cloud.datacatalog_v1 import PolicyTagManagerClient
21
20
  from sqlalchemy.engine import Engine
22
21
 
@@ -107,42 +106,32 @@ def test_connection(
107
106
  return policy_tags
108
107
 
109
108
  def test_tags():
110
- list_project_ids = auth.default()
111
- project_id = list_project_ids[1]
112
-
113
- if isinstance(project_id, str):
114
- taxonomies = PolicyTagManagerClient().list_taxonomies(
115
- parent=f"projects/{project_id}/locations/{service_connection.taxonomyLocation}"
116
- )
117
- return get_tags(taxonomies)
109
+ taxonomies = PolicyTagManagerClient().list_taxonomies(
110
+ parent=f"projects/{engine.url.host}/locations/{service_connection.taxonomyLocation}"
111
+ )
112
+ return get_tags(taxonomies)
113
+
114
+ def test_connection_inner(engine):
115
+ test_fn = {
116
+ "CheckAccess": partial(test_connection_engine_step, engine),
117
+ "GetSchemas": partial(execute_inspector_func, engine, "get_schema_names"),
118
+ "GetTables": partial(execute_inspector_func, engine, "get_table_names"),
119
+ "GetViews": partial(execute_inspector_func, engine, "get_view_names"),
120
+ "GetTags": test_tags,
121
+ "GetQueries": partial(
122
+ test_query,
123
+ engine=engine,
124
+ statement=BIGQUERY_TEST_STATEMENT.format(
125
+ region=service_connection.usageLocation
126
+ ),
127
+ ),
128
+ }
118
129
 
119
- if isinstance(project_id, list):
120
- taxonomies = PolicyTagManagerClient().list_taxonomies(
121
- parent=f"projects/{project_id[0]}/locations/{service_connection.taxonomyLocation}"
122
- )
130
+ test_connection_steps(
131
+ metadata=metadata,
132
+ test_fn=test_fn,
133
+ service_type=service_connection.type.value,
134
+ automation_workflow=automation_workflow,
135
+ )
123
136
 
124
- return get_tags(taxonomies)
125
-
126
- return None
127
-
128
- test_fn = {
129
- "CheckAccess": partial(test_connection_engine_step, engine),
130
- "GetSchemas": partial(execute_inspector_func, engine, "get_schema_names"),
131
- "GetTables": partial(execute_inspector_func, engine, "get_table_names"),
132
- "GetViews": partial(execute_inspector_func, engine, "get_view_names"),
133
- "GetTags": test_tags,
134
- "GetQueries": partial(
135
- test_query,
136
- engine=engine,
137
- statement=BIGQUERY_TEST_STATEMENT.format(
138
- region=service_connection.usageLocation
139
- ),
140
- ),
141
- }
142
-
143
- test_connection_steps(
144
- metadata=metadata,
145
- test_fn=test_fn,
146
- service_type=service_connection.type.value,
147
- automation_workflow=automation_workflow,
148
- )
137
+ test_connection_inner(engine)
@@ -0,0 +1,66 @@
1
+ # Copyright 2021 Collate
2
+ # Licensed under the Apache License, Version 2.0 (the "License");
3
+ # you may not use this file except in compliance with the License.
4
+ # You may obtain a copy of the License at
5
+ # http://www.apache.org/licenses/LICENSE-2.0
6
+ # Unless required by applicable law or agreed to in writing, software
7
+ # distributed under the License is distributed on an "AS IS" BASIS,
8
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9
+ # See the License for the specific language governing permissions and
10
+ # limitations under the License.
11
+
12
+ """
13
+ Source connection helper
14
+ """
15
+
16
+ from typing import Any
17
+
18
+ from pydantic import BaseModel
19
+ from sqlalchemy import inspect
20
+
21
+ from metadata.generated.schema.entity.services.connections.database.bigQueryConnection import (
22
+ BigQueryConnection,
23
+ )
24
+ from metadata.generated.schema.security.credentials.gcpValues import (
25
+ GcpCredentialsValues,
26
+ SingleProjectId,
27
+ )
28
+ from metadata.ingestion.source.connections import get_connection
29
+ from metadata.utils.bigquery_utils import get_bigquery_client
30
+
31
+
32
+ class InspectorWrapper(BaseModel):
33
+ client: Any
34
+ engine: Any
35
+ inspector: Any
36
+
37
+
38
+ def get_inspector_details(
39
+ database_name: str, service_connection: BigQueryConnection
40
+ ) -> InspectorWrapper:
41
+ """
42
+ Method to get the bigquery inspector details
43
+ """
44
+ # TODO support location property in JSON Schema
45
+ # TODO support OAuth 2.0 scopes
46
+ kwargs = {}
47
+ if isinstance(service_connection.credentials.gcpConfig, GcpCredentialsValues):
48
+ service_connection.credentials.gcpConfig.projectId = SingleProjectId(
49
+ __root__=database_name
50
+ )
51
+ if service_connection.credentials.gcpImpersonateServiceAccount:
52
+ kwargs[
53
+ "impersonate_service_account"
54
+ ] = (
55
+ service_connection.credentials.gcpImpersonateServiceAccount.impersonateServiceAccount
56
+ )
57
+
58
+ kwargs[
59
+ "lifetime"
60
+ ] = service_connection.credentials.gcpImpersonateServiceAccount.lifetime
61
+
62
+ client = get_bigquery_client(project_id=database_name, **kwargs)
63
+ engine = get_connection(service_connection)
64
+ inspector = inspect(engine)
65
+
66
+ return InspectorWrapper(client=client, engine=engine, inspector=inspector)
@@ -17,7 +17,6 @@ from typing import Iterable, List, Optional, Tuple
17
17
 
18
18
  from google import auth
19
19
  from google.cloud.datacatalog_v1 import PolicyTagManagerClient
20
- from sqlalchemy import inspect
21
20
  from sqlalchemy.engine.reflection import Inspector
22
21
  from sqlalchemy.sql.sqltypes import Interval
23
22
  from sqlalchemy.types import String
@@ -44,12 +43,12 @@ from metadata.generated.schema.metadataIngestion.workflow import (
44
43
  )
45
44
  from metadata.generated.schema.security.credentials.gcpValues import (
46
45
  GcpCredentialsValues,
47
- MultipleProjectId,
48
- SingleProjectId,
49
46
  )
50
47
  from metadata.generated.schema.type.tagLabel import TagLabel
51
48
  from metadata.ingestion.api.source import InvalidSourceException
52
49
  from metadata.ingestion.models.ometa_classification import OMetaTagAndClassification
50
+ from metadata.ingestion.source.connections import get_test_connection_fn
51
+ from metadata.ingestion.source.database.bigquery.helper import get_inspector_details
53
52
  from metadata.ingestion.source.database.bigquery.queries import (
54
53
  BIGQUERY_SCHEMA_DESCRIPTION,
55
54
  BIGQUERY_TABLE_AND_TYPE,
@@ -60,7 +59,6 @@ from metadata.ingestion.source.database.common_db_source import (
60
59
  TableNameAndType,
61
60
  )
62
61
  from metadata.utils import fqn
63
- from metadata.utils.bigquery_utils import get_bigquery_client
64
62
  from metadata.utils.credentials import GOOGLE_CREDENTIALS
65
63
  from metadata.utils.filters import filter_by_database
66
64
  from metadata.utils.logger import ingestion_logger
@@ -200,9 +198,15 @@ class BigquerySource(CommonDbSourceService):
200
198
  return cls(config, metadata_config)
201
199
 
202
200
  @staticmethod
203
- def set_project_id():
201
+ def set_project_id() -> List[str]:
204
202
  _, project_ids = auth.default()
205
- return project_ids
203
+ return project_ids if isinstance(project_ids, list) else [project_ids]
204
+
205
+ def test_connection(self) -> None:
206
+ for project_id in self.set_project_id():
207
+ self.set_inspector(project_id)
208
+ test_connection_fn = get_test_connection_fn(self.service_connection)
209
+ test_connection_fn(self.metadata, self.engine, self.service_connection)
206
210
 
207
211
  def query_table_names_and_types(
208
212
  self, schema_name: str
@@ -222,7 +226,9 @@ class BigquerySource(CommonDbSourceService):
222
226
  type_=_bigquery_table_types.get(table_type, TableType.Regular),
223
227
  )
224
228
  for table_name, table_type in self.engine.execute(
225
- BIGQUERY_TABLE_AND_TYPE.format(schema_name)
229
+ BIGQUERY_TABLE_AND_TYPE.format(
230
+ project_id=self.client.project, schema_name=schema_name
231
+ )
226
232
  )
227
233
  or []
228
234
  ]
@@ -319,12 +325,41 @@ class BigquerySource(CommonDbSourceService):
319
325
  )
320
326
  yield database_schema_request_obj
321
327
 
328
+ def get_table_obj(self, table_name: str):
329
+ schema_name = self.context.database_schema.name.__root__
330
+ database = self.context.database.name.__root__
331
+ bq_table_fqn = fqn._build(database, schema_name, table_name)
332
+ return self.client.get_table(bq_table_fqn)
333
+
334
+ def yield_table_tag_details(self, table_name_and_type: Tuple[str, str]):
335
+ table_name, _ = table_name_and_type
336
+ table_obj = self.get_table_obj(table_name=table_name)
337
+ if table_obj.labels:
338
+ for key, value in table_obj.labels.items():
339
+ yield from get_ometa_tag_and_classification(
340
+ tags=[value],
341
+ classification_name=key,
342
+ tag_description="Bigquery Table Label",
343
+ classification_desciption="",
344
+ )
345
+
322
346
  def get_tag_labels(self, table_name: str) -> Optional[List[TagLabel]]:
323
347
  """
324
348
  This will only get executed if the tags context
325
349
  is properly informed
326
350
  """
327
- return []
351
+ table_tag_labels = super().get_tag_labels(table_name) or []
352
+ table_obj = self.get_table_obj(table_name=table_name)
353
+ if table_obj.labels:
354
+ for key, _ in table_obj.labels.items():
355
+ tag_label = get_tag_label(
356
+ metadata=self.metadata,
357
+ tag_name=key,
358
+ classification_name=key,
359
+ )
360
+ if tag_label:
361
+ table_tag_labels.append(tag_label)
362
+ return table_tag_labels
328
363
 
329
364
  def get_column_tag_labels(
330
365
  self, table_name: str, column: dict
@@ -343,68 +378,36 @@ class BigquerySource(CommonDbSourceService):
343
378
  return None
344
379
 
345
380
  def set_inspector(self, database_name: str):
346
- # TODO support location property in JSON Schema
347
- # TODO support OAuth 2.0 scopes
348
- kwargs = {}
349
- if isinstance(
350
- self.service_connection.credentials.gcpConfig, GcpCredentialsValues
351
- ):
352
- self.service_connection.credentials.gcpConfig.projectId = SingleProjectId(
353
- __root__=database_name
354
- )
355
- if self.service_connection.credentials.gcpImpersonateServiceAccount:
356
- kwargs[
357
- "impersonate_service_account"
358
- ] = (
359
- self.service_connection.credentials.gcpImpersonateServiceAccount.impersonateServiceAccount
360
- )
361
-
362
- kwargs[
363
- "lifetime"
364
- ] = (
365
- self.service_connection.credentials.gcpImpersonateServiceAccount.lifetime
366
- )
381
+ inspector_details = get_inspector_details(
382
+ database_name=database_name, service_connection=self.service_connection
383
+ )
367
384
 
368
- self.client = get_bigquery_client(project_id=database_name, **kwargs)
369
- self.inspector = inspect(self.engine)
385
+ self.client = inspector_details.client
386
+ self.engine = inspector_details.engine
387
+ self.inspector = inspector_details.inspector
370
388
 
371
389
  def get_database_names(self) -> Iterable[str]:
372
- if hasattr(
373
- self.service_connection.credentials.gcpConfig, "projectId"
374
- ) and isinstance(
375
- self.service_connection.credentials.gcpConfig.projectId, MultipleProjectId
376
- ):
377
- for project_id in self.project_ids:
378
- database_name = project_id
379
- database_fqn = fqn.build(
380
- self.metadata,
381
- entity_type=Database,
382
- service_name=self.context.database_service.name.__root__,
383
- database_name=database_name,
384
- )
385
- if filter_by_database(
386
- self.source_config.databaseFilterPattern,
387
- database_fqn
388
- if self.source_config.useFqnForFiltering
389
- else database_name,
390
- ):
391
- self.status.filter(database_fqn, "Database Filtered out")
392
- continue
393
-
390
+ for project_id in self.project_ids:
391
+ database_fqn = fqn.build(
392
+ self.metadata,
393
+ entity_type=Database,
394
+ service_name=self.context.database_service.name.__root__,
395
+ database_name=project_id,
396
+ )
397
+ if filter_by_database(
398
+ self.source_config.databaseFilterPattern,
399
+ database_fqn if self.source_config.useFqnForFiltering else project_id,
400
+ ):
401
+ self.status.filter(database_fqn, "Database Filtered out")
402
+ else:
394
403
  try:
395
- self.set_inspector(database_name=database_name)
396
- self.project_id = ( # pylint: disable=attribute-defined-outside-init
397
- database_name
398
- )
399
- yield database_name
404
+ self.set_inspector(database_name=project_id)
405
+ yield project_id
400
406
  except Exception as exc:
401
407
  logger.debug(traceback.format_exc())
402
408
  logger.error(
403
- f"Error trying to connect to database {database_name}: {exc}"
409
+ f"Error trying to connect to database {project_id}: {exc}"
404
410
  )
405
- else:
406
- self.set_inspector(database_name=self.project_ids)
407
- yield self.project_ids
408
411
 
409
412
  def get_view_definition(
410
413
  self, table_type: str, table_name: str, schema_name: str, inspector: Inspector
@@ -412,7 +415,9 @@ class BigquerySource(CommonDbSourceService):
412
415
  if table_type == TableType.View:
413
416
  try:
414
417
  view_definition = inspector.get_view_definition(
415
- f"{self.context.database.name.__root__}.{schema_name}.{table_name}"
418
+ fqn._build(
419
+ self.context.database.name.__root__, schema_name, table_name
420
+ )
416
421
  )
417
422
  view_definition = (
418
423
  "" if view_definition is None else str(view_definition)
@@ -430,7 +435,7 @@ class BigquerySource(CommonDbSourceService):
430
435
  check if the table is partitioned table and return the partition details
431
436
  """
432
437
  database = self.context.database.name.__root__
433
- table = self.client.get_table(f"{database}.{schema_name}.{table_name}")
438
+ table = self.client.get_table(fqn._build(database, schema_name, table_name))
434
439
  if table.time_partitioning is not None:
435
440
  if table.time_partitioning.field:
436
441
  table_partition = TablePartition(
@@ -45,7 +45,7 @@ BIGQUERY_TEST_STATEMENT = textwrap.dedent(
45
45
  BIGQUERY_SCHEMA_DESCRIPTION = textwrap.dedent(
46
46
  """
47
47
  SELECT option_value as schema_description FROM
48
- {project_id}.region-{region}.INFORMATION_SCHEMA.SCHEMATA_OPTIONS
48
+ `{project_id}`.`region-{region}`.INFORMATION_SCHEMA.SCHEMATA_OPTIONS
49
49
  where schema_name = '{schema_name}' and option_name = 'description'
50
50
  and option_value is not null
51
51
  """
@@ -53,6 +53,6 @@ BIGQUERY_SCHEMA_DESCRIPTION = textwrap.dedent(
53
53
 
54
54
  BIGQUERY_TABLE_AND_TYPE = textwrap.dedent(
55
55
  """
56
- select table_name, table_type from {}.INFORMATION_SCHEMA.TABLES where table_type != 'VIEW'
56
+ select table_name, table_type from `{project_id}`.{schema_name}.INFORMATION_SCHEMA.TABLES where table_type != 'VIEW'
57
57
  """
58
58
  )
@@ -12,6 +12,7 @@
12
12
  Handle big query usage extraction
13
13
  """
14
14
  from abc import ABC
15
+ from copy import deepcopy
15
16
  from datetime import datetime
16
17
 
17
18
  from google import auth
@@ -25,7 +26,9 @@ from metadata.generated.schema.entity.services.connections.metadata.openMetadata
25
26
  from metadata.generated.schema.metadataIngestion.workflow import (
26
27
  Source as WorkflowSource,
27
28
  )
28
- from metadata.ingestion.api.source import InvalidSourceException
29
+ from metadata.generated.schema.security.credentials.gcpValues import MultipleProjectId
30
+ from metadata.ingestion.api.steps import InvalidSourceException
31
+ from metadata.ingestion.source.database.bigquery.helper import get_inspector_details
29
32
  from metadata.ingestion.source.database.query_parser_source import QueryParserSource
30
33
 
31
34
 
@@ -65,3 +68,18 @@ class BigqueryQueryParserSource(QueryParserSource, ABC):
65
68
  def set_project_id():
66
69
  _, project_id = auth.default()
67
70
  return project_id
71
+
72
+ def get_engine(self):
73
+ if isinstance(
74
+ self.service_connection.credentials.gcpConfig.projectId, MultipleProjectId
75
+ ):
76
+ project_ids = deepcopy(
77
+ self.service_connection.credentials.gcpConfig.projectId
78
+ )
79
+ for project_id in project_ids.__root__:
80
+ inspector_details = get_inspector_details(
81
+ project_id, self.service_connection
82
+ )
83
+ yield inspector_details.engine
84
+ else:
85
+ yield self.engine
@@ -523,9 +523,6 @@ class CommonDbSourceService(
523
523
  """
524
524
  return table
525
525
 
526
- def yield_table_tag(self) -> Iterable[OMetaTagAndClassification]:
527
- pass
528
-
529
526
  def get_source_url(
530
527
  self,
531
528
  database_name: Optional[str] = None,