Ë
    Ìiy2  ã                   ó²  — d dl Z d dlZd dlZd dlmZmZmZmZmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZmZmZmZ d d
lmZ d dlmZ d dlmZm Z  d dl!m"Z" d dl#m$Z$m%Z% d dl&m'Z' d dl(m)Z)m*Z*m+Z+ d dl,m-Z- d dl.m/Z/m0Z0 d dl1m2Z2 d dl3m4Z4 d dl5m6Z6 d dl7m8Z8m9Z9 ddl:m;Z; ddl<m=Z= ddl>m?Z?  G d„ de;«      Z@ G d„ de-«      ZA G d„ d e?«      ZBy)!é    N)ÚAbstractSetÚDictÚListÚOptionalÚType)Údeprecations)ÚBaseAdapter)ÚFreshnessResponse)ÚBaseRelation)Ú
Capability)ÚAdapterResponse)ÚFreshnessResultÚFreshnessStatusÚPartialSourceFreshnessResultÚSourceFreshnessResult)Újinja)ÚSOURCE_RESULT_FILE_NAME)ÚRuntimeProviderÚSourceContext)ÚManifest)ÚHookNodeÚSourceDefinition)Ú	RunStatus)ÚFreshnessCheckCompleteÚLogFreshnessResultÚLogStartLine)ÚResourceTypeSelector)ÚNodeTypeÚRunHookType)Ú
EventLevel)Ú
fire_event)ÚNote)ÚDbtInternalErrorÚDbtRuntimeErroré   )Ú
BaseRunner)Úprint_run_result_error)ÚRunTaskc                   ót   ‡ — e Zd Zdˆ fd„Zdeeef   ddfd„Zd„ Zdd„Z	dd„Z
d	„ Zd
„ Zd„ Zd„ Zdefd„Zˆ xZS )ÚFreshnessRunnerÚreturnNc                 ó:   •— t         ‰| �  |||||«       i | _        y ©N)ÚsuperÚ__init__Ú_metadata_freshness_cache)ÚselfÚconfigÚadapterÚnodeÚ
node_indexÚ	num_nodesÚ	__class__s         €úS/var/www/html/strategist-ai/venv/lib/python3.12/site-packages/dbt/task/freshness.pyr/   zFreshnessRunner.__init__&   s    ø€ Ü‰Ñ˜ ¨$°
¸IÔFØNPˆÕ&ó    Úmetadata_freshness_cachec                 ó   — || _         y r-   ©r0   )r1   r:   s     r8   Úset_metadata_freshness_cachez,FreshnessRunner.set_metadata_freshness_cache*   s   € ð *BˆÕ&r9   c                 ó   — t        d«      ‚)Nz#Freshness: nodes cannot be skipped!)r$   ©r1   s    r8   Úon_skipzFreshnessRunner.on_skip/   s   € ÜÐCÓDÐDr9   c                 óº   — dj                  | j                  «      }t        t        || j                  | j
                  | j                  j                  ¬«      «       y )Nz%freshness of {0.source_name}.{0.name})ÚdescriptionÚindexÚtotalÚ	node_info)Úformatr4   r!   r   r5   r6   rE   )r1   rB   s     r8   Úbefore_executezFreshnessRunner.before_execute2   sD   € Ø=×DÑDÀTÇYÁYÓOˆÜÜØ'Ø—o‘oØ—n‘nØŸ)™)×-Ñ-ô	õ	
