sqlmesh 0.213.1.dev1__py3-none-any.whl → 0.227.2.dev4__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.
Files changed (252) hide show
  1. sqlmesh/__init__.py +12 -2
  2. sqlmesh/_version.py +2 -2
  3. sqlmesh/cli/main.py +0 -44
  4. sqlmesh/cli/project_init.py +11 -2
  5. sqlmesh/core/_typing.py +1 -0
  6. sqlmesh/core/audit/definition.py +8 -2
  7. sqlmesh/core/config/__init__.py +1 -1
  8. sqlmesh/core/config/connection.py +17 -5
  9. sqlmesh/core/config/dbt.py +13 -0
  10. sqlmesh/core/config/janitor.py +12 -0
  11. sqlmesh/core/config/loader.py +7 -0
  12. sqlmesh/core/config/model.py +2 -0
  13. sqlmesh/core/config/root.py +3 -0
  14. sqlmesh/core/console.py +81 -3
  15. sqlmesh/core/constants.py +1 -1
  16. sqlmesh/core/context.py +69 -26
  17. sqlmesh/core/dialect.py +3 -0
  18. sqlmesh/core/engine_adapter/_typing.py +2 -0
  19. sqlmesh/core/engine_adapter/base.py +322 -22
  20. sqlmesh/core/engine_adapter/base_postgres.py +17 -1
  21. sqlmesh/core/engine_adapter/bigquery.py +146 -7
  22. sqlmesh/core/engine_adapter/clickhouse.py +17 -13
  23. sqlmesh/core/engine_adapter/databricks.py +33 -2
  24. sqlmesh/core/engine_adapter/fabric.py +10 -29
  25. sqlmesh/core/engine_adapter/mixins.py +142 -48
  26. sqlmesh/core/engine_adapter/mssql.py +15 -4
  27. sqlmesh/core/engine_adapter/mysql.py +2 -2
  28. sqlmesh/core/engine_adapter/postgres.py +9 -3
  29. sqlmesh/core/engine_adapter/redshift.py +4 -0
  30. sqlmesh/core/engine_adapter/risingwave.py +1 -0
  31. sqlmesh/core/engine_adapter/shared.py +6 -0
  32. sqlmesh/core/engine_adapter/snowflake.py +82 -11
  33. sqlmesh/core/engine_adapter/spark.py +14 -10
  34. sqlmesh/core/engine_adapter/trino.py +4 -2
  35. sqlmesh/core/environment.py +2 -0
  36. sqlmesh/core/janitor.py +181 -0
  37. sqlmesh/core/lineage.py +1 -0
  38. sqlmesh/core/linter/definition.py +13 -13
  39. sqlmesh/core/linter/rules/builtin.py +29 -0
  40. sqlmesh/core/macros.py +35 -13
  41. sqlmesh/core/model/common.py +2 -0
  42. sqlmesh/core/model/definition.py +82 -28
  43. sqlmesh/core/model/kind.py +66 -2
  44. sqlmesh/core/model/meta.py +108 -4
  45. sqlmesh/core/node.py +101 -1
  46. sqlmesh/core/plan/builder.py +18 -10
  47. sqlmesh/core/plan/common.py +199 -2
  48. sqlmesh/core/plan/definition.py +25 -6
  49. sqlmesh/core/plan/evaluator.py +75 -113
  50. sqlmesh/core/plan/explainer.py +90 -8
  51. sqlmesh/core/plan/stages.py +42 -21
  52. sqlmesh/core/renderer.py +78 -32
  53. sqlmesh/core/scheduler.py +102 -22
  54. sqlmesh/core/selector.py +137 -9
  55. sqlmesh/core/signal.py +64 -1
  56. sqlmesh/core/snapshot/__init__.py +2 -0
  57. sqlmesh/core/snapshot/definition.py +146 -34
  58. sqlmesh/core/snapshot/evaluator.py +689 -124
  59. sqlmesh/core/state_sync/__init__.py +0 -1
  60. sqlmesh/core/state_sync/base.py +55 -33
  61. sqlmesh/core/state_sync/cache.py +12 -7
  62. sqlmesh/core/state_sync/common.py +216 -111
  63. sqlmesh/core/state_sync/db/environment.py +6 -4
  64. sqlmesh/core/state_sync/db/facade.py +42 -24
  65. sqlmesh/core/state_sync/db/interval.py +27 -7
  66. sqlmesh/core/state_sync/db/migrator.py +34 -16
  67. sqlmesh/core/state_sync/db/snapshot.py +177 -169
  68. sqlmesh/core/table_diff.py +2 -2
  69. sqlmesh/core/test/context.py +2 -0
  70. sqlmesh/core/test/definition.py +14 -9
  71. sqlmesh/dbt/adapter.py +22 -16
  72. sqlmesh/dbt/basemodel.py +75 -56
  73. sqlmesh/dbt/builtin.py +116 -12
  74. sqlmesh/dbt/column.py +17 -5
  75. sqlmesh/dbt/common.py +19 -5
  76. sqlmesh/dbt/context.py +14 -1
  77. sqlmesh/dbt/loader.py +61 -9
  78. sqlmesh/dbt/manifest.py +174 -16
  79. sqlmesh/dbt/model.py +183 -85
  80. sqlmesh/dbt/package.py +16 -1
  81. sqlmesh/dbt/profile.py +3 -3
  82. sqlmesh/dbt/project.py +12 -7
  83. sqlmesh/dbt/seed.py +6 -1
  84. sqlmesh/dbt/source.py +13 -1
  85. sqlmesh/dbt/target.py +25 -6
  86. sqlmesh/dbt/test.py +36 -5
  87. sqlmesh/migrations/v0000_baseline.py +95 -0
  88. sqlmesh/migrations/v0061_mysql_fix_blob_text_type.py +5 -7
  89. sqlmesh/migrations/v0062_add_model_gateway.py +5 -1
  90. sqlmesh/migrations/v0063_change_signals.py +5 -3
  91. sqlmesh/migrations/v0064_join_when_matched_strings.py +5 -3
  92. sqlmesh/migrations/v0065_add_model_optimize.py +5 -1
  93. sqlmesh/migrations/v0066_add_auto_restatements.py +8 -3
  94. sqlmesh/migrations/v0067_add_tsql_date_full_precision.py +5 -1
  95. sqlmesh/migrations/v0068_include_unrendered_query_in_metadata_hash.py +5 -1
  96. sqlmesh/migrations/v0069_update_dev_table_suffix.py +5 -3
  97. sqlmesh/migrations/v0070_include_grains_in_metadata_hash.py +5 -1
  98. sqlmesh/migrations/v0071_add_dev_version_to_intervals.py +9 -5
  99. sqlmesh/migrations/v0072_add_environment_statements.py +5 -3
  100. sqlmesh/migrations/v0073_remove_symbolic_disable_restatement.py +5 -3
  101. sqlmesh/migrations/v0074_add_partition_by_time_column_property.py +5 -1
  102. sqlmesh/migrations/v0075_remove_validate_query.py +5 -3
  103. sqlmesh/migrations/v0076_add_cron_tz.py +5 -1
  104. sqlmesh/migrations/v0077_fix_column_type_hash_calculation.py +5 -1
  105. sqlmesh/migrations/v0078_warn_if_non_migratable_python_env.py +5 -3
  106. sqlmesh/migrations/v0079_add_gateway_managed_property.py +10 -5
  107. sqlmesh/migrations/v0080_add_batch_size_to_scd_type_2_models.py +5 -1
  108. sqlmesh/migrations/v0081_update_partitioned_by.py +5 -3
  109. sqlmesh/migrations/v0082_warn_if_incorrectly_duplicated_statements.py +5 -3
  110. sqlmesh/migrations/v0083_use_sql_for_scd_time_data_type_data_hash.py +5 -1
  111. sqlmesh/migrations/v0084_normalize_quote_when_matched_and_merge_filter.py +5 -1
  112. sqlmesh/migrations/v0085_deterministic_repr.py +5 -3
  113. sqlmesh/migrations/v0086_check_deterministic_bug.py +5 -3
  114. sqlmesh/migrations/v0087_normalize_blueprint_variables.py +5 -3
  115. sqlmesh/migrations/v0088_warn_about_variable_python_env_diffs.py +5 -3
  116. sqlmesh/migrations/v0089_add_virtual_environment_mode.py +5 -1
  117. sqlmesh/migrations/v0090_add_forward_only_column.py +9 -5
  118. sqlmesh/migrations/v0091_on_additive_change.py +5 -1
  119. sqlmesh/migrations/v0092_warn_about_dbt_data_type_diff.py +5 -3
  120. sqlmesh/migrations/v0093_use_raw_sql_in_fingerprint.py +5 -1
  121. sqlmesh/migrations/v0094_add_dev_version_and_fingerprint_columns.py +123 -0
  122. sqlmesh/migrations/v0095_warn_about_dbt_raw_sql_diff.py +49 -0
  123. sqlmesh/migrations/v0096_remove_plan_dags_table.py +13 -0
  124. sqlmesh/migrations/v0097_add_dbt_name_in_node.py +9 -0
  125. sqlmesh/migrations/{v0060_move_audits_to_model.py → v0098_add_dbt_node_info_in_node.py} +33 -16
  126. sqlmesh/migrations/v0099_add_last_altered_to_intervals.py +25 -0
  127. sqlmesh/migrations/v0100_add_grants_and_grants_target_layer.py +9 -0
  128. sqlmesh/utils/__init__.py +8 -1
  129. sqlmesh/utils/cache.py +5 -1
  130. sqlmesh/utils/connection_pool.py +2 -1
  131. sqlmesh/utils/dag.py +65 -10
  132. sqlmesh/utils/date.py +8 -1
  133. sqlmesh/utils/errors.py +8 -0
  134. sqlmesh/utils/jinja.py +54 -4
  135. sqlmesh/utils/pydantic.py +6 -6
  136. sqlmesh/utils/windows.py +13 -3
  137. {sqlmesh-0.213.1.dev1.dist-info → sqlmesh-0.227.2.dev4.dist-info}/METADATA +7 -10
  138. sqlmesh-0.227.2.dev4.dist-info/RECORD +370 -0
  139. sqlmesh_dbt/cli.py +70 -7
  140. sqlmesh_dbt/console.py +14 -6
  141. sqlmesh_dbt/operations.py +103 -24
  142. sqlmesh_dbt/selectors.py +39 -1
  143. web/client/dist/assets/{Audits-Ucsx1GzF.js → Audits-CBiYyyx-.js} +1 -1
  144. web/client/dist/assets/{Banner-BWDzvavM.js → Banner-DSRbUlO5.js} +1 -1
  145. web/client/dist/assets/{ChevronDownIcon-D2VL13Ah.js → ChevronDownIcon-MK_nrjD_.js} +1 -1
  146. web/client/dist/assets/{ChevronRightIcon-DWGYbf1l.js → ChevronRightIcon-CLWtT22Q.js} +1 -1
  147. web/client/dist/assets/{Content-DdHDZM3I.js → Content-BNuGZN5l.js} +1 -1
  148. web/client/dist/assets/{Content-Bikfy8fh.js → Content-CSHJyW0n.js} +1 -1
  149. web/client/dist/assets/{Data-CzAJH7rW.js → Data-C1oRDbLx.js} +1 -1
  150. web/client/dist/assets/{DataCatalog-BJF11g8f.js → DataCatalog-HXyX2-_j.js} +1 -1
  151. web/client/dist/assets/{Editor-s0SBpV2y.js → Editor-BDyfpUuw.js} +1 -1
  152. web/client/dist/assets/{Editor-DgLhgKnm.js → Editor-D0jNItwC.js} +1 -1
  153. web/client/dist/assets/{Errors-D0m0O1d3.js → Errors-BfuFLcPi.js} +1 -1
  154. web/client/dist/assets/{FileExplorer-CEv0vXkt.js → FileExplorer-BR9IE3he.js} +1 -1
  155. web/client/dist/assets/{Footer-BwzXn8Ew.js → Footer-CgBEtiAh.js} +1 -1
  156. web/client/dist/assets/{Header-6heDkEqG.js → Header-DSqR6nSO.js} +1 -1
  157. web/client/dist/assets/{Input-obuJsD6k.js → Input-B-oZ6fGO.js} +1 -1
  158. web/client/dist/assets/Lineage-DYQVwDbD.js +1 -0
  159. web/client/dist/assets/{ListboxShow-HM9_qyrt.js → ListboxShow-BE5-xevs.js} +1 -1
  160. web/client/dist/assets/{ModelLineage-zWdKo0U2.js → ModelLineage-DkIFAYo4.js} +1 -1
  161. web/client/dist/assets/{Models-Bcu66SRz.js → Models-D5dWr8RB.js} +1 -1
  162. web/client/dist/assets/{Page-BWEEQfIt.js → Page-C-XfU5BR.js} +1 -1
  163. web/client/dist/assets/{Plan-C4gXCqlf.js → Plan-ZEuTINBq.js} +1 -1
  164. web/client/dist/assets/{PlusCircleIcon-CVDO651q.js → PlusCircleIcon-DVXAHG8_.js} +1 -1
  165. web/client/dist/assets/{ReportErrors-BT6xFwAr.js → ReportErrors-B7FEPzMB.js} +1 -1
  166. web/client/dist/assets/{Root-ryJoBK4h.js → Root-8aZyhPxF.js} +1 -1
  167. web/client/dist/assets/{SearchList-DB04sPb9.js → SearchList-W_iT2G82.js} +1 -1
  168. web/client/dist/assets/{SelectEnvironment-CUYcXUu6.js → SelectEnvironment-C65jALmO.js} +1 -1
  169. web/client/dist/assets/{SourceList-Doo_9ZGp.js → SourceList-DSLO6nVJ.js} +1 -1
  170. web/client/dist/assets/{SourceListItem-D5Mj7Dly.js → SourceListItem-BHt8d9-I.js} +1 -1
  171. web/client/dist/assets/{SplitPane-qHmkD1qy.js → SplitPane-CViaZmw6.js} +1 -1
  172. web/client/dist/assets/{Tests-DH1Z74ML.js → Tests-DhaVt5t1.js} +1 -1
  173. web/client/dist/assets/{Welcome-DqUJUNMF.js → Welcome-DvpjH-_4.js} +1 -1
  174. web/client/dist/assets/context-BctCsyGb.js +71 -0
  175. web/client/dist/assets/{context-Dr54UHLi.js → context-DFNeGsFF.js} +1 -1
  176. web/client/dist/assets/{editor-DYIP1yQ4.js → editor-CcO28cqd.js} +1 -1
  177. web/client/dist/assets/{file-DarlIDVi.js → file-CvJN3aZO.js} +1 -1
  178. web/client/dist/assets/{floating-ui.react-dom-BH3TFvkM.js → floating-ui.react-dom-CjE-JNW1.js} +1 -1
  179. web/client/dist/assets/{help-Bl8wqaQc.js → help-DuPhjipa.js} +1 -1
  180. web/client/dist/assets/{index-D1sR7wpN.js → index-C-dJH7yZ.js} +1 -1
  181. web/client/dist/assets/{index-O3mjYpnE.js → index-Dj0i1-CA.js} +2 -2
  182. web/client/dist/assets/{plan-CehRrJUG.js → plan-BTRSbjKn.js} +1 -1
  183. web/client/dist/assets/{popover-CqgMRE0G.js → popover-_Sf0yvOI.js} +1 -1
  184. web/client/dist/assets/{project-6gxepOhm.js → project-BvSOI8MY.js} +1 -1
  185. web/client/dist/index.html +1 -1
  186. sqlmesh/integrations/llm.py +0 -56
  187. sqlmesh/migrations/v0001_init.py +0 -60
  188. sqlmesh/migrations/v0002_remove_identify.py +0 -5
  189. sqlmesh/migrations/v0003_move_batch_size.py +0 -34
  190. sqlmesh/migrations/v0004_environmnent_add_finalized_at.py +0 -23
  191. sqlmesh/migrations/v0005_create_seed_table.py +0 -24
  192. sqlmesh/migrations/v0006_change_seed_hash.py +0 -5
  193. sqlmesh/migrations/v0007_env_table_info_to_kind.py +0 -99
  194. sqlmesh/migrations/v0008_create_intervals_table.py +0 -38
  195. sqlmesh/migrations/v0009_remove_pre_post_hooks.py +0 -62
  196. sqlmesh/migrations/v0010_seed_hash_batch_size.py +0 -5
  197. sqlmesh/migrations/v0011_add_model_kind_name.py +0 -63
  198. sqlmesh/migrations/v0012_update_jinja_expressions.py +0 -86
  199. sqlmesh/migrations/v0013_serde_using_model_dialects.py +0 -87
  200. sqlmesh/migrations/v0014_fix_dev_intervals.py +0 -14
  201. sqlmesh/migrations/v0015_environment_add_promoted_snapshot_ids.py +0 -26
  202. sqlmesh/migrations/v0016_fix_windows_path.py +0 -59
  203. sqlmesh/migrations/v0017_fix_windows_seed_path.py +0 -55
  204. sqlmesh/migrations/v0018_rename_snapshot_model_to_node.py +0 -53
  205. sqlmesh/migrations/v0019_add_env_suffix_target.py +0 -28
  206. sqlmesh/migrations/v0020_remove_redundant_attributes_from_dbt_models.py +0 -80
  207. sqlmesh/migrations/v0021_fix_table_properties.py +0 -62
  208. sqlmesh/migrations/v0022_move_project_to_model.py +0 -54
  209. sqlmesh/migrations/v0023_fix_added_models_with_forward_only_parents.py +0 -65
  210. sqlmesh/migrations/v0024_replace_model_kind_name_enum_with_value.py +0 -55
  211. sqlmesh/migrations/v0025_fix_intervals_and_missing_change_category.py +0 -117
  212. sqlmesh/migrations/v0026_remove_dialect_from_seed.py +0 -55
  213. sqlmesh/migrations/v0027_minute_interval_to_five.py +0 -57
  214. sqlmesh/migrations/v0028_add_plan_dags_table.py +0 -29
  215. sqlmesh/migrations/v0029_generate_schema_types_using_dialect.py +0 -69
  216. sqlmesh/migrations/v0030_update_unrestorable_snapshots.py +0 -65
  217. sqlmesh/migrations/v0031_remove_dbt_target_fields.py +0 -65
  218. sqlmesh/migrations/v0032_add_sqlmesh_version.py +0 -25
  219. sqlmesh/migrations/v0033_mysql_fix_blob_text_type.py +0 -45
  220. sqlmesh/migrations/v0034_add_default_catalog.py +0 -367
  221. sqlmesh/migrations/v0035_add_catalog_name_override.py +0 -22
  222. sqlmesh/migrations/v0036_delete_plan_dags_bug_fix.py +0 -14
  223. sqlmesh/migrations/v0037_remove_dbt_is_incremental_macro.py +0 -61
  224. sqlmesh/migrations/v0038_add_expiration_ts_to_snapshot.py +0 -73
  225. sqlmesh/migrations/v0039_include_environment_in_plan_dag_spec.py +0 -68
  226. sqlmesh/migrations/v0040_add_previous_finalized_snapshots.py +0 -26
  227. sqlmesh/migrations/v0041_remove_hash_raw_query_attribute.py +0 -59
  228. sqlmesh/migrations/v0042_trim_indirect_versions.py +0 -66
  229. sqlmesh/migrations/v0043_fix_remove_obsolete_attributes_in_plan_dags.py +0 -61
  230. sqlmesh/migrations/v0044_quote_identifiers_in_model_attributes.py +0 -5
  231. sqlmesh/migrations/v0045_move_gateway_variable.py +0 -70
  232. sqlmesh/migrations/v0046_add_batch_concurrency.py +0 -8
  233. sqlmesh/migrations/v0047_change_scd_string_to_column.py +0 -5
  234. sqlmesh/migrations/v0048_drop_indirect_versions.py +0 -59
  235. sqlmesh/migrations/v0049_replace_identifier_with_version_in_seeds_table.py +0 -57
  236. sqlmesh/migrations/v0050_drop_seeds_table.py +0 -11
  237. sqlmesh/migrations/v0051_rename_column_descriptions.py +0 -65
  238. sqlmesh/migrations/v0052_add_normalize_name_in_environment_naming_info.py +0 -28
  239. sqlmesh/migrations/v0053_custom_model_kind_extra_attributes.py +0 -5
  240. sqlmesh/migrations/v0054_fix_trailing_comments.py +0 -5
  241. sqlmesh/migrations/v0055_add_updated_ts_unpaused_ts_ttl_ms_unrestorable_to_snapshot.py +0 -132
  242. sqlmesh/migrations/v0056_restore_table_indexes.py +0 -118
  243. sqlmesh/migrations/v0057_add_table_format.py +0 -5
  244. sqlmesh/migrations/v0058_add_requirements.py +0 -26
  245. sqlmesh/migrations/v0059_add_physical_version.py +0 -5
  246. sqlmesh-0.213.1.dev1.dist-info/RECORD +0 -421
  247. web/client/dist/assets/Lineage-D0Hgdz2v.js +0 -1
  248. web/client/dist/assets/context-DgX0fp2E.js +0 -68
  249. {sqlmesh-0.213.1.dev1.dist-info → sqlmesh-0.227.2.dev4.dist-info}/WHEEL +0 -0
  250. {sqlmesh-0.213.1.dev1.dist-info → sqlmesh-0.227.2.dev4.dist-info}/entry_points.txt +0 -0
  251. {sqlmesh-0.213.1.dev1.dist-info → sqlmesh-0.227.2.dev4.dist-info}/licenses/LICENSE +0 -0
  252. {sqlmesh-0.213.1.dev1.dist-info → sqlmesh-0.227.2.dev4.dist-info}/top_level.txt +0 -0
