sqlmesh 0.196.4.dev14__py3-none-any.whl → 0.196.4.dev15__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.
sqlmesh/_version.py CHANGED
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '0.196.4.dev14'
21
- __version_tuple__ = version_tuple = (0, 196, 4, 'dev14')
20
+ __version__ = version = '0.196.4.dev15'
21
+ __version_tuple__ = version_tuple = (0, 196, 4, 'dev15')
@@ -6,11 +6,13 @@ import typing as t
6
6
 
7
7
  from sqlglot import exp
8
8
 
9
- from sqlmesh.core.dialect import to_schema
9
+ from sqlmesh.core.dialect import to_schema, add_table
10
10
  from sqlmesh.core.engine_adapter.base import (
11
11
  EngineAdapterWithIndexSupport,
12
12
  EngineAdapter,
13
13
  InsertOverwriteStrategy,
14
+ MERGE_SOURCE_ALIAS,
15
+ MERGE_TARGET_ALIAS,
14
16
  )
15
17
  from sqlmesh.core.engine_adapter.mixins import (
16
18
  GetCurrentCatalogFromFunctionMixin,
@@ -32,7 +34,7 @@ from sqlmesh.core.schema_diff import SchemaDiffer
32
34
 
33
35
  if t.TYPE_CHECKING:
34
36
  from sqlmesh.core._typing import SchemaName, TableName
35
- from sqlmesh.core.engine_adapter._typing import DF, Query
37
+ from sqlmesh.core.engine_adapter._typing import DF, Query, QueryOrDF
36
38
 
37
39
 
38
40
  @set_catalog()
@@ -188,6 +190,87 @@ class MSSQLEngineAdapter(
188
190
  )
189
191
  super().drop_schema(schema_name, ignore_if_not_exists=ignore_if_not_exists, cascade=False)
190
192
 
193
+ def merge(
194
+ self,
195
+ target_table: TableName,
196
+ source_table: QueryOrDF,
197
+ columns_to_types: t.Optional[t.Dict[str, exp.DataType]],
198
+ unique_key: t.Sequence[exp.Expression],
199
+ when_matched: t.Optional[exp.Whens] = None,
200
+ merge_filter: t.Optional[exp.Expression] = None,
201
+ ) -> None:
202
+ source_queries, columns_to_types = self._get_source_queries_and_columns_to_types(
203
+ source_table, columns_to_types, target_table=target_table
204
+ )
205
+ columns_to_types = columns_to_types or self.columns(target_table)
206
+ on = exp.and_(
207
+ *(
208
+ add_table(part, MERGE_TARGET_ALIAS).eq(add_table(part, MERGE_SOURCE_ALIAS))
209
+ for part in unique_key
210
+ )
211
+ )
212
+ if merge_filter:
213
+ on = exp.and_(merge_filter, on)
214
+
215
+ if not when_matched:
216
+ match_condition = None
217
+ unique_key_names = [y.name for y in unique_key]
218
+ columns_to_types_no_keys = [c for c in columns_to_types if c not in unique_key_names]
219
+
220
+ target_columns_no_keys = [
221
+ exp.column(c, MERGE_TARGET_ALIAS) for c in columns_to_types_no_keys
222
+ ]
223
+ source_columns_no_keys = [
224
+ exp.column(c, MERGE_SOURCE_ALIAS) for c in columns_to_types_no_keys
225
+ ]
226
+
227
+ match_condition = exp.Exists(
228
+ this=exp.select(*target_columns_no_keys).except_(
229
+ exp.select(*source_columns_no_keys)
230
+ )
231
+ )
232
+
233
+ match_expressions = [
234
+ exp.When(
235
+ matched=True,
236
+ source=False,
237
+ condition=match_condition,
238
+ then=exp.Update(
239
+ expressions=[
240
+ exp.column(col, MERGE_TARGET_ALIAS).eq(
241
+ exp.column(col, MERGE_SOURCE_ALIAS)
242
+ )
243
+ for col in columns_to_types_no_keys
244
+ ],
245
+ ),
246
+ )
247
+ ]
248
+ else:
249
+ match_expressions = when_matched.copy().expressions
250
+
251
+ match_expressions.append(
252
+ exp.When(
253
+ matched=False,
254
+ source=False,
255
+ then=exp.Insert(
256
+ this=exp.Tuple(expressions=[exp.column(col) for col in columns_to_types]),
257
+ expression=exp.Tuple(
258
+ expressions=[
259
+ exp.column(col, MERGE_SOURCE_ALIAS) for col in columns_to_types
260
+ ]
261
+ ),
262
+ ),
263
+ )
264
+ )
265
+ for source_query in source_queries:
266
+ with source_query as query:
267
+ self._merge(
268
+ target_table=target_table,
269
+ query=query,
270
+ on=on,
271
+ whens=exp.Whens(expressions=match_expressions),
272
+ )
273
+
191
274
  def _convert_df_datetime(self, df: DF, columns_to_types: t.Dict[str, exp.DataType]) -> None:
192
275
  import pandas as pd
193
276
  from pandas.api.types import is_datetime64_any_dtype # type: ignore
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlmesh
3
- Version: 0.196.4.dev14
3
+ Version: 0.196.4.dev15
4
4
  Summary: Next-generation data transformation framework
5
5
  Author-email: "TobikoData Inc." <engineering@tobikodata.com>
6
6
  License: Apache License
@@ -1,5 +1,5 @@
1
1
  sqlmesh/__init__.py,sha256=QjwaamJIdW7voXoS880yAx7tHm-Im4_mqGA-XJgafos,7631
2
- sqlmesh/_version.py,sha256=Q7f-hz4MIXEvQ4HJVw_bmmRwWQThZWjZbVIq2ZUhim4,530
2
+ sqlmesh/_version.py,sha256=JlpBDibXcqUt2F9HyzRDYtRJDb11w2foRGLAbgCHwC8,530
3
3
  sqlmesh/magics.py,sha256=nMfwSW5rIkdnyO9MXYm9u24hNl6dqgAWybC-MnRcNnE,41451
4
4
  sqlmesh/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  sqlmesh/cicd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -66,7 +66,7 @@ sqlmesh/core/engine_adapter/clickhouse.py,sha256=LoPdm_s_s-ZxS1XJPA3Et0iOHeJ1Lgq
66
66
  sqlmesh/core/engine_adapter/databricks.py,sha256=8ZExPIeT3dDh9MTJW8udvmh9LiY-f9HkRAN1Q5Qebhs,14541
67
67
  sqlmesh/core/engine_adapter/duckdb.py,sha256=TlSFSWNzUfjGdhuMyCi1CLwhBaEKyNKtasub9OsYwrc,5199
68
68
  sqlmesh/core/engine_adapter/mixins.py,sha256=HMB0Z9O3p5jaTZMolKiWKqpVDZokf5GoI99YXwEJ8bc,22470
69
- sqlmesh/core/engine_adapter/mssql.py,sha256=_rnnhZMBzVTUMBZpm7RM3Nfo8KdpO6Imn4mAvfs96Es,14250
69
+ sqlmesh/core/engine_adapter/mssql.py,sha256=KY9ruyofPOxsIPQdfFIQIuMOO4lMl9cynnPYgLKmIH4,17311
70
70
  sqlmesh/core/engine_adapter/mysql.py,sha256=lVC-siXZK3iSfqCmBjZNw8uy09Z8la8v8_oUZ-E2OwI,6966
71
71
  sqlmesh/core/engine_adapter/postgres.py,sha256=fdQrsBodfGlNf8lZYkS99U_gjoDyaYKEVKLgScduv3I,4601
72
72
  sqlmesh/core/engine_adapter/redshift.py,sha256=B4GsPggz-xyvBpx5qubvVwEeKF3vk7n5SMExL-Q5Ysw,16754
@@ -283,7 +283,7 @@ sqlmesh/utils/pydantic.py,sha256=I898jAFqa3qU6lG2uPpRebVFncOUo8ZrLWM_R3K3DHU,116
283
283
  sqlmesh/utils/rich.py,sha256=BpB47G0-JcU41LkGkeGKroexj4NOV5fox4-GOIXPgIc,3545
284
284
  sqlmesh/utils/windows.py,sha256=r7Yin4WEwbvH7sKA3hOJtRsclmscNuBeCklCfVPvtQs,611
285
285
  sqlmesh/utils/yaml.py,sha256=hvo5lmybYLcIx4p6CQwufS8X4MbwS60lEBnCmYJCXmU,2336
286
- sqlmesh-0.196.4.dev14.dist-info/licenses/LICENSE,sha256=OlMefUjgWJdULtf84BLW0AZZcY8DwdgQqb_1j2862j8,11346
286
+ sqlmesh-0.196.4.dev15.dist-info/licenses/LICENSE,sha256=OlMefUjgWJdULtf84BLW0AZZcY8DwdgQqb_1j2862j8,11346
287
287
  web/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
288
288
  web/client/dist/index.html,sha256=kNpFjWxt34Pf-P-cROtPWi3GNSVk6zqA3eoN9tlZXI0,5472
289
289
  web/client/dist/assets/Audits-DKgXravk.js,sha256=SaVQhNlislD_yQc_KivO7SPi1JH0ts1GnDPD5Zssutw,1041
@@ -401,8 +401,8 @@ web/server/api/endpoints/models.py,sha256=ud-lRwriyI_OYg9tZchrBgeiXELiRTLNEodraf
401
401
  web/server/api/endpoints/modules.py,sha256=8hqqgonGay_mJmpCw0IdbjsPhWlQH2VLdKAqha-myac,468
402
402
  web/server/api/endpoints/plan.py,sha256=OYuQ_4dgbhG9ibTcX1a8mvYgH3ANxw9Fhbb4wg6QWqc,9222
403
403
  web/server/api/endpoints/table_diff.py,sha256=SCy3-pr5x6bEEiOaZGCDbiHQhpgxwmnz3Acqa2Ie6jI,2090
404
- sqlmesh-0.196.4.dev14.dist-info/METADATA,sha256=nOPaChAOCQAVlVsQ5k0IfPm-lXgs7SCSecw6wIWevQA,26542
405
- sqlmesh-0.196.4.dev14.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
406
- sqlmesh-0.196.4.dev14.dist-info/entry_points.txt,sha256=pIYKtg-u-uO7BK_Y0qrdmfyj0bYrcMc3Xiqr5WE3VFk,121
407
- sqlmesh-0.196.4.dev14.dist-info/top_level.txt,sha256=bspjo5vjELQkuN0qKuTFIbsrUt3Zeo8D2mlKeHG1LdE,12
408
- sqlmesh-0.196.4.dev14.dist-info/RECORD,,
404
+ sqlmesh-0.196.4.dev15.dist-info/METADATA,sha256=ZUlQVtRCcgKx-Yxr_EukrMunZ-E4SCZsV41FPMCRyd0,26542
405
+ sqlmesh-0.196.4.dev15.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
406
+ sqlmesh-0.196.4.dev15.dist-info/entry_points.txt,sha256=pIYKtg-u-uO7BK_Y0qrdmfyj0bYrcMc3Xiqr5WE3VFk,121
407
+ sqlmesh-0.196.4.dev15.dist-info/top_level.txt,sha256=bspjo5vjELQkuN0qKuTFIbsrUt3Zeo8D2mlKeHG1LdE,12
408
+ sqlmesh-0.196.4.dev15.dist-info/RECORD,,