r9   c                 ó¨  — t        |d«      r-|j                  j                  }|j                  j                  }n|j                  }|j                  }t        j                  t        |j                  «      «      }t        t        |j                  ||| j                  | j                  |j                  | j                  j                  ¬«      |¬«       y )Nr4   )ÚstatusÚsource_nameÚ
table_namerC   rD   Úexecution_timerE   )Úlevel)Úhasattrr4   rJ   ÚnamerK   r   Ústatus_to_levelÚstrrI   r!   r5   r6   rL   rE   )r1   ÚresultrJ   rK   rM   s        r8   Úafter_executezFreshnessRunner.after_execute=   sŸ   € Ü�6˜6Ô"Ø Ÿ+™+×1Ñ1ˆKØŸ™×)Ñ)‰Jà ×,Ñ,ˆKØ×*Ñ*ˆJÜ"×2Ñ2´3°v·}±}Ó3EÓFˆÜÜØ—}‘}Ø'Ø%Ø—o‘oØ—n‘nØ%×4Ñ4ØŸ)™)×-Ñ-ôð ö	
r9   c                 óJ   — | j                  ||t        j                  ||¬«      S )N)r4   Ú
start_timerI   Útiming_infoÚmessage)Ú_build_run_resultr   Ú
RuntimeErr)r1   r4   rW   rU   rV   s        r8   Úerror_resultzFreshnessRunner.error_resultR   s/   € Ø×%Ñ%ØØ!Ü"×-Ñ-Ø#Øð &ó 
ð 	
r9   c           
      ó’   — t        j                   «       |z
  }t        j                  «       j                  }t	        ||||||i d ¬«      S )N)rI   Ú	thread_idrL   ÚtimingrW   r4   Úadapter_responseÚfailures)ÚtimeÚ	threadingÚcurrent_threadrO   r   )r1   r4   rU   rI   rV   rW   rL   r\   s           r8   rX   z!FreshnessRunner._build_run_result[   sK   € ÜŸ™› zÑ1ˆÜ×,Ñ,Ó.×3Ñ3ˆ	Ü+ØØØ)ØØØØØô	
ð 		
r9   c                 ót   — t        j                   «       |z
  |_        |j                  j                  |«       |S r-   )r`   rL   r]   Úextend)r1   rR   rU   rV   s       r8   Úfrom_run_resultzFreshnessRunner.from_run_resulti   s,   € Ü $§	¡	£¨jÑ 8ˆÔØ�‰×Ñ˜[Ô)Øˆr9   c                 ó  — | j                   j                  j                  | j                  |«      }| j                   j	                  |j
                  |«      5  | j                   j                  «        d }d }|j                  ��t        j                  |j                  t        || j                  |t        «       d «      j                  «       |«      }| j                   j                  |||¬«      \  }}|j                  j                  |d   «      }�nž|j                   �`| j                   j#                  ||j                   |j                  j$                  |¬«      \  }}|j                  j                  |d   «      }�n2| j                   j'                  t(        j*                  «      rÕ|j                  j$                  �2t-        t/        d|j0                  › d�¬«      t2        j4                  «       | j                   j                  j                  | j                  |«      }|| j6                  v r| j6                  |   }n | j                   j9                  ||¬«      \  }}|j                  j                  |d   «      }n4t;        d|j0                  › d| j                   j=                  «       › d�«      ‚d d d «       r|j                  d	¬
«      }t?        d|tA        jB                  «       j0                  g dd |xs i d dœ¤ŽS # 1 sw Y   ŒQxY w)N)Úmacro_resolverÚagezDA filter cannot be applied to a metadata freshness check on source 'z'.©Úmsgz'Could not compute freshness for source z$: no 'loaded_at_field' provided and z: adapter does not support metadata-based freshness checks.T)Ú	omit_noner   )r4   rI   r\   r]   rL   rW   r^   r_   © )"r3   ÚRelationÚcreate_fromr2   Úconnection_namedÚ	unique_idÚclear_transactionÚloaded_at_queryr   Úget_renderedr   r   Úto_dictÚ#calculate_freshness_from_custom_sqlÚ	freshnessrI   Úloaded_at_fieldÚcalculate_freshnessÚfilterÚsupportsr   ÚTableLastModifiedMetadatar!   r"   rO   r    ÚWARNr0   Ú!calculate_freshness_from_metadatar$   Útyper   ra   rb   )	r1   Úcompiled_nodeÚmanifestÚrelationr^   rv   Úcompiled_coderI   Úmetadata_sources	            r8   ÚexecutezFreshnessRunner.executen   sý  € Ø—<‘<×(Ñ(×4Ñ4°T·[±[À-ÓPˆà�\‰\×*Ñ*¨=×+BÑ+BÀMÓRñ 3	Ø�L‰L×*Ñ*Ô,Ø:>ÐØ59ˆIà×,Ñ,Ð8ä %× 2Ñ 2Ø!×1Ñ1Ü!Ø% t§{¡{°H¼oÓ>OÐQUóç‘g“iØ!ó!�ð /3¯l©l×.^Ñ.^ØØ!Ø#+ð /_ó /Ñ+Ð  )ð
 '×0Ñ0×7Ñ7¸	À%Ñ8HÓI’Ø×.Ñ.Ð:Ø.2¯l©l×.NÑ.NØØ!×1Ñ1Ø!×+Ñ+×2Ñ2Ø#+ð	 /Oó /Ñ+Ð  )ð '×0Ñ0×7Ñ7¸	À%Ñ8HÓI’Ø—‘×&Ñ&¤z×'KÑ'KÔLØ ×*Ñ*×1Ñ1Ð=ÜÜØ"fÐgt×gyÑgyÐfzÐz|Ð }ôô #Ÿ™ô	ð #'§,¡,×"7Ñ"7×"CÑ"CÀDÇKÁKÐQ^Ó"_�Ø" d×&DÑ&DÑDØ $× >Ñ >¸Ñ O‘Ià26·,±,×2`Ñ2`Ø Ø'/ð 3aó 3Ñ/Ð$ ið
 '×0Ñ0×7Ñ7¸	À%Ñ8HÓI‘ä%Ø=¸m×>PÑ>PÐ=QÐQuÐvz÷  wCñ  wC÷  wHñ  wHó  wJð  vKð  KEð  Fóð ÷c3	ñl Ø/×7Ñ7À$Ð7ÓGÐä$ð 

