acryl-datahub-cloud 0.3.11rc0__py3-none-any.whl → 0.3.16.1rc0__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 acryl-datahub-cloud might be problematic. Click here for more details.

Files changed (238) hide show
  1. acryl_datahub_cloud/_codegen_config.json +1 -1
  2. acryl_datahub_cloud/acryl_cs_issues/models.py +5 -3
  3. acryl_datahub_cloud/action_request/action_request_owner_source.py +36 -6
  4. acryl_datahub_cloud/datahub_forms_notifications/__init__.py +0 -0
  5. acryl_datahub_cloud/datahub_forms_notifications/forms_notifications_source.py +569 -0
  6. acryl_datahub_cloud/datahub_forms_notifications/get_feature_flag.gql +7 -0
  7. acryl_datahub_cloud/datahub_forms_notifications/get_search_results_total.gql +14 -0
  8. acryl_datahub_cloud/datahub_forms_notifications/query.py +17 -0
  9. acryl_datahub_cloud/datahub_forms_notifications/scroll_forms_for_notification.gql +29 -0
  10. acryl_datahub_cloud/datahub_forms_notifications/send_form_notification_request.gql +5 -0
  11. acryl_datahub_cloud/datahub_reporting/datahub_dataset.py +37 -13
  12. acryl_datahub_cloud/datahub_reporting/datahub_form_reporting.py +55 -24
  13. acryl_datahub_cloud/datahub_reporting/extract_graph.py +4 -3
  14. acryl_datahub_cloud/datahub_reporting/extract_sql.py +242 -51
  15. acryl_datahub_cloud/datahub_reporting/forms.py +1 -1
  16. acryl_datahub_cloud/datahub_reporting/forms_config.py +3 -2
  17. acryl_datahub_cloud/datahub_restore/source.py +3 -2
  18. acryl_datahub_cloud/datahub_usage_reporting/excluded.py +94 -0
  19. acryl_datahub_cloud/datahub_usage_reporting/query_builder.py +48 -8
  20. acryl_datahub_cloud/datahub_usage_reporting/usage_feature_reporter.py +518 -77
  21. acryl_datahub_cloud/elasticsearch/graph_service.py +76 -14
  22. acryl_datahub_cloud/graphql_utils.py +64 -0
  23. acryl_datahub_cloud/lineage_features/source.py +555 -49
  24. acryl_datahub_cloud/metadata/_urns/urn_defs.py +2296 -1900
  25. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/actionworkflow/__init__.py +53 -0
  26. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/anomaly/__init__.py +2 -0
  27. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/application/__init__.py +19 -0
  28. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/assertion/__init__.py +4 -2
  29. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/common/__init__.py +6 -0
  30. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/conversation/__init__.py +29 -0
  31. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/event/notification/settings/__init__.py +2 -0
  32. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/execution/__init__.py +2 -0
  33. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/file/__init__.py +19 -0
  34. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/form/__init__.py +8 -0
  35. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/identity/__init__.py +8 -0
  36. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/knowledge/__init__.py +33 -0
  37. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/logical/__init__.py +15 -0
  38. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/metadata/key/__init__.py +12 -0
  39. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/metadata/search/features/__init__.py +2 -0
  40. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/module/__init__.py +31 -0
  41. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/notification/__init__.py +19 -0
  42. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/platform/event/v1/__init__.py +4 -0
  43. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/role/__init__.py +2 -0
  44. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/settings/asset/__init__.py +19 -0
  45. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/settings/global/__init__.py +28 -0
  46. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/template/__init__.py +31 -0
  47. acryl_datahub_cloud/metadata/schema.avsc +25091 -20557
  48. acryl_datahub_cloud/metadata/schema_classes.py +29269 -23863
  49. acryl_datahub_cloud/metadata/schemas/ActionRequestInfo.avsc +235 -2
  50. acryl_datahub_cloud/metadata/schemas/ActionWorkflowInfo.avsc +683 -0
  51. acryl_datahub_cloud/metadata/schemas/ActionWorkflowKey.avsc +21 -0
  52. acryl_datahub_cloud/metadata/schemas/Actors.avsc +38 -1
  53. acryl_datahub_cloud/metadata/schemas/ApplicationKey.avsc +31 -0
  54. acryl_datahub_cloud/metadata/schemas/ApplicationProperties.avsc +75 -0
  55. acryl_datahub_cloud/metadata/schemas/Applications.avsc +38 -0
  56. acryl_datahub_cloud/metadata/schemas/AssertionAnalyticsRunEvent.avsc +353 -215
  57. acryl_datahub_cloud/metadata/schemas/AssertionInfo.avsc +147 -20
  58. acryl_datahub_cloud/metadata/schemas/AssertionKey.avsc +1 -1
  59. acryl_datahub_cloud/metadata/schemas/AssertionRunEvent.avsc +166 -21
  60. acryl_datahub_cloud/metadata/schemas/{AssertionSummary.avsc → AssertionRunSummary.avsc} +15 -2
  61. acryl_datahub_cloud/metadata/schemas/AssertionsSummary.avsc +54 -0
  62. acryl_datahub_cloud/metadata/schemas/AssetSettings.avsc +63 -0
  63. acryl_datahub_cloud/metadata/schemas/BusinessAttributeInfo.avsc +7 -3
  64. acryl_datahub_cloud/metadata/schemas/ChartInfo.avsc +20 -6
  65. acryl_datahub_cloud/metadata/schemas/ChartKey.avsc +1 -0
  66. acryl_datahub_cloud/metadata/schemas/ConstraintInfo.avsc +12 -1
  67. acryl_datahub_cloud/metadata/schemas/ContainerKey.avsc +1 -0
  68. acryl_datahub_cloud/metadata/schemas/ContainerProperties.avsc +16 -5
  69. acryl_datahub_cloud/metadata/schemas/CorpGroupEditableInfo.avsc +2 -1
  70. acryl_datahub_cloud/metadata/schemas/CorpGroupInfo.avsc +7 -3
  71. acryl_datahub_cloud/metadata/schemas/CorpGroupKey.avsc +2 -1
  72. acryl_datahub_cloud/metadata/schemas/CorpGroupSettings.avsc +127 -2
  73. acryl_datahub_cloud/metadata/schemas/CorpUserEditableInfo.avsc +1 -1
  74. acryl_datahub_cloud/metadata/schemas/CorpUserInfo.avsc +18 -2
  75. acryl_datahub_cloud/metadata/schemas/CorpUserInvitationStatus.avsc +106 -0
  76. acryl_datahub_cloud/metadata/schemas/CorpUserKey.avsc +4 -1
  77. acryl_datahub_cloud/metadata/schemas/CorpUserSettings.avsc +304 -2
  78. acryl_datahub_cloud/metadata/schemas/CorpUserUsageFeatures.avsc +86 -0
  79. acryl_datahub_cloud/metadata/schemas/DashboardInfo.avsc +11 -5
  80. acryl_datahub_cloud/metadata/schemas/DashboardKey.avsc +1 -0
  81. acryl_datahub_cloud/metadata/schemas/DataFlowInfo.avsc +15 -5
  82. acryl_datahub_cloud/metadata/schemas/DataFlowKey.avsc +1 -0
  83. acryl_datahub_cloud/metadata/schemas/DataHubAiConversationInfo.avsc +256 -0
  84. acryl_datahub_cloud/metadata/schemas/DataHubAiConversationKey.avsc +22 -0
  85. acryl_datahub_cloud/metadata/schemas/DataHubFileInfo.avsc +234 -0
  86. acryl_datahub_cloud/metadata/schemas/DataHubFileKey.avsc +22 -0
  87. acryl_datahub_cloud/metadata/schemas/DataHubIngestionSourceKey.avsc +2 -1
  88. acryl_datahub_cloud/metadata/schemas/DataHubPageModuleKey.avsc +21 -0
  89. acryl_datahub_cloud/metadata/schemas/DataHubPageModuleProperties.avsc +308 -0
  90. acryl_datahub_cloud/metadata/schemas/DataHubPageTemplateKey.avsc +21 -0
  91. acryl_datahub_cloud/metadata/schemas/DataHubPageTemplateProperties.avsc +251 -0
  92. acryl_datahub_cloud/metadata/schemas/DataHubPolicyInfo.avsc +12 -1
  93. acryl_datahub_cloud/metadata/schemas/DataJobInfo.avsc +13 -4
  94. acryl_datahub_cloud/metadata/schemas/DataJobInputOutput.avsc +8 -0
  95. acryl_datahub_cloud/metadata/schemas/DataJobKey.avsc +1 -0
  96. acryl_datahub_cloud/metadata/schemas/DataPlatformInfo.avsc +3 -1
  97. acryl_datahub_cloud/metadata/schemas/DataPlatformInstanceProperties.avsc +5 -2
  98. acryl_datahub_cloud/metadata/schemas/DataProcessKey.avsc +4 -0
  99. acryl_datahub_cloud/metadata/schemas/DataProductKey.avsc +2 -0
  100. acryl_datahub_cloud/metadata/schemas/DataProductProperties.avsc +6 -3
  101. acryl_datahub_cloud/metadata/schemas/DataTypeInfo.avsc +5 -0
  102. acryl_datahub_cloud/metadata/schemas/DatasetKey.avsc +10 -2
  103. acryl_datahub_cloud/metadata/schemas/DatasetProperties.avsc +12 -5
  104. acryl_datahub_cloud/metadata/schemas/DatasetUsageStatistics.avsc +8 -0
  105. acryl_datahub_cloud/metadata/schemas/DocumentInfo.avsc +407 -0
  106. acryl_datahub_cloud/metadata/schemas/DocumentKey.avsc +35 -0
  107. acryl_datahub_cloud/metadata/schemas/DocumentSettings.avsc +79 -0
  108. acryl_datahub_cloud/metadata/schemas/DomainKey.avsc +2 -0
  109. acryl_datahub_cloud/metadata/schemas/DomainProperties.avsc +7 -3
  110. acryl_datahub_cloud/metadata/schemas/EditableContainerProperties.avsc +2 -1
  111. acryl_datahub_cloud/metadata/schemas/EditableDashboardProperties.avsc +2 -1
  112. acryl_datahub_cloud/metadata/schemas/EditableDataFlowProperties.avsc +2 -1
  113. acryl_datahub_cloud/metadata/schemas/EditableDataJobProperties.avsc +2 -1
  114. acryl_datahub_cloud/metadata/schemas/EditableDatasetProperties.avsc +2 -1
  115. acryl_datahub_cloud/metadata/schemas/EditableERModelRelationshipProperties.avsc +2 -1
  116. acryl_datahub_cloud/metadata/schemas/EditableMLFeatureProperties.avsc +2 -1
  117. acryl_datahub_cloud/metadata/schemas/EditableMLFeatureTableProperties.avsc +2 -1
  118. acryl_datahub_cloud/metadata/schemas/EditableMLModelGroupProperties.avsc +2 -1
  119. acryl_datahub_cloud/metadata/schemas/EditableMLModelProperties.avsc +2 -1
  120. acryl_datahub_cloud/metadata/schemas/EditableNotebookProperties.avsc +2 -1
  121. acryl_datahub_cloud/metadata/schemas/EditableSchemaMetadata.avsc +4 -2
  122. acryl_datahub_cloud/metadata/schemas/EntityTypeInfo.avsc +5 -0
  123. acryl_datahub_cloud/metadata/schemas/ExecutionRequestArtifactsLocation.avsc +16 -0
  124. acryl_datahub_cloud/metadata/schemas/ExecutionRequestKey.avsc +2 -1
  125. acryl_datahub_cloud/metadata/schemas/FormAssignmentStatus.avsc +36 -0
  126. acryl_datahub_cloud/metadata/schemas/FormInfo.avsc +6 -0
  127. acryl_datahub_cloud/metadata/schemas/FormKey.avsc +3 -1
  128. acryl_datahub_cloud/metadata/schemas/FormNotifications.avsc +69 -0
  129. acryl_datahub_cloud/metadata/schemas/FormSettings.avsc +30 -0
  130. acryl_datahub_cloud/metadata/schemas/GlobalSettingsInfo.avsc +416 -0
  131. acryl_datahub_cloud/metadata/schemas/GlobalTags.avsc +2 -1
  132. acryl_datahub_cloud/metadata/schemas/GlossaryNodeInfo.avsc +3 -1
  133. acryl_datahub_cloud/metadata/schemas/GlossaryNodeKey.avsc +1 -0
  134. acryl_datahub_cloud/metadata/schemas/GlossaryTermInfo.avsc +3 -1
  135. acryl_datahub_cloud/metadata/schemas/GlossaryTermKey.avsc +2 -0
  136. acryl_datahub_cloud/metadata/schemas/IcebergWarehouseInfo.avsc +4 -0
  137. acryl_datahub_cloud/metadata/schemas/IncidentActivityEvent.avsc +3 -3
  138. acryl_datahub_cloud/metadata/schemas/IncidentInfo.avsc +3 -3
  139. acryl_datahub_cloud/metadata/schemas/InferredMetadata.avsc +71 -1
  140. acryl_datahub_cloud/metadata/schemas/InputFields.avsc +2 -1
  141. acryl_datahub_cloud/metadata/schemas/InviteToken.avsc +26 -0
  142. acryl_datahub_cloud/metadata/schemas/LineageFeatures.avsc +67 -42
  143. acryl_datahub_cloud/metadata/schemas/LogicalParent.avsc +145 -0
  144. acryl_datahub_cloud/metadata/schemas/MLFeatureKey.avsc +4 -1
  145. acryl_datahub_cloud/metadata/schemas/MLFeatureTableKey.avsc +4 -1
  146. acryl_datahub_cloud/metadata/schemas/MLModelDeploymentKey.avsc +7 -1
  147. acryl_datahub_cloud/metadata/schemas/MLModelGroupKey.avsc +9 -1
  148. acryl_datahub_cloud/metadata/schemas/MLModelKey.avsc +9 -1
  149. acryl_datahub_cloud/metadata/schemas/MLModelProperties.avsc +4 -2
  150. acryl_datahub_cloud/metadata/schemas/MLPrimaryKeyKey.avsc +4 -1
  151. acryl_datahub_cloud/metadata/schemas/MetadataChangeEvent.avsc +418 -97
  152. acryl_datahub_cloud/metadata/schemas/MetadataChangeLog.avsc +62 -44
  153. acryl_datahub_cloud/metadata/schemas/MetadataChangeProposal.avsc +61 -0
  154. acryl_datahub_cloud/metadata/schemas/MonitorAnomalyEvent.avsc +54 -9
  155. acryl_datahub_cloud/metadata/schemas/MonitorInfo.avsc +163 -23
  156. acryl_datahub_cloud/metadata/schemas/MonitorKey.avsc +9 -1
  157. acryl_datahub_cloud/metadata/schemas/MonitorSuiteInfo.avsc +128 -3
  158. acryl_datahub_cloud/metadata/schemas/NotebookInfo.avsc +5 -2
  159. acryl_datahub_cloud/metadata/schemas/NotebookKey.avsc +1 -0
  160. acryl_datahub_cloud/metadata/schemas/NotificationRequest.avsc +91 -4
  161. acryl_datahub_cloud/metadata/schemas/Operation.avsc +17 -0
  162. acryl_datahub_cloud/metadata/schemas/Ownership.avsc +71 -1
  163. acryl_datahub_cloud/metadata/schemas/QuerySubjects.avsc +2 -13
  164. acryl_datahub_cloud/metadata/schemas/RelationshipChangeEvent.avsc +215 -0
  165. acryl_datahub_cloud/metadata/schemas/RoleProperties.avsc +3 -1
  166. acryl_datahub_cloud/metadata/schemas/SchemaFieldInfo.avsc +3 -1
  167. acryl_datahub_cloud/metadata/schemas/SchemaFieldKey.avsc +3 -0
  168. acryl_datahub_cloud/metadata/schemas/SchemaMetadata.avsc +2 -1
  169. acryl_datahub_cloud/metadata/schemas/SemanticContent.avsc +123 -0
  170. acryl_datahub_cloud/metadata/schemas/StructuredProperties.avsc +69 -0
  171. acryl_datahub_cloud/metadata/schemas/StructuredPropertyDefinition.avsc +15 -4
  172. acryl_datahub_cloud/metadata/schemas/StructuredPropertySettings.avsc +9 -0
  173. acryl_datahub_cloud/metadata/schemas/SubscriptionInfo.avsc +136 -5
  174. acryl_datahub_cloud/metadata/schemas/SubscriptionKey.avsc +2 -1
  175. acryl_datahub_cloud/metadata/schemas/SystemMetadata.avsc +61 -0
  176. acryl_datahub_cloud/metadata/schemas/TagProperties.avsc +3 -1
  177. acryl_datahub_cloud/metadata/schemas/TestInfo.avsc +2 -1
  178. acryl_datahub_cloud/metadata/schemas/UpstreamLineage.avsc +9 -0
  179. acryl_datahub_cloud/metadata/schemas/UsageFeatures.avsc +10 -0
  180. acryl_datahub_cloud/notifications/__init__.py +0 -0
  181. acryl_datahub_cloud/notifications/notification_recipient_builder.py +399 -0
  182. acryl_datahub_cloud/sdk/__init__.py +69 -0
  183. acryl_datahub_cloud/sdk/assertion/__init__.py +58 -0
  184. acryl_datahub_cloud/sdk/assertion/assertion_base.py +779 -0
  185. acryl_datahub_cloud/sdk/assertion/column_metric_assertion.py +191 -0
  186. acryl_datahub_cloud/sdk/assertion/column_value_assertion.py +431 -0
  187. acryl_datahub_cloud/sdk/assertion/freshness_assertion.py +201 -0
  188. acryl_datahub_cloud/sdk/assertion/schema_assertion.py +268 -0
  189. acryl_datahub_cloud/sdk/assertion/smart_column_metric_assertion.py +212 -0
  190. acryl_datahub_cloud/sdk/assertion/smart_freshness_assertion.py +165 -0
  191. acryl_datahub_cloud/sdk/assertion/smart_sql_assertion.py +156 -0
  192. acryl_datahub_cloud/sdk/assertion/smart_volume_assertion.py +162 -0
  193. acryl_datahub_cloud/sdk/assertion/sql_assertion.py +273 -0
  194. acryl_datahub_cloud/sdk/assertion/types.py +20 -0
  195. acryl_datahub_cloud/sdk/assertion/volume_assertion.py +156 -0
  196. acryl_datahub_cloud/sdk/assertion_client/__init__.py +0 -0
  197. acryl_datahub_cloud/sdk/assertion_client/column_metric.py +545 -0
  198. acryl_datahub_cloud/sdk/assertion_client/column_value.py +617 -0
  199. acryl_datahub_cloud/sdk/assertion_client/freshness.py +371 -0
  200. acryl_datahub_cloud/sdk/assertion_client/helpers.py +166 -0
  201. acryl_datahub_cloud/sdk/assertion_client/schema.py +358 -0
  202. acryl_datahub_cloud/sdk/assertion_client/smart_column_metric.py +540 -0
  203. acryl_datahub_cloud/sdk/assertion_client/smart_freshness.py +373 -0
  204. acryl_datahub_cloud/sdk/assertion_client/smart_sql.py +411 -0
  205. acryl_datahub_cloud/sdk/assertion_client/smart_volume.py +380 -0
  206. acryl_datahub_cloud/sdk/assertion_client/sql.py +410 -0
  207. acryl_datahub_cloud/sdk/assertion_client/volume.py +446 -0
  208. acryl_datahub_cloud/sdk/assertion_input/__init__.py +0 -0
  209. acryl_datahub_cloud/sdk/assertion_input/assertion_input.py +1470 -0
  210. acryl_datahub_cloud/sdk/assertion_input/column_assertion_constants.py +114 -0
  211. acryl_datahub_cloud/sdk/assertion_input/column_assertion_utils.py +284 -0
  212. acryl_datahub_cloud/sdk/assertion_input/column_metric_assertion_input.py +759 -0
  213. acryl_datahub_cloud/sdk/assertion_input/column_metric_constants.py +109 -0
  214. acryl_datahub_cloud/sdk/assertion_input/column_value_assertion_input.py +810 -0
  215. acryl_datahub_cloud/sdk/assertion_input/freshness_assertion_input.py +305 -0
  216. acryl_datahub_cloud/sdk/assertion_input/schema_assertion_input.py +413 -0
  217. acryl_datahub_cloud/sdk/assertion_input/smart_column_metric_assertion_input.py +793 -0
  218. acryl_datahub_cloud/sdk/assertion_input/smart_freshness_assertion_input.py +218 -0
  219. acryl_datahub_cloud/sdk/assertion_input/smart_sql_assertion_input.py +181 -0
  220. acryl_datahub_cloud/sdk/assertion_input/smart_volume_assertion_input.py +189 -0
  221. acryl_datahub_cloud/sdk/assertion_input/sql_assertion_input.py +320 -0
  222. acryl_datahub_cloud/sdk/assertion_input/volume_assertion_input.py +635 -0
  223. acryl_datahub_cloud/sdk/assertions_client.py +1074 -0
  224. acryl_datahub_cloud/sdk/entities/__init__.py +0 -0
  225. acryl_datahub_cloud/sdk/entities/assertion.py +439 -0
  226. acryl_datahub_cloud/sdk/entities/monitor.py +291 -0
  227. acryl_datahub_cloud/sdk/entities/subscription.py +100 -0
  228. acryl_datahub_cloud/sdk/errors.py +34 -0
  229. acryl_datahub_cloud/sdk/resolver_client.py +42 -0
  230. acryl_datahub_cloud/sdk/subscription_client.py +737 -0
  231. {acryl_datahub_cloud-0.3.11rc0.dist-info → acryl_datahub_cloud-0.3.16.1rc0.dist-info}/METADATA +55 -49
  232. {acryl_datahub_cloud-0.3.11rc0.dist-info → acryl_datahub_cloud-0.3.16.1rc0.dist-info}/RECORD +235 -142
  233. {acryl_datahub_cloud-0.3.11rc0.dist-info → acryl_datahub_cloud-0.3.16.1rc0.dist-info}/WHEEL +1 -1
  234. {acryl_datahub_cloud-0.3.11rc0.dist-info → acryl_datahub_cloud-0.3.16.1rc0.dist-info}/entry_points.txt +1 -0
  235. acryl_datahub_cloud/_sdk_extras/__init__.py +0 -4
  236. acryl_datahub_cloud/_sdk_extras/assertion.py +0 -15
  237. acryl_datahub_cloud/_sdk_extras/assertions_client.py +0 -23
  238. {acryl_datahub_cloud-0.3.11rc0.dist-info → acryl_datahub_cloud-0.3.16.1rc0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,411 @@
1
+ from __future__ import annotations
2
+
3
+ import logging
4
+ from datetime import datetime, timezone
5
+ from typing import TYPE_CHECKING, Optional, Union
6
+
7
+ from acryl_datahub_cloud.sdk.assertion.assertion_base import AssertionMode
8
+ from acryl_datahub_cloud.sdk.assertion.smart_sql_assertion import SmartSqlAssertion
9
+ from acryl_datahub_cloud.sdk.assertion_client.helpers import (
10
+ DEFAULT_CREATED_BY,
11
+ _merge_field,
12
+ _print_experimental_warning,
13
+ _validate_required_field,
14
+ resolve_updated_by,
15
+ retrieve_assertion_and_monitor_by_urn,
16
+ )
17
+ from acryl_datahub_cloud.sdk.assertion_input.assertion_input import (
18
+ AssertionIncidentBehaviorInputTypes,
19
+ ExclusionWindowInputTypes,
20
+ InferenceSensitivity,
21
+ )
22
+ from acryl_datahub_cloud.sdk.assertion_input.smart_sql_assertion_input import (
23
+ _SmartSqlAssertionInput,
24
+ )
25
+ from acryl_datahub_cloud.sdk.entities.assertion import Assertion, TagsInputType
26
+ from acryl_datahub_cloud.sdk.entities.monitor import Monitor
27
+ from acryl_datahub_cloud.sdk.errors import SDKUsageError
28
+ from datahub.metadata import schema_classes as models
29
+ from datahub.metadata.urns import AssertionUrn, CorpUserUrn, DatasetUrn, MonitorUrn
30
+
31
+ if TYPE_CHECKING:
32
+ from datahub.sdk.main_client import DataHubClient
33
+
34
+ logger = logging.getLogger(__name__)
35
+
36
+
37
+ class SmartSqlAssertionClient:
38
+ """Client for managing smart SQL assertions."""
39
+
40
+ def __init__(self, client: "DataHubClient"):
41
+ self.client = client
42
+
43
+ def sync_smart_sql_assertion(
44
+ self,
45
+ *,
46
+ dataset_urn: Union[str, DatasetUrn],
47
+ statement: Optional[str] = None,
48
+ urn: Optional[Union[str, AssertionUrn]] = None,
49
+ display_name: Optional[str] = None,
50
+ enabled: Optional[bool] = None,
51
+ sensitivity: Optional[Union[str, InferenceSensitivity]] = None,
52
+ exclusion_windows: Optional[ExclusionWindowInputTypes] = None,
53
+ training_data_lookback_days: Optional[int] = None,
54
+ incident_behavior: Optional[AssertionIncidentBehaviorInputTypes] = None,
55
+ tags: Optional[TagsInputType] = None,
56
+ updated_by: Optional[Union[str, CorpUserUrn]] = None,
57
+ schedule: Optional[Union[str, models.CronScheduleClass]] = None,
58
+ ) -> SmartSqlAssertion:
59
+ _print_experimental_warning()
60
+ now_utc = datetime.now(timezone.utc)
61
+
62
+ resolved_updated_by = resolve_updated_by(updated_by)
63
+
64
+ # Validate statement is provided for new assertions, since we can't fetch it from an existing one
65
+ if urn is None:
66
+ logger.info("URN is not set, creating a new assertion")
67
+ _validate_required_field(
68
+ statement, "statement", "when creating a new assertion (urn is None)"
69
+ )
70
+ assert statement is not None
71
+
72
+ merged_assertion_input = (
73
+ self._retrieve_and_merge_smart_sql_assertion_and_monitor(
74
+ dataset_urn=dataset_urn,
75
+ urn=urn,
76
+ display_name=display_name,
77
+ enabled=enabled,
78
+ statement=statement,
79
+ sensitivity=sensitivity,
80
+ exclusion_windows=exclusion_windows,
81
+ training_data_lookback_days=training_data_lookback_days,
82
+ incident_behavior=incident_behavior,
83
+ tags=tags,
84
+ updated_by=resolved_updated_by,
85
+ now_utc=now_utc,
86
+ schedule=schedule,
87
+ )
88
+ )
89
+
90
+ # After merge, ensure statement exists (either provided or fetched from existing assertion)
91
+ if merged_assertion_input.statement is None:
92
+ raise SDKUsageError(
93
+ f"statement is required but was not provided and not found in existing assertion {urn}. "
94
+ "The existing assertion may be invalid or corrupted."
95
+ )
96
+
97
+ assertion_entity, monitor_entity = (
98
+ merged_assertion_input.to_assertion_and_monitor_entities()
99
+ )
100
+ # Upsert assertion first to fail fast if there's an issue before touching the monitor
101
+ self.client.entities.upsert(assertion_entity)
102
+ self.client.entities.upsert(monitor_entity)
103
+
104
+ return SmartSqlAssertion._from_entities(assertion_entity, monitor_entity)
105
+
106
+ def _retrieve_assertion_and_monitor_by_urn(
107
+ self,
108
+ urn: Union[str, AssertionUrn],
109
+ dataset_urn: Union[str, DatasetUrn],
110
+ ) -> tuple[Optional[Assertion], MonitorUrn, Optional[Monitor]]:
111
+ """Retrieve assertion and monitor entities by URN."""
112
+ return retrieve_assertion_and_monitor_by_urn(self.client, urn, dataset_urn)
113
+
114
+ def _build_smart_sql_assertion_input(
115
+ self,
116
+ *,
117
+ dataset_urn: Union[str, DatasetUrn],
118
+ urn: Optional[Union[str, AssertionUrn]],
119
+ display_name: Optional[str],
120
+ enabled: Optional[bool],
121
+ statement: Optional[str],
122
+ sensitivity: Optional[Union[str, InferenceSensitivity]],
123
+ exclusion_windows: Optional[ExclusionWindowInputTypes],
124
+ training_data_lookback_days: Optional[int],
125
+ incident_behavior: Optional[AssertionIncidentBehaviorInputTypes],
126
+ tags: Optional[TagsInputType],
127
+ updated_by: Union[str, CorpUserUrn],
128
+ now_utc: datetime,
129
+ schedule: Optional[Union[str, models.CronScheduleClass]],
130
+ ) -> _SmartSqlAssertionInput:
131
+ """Build a SmartSqlAssertionInput from the given parameters."""
132
+ return _SmartSqlAssertionInput(
133
+ urn=urn,
134
+ entity_client=self.client.entities,
135
+ dataset_urn=dataset_urn,
136
+ display_name=display_name,
137
+ enabled=enabled if enabled is not None else True,
138
+ statement=statement,
139
+ sensitivity=sensitivity,
140
+ exclusion_windows=exclusion_windows,
141
+ training_data_lookback_days=training_data_lookback_days,
142
+ incident_behavior=incident_behavior,
143
+ tags=tags,
144
+ created_by=updated_by,
145
+ created_at=now_utc,
146
+ updated_by=updated_by,
147
+ updated_at=now_utc,
148
+ schedule=schedule,
149
+ )
150
+
151
+ # TODO: Refactoring planned - See https://github.com/acryldata/datahub-fork/pull/7585
152
+ # This method (lines 156-270) contains duplicated orchestration logic that exists
153
+ # in 7 other assertion client files. A future PR will extract this into a
154
+ # BaseAssertionClient with template method pattern. See PR #7585 for details.
155
+ def _retrieve_and_merge_smart_sql_assertion_and_monitor(
156
+ self,
157
+ dataset_urn: Union[str, DatasetUrn],
158
+ urn: Optional[Union[str, AssertionUrn]],
159
+ display_name: Optional[str],
160
+ enabled: Optional[bool],
161
+ statement: Optional[str],
162
+ sensitivity: Optional[Union[str, InferenceSensitivity]],
163
+ exclusion_windows: Optional[ExclusionWindowInputTypes],
164
+ training_data_lookback_days: Optional[int],
165
+ incident_behavior: Optional[AssertionIncidentBehaviorInputTypes],
166
+ tags: Optional[TagsInputType],
167
+ updated_by: Union[str, CorpUserUrn],
168
+ now_utc: datetime,
169
+ schedule: Optional[Union[str, models.CronScheduleClass]],
170
+ ) -> _SmartSqlAssertionInput:
171
+ if urn is None:
172
+ logger.info("URN is not set, building a new assertion input")
173
+ return self._build_smart_sql_assertion_input(
174
+ dataset_urn=dataset_urn,
175
+ urn=None,
176
+ display_name=display_name,
177
+ enabled=enabled,
178
+ statement=statement,
179
+ sensitivity=sensitivity,
180
+ exclusion_windows=exclusion_windows,
181
+ training_data_lookback_days=training_data_lookback_days,
182
+ incident_behavior=incident_behavior,
183
+ tags=tags,
184
+ updated_by=updated_by,
185
+ now_utc=now_utc,
186
+ schedule=schedule,
187
+ )
188
+
189
+ assertion_input = self._build_smart_sql_assertion_input(
190
+ dataset_urn=dataset_urn,
191
+ urn=urn,
192
+ display_name=display_name,
193
+ enabled=enabled,
194
+ statement=statement,
195
+ sensitivity=sensitivity,
196
+ exclusion_windows=exclusion_windows,
197
+ training_data_lookback_days=training_data_lookback_days,
198
+ incident_behavior=incident_behavior,
199
+ tags=tags,
200
+ updated_by=updated_by,
201
+ now_utc=now_utc,
202
+ schedule=schedule,
203
+ )
204
+
205
+ maybe_assertion_entity, monitor_urn, maybe_monitor_entity = (
206
+ self._retrieve_assertion_and_monitor(assertion_input)
207
+ )
208
+
209
+ existing_assertion: Optional[SmartSqlAssertion] = None
210
+
211
+ if maybe_assertion_entity and maybe_monitor_entity:
212
+ existing_assertion = SmartSqlAssertion._from_entities(
213
+ maybe_assertion_entity, maybe_monitor_entity
214
+ )
215
+ elif maybe_assertion_entity and not maybe_monitor_entity:
216
+ monitor_mode = "INACTIVE" if enabled is False else "ACTIVE"
217
+ existing_assertion = SmartSqlAssertion._from_entities(
218
+ maybe_assertion_entity,
219
+ Monitor(id=monitor_urn, info=("ASSERTION", monitor_mode)),
220
+ )
221
+ elif not maybe_assertion_entity:
222
+ logger.info(
223
+ f"No existing assertion entity found for assertion urn {urn}, building a new assertion input"
224
+ )
225
+ return self._build_smart_sql_assertion_input(
226
+ dataset_urn=dataset_urn,
227
+ urn=urn,
228
+ display_name=display_name,
229
+ enabled=enabled,
230
+ statement=statement,
231
+ sensitivity=sensitivity,
232
+ exclusion_windows=exclusion_windows,
233
+ training_data_lookback_days=training_data_lookback_days,
234
+ incident_behavior=incident_behavior,
235
+ tags=tags,
236
+ updated_by=updated_by,
237
+ now_utc=now_utc,
238
+ schedule=schedule,
239
+ )
240
+
241
+ # At this point, existing_assertion must be set (we return early if not maybe_assertion_entity)
242
+ assert existing_assertion is not None
243
+
244
+ # Validate dataset URN hasn't changed to prevent assertion corruption
245
+ if existing_assertion.dataset_urn != assertion_input.dataset_urn:
246
+ raise SDKUsageError(
247
+ f"Dataset URN mismatch, existing assertion: {existing_assertion.dataset_urn} != new assertion: {dataset_urn}"
248
+ )
249
+
250
+ merged_assertion_input = self._merge_smart_sql_input(
251
+ dataset_urn=dataset_urn,
252
+ urn=urn,
253
+ display_name=display_name,
254
+ enabled=enabled,
255
+ statement=statement,
256
+ sensitivity=sensitivity,
257
+ exclusion_windows=exclusion_windows,
258
+ training_data_lookback_days=training_data_lookback_days,
259
+ incident_behavior=incident_behavior,
260
+ tags=tags,
261
+ now_utc=now_utc,
262
+ assertion_input=assertion_input,
263
+ maybe_assertion_entity=maybe_assertion_entity,
264
+ maybe_monitor_entity=maybe_monitor_entity,
265
+ existing_assertion=existing_assertion,
266
+ schedule=schedule,
267
+ )
268
+
269
+ return merged_assertion_input
270
+
271
+ def _retrieve_assertion_and_monitor(
272
+ self,
273
+ assertion_input: _SmartSqlAssertionInput,
274
+ ) -> tuple[Optional[Assertion], MonitorUrn, Optional[Monitor]]:
275
+ """Retrieve the assertion and monitor entities from the DataHub instance.
276
+
277
+ Args:
278
+ assertion_input: The validated input to the function.
279
+
280
+ Returns:
281
+ The assertion and monitor entities.
282
+ """
283
+ assert assertion_input.urn is not None, "URN is required"
284
+ return retrieve_assertion_and_monitor_by_urn(
285
+ self.client, assertion_input.urn, assertion_input.dataset_urn
286
+ )
287
+
288
+ def _merge_smart_sql_input(
289
+ self,
290
+ dataset_urn: Union[str, DatasetUrn],
291
+ urn: Union[str, AssertionUrn],
292
+ display_name: Optional[str],
293
+ enabled: Optional[bool],
294
+ statement: Optional[str],
295
+ sensitivity: Optional[Union[str, InferenceSensitivity]],
296
+ exclusion_windows: Optional[ExclusionWindowInputTypes],
297
+ training_data_lookback_days: Optional[int],
298
+ incident_behavior: Optional[AssertionIncidentBehaviorInputTypes],
299
+ tags: Optional[TagsInputType],
300
+ now_utc: datetime,
301
+ assertion_input: _SmartSqlAssertionInput,
302
+ maybe_assertion_entity: Optional[Assertion],
303
+ maybe_monitor_entity: Optional[Monitor],
304
+ existing_assertion: SmartSqlAssertion,
305
+ schedule: Optional[Union[str, models.CronScheduleClass]],
306
+ ) -> _SmartSqlAssertionInput:
307
+ """Merge the input with the existing assertion and monitor entities.
308
+
309
+ Args:
310
+ dataset_urn: The urn of the dataset to be monitored.
311
+ urn: The urn of the assertion.
312
+ display_name: The display name of the assertion.
313
+ enabled: Whether the assertion is enabled.
314
+ statement: The SQL statement for the assertion.
315
+ sensitivity: The sensitivity to be applied to the assertion.
316
+ exclusion_windows: The exclusion windows to be applied to the assertion.
317
+ training_data_lookback_days: The training data lookback days to be applied to the assertion.
318
+ incident_behavior: The incident behavior to be applied to the assertion.
319
+ tags: The tags to be applied to the assertion.
320
+ now_utc: The current UTC time from when the function is called.
321
+ assertion_input: The validated input to the function.
322
+ maybe_assertion_entity: The existing assertion entity from the DataHub instance.
323
+ maybe_monitor_entity: The existing monitor entity from the DataHub instance.
324
+ existing_assertion: The existing assertion from the DataHub instance.
325
+ schedule: The schedule to be applied to the assertion.
326
+
327
+ Returns:
328
+ The merged assertion input.
329
+ """
330
+ merged_assertion_input = _SmartSqlAssertionInput(
331
+ urn=urn,
332
+ entity_client=self.client.entities,
333
+ dataset_urn=dataset_urn,
334
+ display_name=_merge_field(
335
+ display_name,
336
+ "display_name",
337
+ assertion_input,
338
+ existing_assertion,
339
+ maybe_assertion_entity.description if maybe_assertion_entity else None,
340
+ ),
341
+ enabled=_merge_field(
342
+ enabled,
343
+ "enabled",
344
+ assertion_input,
345
+ existing_assertion,
346
+ existing_assertion.mode == AssertionMode.ACTIVE
347
+ if existing_assertion
348
+ else None,
349
+ ),
350
+ schedule=_merge_field(
351
+ schedule,
352
+ "schedule",
353
+ assertion_input,
354
+ existing_assertion,
355
+ existing_assertion.schedule if existing_assertion else None,
356
+ ),
357
+ statement=_merge_field(
358
+ statement,
359
+ "statement",
360
+ assertion_input,
361
+ existing_assertion,
362
+ existing_assertion.statement if existing_assertion else None,
363
+ ),
364
+ sensitivity=_merge_field(
365
+ sensitivity,
366
+ "sensitivity",
367
+ assertion_input,
368
+ existing_assertion,
369
+ maybe_monitor_entity.sensitivity if maybe_monitor_entity else None,
370
+ ),
371
+ exclusion_windows=_merge_field(
372
+ exclusion_windows,
373
+ "exclusion_windows",
374
+ assertion_input,
375
+ existing_assertion,
376
+ maybe_monitor_entity.exclusion_windows
377
+ if maybe_monitor_entity
378
+ else None,
379
+ ),
380
+ training_data_lookback_days=_merge_field(
381
+ training_data_lookback_days,
382
+ "training_data_lookback_days",
383
+ assertion_input,
384
+ existing_assertion,
385
+ maybe_monitor_entity.training_data_lookback_days
386
+ if maybe_monitor_entity
387
+ else None,
388
+ ),
389
+ incident_behavior=_merge_field(
390
+ incident_behavior,
391
+ "incident_behavior",
392
+ assertion_input,
393
+ existing_assertion,
394
+ SmartSqlAssertion._get_incident_behavior(maybe_assertion_entity)
395
+ if maybe_assertion_entity
396
+ else None,
397
+ ),
398
+ tags=_merge_field(
399
+ tags,
400
+ "tags",
401
+ assertion_input,
402
+ existing_assertion,
403
+ maybe_assertion_entity.tags if maybe_assertion_entity else None,
404
+ ),
405
+ created_by=existing_assertion.created_by or DEFAULT_CREATED_BY,
406
+ created_at=existing_assertion.created_at or now_utc,
407
+ updated_by=assertion_input.updated_by,
408
+ updated_at=assertion_input.updated_at,
409
+ )
410
+
411
+ return merged_assertion_input