@@ -748,8 +748,10 @@ def _evaluate_snapshot(
748748 adapter .transaction (),
749749 adapter .session (snapshot .model .render_session_properties (** render_statements_kwargs )),
750750 ):
751- if not snapshot .is_dbt_custom :
752- adapter .execute (model .render_pre_statements (** render_statements_kwargs ))
751+ evaluation_strategy = _evaluation_strategy (snapshot , adapter )
752+ evaluation_strategy .run_pre_statements (
753+ snapshot = snapshot , render_kwargs = render_statements_kwargs
754+ )
753755
754756 if not target_table_exists or (model .is_seed and not snapshot .intervals ):
755757 # Only create the empty table if the columns were provided explicitly by the user
@@ -819,8 +821,9 @@ def _evaluate_snapshot(
819821 batch_index = batch_index ,
820822 )
821823
822- if not snapshot .is_dbt_custom :
823- adapter .execute (model .render_post_statements (** render_statements_kwargs ))
824+ evaluation_strategy .run_post_statements (
825+ snapshot = snapshot , render_kwargs = render_statements_kwargs
826+ )
824827
825828 return wap_id
826829
@@ -1435,8 +1438,10 @@ def _execute_create(
14351438 ** create_render_kwargs ,
14361439 "table_mapping" : {snapshot .name : table_name },
14371440 }
1438- if run_pre_post_statements and not snapshot .is_dbt_custom :
1439- adapter .execute (snapshot .model .render_pre_statements (** create_render_kwargs ))
1441+ if run_pre_post_statements :
1442+ evaluation_strategy .run_pre_statements (
1443+ snapshot = snapshot , render_kwargs = create_render_kwargs
1444+ )
14401445 evaluation_strategy .create (
14411446 table_name = table_name ,
14421447 model = snapshot .model ,
@@ -1447,8 +1452,10 @@ def _execute_create(
14471452 dry_run = dry_run ,
14481453 physical_properties = rendered_physical_properties ,
14491454 )
1450- if run_pre_post_statements and not snapshot .is_dbt_custom :
1451- adapter .execute (snapshot .model .render_post_statements (** create_render_kwargs ))
1455+ if run_pre_post_statements :
1456+ evaluation_strategy .run_post_statements (
1457+ snapshot = snapshot , render_kwargs = create_render_kwargs
1458+ )
14521459
14531460 def _can_clone (self , snapshot : Snapshot , deployability_index : DeployabilityIndex ) -> bool :
14541461 adapter = self .get_adapter (snapshot .model .gateway )
@@ -1548,7 +1555,7 @@ def _evaluation_strategy(snapshot: SnapshotInfoLike, adapter: EngineAdapter) ->
15481555 if hasattr (snapshot , "model" ) and isinstance (
15491556 (model_kind := snapshot .model .kind ), DbtCustomKind
15501557 ):
1551- return DbtCustomMaterialization (
1558+ return DbtCustomMaterializationStrategy (
15521559 adapter = adapter ,
15531560 materialization_name = model_kind .materialization ,
15541561 materialization_template = model_kind .definition ,
@@ -1696,6 +1703,24 @@ def demote(self, view_name: str, **kwargs: t.Any) -> None:
16961703 view_name: The name of the target view in the virtual layer.
16971704 """
16981705
1706+ @abc .abstractmethod
1707+ def run_pre_statements (self , snapshot : Snapshot , render_kwargs : t .Any ) -> None :
1708+ """Executes the snapshot's pre statements.
1709+
1710+ Args:
1711+ snapshot: The target snapshot.
1712+ render_kwargs: Additional key-value arguments to pass when rendering the statements.
1713+ """
1714+
1715+ @abc .abstractmethod
1716+ def run_post_statements (self , snapshot : Snapshot , render_kwargs : t .Any ) -> None :
1717+ """Executes the snapshot's post statements.
1718+
1719+ Args:
1720+ snapshot: The target snapshot.
1721+ render_kwargs: Additional key-value arguments to pass when rendering the statements.
1722+ """
1723+
16991724
17001725class SymbolicStrategy (EvaluationStrategy ):
17011726 def insert (
@@ -1757,6 +1782,12 @@ def promote(
17571782 def demote (self , view_name : str , ** kwargs : t .Any ) -> None :
17581783 pass
17591784
1785+ def run_pre_statements (self , snapshot : Snapshot , render_kwargs : t .Dict [str , t .Any ]) -> None :
1786+ pass
1787+
1788+ def run_post_statements (self , snapshot : Snapshot , render_kwargs : t .Dict [str , t .Any ]) -> None :
1789+ pass
1790+
17601791
17611792class EmbeddedStrategy (SymbolicStrategy ):
17621793 def promote (
@@ -1804,6 +1835,12 @@ def demote(self, view_name: str, **kwargs: t.Any) -> None:
18041835 logger .info ("Dropping view '%s'" , view_name )
18051836 self .adapter .drop_view (view_name , cascade = False )
18061837
1838+ def run_pre_statements (self , snapshot : Snapshot , render_kwargs : t .Any ) -> None :
1839+ self .adapter .execute (snapshot .model .render_pre_statements (** render_kwargs ))
1840+
1841+ def run_post_statements (self , snapshot : Snapshot , render_kwargs : t .Any ) -> None :
1842+ self .adapter .execute (snapshot .model .render_post_statements (** render_kwargs ))
1843+
18071844
18081845class MaterializableStrategy (PromotableStrategy , abc .ABC ):
18091846 def create (
@@ -2610,7 +2647,7 @@ def get_custom_materialization_type_or_raise(
26102647 raise SQLMeshError (f"Custom materialization '{ name } ' not present in the Python environment" )
26112648
26122649
2613- class DbtCustomMaterialization (MaterializableStrategy ):
2650+ class DbtCustomMaterializationStrategy (MaterializableStrategy ):
26142651 def __init__ (
26152652 self ,
26162653 adapter : EngineAdapter ,
@@ -2675,6 +2712,14 @@ def append(
26752712 ** kwargs ,
26762713 )
26772714
2715+ def run_pre_statements (self , snapshot : Snapshot , render_kwargs : t .Any ) -> None :
2716+ # in dbt custom materialisations it's up to the user when to run the pre hooks
2717+ pass
2718+
2719+ def run_post_statements (self , snapshot : Snapshot , render_kwargs : t .Any ) -> None :
2720+ # in dbt custom materialisations it's up to the user when to run the post hooks
2721+ pass
2722+
26782723 def _execute_materialization (
26792724 self ,
26802725 table_name : str ,
0 commit comments