ØØÜ×.Ñ.Ó0×5Ñ5ØØØØ-Ò3°Øñ

ð ñ

ð 
	
÷s3	ð 3	ús   ÁIK?Ë?Lr€   c                 ó~   — | j                   j                  t        j                  k7  rt	        d«      ‚| j                   S )Nz"freshness runner: got a non-Source)r4   Úresource_typer   ÚSourcer$   )r1   r€   s     r8   ÚcompilezFreshnessRunner.compile¶   s.   € Ø�9‰9×"Ñ"¤h§o¡oÒ5ä!Ð"FÓGÐGà�y‰yÐr9   ©r+   N)Ú__name__Ú
__module__Ú__qualname__r/   r   r   r   r=   r@   rG   rS   rZ   rX   re   r„   r   rˆ   Ú__classcell__©r7   s   @r8   r*   r*   %   s]   ø„ õQðBØ(,¨\¸?Ð-JÑ(KðBà	óBò
Eó	
ó
ò*
ò
òò
F
ðP ÷ r9   r*   c                   ó   ‡ — e Zd Zˆ fd„Zˆ xZS )ÚFreshnessSelectorc                 ó^   •— t         ‰| �  |«      syt        |t        «      sy|j                  S ©NF)r.   Únode_is_matchÚ
isinstancer   Úhas_freshness)r1   r4   r7   s     €r8   r“   zFreshnessSelector.node_is_match¿   s-   ø€ Ü‰wÑ$ TÔ*ØÜ˜$Ô 0Ô1ØØ×!Ñ!Ð!r9   )rŠ   r‹   rŒ   r“   r�   rŽ   s   @r8   r�   r�   ¾   s   ø„ ÷"ð "r9   r�   c                   óØ   ‡ — e Zd Zdˆ fd„Zdefd„Zdefd„Zd„ Zde	de
e   defˆ fd„Zdefˆ fd	„Zdeee      fd
„Zd„ Zdd„Zdedee   fˆ fd„Zde
e   defd„Zdeeef   fd„Zˆ xZS )ÚFreshnessTaskr+   c                 óÊ   •— t         ‰| �  |||«       | j                  j                  r4t	        j
                  dt        | j                  j                  «      ¬«       i | _        y )Nz2custom-output-path-in-source-freshness-deprecation)Úpath)r.   r/   ÚargsÚoutputr   ÚwarnrQ   r0   )r1   rš   r2   r€   r7   s       €r8   r/   zFreshnessTask.__init__È   sO   ø€ Ü‰Ñ˜˜v xÔ0à�9‰9×ÒÜ×ÑØDÌ3ÈtÏyÉy×O_ÑO_ÓK`õð OQˆÕ&r9   c                 ó  — | j                   j                  r3t        j                  j	                  | j                   j                  «      S t        j                  j                  | j                  j                  t        «      S r-   )	rš   r›   Úosr™   ÚrealpathÚjoinr2   Úproject_target_pathr   r?   s    r8   Úresult_pathzFreshnessTask.result_pathÒ   sN   € Ø�9‰9×ÒÜ—7‘7×#Ñ# D§I¡I×$4Ñ$4Ó5Ð5ä—7‘7—<‘< §¡× ?Ñ ?ÔAXÓYÐYr9   c                  ó   — yr’   rl   r?   s    r8   Úraise_on_first_errorz"FreshnessTask.raise_on_first_errorØ   s   € Ør9   c                 óÀ   — | j                   �| j                  €t        d«      ‚t        | j                  | j                   | j                  t
        j                  g¬«      S )Nz<manifest and graph must be set to get perform node selection)Úgraphr€   Úprevious_stateÚresource_types)r€   r¦   r#   r�   r§   r   r‡   r?   s    r8   Úget_node_selectorzFreshnessTask.get_node_selectorÛ   sO   € Ø�=‰=Ð  D§J¡JÐ$6Ü"Ð#aÓbÐbÜ Ø—*‘*Ø—]‘]Ø×.Ñ.Ü$ŸO™OÐ,ô	
ð 	
r9   r3   Úselected_uidsc                 óX  •— t         j                  }t        ‰| �  ||«      }|t         j                  k(  r1|j	                  t
        j                  «      r| j                  ||«      }|t         j                  k(  r#|t         j                  k(  rt         j                  S t         j                  S r-   )	r   ÚSuccessr.   Ú
before_runrz   r   ÚTableLastModifiedMetadataBatchÚ!populate_metadata_freshness_cacheÚError)r1   r3   rª   Ú(populate_metadata_freshness_cache_statusÚbefore_run_statusr7   s        €r8   r­   zFreshnessTask.before_runå   s‘   ø€ Ü3<×3DÑ3DÐ0ä!™GÑ.¨w¸ÓFÐà¤	× 1Ñ 1Ò1°g×6FÑ6FÜ×5Ñ5ô7
ð 8<×7]Ñ7]Ø˜ó8Ð4ð
 ¤×!2Ñ!2Ò2Ø8¼I×<MÑ<MÒMä×$Ñ$Ð$ä—?‘?Ð"r9   c                 ó€   •— t         ‰| �  |«      }t        |t        «      sJ ‚|j	                  | j
                  «       |S r-   )r.   Ú
get_runnerr”   r*   r=   r0   )r1   r4   Úfreshness_runnerr7   s      €r8   r´   zFreshnessTask.get_runnerù   s>   ø€ Ü ™7Ñ-¨dÓ3ÐÜÐ*¬OÔ<Ð<Ð<Ø×5Ñ5°d×6TÑ6TÔUØÐr9   c                 ó   — t         S r-   )r*   )r1   Ú_s     r8   Úget_runner_typezFreshnessTask.get_runner_typeÿ   s   € ÜÐr9   c                 ó2   — t        j                  |||¬«      S )N)Úelapsed_timeÚgenerated_atÚresults)r   Úfrom_node_results)r1   r¼   rº   r»   s       r8   Ú
get_resultzFreshnessTask.get_result  s   € Ü×0Ñ0Ø%°LÈ'ô
ð 	
r9   c                 óÆ   — |D ]I  }|j                   t        j                  t        j                  t        j                  fv sŒ?t        |«       ŒK t        t        «       «       y r-   )rI   r   r°   rY   r   r'   r!   r   )r1   r¼   rR   s      r8   Útask_end_messageszFreshnessTask.task_end_messages  sS   € Øò 	/ˆFØ�}‰}Ü×%Ñ%Ü×*Ñ*Ü—‘ð!ò ô
 ' vÕ.ð	/ô 	Ô)Ó+Õ,r9   Ú	hook_typec                 ó„   •— t         ‰| �  |«      }| j                  j                  r|S |rt	        j
                  d«       g S )Nzsource-freshness-project-hooks)r.   Úget_hooks_by_typerš   Ú"source_freshness_run_project_hooksr   rœ   )r1   rÁ   Úhooksr7   s      €r8   rÃ   zFreshnessTask.get_hooks_by_type  s;   ø€ Ü‘Ñ)¨)Ó4ˆØ�9‰9×7Ò7ØˆLáÜ×!Ñ!Ð"BÔCØˆIr9   c                 ó¨  — | j                   €t        d«      ‚g }t        |«      D ]n  }| j                   j                  j	                  |«      }|sŒ+|j
                  �Œ8|j                  j                  | j                  |«      }|j                  |«       Œp t        t        dt        |«      › d�¬«      t        j                  «       	 |j                  |«      \  }}| j                   j#                  |«       t$        j&                  S # t(        $ rA}	t        t        d|	› �¬«      t        j*                  «       t$        j,                  cY d }	~	S d }	~	ww xY w)Nz9Manifest must be set to populate metadata freshness cachez5Pulling freshness from warehouse metadata tables for z sourcesri   z3Metadata freshness could not be computed in batch: )r€   r#   ÚlistÚsourcesÚgetrw   rm   rn   r2   Úappendr!   r"   Úlenr    ÚINFOÚ'calculate_freshness_from_metadata_batchr0   Úupdater   r¬   Ú	Exceptionr|   r°   )
r1   r3   rª   Úbatch_metadata_sourcesÚselected_source_uidÚsourcerƒ   r·   Úmetadata_freshness_resultsÚes
             r8   r¯   z/FreshnessTask.populate_metadata_freshness_cache  s5  € ð �=‰=Ð Ü"Ð#^Ó_Ð_à57ÐÜ#'¨Ó#6ò 	?ÐØ—]‘]×*Ñ*×.Ñ.Ð/BÓCˆFÚ˜&×0Ñ0Ñ8Ø")×"2Ñ"2×">Ñ">¸t¿{¹{ÈFÓ"S�Ø&×-Ñ-¨oÕ>ð		?ô 	ÜØKÌCÐPfÓLgÐKhÐhpÐqôô �O‰Oô		
ð	#Ø,3×,[Ñ,[Ø&ó-Ñ)ˆAÐ)ð ×*Ñ*×1Ñ1Ð2LÔMÜ×$Ñ$Ð$øÜò 
	#ô ÜÐNÈqÈcÐRÔSÜ—‘ôô —?‘?Õ"ûð
	#ús   Ã>D Ä	EÄ6EÅEÅEc                 ó   — | j                   S r-   r<   r?   s    r8   Úget_freshness_metadata_cachez*FreshnessTask.get_freshness_metadata_cacheA  s   € Ø×-Ñ-Ð-r9   r‰   )rŠ   r‹   rŒ   r/   rQ   r¢   Úboolr¤   r©   r	   r   r   r­   r&   r´   r   r   r¸   r¾   rÀ   r   r   r   rÃ   r¯   r   r   r   rÖ   r�   rŽ   s   @r8   r—   r—   Ç   s¼   ø„ õQðZ˜Só Zð dó ò
ð# +ð #¸kÈ#Ñ>Nð #ÐS\õ #ð(  *õ  ð H¨T°*Ñ-=Ñ$>ó ò
ó
	-ð¨;ð ¸4À¹>õ ð$#Ø&1°#Ñ&6ð$#à	ó$#ðL.¨d°<ÀÐ3PÑ.Q÷ .r9   r—   )Crž   ra   r`   Útypingr   r   r   r   r   Údbtr   Údbt.adapters.baser	   Údbt.adapters.base.implr
   Údbt.adapters.base.relationr   Údbt.adapters.capabilityr   Ú!dbt.adapters.contracts.connectionr   Údbt.artifacts.schemas.freshnessr   r   r   r   Údbt.clientsr   Údbt.constantsr   Údbt.context.providersr   r   Údbt.contracts.graph.manifestr   Údbt.contracts.graph.nodesr   r   Údbt.contracts.resultsr   Údbt.events.typesr   r   r   Ú	dbt.graphr   Údbt.node_typesr   r   Údbt_common.events.base_typesr    Údbt_common.events.functionsr!   Údbt_common.events.typesr"   Údbt_common.exceptionsr#   r$   Úbaser&   Úprinterr'   Úrunr(   r*   r�   r—   rl   r9   r8   ú<module>rð      s�   ðÛ 	Û Û ß :Õ :å Ý )Ý 4Ý 3Ý .Ý =÷ó õ Ý 1ß @Ý 1ß @Ý +ß UÑ UÝ *ß 0Ý 3Ý 2Ý (ß Cå Ý +Ý ôV�jô Vôr"Ð,ô "ô{.�Gõ {.r9   