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,320 @@
1
+ from datetime import datetime
2
+ from enum import Enum
3
+ from typing import Optional, Union
4
+
5
+ from pydantic import BaseModel
6
+
7
+ from acryl_datahub_cloud.sdk.assertion_input.assertion_input import (
8
+ DEFAULT_DAILY_SCHEDULE,
9
+ RANGE_OPERATORS,
10
+ SINGLE_VALUE_NUMERIC_OPERATORS,
11
+ AssertionIncidentBehaviorInputTypes,
12
+ FieldSpecType,
13
+ _AssertionInput,
14
+ )
15
+ from acryl_datahub_cloud.sdk.entities.assertion import (
16
+ AssertionInfoInputType,
17
+ TagsInputType,
18
+ )
19
+ from acryl_datahub_cloud.sdk.errors import SDKUsageError
20
+ from datahub.metadata import schema_classes as models
21
+ from datahub.metadata.urns import AssertionUrn, CorpUserUrn, DatasetUrn
22
+ from datahub.sdk.entity_client import EntityClient
23
+
24
+
25
+ class SqlAssertionCondition(Enum):
26
+ IS_EQUAL_TO = "IS_EQUAL_TO" # models.SqlAssertionTypeClass.METRIC + models.AssertionStdOperatorClass.EQUAL_TO
27
+ IS_NOT_EQUAL_TO = "IS_NOT_EQUAL_TO" # models.SqlAssertionTypeClass.METRIC + models.AssertionStdOperatorClass.NOT_EQUAL_TO
28
+ IS_GREATER_THAN = "IS_GREATER_THAN" # models.SqlAssertionTypeClass.METRIC + models.AssertionStdOperatorClass.GREATER_THAN
29
+ IS_LESS_THAN = "IS_LESS_THAN" # models.SqlAssertionTypeClass.METRIC + models.AssertionStdOperatorClass.LESS_THAN
30
+ IS_WITHIN_A_RANGE = "IS_WITHIN_A_RANGE" # models.SqlAssertionTypeClass.METRIC + models.AssertionStdOperatorClass.BETWEEN
31
+ GROWS_AT_MOST_ABSOLUTE = "GROWS_AT_MOST_ABSOLUTE" # models.SqlAssertionTypeClass.METRIC_CHANGE + models.AssertionStdOperatorClass.LESS_THAN_OR_EQUAL_TO + models.AssertionValueChangeTypeClass.ABSOLUTE
32
+ GROWS_AT_MOST_PERCENTAGE = "GROWS_AT_MOST_PERCENTAGE" # models.SqlAssertionTypeClass.METRIC_CHANGE + models.AssertionStdOperatorClass.LESS_THAN_OR_EQUAL_TO + models.AssertionValueChangeTypeClass.PERCENTAGE
33
+ GROWS_AT_LEAST_ABSOLUTE = "GROWS_AT_LEAST_ABSOLUTE" # models.SqlAssertionTypeClass.METRIC_CHANGE + models.AssertionStdOperatorClass.GREATER_THAN_OR_EQUAL_TO + models.AssertionValueChangeTypeClass.ABSOLUTE
34
+ GROWS_AT_LEAST_PERCENTAGE = "GROWS_AT_LEAST_PERCENTAGE" # models.SqlAssertionTypeClass.METRIC_CHANGE + models.AssertionStdOperatorClass.GREATER_THAN_OR_EQUAL_TO + models.AssertionValueChangeTypeClass.PERCENTAGE
35
+ GROWS_WITHIN_A_RANGE_ABSOLUTE = "GROWS_WITHIN_A_RANGE_ABSOLUTE" # models.SqlAssertionTypeClass.METRIC_CHANGE + models.AssertionStdOperatorClass.BETWEEN + models.AssertionValueChangeTypeClass.ABSOLUTE
36
+ GROWS_WITHIN_A_RANGE_PERCENTAGE = "GROWS_WITHIN_A_RANGE_PERCENTAGE" # models.SqlAssertionTypeClass.METRIC_CHANGE + models.AssertionStdOperatorClass.BETWEEN + models.AssertionValueChangeTypeClass.PERCENTAGE
37
+
38
+
39
+ class SqlAssertionCriteria(BaseModel):
40
+ condition: Union[SqlAssertionCondition, str]
41
+ # Either a single value or a range must be provided
42
+ parameters: Union[Union[float, int], tuple[Union[float, int], Union[float, int]]]
43
+
44
+ @classmethod
45
+ def get_type_from_condition(
46
+ cls, condition: Union[SqlAssertionCondition, str]
47
+ ) -> models.SqlAssertionTypeClass:
48
+ condition_enum = (
49
+ condition
50
+ if isinstance(condition, SqlAssertionCondition)
51
+ else SqlAssertionCondition(condition)
52
+ )
53
+
54
+ if condition_enum in [
55
+ SqlAssertionCondition.IS_EQUAL_TO,
56
+ SqlAssertionCondition.IS_NOT_EQUAL_TO,
57
+ SqlAssertionCondition.IS_GREATER_THAN,
58
+ SqlAssertionCondition.IS_LESS_THAN,
59
+ SqlAssertionCondition.IS_WITHIN_A_RANGE,
60
+ ]:
61
+ return models.SqlAssertionTypeClass.METRIC # type: ignore[return-value]
62
+ elif condition_enum in [
63
+ SqlAssertionCondition.GROWS_AT_MOST_ABSOLUTE,
64
+ SqlAssertionCondition.GROWS_AT_MOST_PERCENTAGE,
65
+ SqlAssertionCondition.GROWS_AT_LEAST_ABSOLUTE,
66
+ SqlAssertionCondition.GROWS_AT_LEAST_PERCENTAGE,
67
+ SqlAssertionCondition.GROWS_WITHIN_A_RANGE_ABSOLUTE,
68
+ SqlAssertionCondition.GROWS_WITHIN_A_RANGE_PERCENTAGE,
69
+ ]:
70
+ return models.SqlAssertionTypeClass.METRIC_CHANGE # type: ignore[return-value]
71
+ else:
72
+ raise SDKUsageError(f"Unknown condition: {condition_enum}")
73
+
74
+ @classmethod
75
+ def get_operator_from_condition(
76
+ cls, condition: Union[SqlAssertionCondition, str]
77
+ ) -> models.AssertionStdOperatorClass:
78
+ condition_enum = (
79
+ condition
80
+ if isinstance(condition, SqlAssertionCondition)
81
+ else SqlAssertionCondition(condition)
82
+ )
83
+
84
+ condition_to_operator = {
85
+ SqlAssertionCondition.IS_EQUAL_TO: models.AssertionStdOperatorClass.EQUAL_TO,
86
+ SqlAssertionCondition.IS_NOT_EQUAL_TO: models.AssertionStdOperatorClass.NOT_EQUAL_TO,
87
+ SqlAssertionCondition.IS_GREATER_THAN: models.AssertionStdOperatorClass.GREATER_THAN,
88
+ SqlAssertionCondition.IS_LESS_THAN: models.AssertionStdOperatorClass.LESS_THAN,
89
+ SqlAssertionCondition.IS_WITHIN_A_RANGE: models.AssertionStdOperatorClass.BETWEEN,
90
+ SqlAssertionCondition.GROWS_AT_MOST_ABSOLUTE: models.AssertionStdOperatorClass.LESS_THAN_OR_EQUAL_TO,
91
+ SqlAssertionCondition.GROWS_AT_MOST_PERCENTAGE: models.AssertionStdOperatorClass.LESS_THAN_OR_EQUAL_TO,
92
+ SqlAssertionCondition.GROWS_AT_LEAST_ABSOLUTE: models.AssertionStdOperatorClass.GREATER_THAN_OR_EQUAL_TO,
93
+ SqlAssertionCondition.GROWS_AT_LEAST_PERCENTAGE: models.AssertionStdOperatorClass.GREATER_THAN_OR_EQUAL_TO,
94
+ SqlAssertionCondition.GROWS_WITHIN_A_RANGE_ABSOLUTE: models.AssertionStdOperatorClass.BETWEEN,
95
+ SqlAssertionCondition.GROWS_WITHIN_A_RANGE_PERCENTAGE: models.AssertionStdOperatorClass.BETWEEN,
96
+ }
97
+
98
+ if condition_enum not in condition_to_operator:
99
+ raise SDKUsageError(f"Unknown condition: {condition_enum}")
100
+
101
+ return condition_to_operator[condition_enum] # type: ignore[return-value]
102
+
103
+ @classmethod
104
+ def get_change_type_from_condition(
105
+ cls, condition: Union[SqlAssertionCondition, str]
106
+ ) -> Optional[models.AssertionValueChangeTypeClass]:
107
+ condition_enum = (
108
+ condition
109
+ if isinstance(condition, SqlAssertionCondition)
110
+ else SqlAssertionCondition(condition)
111
+ )
112
+
113
+ if condition_enum in [
114
+ SqlAssertionCondition.GROWS_AT_MOST_ABSOLUTE,
115
+ SqlAssertionCondition.GROWS_AT_LEAST_ABSOLUTE,
116
+ SqlAssertionCondition.GROWS_WITHIN_A_RANGE_ABSOLUTE,
117
+ ]:
118
+ return models.AssertionValueChangeTypeClass.ABSOLUTE # type: ignore[return-value]
119
+ elif condition_enum in [
120
+ SqlAssertionCondition.GROWS_AT_MOST_PERCENTAGE,
121
+ SqlAssertionCondition.GROWS_AT_LEAST_PERCENTAGE,
122
+ SqlAssertionCondition.GROWS_WITHIN_A_RANGE_PERCENTAGE,
123
+ ]:
124
+ return models.AssertionValueChangeTypeClass.PERCENTAGE # type: ignore[return-value]
125
+ else:
126
+ # Value-based conditions don't have a change type
127
+ return None
128
+
129
+ @classmethod
130
+ def get_parameters(
131
+ cls,
132
+ parameters: Union[
133
+ Union[float, int], tuple[Union[float, int], Union[float, int]]
134
+ ],
135
+ ) -> models.AssertionStdParametersClass:
136
+ if isinstance(parameters, (float, int)):
137
+ return models.AssertionStdParametersClass(
138
+ value=models.AssertionStdParameterClass(
139
+ type=models.AssertionStdParameterTypeClass.NUMBER,
140
+ value=str(parameters),
141
+ ),
142
+ )
143
+ elif isinstance(parameters, tuple):
144
+ return models.AssertionStdParametersClass(
145
+ minValue=models.AssertionStdParameterClass(
146
+ type=models.AssertionStdParameterTypeClass.NUMBER,
147
+ value=str(min(parameters[0], parameters[1])),
148
+ ),
149
+ maxValue=models.AssertionStdParameterClass(
150
+ type=models.AssertionStdParameterTypeClass.NUMBER,
151
+ value=str(max(parameters[0], parameters[1])),
152
+ ),
153
+ )
154
+ else:
155
+ raise SDKUsageError(
156
+ "Either a single value or a range must be provided for the parameters of SqlAssertionCriteria"
157
+ )
158
+
159
+ @staticmethod
160
+ def validate(criteria: "SqlAssertionCriteria") -> "SqlAssertionCriteria":
161
+ operator = SqlAssertionCriteria.get_operator_from_condition(criteria.condition)
162
+ condition_enum = (
163
+ criteria.condition
164
+ if isinstance(criteria.condition, SqlAssertionCondition)
165
+ else SqlAssertionCondition(criteria.condition)
166
+ )
167
+
168
+ if operator in SINGLE_VALUE_NUMERIC_OPERATORS:
169
+ if not isinstance(criteria.parameters, float) and not isinstance(
170
+ criteria.parameters, int
171
+ ):
172
+ raise SDKUsageError(
173
+ f"The parameter value of SqlAssertionCriteria must be a single value numeric for condition {str(condition_enum)}"
174
+ )
175
+ elif operator in RANGE_OPERATORS:
176
+ if not isinstance(criteria.parameters, tuple):
177
+ raise SDKUsageError(
178
+ f"The parameter value of SqlAssertionCriteria must be a tuple range for condition {str(condition_enum)}"
179
+ )
180
+ else:
181
+ raise SDKUsageError(
182
+ f"Condition {str(condition_enum)} is not supported for SqlAssertionCriteria"
183
+ )
184
+
185
+ return criteria
186
+
187
+
188
+ class _SqlAssertionInput(_AssertionInput):
189
+ def _assertion_type(self) -> str:
190
+ """Get the assertion type."""
191
+ return models.AssertionTypeClass.SQL
192
+
193
+ def __init__(
194
+ self,
195
+ *,
196
+ dataset_urn: Union[str, DatasetUrn],
197
+ entity_client: EntityClient, # Needed to get the schema field spec for the detection mechanism if needed
198
+ criteria: Optional[SqlAssertionCriteria],
199
+ statement: Optional[str],
200
+ urn: Optional[Union[str, AssertionUrn]] = None,
201
+ display_name: Optional[str] = None,
202
+ enabled: bool = True,
203
+ schedule: Optional[Union[str, models.CronScheduleClass]] = None,
204
+ incident_behavior: Optional[AssertionIncidentBehaviorInputTypes] = None,
205
+ tags: Optional[TagsInputType] = None,
206
+ created_by: Union[str, CorpUserUrn],
207
+ created_at: datetime,
208
+ updated_by: Union[str, CorpUserUrn],
209
+ updated_at: datetime,
210
+ ):
211
+ _AssertionInput.__init__(
212
+ self,
213
+ dataset_urn=dataset_urn,
214
+ entity_client=entity_client,
215
+ urn=urn,
216
+ display_name=display_name,
217
+ enabled=enabled,
218
+ schedule=schedule,
219
+ incident_behavior=incident_behavior,
220
+ tags=tags,
221
+ source_type=models.AssertionSourceTypeClass.NATIVE, # Native assertions are of type native, not inferred
222
+ created_by=created_by,
223
+ created_at=created_at,
224
+ updated_by=updated_by,
225
+ updated_at=updated_at,
226
+ )
227
+ self.criteria = criteria
228
+ self.statement = statement
229
+
230
+ def _create_monitor_info(
231
+ self,
232
+ assertion_urn: AssertionUrn,
233
+ status: models.MonitorStatusClass,
234
+ schedule: models.CronScheduleClass,
235
+ ) -> models.MonitorInfoClass:
236
+ """
237
+ Create a MonitorInfoClass with all the necessary components.
238
+ """
239
+ return models.MonitorInfoClass(
240
+ type=models.MonitorTypeClass.ASSERTION,
241
+ status=status,
242
+ assertionMonitor=models.AssertionMonitorClass(
243
+ assertions=[
244
+ models.AssertionEvaluationSpecClass(
245
+ assertion=str(assertion_urn),
246
+ schedule=schedule,
247
+ parameters=self._get_assertion_evaluation_parameters(
248
+ "None",
249
+ None, # Not used for sql assertions
250
+ ),
251
+ )
252
+ ]
253
+ ),
254
+ )
255
+
256
+ def _create_assertion_info(
257
+ self,
258
+ filter: Optional[models.DatasetFilterClass], # Not used for sql assertions
259
+ ) -> AssertionInfoInputType:
260
+ """
261
+ Create a SqlAssertionInfoClass for a sql assertion.
262
+
263
+ Returns:
264
+ A SqlAssertionInfoClass configured for sql.
265
+ """
266
+ # Validate required fields are present
267
+ if self.statement is None:
268
+ raise SDKUsageError("statement is required for SQL assertions")
269
+ if self.criteria is None:
270
+ raise SDKUsageError("criteria is required for SQL assertions")
271
+
272
+ SqlAssertionCriteria.validate(self.criteria)
273
+
274
+ return models.SqlAssertionInfoClass(
275
+ type=SqlAssertionCriteria.get_type_from_condition(self.criteria.condition),
276
+ entity=str(self.dataset_urn),
277
+ statement=self.statement,
278
+ changeType=SqlAssertionCriteria.get_change_type_from_condition(
279
+ self.criteria.condition
280
+ ),
281
+ operator=SqlAssertionCriteria.get_operator_from_condition(
282
+ self.criteria.condition
283
+ ),
284
+ parameters=SqlAssertionCriteria.get_parameters(self.criteria.parameters),
285
+ )
286
+
287
+ def _get_assertion_evaluation_parameters(
288
+ self,
289
+ source_type: str, # Not used for sql assertions
290
+ field: Optional[FieldSpecType], # Not used for sql assertions
291
+ ) -> models.AssertionEvaluationParametersClass:
292
+ return models.AssertionEvaluationParametersClass(
293
+ type=models.AssertionEvaluationParametersTypeClass.DATASET_SQL,
294
+ )
295
+
296
+ # Not used for sql assertions
297
+ def _convert_assertion_source_type_and_field(
298
+ self,
299
+ ) -> tuple[str, None]:
300
+ return "None", None
301
+
302
+ # Not used for sql assertions
303
+ def _create_filter_from_detection_mechanism(
304
+ self,
305
+ ) -> Optional[models.DatasetFilterClass]:
306
+ return None
307
+
308
+ def _convert_schedule(self) -> models.CronScheduleClass:
309
+ """Create a schedule for a sql assertion.
310
+
311
+ Returns:
312
+ A CronScheduleClass with appropriate schedule settings.
313
+ """
314
+ if self.schedule is None:
315
+ return DEFAULT_DAILY_SCHEDULE
316
+
317
+ return models.CronScheduleClass(
318
+ cron=self.schedule.cron,
319
+ timezone=self.schedule.timezone,
320
+ )