99from airflow .models import BaseOperator , baseoperator
1010from airflow .operators .empty import EmptyOperator
1111from airflow .operators .python import PythonOperator
12+ from airflow .sensors .base import BaseSensorOperator
1213
1314from sqlmesh .core .environment import Environment , EnvironmentNamingInfo
1415from sqlmesh .core .notification_target import NotificationTarget
2122)
2223from sqlmesh .schedulers .airflow import common , util
2324from sqlmesh .schedulers .airflow .operators import targets
24- from sqlmesh .schedulers .airflow .operators .hwm_sensor import HighWaterMarkSensor
25+ from sqlmesh .schedulers .airflow .operators .hwm_sensor import (
26+ HighWaterMarkExternalSensor ,
27+ HighWaterMarkSensor ,
28+ )
2529from sqlmesh .schedulers .airflow .operators .notification import (
2630 BaseNotificationOperatorProvider ,
2731)
@@ -58,12 +62,16 @@ def __init__(
5862 engine_operator_args : t .Optional [t .Dict [str , t .Any ]],
5963 ddl_engine_operator : t .Type [BaseOperator ],
6064 ddl_engine_operator_args : t .Optional [t .Dict [str , t .Any ]],
65+ external_table_sensor_factory : t .Optional [
66+ t .Callable [[t .Dict [str , t .Any ]], BaseSensorOperator ]
67+ ],
6168 snapshots : t .Dict [SnapshotId , Snapshot ],
6269 ):
6370 self ._engine_operator = engine_operator
6471 self ._engine_operator_args = engine_operator_args or {}
6572 self ._ddl_engine_operator = ddl_engine_operator
6673 self ._ddl_engine_operator_args = ddl_engine_operator_args or {}
74+ self ._external_table_sensor_factory = external_table_sensor_factory
6775 self ._snapshots = snapshots
6876
6977 def generate_cadence_dags (self , snapshots : t .Iterable [SnapshotIdLike ]) -> t .List [DAG ]:
@@ -506,10 +514,12 @@ def _create_snapshot_evaluator_operator(
506514 task_id = task_id ,
507515 )
508516
509- def _create_hwm_sensors (self , snapshot : Snapshot ) -> t .List [HighWaterMarkSensor ]:
510- output = []
517+ def _create_hwm_sensors (self , snapshot : Snapshot ) -> t .List [BaseSensorOperator ]:
518+ output : t .List [BaseSensorOperator ] = []
519+ depends_on = snapshot .node .depends_on
511520 for upstream_snapshot_id in snapshot .parents :
512521 upstream_snapshot = self ._snapshots [upstream_snapshot_id ]
522+ depends_on .discard (upstream_snapshot .name )
513523 if not upstream_snapshot .is_symbolic and not upstream_snapshot .is_seed :
514524 output .append (
515525 HighWaterMarkSensor (
@@ -518,6 +528,16 @@ def _create_hwm_sensors(self, snapshot: Snapshot) -> t.List[HighWaterMarkSensor]
518528 task_id = f"{ sanitize_name (upstream_snapshot .name )} _{ upstream_snapshot .version } _high_water_mark_sensor" ,
519529 )
520530 )
531+
532+ if self ._external_table_sensor_factory and snapshot .model .signals :
533+ output .append (
534+ HighWaterMarkExternalSensor (
535+ snapshot = snapshot ,
536+ external_table_sensor_factory = self ._external_table_sensor_factory ,
537+ task_id = "external_high_water_mark_sensor" ,
538+ )
539+ )
540+
521541 return output
522542
523543
0 commit comments