@@ -1,66 +0,0 @@
1
- """Trim irrelevant attributes from indirect versions."""
2
-
3
- import json
4
-
5
- from sqlglot import exp
6
-
7
- from sqlmesh.utils.migration import index_text_type
8
- from sqlmesh.utils.migration import blob_text_type
9
-
10
-
11
- def migrate(state_sync, **kwargs): # type: ignore
12
- import pandas as pd
13
-
14
- engine_adapter = state_sync.engine_adapter
15
- schema = state_sync.schema
16
- snapshots_table = "_snapshots"
17
- if schema:
18
- snapshots_table = f"{schema}.{snapshots_table}"
19
-
20
- new_snapshots = []
21
-
22
- for name, identifier, version, snapshot, kind_name, expiration_ts in engine_adapter.fetchall(
23
- exp.select("name", "identifier", "version", "snapshot", "kind_name", "expiration_ts").from_(
24
- snapshots_table
25
- ),
26
- quote_identifiers=True,
27
- ):
28
- parsed_snapshot = json.loads(snapshot)
29
- for indirect_versions in parsed_snapshot["indirect_versions"].values():
30
- for indirect_version in indirect_versions:
31
- # Only keep version and change_category.
32
- version = indirect_version.get("version")
33
- change_category = indirect_version.get("change_category")
34
- indirect_version.clear()
35
- indirect_version["version"] = version
36
- indirect_version["change_category"] = change_category
37
-
38
- new_snapshots.append(
39
- {
40
- "name": name,
41
- "identifier": identifier,
42
- "version": version,
43
- "snapshot": json.dumps(parsed_snapshot),
44
- "kind_name": kind_name,
45
- "expiration_ts": expiration_ts,
46
- }
47
- )
48
-
49
- if new_snapshots:
50
- engine_adapter.delete_from(snapshots_table, "TRUE")
51
-
52
- index_type = index_text_type(engine_adapter.dialect)
53
- blob_type = blob_text_type(engine_adapter.dialect)
54
-
55
- engine_adapter.insert_append(
56
- snapshots_table,
57
- pd.DataFrame(new_snapshots),
58
- target_columns_to_types={
59
- "name": exp.DataType.build(index_type),
60
- "identifier": exp.DataType.build(index_type),
61
- "version": exp.DataType.build(index_type),
62
- "snapshot": exp.DataType.build(blob_type),
63
- "kind_name": exp.DataType.build(index_type),
64
- "expiration_ts": exp.DataType.build("bigint"),
65
- },
66
- )
@@ -1,61 +0,0 @@
1
- """Trim irrelevant attributes from the plan DAGs state."""
2
-
3
- import json
4
-
5
- from sqlglot import exp
6
-
7
- from sqlmesh.utils.migration import index_text_type
8
- from sqlmesh.utils.migration import blob_text_type
9
-
10
-
11
- def migrate(state_sync, **kwargs): # type: ignore
12
- import pandas as pd
13
-
14
- engine_adapter = state_sync.engine_adapter
15
- schema = state_sync.schema
16
- plan_dags_table = "_plan_dags"
17
- if schema:
18
- plan_dags_table = f"{schema}.{plan_dags_table}"
19
-
20
- new_dag_specs = []
21
-
22
- for request_id, dag_id, dag_spec in engine_adapter.fetchall(
23
- exp.select("request_id", "dag_id", "dag_spec").from_(plan_dags_table),
24
- quote_identifiers=True,
25
- ):
26
- parsed_dag_spec = json.loads(dag_spec)
27
- for snapshot in parsed_dag_spec.get("new_snapshots", []):
28
- snapshot["node"].pop("hash_raw_query", None)
29
-
30
- for indirect_versions in snapshot.get("indirect_versions", {}).values():
31
- for indirect_version in indirect_versions:
32
- # Only keep version and change_category.
33
- version = indirect_version.get("version")
34
- change_category = indirect_version.get("change_category")
35
- indirect_version.clear()
36
- indirect_version["version"] = version
37
- indirect_version["change_category"] = change_category
38
-
39
- new_dag_specs.append(
40
- {
41
- "request_id": request_id,
42
- "dag_id": dag_id,
43
- "dag_spec": json.dumps(parsed_dag_spec),
44
- }
45
- )
46
-
47
- if new_dag_specs:
48
- engine_adapter.delete_from(plan_dags_table, "TRUE")
49
-
50
- index_type = index_text_type(engine_adapter.dialect)
51
- blob_type = blob_text_type(engine_adapter.dialect)
52
-
53
- engine_adapter.insert_append(
54
- plan_dags_table,
55
- pd.DataFrame(new_dag_specs),
56
- target_columns_to_types={
57
- "request_id": exp.DataType.build(index_type),
58
- "dag_id": exp.DataType.build(index_type),
59
- "dag_spec": exp.DataType.build(blob_type),
60
- },
61
- )
@@ -1,5 +0,0 @@
1
- """Quoted identifiers in model SQL attributes."""
2
-
3
-
4
- def migrate(state_sync, **kwargs): # type: ignore
5
- pass
@@ -1,70 +0,0 @@
1
- """Move the gateway variable."""
2
-
3
- import ast
4
- import json
5
-
6
- from sqlglot import exp
7
-
8
- from sqlmesh.utils.migration import index_text_type
9
- from sqlmesh.utils.migration import blob_text_type
10
-
11
-
12
- def migrate(state_sync, **kwargs): # type: ignore
13
- import pandas as pd
14
-
15
- engine_adapter = state_sync.engine_adapter
16
- schema = state_sync.schema
17
- snapshots_table = "_snapshots"
18
- if schema:
19
- snapshots_table = f"{schema}.{snapshots_table}"
20
-
21
- migration_needed = False
22
- new_snapshots = []
23
-
24
- for name, identifier, version, snapshot, kind_name, expiration_ts in engine_adapter.fetchall(
25
- exp.select("name", "identifier", "version", "snapshot", "kind_name", "expiration_ts").from_(
26
- snapshots_table
27
- ),
28
- quote_identifiers=True,
29
- ):
30
- parsed_snapshot = json.loads(snapshot)
31
- python_env = parsed_snapshot["node"].get("python_env")
32
- if python_env:
33
- gateway = python_env.pop("gateway", None)
34
- if gateway is not None:
35
- migration_needed = True
36
- sqlmesh_vars = {"gateway": ast.literal_eval(gateway["payload"])}
37
- python_env["__sqlmesh__vars__"] = {
38
- "payload": repr(sqlmesh_vars),
39
- "kind": "value",
40
- }
41
-
42
- new_snapshots.append(
43
- {
44
- "name": name,
45
- "identifier": identifier,
46
- "version": version,
47
- "snapshot": json.dumps(parsed_snapshot),
48
- "kind_name": kind_name,
49
- "expiration_ts": expiration_ts,
50
- }
51
- )
52
-
53
- if migration_needed and new_snapshots:
54
- engine_adapter.delete_from(snapshots_table, "TRUE")
55
-
56
- index_type = index_text_type(engine_adapter.dialect)
57
- blob_type = blob_text_type(engine_adapter.dialect)
58
-
59
- engine_adapter.insert_append(
60
- snapshots_table,
61
- pd.DataFrame(new_snapshots),
62
- target_columns_to_types={
63
- "name": exp.DataType.build(index_type),
64
- "identifier": exp.DataType.build(index_type),
65
- "version": exp.DataType.build(index_type),
66
- "snapshot": exp.DataType.build(blob_type),
67
- "kind_name": exp.DataType.build(index_type),
68
- "expiration_ts": exp.DataType.build("bigint"),
69
- },
70
- )
@@ -1,8 +0,0 @@
1
- """Add the batch_concurrency attribute to the incremental model kinds.
2
-
3
- This results in a change to the metadata hash.
4
- """
5
-
6
-
7
- def migrate(state_sync, **kwargs): # type: ignore
8
- pass
@@ -1,5 +0,0 @@
1
- """Changes the SCD Type 2 columns from strings to columns."""
2
-
3
-
4
- def migrate(state_sync, **kwargs): # type: ignore
5
- pass
@@ -1,59 +0,0 @@
1
- """Drop the indirect_versions attribute in snapshots."""
2
-
3
- import json
4
-
5
- from sqlglot import exp
6
-
7
- from sqlmesh.utils.migration import index_text_type
8
- from sqlmesh.utils.migration import blob_text_type
9
-
10
-
11
- def migrate(state_sync, **kwargs): # type: ignore
12
- import pandas as pd
13
-
14
- engine_adapter = state_sync.engine_adapter
15
- schema = state_sync.schema
16
- snapshots_table = "_snapshots"
17
- if schema:
18
- snapshots_table = f"{schema}.{snapshots_table}"
19
-
20
- new_snapshots = []
21
-
22
- for name, identifier, version, snapshot, kind_name, expiration_ts in engine_adapter.fetchall(
23
- exp.select("name", "identifier", "version", "snapshot", "kind_name", "expiration_ts").from_(
24
- snapshots_table
25
- ),
26
- quote_identifiers=True,
27
- ):
28
- parsed_snapshot = json.loads(snapshot)
29
- parsed_snapshot.pop("indirect_versions", None)
30
-
31
- new_snapshots.append(
32
- {
33
- "name": name,
34
- "identifier": identifier,
35
- "version": version,
36
- "snapshot": json.dumps(parsed_snapshot),
37
- "kind_name": kind_name,
38
- "expiration_ts": expiration_ts,
39
- }
40
- )
41
-
42
- if new_snapshots:
43
- engine_adapter.delete_from(snapshots_table, "TRUE")
44
-
45
- index_type = index_text_type(engine_adapter.dialect)
46
- blob_type = blob_text_type(engine_adapter.dialect)
47
-
48
- engine_adapter.insert_append(
49
- snapshots_table,
50
- pd.DataFrame(new_snapshots),
51
- target_columns_to_types={
52
- "name": exp.DataType.build(index_type),
53
- "identifier": exp.DataType.build(index_type),
54
- "version": exp.DataType.build(index_type),
55
- "snapshot": exp.DataType.build(blob_type),
56
- "kind_name": exp.DataType.build(index_type),
57
- "expiration_ts": exp.DataType.build("bigint"),
58
- },
59
- )
@@ -1,57 +0,0 @@
1
- """Use version instead of identifier in the seeds table."""
2
-
3
- from sqlglot import exp
4
-
5
- from sqlmesh.utils.migration import index_text_type
6
-
7
-
8
- def migrate(state_sync, **kwargs): # type: ignore
9
- engine_adapter = state_sync.engine_adapter
10
-
11
- snapshots_table = "_snapshots"
12
- seeds_table = "_seeds"
13
- new_seeds_table = f"{seeds_table}_v49"
14
-
15
- if state_sync.schema:
16
- snapshots_table = f"{state_sync.schema}.{snapshots_table}"
17
- seeds_table = f"{state_sync.schema}.{seeds_table}"
18
- new_seeds_table = f"{state_sync.schema}.{new_seeds_table}"
19
-
20
- index_type = index_text_type(engine_adapter.dialect)
21
-
22
- engine_adapter.drop_table(new_seeds_table)
23
- engine_adapter.create_state_table(
24
- new_seeds_table,
25
- {
26
- "name": exp.DataType.build(index_type),
27
- "version": exp.DataType.build(index_type),
28
- "content": exp.DataType.build("text"),
29
- },
30
- primary_key=("name", "version"),
31
- )
32
-
33
- name_col = exp.column("name", table="seeds")
34
- version_col = exp.column("version", table="snapshots")
35
- query = (
36
- exp.select(
37
- name_col,
38
- version_col,
39
- exp.func("MAX", exp.column("content", table="seeds")).as_("content"),
40
- )
41
- .from_(exp.to_table(seeds_table).as_("seeds"))
42
- .join(
43
- exp.to_table(snapshots_table).as_("snapshots"),
44
- on=exp.and_(
45
- exp.column("name", table="seeds").eq(exp.column("name", table="snapshots")),
46
- exp.column("identifier", table="seeds").eq(
47
- exp.column("identifier", table="snapshots")
48
- ),
49
- ),
50
- )
51
- .where(exp.column("version", table="snapshots").is_(exp.null()).not_())
52
- .group_by(name_col, version_col)
53
- )
54
-
55
- engine_adapter.insert_append(new_seeds_table, query)
56
- engine_adapter.drop_table(seeds_table)
57
- engine_adapter.rename_table(new_seeds_table, seeds_table)
@@ -1,11 +0,0 @@
1
- """Drop the seeds table."""
2
-
3
-
4
- def migrate(state_sync, **kwargs): # type: ignore
5
- engine_adapter = state_sync.engine_adapter
6
-
7
- seeds_table = "_seeds"
8
- if state_sync.schema:
9
- seeds_table = f"{state_sync.schema}.{seeds_table}"
10
-
11
- engine_adapter.drop_table(seeds_table)
@@ -1,65 +0,0 @@
1
- """Rename the node attribute `column_descriptions_` to `column_descriptions` in snapshots."""
2
-
3
- import json
4
-
5
- from sqlglot import exp
6
-
7
- from sqlmesh.utils.migration import index_text_type
8
- from sqlmesh.utils.migration import blob_text_type
9
-
10
-
11
- def migrate(state_sync, **kwargs): # type: ignore
12
- import pandas as pd
13
-
14
- engine_adapter = state_sync.engine_adapter
15
- schema = state_sync.schema
16
- snapshots_table = "_snapshots"
17
- if schema:
18
- snapshots_table = f"{schema}.{snapshots_table}"
19
-
20
- new_snapshots = []
21
- found_col_descriptions = False
22
-
23
- for name, identifier, version, snapshot, kind_name, expiration_ts in engine_adapter.fetchall(
24
- exp.select("name", "identifier", "version", "snapshot", "kind_name", "expiration_ts").from_(
25
- snapshots_table
26
- ),
27
- quote_identifiers=True,
28
- ):
29
- parsed_snapshot = json.loads(snapshot)
30
-
31
- if "column_descriptions_" in parsed_snapshot["node"]:
32
- found_col_descriptions = True
33
- parsed_snapshot["node"]["column_descriptions"] = parsed_snapshot["node"].pop(
34
- "column_descriptions_"
35
- )
36
-
37
- new_snapshots.append(
38
- {
39
- "name": name,
40
- "identifier": identifier,
41
- "version": version,
42
- "snapshot": json.dumps(parsed_snapshot),
43
- "kind_name": kind_name,
44
- "expiration_ts": expiration_ts,
45
- }
46
- )
47
-
48
- if found_col_descriptions:
49
- engine_adapter.delete_from(snapshots_table, "TRUE")
50
-
51
- index_type = index_text_type(engine_adapter.dialect)
52
- blob_type = blob_text_type(engine_adapter.dialect)
53
-
54
- engine_adapter.insert_append(
55
- snapshots_table,
56
- pd.DataFrame(new_snapshots),
57
- target_columns_to_types={
58
- "name": exp.DataType.build(index_type),
59
- "identifier": exp.DataType.build(index_type),
60
- "version": exp.DataType.build(index_type),
61
- "snapshot": exp.DataType.build(blob_type),
62
- "kind_name": exp.DataType.build(index_type),
63
- "expiration_ts": exp.DataType.build("bigint"),
64
- },
65
- )
@@ -1,28 +0,0 @@
1
- """Add flag that controls whether environment names will be normalized."""
2
-
3
- from sqlglot import exp
4
-
5
-
6
- def migrate(state_sync, **kwargs): # type: ignore
7
- engine_adapter = state_sync.engine_adapter
8
- environments_table = "_environments"
9
- if state_sync.schema:
10
- environments_table = f"{state_sync.schema}.{environments_table}"
11
-
12
- alter_table_exp = exp.Alter(
13
- this=exp.to_table(environments_table),
14
- kind="TABLE",
15
- actions=[
16
- exp.ColumnDef(
17
- this=exp.to_column("normalize_name"),
18
- kind=exp.DataType.build("boolean"),
19
- )
20
- ],
21
- )
22
- engine_adapter.execute(alter_table_exp)
23
-
24
- state_sync.engine_adapter.update_table(
25
- environments_table,
26
- {"normalize_name": False},
27
- where=exp.true(),
28
- )
@@ -1,5 +0,0 @@
1
- """Add batch_size, batch_concurrency, and batch_interval to the CUSTOM model kind."""
2
-
3
-
4
- def migrate(state_sync, **kwargs): # type: ignore
5
- pass
@@ -1,5 +0,0 @@
1
- """Fix support for trailing comments in SQL model definitions."""
2
-
3
-
4
- def migrate(state_sync, **kwargs): # type: ignore
5
- pass
@@ -1,132 +0,0 @@
1
- """Add updated_ts, unpaused_ts, ttl_ms, and unrestorable columns to the snapshots table."""
2
-
3
- import json
4
-
5
- from sqlglot import exp
6
-
7
- from sqlmesh.utils.date import to_datetime, to_timestamp
8
- from sqlmesh.utils.migration import index_text_type
9
- from sqlmesh.utils.migration import blob_text_type
10
-
11
-
12
- def migrate(state_sync, **kwargs): # type: ignore
13
- import pandas as pd
14
-
15
- engine_adapter = state_sync.engine_adapter
16
- schema = state_sync.schema
17
- snapshots_table = "_snapshots"
18
- if schema:
19
- snapshots_table = f"{schema}.{snapshots_table}"
20
-
21
- index_type = index_text_type(engine_adapter.dialect)
22
- blob_type = blob_text_type(engine_adapter.dialect)
23
-
24
- add_column_exps = [
25
- exp.Alter(
26
- this=exp.to_table(snapshots_table),
27
- kind="TABLE",
28
- actions=[
29
- exp.ColumnDef(
30
- this=exp.to_column(column_name),
31
- kind=exp.DataType.build("bigint"),
32
- )
33
- ],
34
- )
35
- for column_name in ["updated_ts", "unpaused_ts", "ttl_ms"]
36
- ] + [
37
- exp.Alter(
38
- this=exp.to_table(snapshots_table),
39
- kind="TABLE",
40
- actions=[
41
- exp.ColumnDef(
42
- this=exp.to_column("unrestorable"),
43
- kind=exp.DataType.build("boolean"),
44
- )
45
- ],
46
- )
47
- ]
48
- engine_adapter.execute(add_column_exps)
49
-
50
- if engine_adapter.dialect == "databricks":
51
- # Databricks will throw an error like:
52
- # > databricks.sql.exc.ServerOperationError: [DELTA_UNSUPPORTED_DROP_COLUMN] DROP COLUMN is not supported for your Delta table.
53
- # when we try to drop `expiration_ts` below unless we set delta.columnMapping.mode to 'name'
54
- alter_table_exp = exp.Alter(
55
- this=exp.to_table(snapshots_table),
56
- kind="TABLE",
57
- actions=[
58
- exp.AlterSet(
59
- expressions=[
60
- exp.Properties(
61
- expressions=[
62
- exp.Property(
63
- this=exp.Literal.string("delta.columnMapping.mode"),
64
- value=exp.Literal.string("name"),
65
- )
66
- ]
67
- )
68
- ]
69
- )
70
- ],
71
- )
72
- engine_adapter.execute(alter_table_exp)
73
-
74
- drop_column_exp = exp.Alter(
75
- this=exp.to_table(snapshots_table),
76
- kind="TABLE",
77
- actions=[exp.Drop(this=exp.to_column("expiration_ts"), kind="COLUMN")],
78
- )
79
- engine_adapter.execute(drop_column_exp)
80
-
81
- new_snapshots = []
82
-
83
- for name, identifier, version, snapshot, kind_name in engine_adapter.fetchall(
84
- exp.select("name", "identifier", "version", "snapshot", "kind_name").from_(snapshots_table),
85
- quote_identifiers=True,
86
- ):
87
- parsed_snapshot = json.loads(snapshot)
88
- updated_ts = parsed_snapshot.pop("updated_ts")
89
- unpaused_ts = parsed_snapshot.pop("unpaused_ts", None)
90
- ttl_ms = max(
91
- to_timestamp(
92
- parsed_snapshot["ttl"],
93
- relative_base=to_datetime(updated_ts),
94
- check_categorical_relative_expression=False,
95
- )
96
- - updated_ts,
97
- 0,
98
- )
99
- unrestorable = parsed_snapshot.pop("unrestorable", False)
100
-
101
- new_snapshots.append(
102
- {
103
- "name": name,
104
- "identifier": identifier,
105
- "version": version,
106
- "snapshot": json.dumps(parsed_snapshot),
107
- "kind_name": kind_name,
108
- "updated_ts": updated_ts,
109
- "unpaused_ts": unpaused_ts,
110
- "ttl_ms": ttl_ms,
111
- "unrestorable": unrestorable,
112
- }
113
- )
114
-
115
- if new_snapshots:
116
- engine_adapter.delete_from(snapshots_table, "TRUE")
117
-
118
- engine_adapter.insert_append(
119
- snapshots_table,
120
- pd.DataFrame(new_snapshots),
121
- target_columns_to_types={
122
- "name": exp.DataType.build(index_type),
123
- "identifier": exp.DataType.build(index_type),
124
- "version": exp.DataType.build(index_type),
125
- "snapshot": exp.DataType.build(blob_type),
126
- "kind_name": exp.DataType.build(index_type),
127
- "updated_ts": exp.DataType.build("bigint"),
128
- "unpaused_ts": exp.DataType.build("bigint"),
129
- "ttl_ms": exp.DataType.build("bigint"),
130
- "unrestorable": exp.DataType.build("boolean"),
131
- },
132
- )