@@ -6436,7 +6436,7 @@ def end_date_macro(evaluator: MacroEvaluator, var: bool):
6436
6436
owner = "@IF(@gateway = 'dev', @{dev_owner}, @{prod_owner})" ,
6437
6437
stamp = "@{stamp}" ,
6438
6438
tags = ["@{tag1}" , "@{tag2}" ],
6439
- description = "Model desc @{test_}" ,
6439
+ description = "' Model desc @{test_}' " ,
6440
6440
)
6441
6441
def model_with_macros (evaluator , ** kwargs ):
6442
6442
return exp .select (
@@ -6480,26 +6480,109 @@ def model_with_macros(evaluator, **kwargs):
6480
6480
assert query .sql () == """SELECT 'test_value' AS "a" """ .strip ()
6481
6481
6482
6482
6483
+ def test_unrendered_macros_sql_model (mocker : MockerFixture ) -> None :
6484
+ model = load_sql_based_model (
6485
+ parse (
6486
+ """
6487
+ MODEL (
6488
+ name db.employees,
6489
+ kind INCREMENTAL_BY_UNIQUE_KEY (
6490
+ unique_key @{key},
6491
+ merge_filter source.id > 0 and target.updated_at < @end_ds and source.updated_at > @start_ds and @merge_filter_var
6492
+ ),
6493
+ cron '@daily',
6494
+ allow_partials @IF(@gateway = 'dev', True, False),
6495
+ physical_properties (
6496
+ location1 = @'s3://bucket/prefix/@{schema_name}/@{table_name}',
6497
+ location2 = @IF(@gateway = 'dev', @'hdfs://@{catalog_name}/@{schema_name}/dev/@{table_name}', @'s3://prod/@{table_name}'),
6498
+ foo = @physical_var
6499
+ ),
6500
+ virtual_properties (
6501
+ creatable_type = @{create_type},
6502
+ bar = @virtual_var,
6503
+ ),
6504
+ session_properties (
6505
+ 'spark.executor.cores' = @IF(@gateway = 'dev', 1, 2),
6506
+ 'spark.executor.memory' = '1G',
6507
+ baz = @session_var
6508
+ ),
6509
+ );
6510
+
6511
+ SELECT * FROM src;
6512
+ """
6513
+ ),
6514
+ variables = {
6515
+ "gateway" : "dev" ,
6516
+ "key" : "a" , # Not included in python_env because kind is rendered at load time
6517
+ "create_type" : "'SECURE'" ,
6518
+ "merge_filter_var" : True ,
6519
+ "physical_var" : "bla" ,
6520
+ "virtual_var" : "blb" ,
6521
+ "session_var" : "blc" ,
6522
+ },
6523
+ )
6524
+
6525
+ assert model .python_env [c .SQLMESH_VARS ] == Executable .value (
6526
+ {
6527
+ "gateway" : "dev" ,
6528
+ "create_type" : "'SECURE'" ,
6529
+ "merge_filter_var" : True ,
6530
+ "physical_var" : "bla" ,
6531
+ "virtual_var" : "blb" ,
6532
+ "session_var" : "blc" ,
6533
+ }
6534
+ )
6535
+
6536
+ assert "location1" in model .physical_properties
6537
+ assert "location2" in model .physical_properties
6538
+
6539
+ # The properties will stay unrendered at load time
6540
+ assert model .session_properties == {
6541
+ "spark.executor.cores" : exp .maybe_parse ("@IF(@gateway = 'dev', 1, 2)" ),
6542
+ "spark.executor.memory" : "1G" ,
6543
+ "baz" : exp .maybe_parse ("@session_var" ),
6544
+ }
6545
+ assert model .virtual_properties ["creatable_type" ] == exp .maybe_parse ("@{create_type}" )
6546
+
6547
+ assert (
6548
+ model .physical_properties ["location1" ].sql ()
6549
+ == "@'s3://bucket/prefix/@{schema_name}/@{table_name}'"
6550
+ )
6551
+ assert (
6552
+ model .physical_properties ["location2" ].sql ()
6553
+ == "@IF(@gateway = 'dev', @'hdfs://@{catalog_name}/@{schema_name}/dev/@{table_name}', @'s3://prod/@{table_name}')"
6554
+ )
6555
+
6556
+ # merge_filter will stay unrendered as well
6557
+ assert model .unique_key [0 ] == exp .column ("a" , quoted = True )
6558
+ assert (
6559
+ t .cast (exp .Expression , model .merge_filter ).sql ()
6560
+ == '"__merge_source__"."id" > 0 AND "__merge_target__"."updated_at" < @end_ds AND "__merge_source__"."updated_at" > @start_ds AND @merge_filter_var'
6561
+ )
6562
+
6563
+
6483
6564
def test_unrendered_macros_python_model (mocker : MockerFixture ) -> None :
6484
6565
@model (
6485
6566
"test_unrendered_macros_python_model_@{bar}" ,
6486
6567
is_sql = True ,
6487
6568
kind = dict (
6488
6569
name = ModelKindName .INCREMENTAL_BY_UNIQUE_KEY ,
6489
6570
unique_key = "@{key}" ,
6490
- merge_filter = "source.id > 0 and target.updated_at < @end_ds and source.updated_at > @start_ds" ,
6571
+ merge_filter = "source.id > 0 and target.updated_at < @end_ds and source.updated_at > @start_ds and @merge_filter_var " ,
6491
6572
),
6492
6573
cron = "@daily" ,
6493
6574
columns = {"a" : "string" },
6494
6575
allow_partials = "@IF(@gateway = 'dev', True, False)" ,
6495
6576
physical_properties = dict (
6496
6577
location1 = "@'s3://bucket/prefix/@{schema_name}/@{table_name}'" ,
6497
6578
location2 = "@IF(@gateway = 'dev', @'hdfs://@{catalog_name}/@{schema_name}/dev/@{table_name}', @'s3://prod/@{table_name}')" ,
6579
+ foo = "@physical_var" ,
6498
6580
),
6499
- virtual_properties = {"creatable_type" : "@{create_type}" },
6581
+ virtual_properties = {"creatable_type" : "@{create_type}" , "bar" : "@virtual_var" },
6500
6582
session_properties = {
6501
6583
"spark.executor.cores" : "@IF(@gateway = 'dev', 1, 2)" ,
6502
6584
"spark.executor.memory" : "1G" ,
6585
+ "baz" : "@session_var" ,
6503
6586
},
6504
6587
)
6505
6588
def model_with_macros (evaluator , ** kwargs ):
@@ -6517,12 +6600,24 @@ def model_with_macros(evaluator, **kwargs):
6517
6600
"gateway" : "dev" ,
6518
6601
"key" : "a" ,
6519
6602
"create_type" : "'SECURE'" ,
6603
+ "merge_filter_var" : True ,
6604
+ "physical_var" : "bla" ,
6605
+ "virtual_var" : "blb" ,
6606
+ "session_var" : "blc" ,
6520
6607
},
6521
6608
)
6522
6609
6523
6610
assert python_sql_model .name == "test_unrendered_macros_python_model_suffix"
6524
6611
assert python_sql_model .python_env [c .SQLMESH_VARS ] == Executable .value (
6525
- {"test_var_a" : "test_value" }
6612
+ {
6613
+ "test_var_a" : "test_value" ,
6614
+ "gateway" : "dev" ,
6615
+ "create_type" : "'SECURE'" ,
6616
+ "merge_filter_var" : True ,
6617
+ "physical_var" : "bla" ,
6618
+ "virtual_var" : "blb" ,
6619
+ "session_var" : "blc" ,
6620
+ }
6526
6621
)
6527
6622
assert python_sql_model .enabled
6528
6623
@@ -6536,25 +6631,28 @@ def model_with_macros(evaluator, **kwargs):
6536
6631
6537
6632
# The properties will stay unrendered at load time
6538
6633
assert python_sql_model .session_properties == {
6539
- "spark.executor.cores" : "@IF(@gateway = 'dev', 1, 2)" ,
6634
+ "spark.executor.cores" : exp . maybe_parse ( "@IF(@gateway = 'dev', 1, 2)" ) ,
6540
6635
"spark.executor.memory" : "1G" ,
6636
+ "baz" : exp .maybe_parse ("@session_var" ),
6541
6637
}
6542
- assert python_sql_model .virtual_properties ["creatable_type" ] == exp .convert ("@{create_type}" )
6638
+ assert python_sql_model .virtual_properties ["creatable_type" ] == exp .maybe_parse (
6639
+ "@{create_type}"
6640
+ )
6543
6641
6544
6642
assert (
6545
- python_sql_model .physical_properties ["location1" ].text ( "this" )
6643
+ python_sql_model .physical_properties ["location1" ].sql ( )
6546
6644
== "@'s3://bucket/prefix/@{schema_name}/@{table_name}'"
6547
6645
)
6548
6646
assert (
6549
- python_sql_model .physical_properties ["location2" ].text ( "this" )
6647
+ python_sql_model .physical_properties ["location2" ].sql ( )
6550
6648
== "@IF(@gateway = 'dev', @'hdfs://@{catalog_name}/@{schema_name}/dev/@{table_name}', @'s3://prod/@{table_name}')"
6551
6649
)
6552
6650
6553
6651
# merge_filter will stay unrendered as well
6554
6652
assert python_sql_model .unique_key [0 ] == exp .column ("a" , quoted = True )
6555
6653
assert (
6556
6654
python_sql_model .merge_filter .sql ()
6557
- == '"source "."id" > 0 AND "target "."updated_at" < @end_ds AND "source "."updated_at" > @start_ds'
6655
+ == '"__merge_source__ "."id" > 0 AND "__merge_target__ "."updated_at" < @end_ds AND "__merge_source__ "."updated_at" > @start_ds AND @merge_filter_var '
6558
6656
)
6559
6657
6560
6658
0 commit comments