Ë
    Ìi3‰  ã                   óZ  — d dl Z d dlZd dlZd dlZd dlmZmZ d dlmZm	Z	m
Z
mZmZmZmZ d dlZd dlZd dlZd dlmZ d dlmZ d dlmZmZ d dlmZmZ d dlmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( d d	l)m*Z*m+Z+ d d
l,m-Z-m.Z.m/Z/m0Z0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl6m7Z7m8Z8 d dl9m:Z: d dl;m<Z< d dl=m>Z> d dl?m@Z@ d dlAmBZB d dlCmDZD d dlEmFZF dZGde	e8eHf   fd„ZIde"fd„ZJdede	e8eHf   fd„ZKd„ ZLd„ ZMdededee   fd „ZNe jž                   G d!„ d"«      «       ZP G d#„ d$«      ZQ G d%„ d&«      ZRd'eSd(ee!   deSfd)„ZTy)*é    N)ÚdefaultdictÚdeque)ÚAnyÚDictÚIterableÚListÚOptionalÚSetÚTuple)Úget_adapter)Újinja)Úgenerate_runtime_model_contextÚ"generate_runtime_unit_test_context)ÚManifestÚUniqueID)
ÚGenericTestNodeÚGraphMemberNodeÚInjectedCTEÚManifestNodeÚManifestSQLNodeÚ	ModelNodeÚSeedNodeÚUnitTestDefinitionÚUnitTestNodeÚUnitTestSourceDefinition)Ú
FoundStatsÚWritingInjectedSQLForNode)ÚDbtInternalErrorÚDbtRuntimeErrorÚ!ForeignKeyConstraintToSyntaxErrorÚGraphDependencyNotFoundErrorÚParsingError)Ú	get_flags)ÚGraph)ÚModelLanguageÚNodeType)Úmake_directory)ÚConstraintType)Úget_node_info)Ú	pluralize)Ú
fire_event)ÚNote)Úget_invocation_idzgraph.gpickleÚstatsc           
      ó¾  — t         j                  j                  �P| j                  «       D ��ci c]  \  }}|j	                  «       |“Œ }}}t         j                  j                  |«       dj                  | j                  «       D ��cg c]'  \  }}|dk7  sŒt	        ||«      j                  dd«      ‘Œ) c}}«      }t        t        |¬«      «       y c c}}w c c}}w )Nú, r   Ú_ú )Ú	stat_line)
ÚdbtÚtrackingÚactive_userÚitemsr*   Útrack_resource_countsÚjoinÚreplacer+   r   )r.   ÚkÚvÚresource_countsÚtÚctr3   s          úP/var/www/html/strategist-ai/venv/lib/python3.12/site-packages/dbt/compilation.pyÚprint_compile_statsrA   5   sª   € ä
‡|�|×ÑÐ+Ø8=¿¹»×F±°°1˜1Ÿ;™;›=¨!Ñ+ÐFˆÑFÜ�‰×*Ñ*¨?Ô;ð —	‘	Ø9>¿¹»×R±°°2È"ÐPQË'Œ�2�qÓ	×	!Ñ	! # sÕ	+ÓRó€Iô Œz IÔ.Õ/ùó Gùó
 	Ss   ®CÂ	C
ÂC
Únodec                 ól   — | j                   t        j                  k(  r| j                  j                  syy)NFT)Úresource_typer&   ÚTestÚconfigÚenabled)rB   s    r@   Ú_node_enabledrH   B   s&   € à×ÑœXŸ]™]Ò*°4·;±;×3FÒ3FØàó    ÚmanifestÚreturnc                 óˆ  — t        t        «      }| j                  j                  «       D ]%  }t	        |«      sŒ||j
                  xx   dz  cc<   Œ' |t        j                  xx   t        | j                  «      z  cc<   |t        j                  xx   t        | j                  «      z  cc<   |t        j                  xx   t        | j                  «      z  cc<   |t        j                  xx   t        | j                  «      z  cc<   |t        j                   xx   t        | j"                  «      z  cc<   |t        j$                  xx   t        | j&                  «      z  cc<   |t        j(                  xx   t        | j*                  «      z  cc<   |t        j,                  xx   t        | j.                  «      z  cc<   |S )Né   )r   ÚintÚnodesÚvaluesrH   rD   r&   ÚSourceÚlenÚsourcesÚExposureÚ	exposuresÚMetricÚmetricsÚMacroÚmacrosÚGroupÚgroupsÚSemanticModelÚsemantic_modelsÚ
SavedQueryÚsaved_queriesÚUnitÚ
unit_tests)rJ   r.   rB   s      r@   Ú_generate_statsrb   J   sI  € Ü!,¬SÓ!1€EØ—‘×%Ñ%Ó'ò +ˆÜ˜ÕØ�$×$Ñ$Ó%¨Ñ*Ô%ð+ð
 
Œ(�/‰/Óœc (×"2Ñ"2Ó3Ñ3ÓØ	Œ(×
Ñ
Ó¤ H×$6Ñ$6Ó 7Ñ7ÓØ	Œ(�/‰/Óœc (×"2Ñ"2Ó3Ñ3ÓØ	Œ(�.‰.ÓœS §¡Ó1Ñ1ÓØ	Œ(�.‰.ÓœS §¡Ó1Ñ1ÓØ	Œ(×
 Ñ
 Ó!¤S¨×)AÑ)AÓ%BÑBÓ!Ø	Œ(×
Ñ
Ó¤# h×&<Ñ&<Ó"=Ñ=ÓØ	Œ(�-‰-ÓœC × 3Ñ 3Ó4Ñ4Óð €LrI   c                 óÀ   — | D ];  }|j                   |j                   k(  sŒ|j                  sŒ*|j                  |_         y  |j                  r| j                  |«       y y ©N)ÚidÚsqlÚappend)Úprepended_ctesÚnew_cteÚctes      r@   Ú_add_prepended_cterk   _   sQ   € Øò ˆØ�6‰6�W—Z‘ZÓ G§K£KØ—k‘kˆCŒGÙðð ‡{‚{Ø×Ñ˜gÕ&ð rI   c                 ó*   — |D ]  }t        | |«       Œ y rd   )rk   )rh   Únew_prepended_ctesri   s      r@   Ú_extend_prepended_ctesrn   h   s   € Ø%ò 4ˆÜ˜>¨7Õ3ñ4rI   Ú	unique_idc                 ó”   — g }|| j                   v r7| j                   |   D ]%  }|j                  d«      sŒ|j                  |«       Œ' |S )zKGet a list of tests that depend on the node with the
    provided unique idztest.)Ú	child_mapÚ
startswithrg   )rJ   ro   ÚtestsÚchild_unique_ids       r@   Ú_get_tests_for_noderu   m   sR   € ð €EØ�H×&Ñ&Ñ&Ø'×1Ñ1°)Ñ<ò 	.ˆOØ×)Ñ)¨'Õ2Ø—‘˜_Õ-ð	.ð €LrI   c                   ó¦   — e Zd ZU eed<   dZeed<    ej                  e	¬«      Z
ee   ed<    ej                  e	¬«      Zeeeeedf   f      ed<   y)	ÚSeenDetailsÚnode_idr   Úvisits)Údefault_factoryÚ	ancestors.Úawaits_testsN)Ú__name__Ú
__module__Ú__qualname__r   Ú__annotations__ry   rN   ÚdataclassesÚfieldÚsetr{   r
   r|   r   © rI   r@   rw   rw   z   sa   … àÓØ€FˆCƒOØ0˜{×0Ñ0ÀÔE€Iˆs�8‰}ÓEØ?P¸{×?PÑ?PØô@€L�#�e˜H e¨H°c¨MÑ&:Ð:Ñ;Ñ<ô rI   rw   c                   óX  — e Zd Zddd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd	e	d
e
fd„Zded
e
fd„Zd
e
fd„Zd
e
ddfd„Zd
e
ddfd„Zd
e
fd„Zedej(                  d
e
deeeef      fd„«       Zedej(                  d
e
dee   dee   deeeef      f
d„«       Zd
e
defd„Zd
e
deeee	e f   f   fd„Z!y)ÚLinkerNrK   c                 ó@   — |€i }t        j                  di |¤Ž| _        y )Nr„   )ÚnxÚDiGraphÚgraph)ÚselfÚdatas     r@   Ú__init__zLinker.__init__…   s   € Øˆ<ØˆDÜ!#§¡Ñ!3¨dÑ!3ˆ�
rI   c                 ó6   — | j                   j                  «       S rd   )rŠ   Úedges©r‹   s    r@   r�   zLinker.edgesŠ   ó   € Ø�z‰z×ÑÓ!Ð!rI   c                 ó6   — | j                   j                  «       S rd   )rŠ   rO   r�   s    r@   rO   zLinker.nodes�   r‘   rI   c                 ó¤   — 	 t        j                  | j                  «      }dj                  d„ |D «       «      S # t         j                  $ r Y y w xY w)Nz --> c              3   ó&   K  — | ]	  }|d    –— Œ y­w)r   Nr„   ©Ú.0Úcs     r@   ú	<genexpr>z%Linker.find_cycles.<locals>.<genexpr>—   s   è ø€ Ò4¨  !¥Ñ4ùs   ‚)rˆ   Ú
find_cyclerŠ   r9   ÚNetworkXNoCycle)r‹   Úcycles     r@   Úfind_cycleszLinker.find_cycles�   sJ   € ð	5Ü—M‘M $§*¡*Ó-ˆEð
 —<‘<Ñ4¨eÔ4Ó4Ð4øô	 ×!Ñ!ò 	Ùð	ús   ‚9 ¹AÁAc                 ó¨   — | j                   j                  |«       | j                   j                  |«       | j                   j                  ||«       y)z$indicate that node1 depends on node2N)rŠ   Úadd_nodeÚadd_edge)r‹   Únode1Únode2s      r@   Ú
dependencyzLinker.dependency™   s:   € à�
‰
×Ñ˜EÔ"Ø�
‰
×Ñ˜EÔ"Ø�
‰
×Ñ˜E 5Õ)rI   c                 ó:   — | j                   j                  |«       y rd   )rŠ   rž   )r‹   rB   s     r@   rž   zLinker.add_nodeŸ   s   € Ø�
‰
×Ñ˜DÕ!rI   ÚoutfilerJ   c                 óP  — | j                   j                  «       }| j                   D ]6  }|j                  |«      j                  d¬«      } |j                  |fi |¤Ž Œ8 t        |d«      5 }t        j                  ||t        j                  ¬«       ddd«       y# 1 sw Y   yxY w)zŠWrite the graph to a gpickle file. Before doing so, serialize and
        include all nodes in their corresponding graph entries.
        T©Ú	omit_noneÚwb)ÚprotocolN)	rŠ   ÚcopyÚexpectÚto_dictrž   ÚopenÚpickleÚdumpÚHIGHEST_PROTOCOL)r‹   r¤   rJ   Ú	out_graphrx   rŒ   Úoutfhs          r@   Úwrite_graphzLinker.write_graph¢   s•   € ð —J‘J—O‘OÓ%ˆ	Ø—z‘zò 	0ˆGØ—?‘? 7Ó+×3Ñ3¸dÐ3ÓCˆDØˆI×Ñ˜wÑ/¨$Ó/ð	0ô �'˜4Ó ð 	L EÜ�K‰K˜	 5´6×3JÑ3JÕK÷	L÷ 	Lñ 	Lús   Á,'BÂB%rB   c                 ó  — | j                  |j                  «       |j                  D �]Y  }||j                  v r4| j	                  |j                  |j                  |   j                  «       ŒF||j
                  v r4| j	                  |j                  |j
                  |   j                  «       Œˆ||j                  v r4| j	                  |j                  |j                  |   j                  «       ŒÊ||j                  v r5| j	                  |j                  |j                  |   j                  «       �Œ||j                  v r5| j	                  |j                  |j                  |   j                  «       �ŒPt        ||«      ‚ y rd   )
rž   ro   Údepends_on_nodesrO   r¢   rS   rW   r]   Ú	functionsr!   )r‹   rB   rJ   r¢   s       r@   Ú	link_nodezLinker.link_node­   s'  € Ø�‰�d—n‘nÔ%à×/Ñ/ó 	EˆJØ˜XŸ^™^Ñ+Ø—‘ §¡°·±À
Ñ1K×1UÑ1UÕWØ˜x×/Ñ/Ñ/Ø—‘ §¡°×1AÑ1AÀ*Ñ1M×1WÑ1WÕYØ˜x×/Ñ/Ñ/Ø—‘ §¡°×1AÑ1AÀ*Ñ1M×1WÑ1WÕYØ˜x×7Ñ7Ñ7Ø—‘ §¡°×1IÑ1IÈ*Ñ1U×1_Ñ1_ÖaØ˜x×1Ñ1Ñ1Ø—‘ §¡°×1CÑ1CÀJÑ1O×1YÑ1YÖ[ä2°4¸ÓDÐDñ	ErI   c                 ó~  — |j                   j                  «       D ]  }| j                  |j                  «       Œ |j                  j                  «       D ]  }| j                  ||«       Œ |j                  j                  «       D ]  }| j                  ||«       Œ |j                  j                  «       D ]  }| j                  ||«       Œ |j                  j                  «       D ]  }| j                  ||«       Œ |j                  j                  «       D ]  }| j                  ||«       Œ |j                  j                  «       D ]  }| j                  ||«       Œ |j                  j                  «       D ]  }	| j                  |	|«       Œ | j                  «       }
|
rt        dj                  |
«      «      ‚y )NzFound a cycle: {})rS   rP   rž   ro   rO   r·   r]   rU   r¶   rW   ra   r_   rœ   ÚRuntimeErrorÚformat)r‹   rJ   ÚsourcerB   Úsemantic_modelÚexposureÚfunctionÚmetricÚ	unit_testÚsaved_queryr›   s              r@   Ú
link_graphzLinker.link_graph¾   s“  € Ø×&Ñ&×-Ñ-Ó/ò 	,ˆFØ�M‰M˜&×*Ñ*Õ+ð	,à—N‘N×)Ñ)Ó+ò 	+ˆDØ�N‰N˜4 Õ*ð	+à&×6Ñ6×=Ñ=Ó?ò 	5ˆNØ�N‰N˜>¨8Õ4ð	5à ×*Ñ*×1Ñ1Ó3ò 	/ˆHØ�N‰N˜8 XÕ.ð	/à ×*Ñ*×1Ñ1Ó3ò 	/ˆHØ�N‰N˜8 XÕ.ð	/à×&Ñ&×-Ñ-Ó/ò 	-ˆFØ�N‰N˜6 8Õ,ð	-à!×,Ñ,×3Ñ3Ó5ò 	0ˆIØ�N‰N˜9 hÕ/ð	0à#×1Ñ1×8Ñ8Ó:ò 	2ˆKØ�N‰N˜;¨Õ1ð	2ð × Ñ Ó"ˆáÜÐ2×9Ñ9¸%Ó@ÓAÐAð rI   c                 ór   — t        «       j                  s| j                  |«       y | j                  |«       y rd   )r#   ÚUSE_FAST_TEST_EDGESÚadd_test_edges_1Úadd_test_edges_2©r‹   rJ   s     r@   Úadd_test_edgeszLinker.add_test_edgesÕ   s)   € Ü‹{×.Ò.Ø×!Ñ! (Õ+à×!Ñ! (Õ+rI   c                 ó  — | j                   D ]ø  }||j                  v sŒ|j                  |   j                  t        j                  k7  sŒ=t
        j                  j                  | j                   |d¬«      }t        |D �cg c]
  }||k7  sŒ	|‘Œ c}«      }g }|D ]  }|t        ||«      z  }Œ |D ]T  }t        |j                  |   j                  «      }	|	j                  |«      sŒ7| j                   j                  ||d¬«       ŒV Œú yc c}w )zýThis method adds additional edges to the DAG. For a given non-test
        executable node, add an edge from an upstream test to the given node if
        the set of nodes the test depends on is a subset of the upstream nodes
        for the given node.T)ÚreverseÚparent_test©Ú	edge_typeN)rŠ   rO   rD   r&   rE   rˆ   Ú	traversalÚbfs_treerƒ   ru   rµ   ÚissubsetrŸ   )
r‹   rJ   rx   Úall_upstream_nodesÚnÚupstream_nodesÚupstream_testsÚupstream_nodeÚupstream_testÚtest_depends_ons
             r@   rÅ   zLinker.add_test_edges_1Û   s	  € ðr —z‘zò 	]ˆGð ˜8Ÿ>™>Ò)Ø—N‘N 7Ñ+×9Ñ9¼X¿]¹]ÓJô &(§\¡\×%:Ñ%:¸4¿:¹:ÀwÐX\Ð%:Ó%]Ð"ä!$Ð1CÖ%T¨AÀqÈGÃ|¢aÒ%TÓ!U�ð "$�Ø%3ò S�Mà"Ô&9¸(ÀMÓ&RÑR‘NðSð &4ò ]�Mô '*¨(¯.©.¸Ñ*G×*XÑ*XÓ&Y�Oð
 '×/Ñ/°Õ?ØŸ
™
×+Ñ+¨M¸7ÈmÐ+Õ\ñ]ñ%	]ùò &Us   Á?
D	
Â
D	
c                 ó‚   — | j                   }| j                  ||«      }|D ]  }|j                  |d   |d   d¬«       Œ y )Nr   rM   rË   rÌ   )rŠ   Ú_get_test_edges_2rŸ   )r‹   rJ   rŠ   Ú	new_edgesÚes        r@   rÆ   zLinker.add_test_edges_25  sH   € Ø—
‘
ˆØ×*Ñ*¨5°(Ó;ˆ	Øò 	@ˆAØ�N‰N˜1˜Q™4  1¡°ˆNÕ?ñ	@rI   rŠ   c                 ó<  — g }g }t        «       }t        «       }t        t        «      }| j                  D ]Ø  }|j                  j	                  |d «      }|€Œ"t        | j                  |«      d «      €|j                  |«       |j                  t        j                  k7  r|j                  |«       Œ}|j                  }	t        |	«      dk(  r||	d      j                  |«       Œ¯t        |	«      dkD  sŒ¾|j                  |j                  «       ŒÚ |j                  «       D ]I  \  }}
| j!                  |«      D �cg c]	  }||v sŒ|‘Œ }}|D ]  }|
D ]  }|j                  ||f«       Œ Œ ŒK t        |«      dkD  rt"        j%                  | ||||«      }||z  }|S c c}w )NrM   r   )rƒ   r   ÚlistrO   ÚgetÚnextÚpredecessorsrg   rD   r&   rE   Úaddrµ   rR   Úupdater7   Ú
successorsr†   Ú_get_multi_test_edges)rŠ   rJ   rÚ   Úsource_nodesÚexecutable_nodesÚmulti_tested_nodesÚsingle_tested_nodesrx   Úmanifest_nodeÚ	test_depsÚtest_idsÚsÚsuccsÚsucc_idÚtest_idÚmulti_test_edgess                   r@   rÙ   zLinker._get_test_edges_2;  s®  € ð  68ˆ	à')ˆÜ*-«%ÐÜ ›UÐä>IÌ$Ó>OÐØ—{‘{ò 	NˆGØ$ŸN™N×.Ñ.¨w¸Ó=ˆMØÐ$Øä�E×&Ñ& wÓ/°Ó6Ð>Ø×#Ñ# GÔ,à×*Ñ*¬h¯m©mÒ;Ø ×$Ñ$ WÕ-à)×:Ñ:�	Ü�y“> QÒ&Ø'¨	°!©Ñ5×<Ñ<¸WÕEÜ˜“^ aÓ'Ø&×-Ñ-¨m×.LÑ.LÕMð	Nð& "5×!:Ñ!:Ó!<ò 	9ÑˆG�XØ %× 0Ñ 0°Ó 9ÖS˜1¸QÐBRÒ=R’QÐSˆEÐSØ ò 9�Ø'ò 9�GØ×$Ñ$ g¨wÐ%7Õ8ñ9ñ9ð	9ô Ð!Ó" QÒ&Ü%×;Ñ;Ø�x Ð/?ÐASó Ðð Ð)Ñ)ˆIàÐùò Ts   Ä8	FÅFrå   ræ   c                 ó*  ‡— g }t        |«      }|D �ci c]  }|t        |«      “Œ }}t        |«      dkD  �rR||j                  «          }	t	        ||	j
                  «      }
|	j                  j                  «       }|
D ]O  }t        |j                  |   j                  «      }t        |«      dkD  sŒ4|j                  |t        |«      f«       ŒQ | j                  |	j
                  «      D �cg c]	  }||v sŒ|‘Œ c}D �]l  }|j                  |d «      Š‰€t        |«      Š‰||<   ‰xj                  dz  c_        ‰j                  j!                  |«       ‰j"                  j!                  |	j"                  «       |	j
                  |v r%‰j"                  j                  |	j
                  «       ‰j                  | j%                  |«      k(  sŒÏt        ‰j                  «      dkD  rut'        «       }‰j                  D ]A  }t)        ˆfd„|d   D «       «      rŒ|j                  |«       |j+                  |d   |f«       ŒC ‰j                  j-                  |«       |j/                  |«       �Œo ||	j
                  = t        |«      dkD  r�ŒR|S c c}w c c}w )Nr   rM   c              3   ó@   •K  — | ]  }|‰j                   vsŒd –— Œ y­w)TN)r{   )r–   ÚaÚsuc_detailss     €r@   r˜   z/Linker._get_multi_test_edges.<locals>.<genexpr>­  s   øè ø€ Ò&^°¸qÈ×H]ÑH]Ò?]¤tÑ&^ùs   ƒ—)r   rw   rR   Úpopru   rx   r|   rª   ÚsortedrO   rµ   rá   Útuplerã   rÞ   ry   râ   r{   Ú	in_degreerƒ   Úanyrg   Údifference_updateÚ
appendleft)rŠ   rJ   rå   ræ   rç   rÚ   Úreadyrx   ÚdetailsÚcurr_detailsrë   Únew_awaits_for_succsrï   Údepsrì   rî   ÚremovesÚawtrô   s                     @r@   rä   zLinker._get_multi_test_edgest  sd  ø€ ð0 68ˆ	Ü˜\Ó*ˆØ@LÖM°W�7œK¨Ó0Ñ0ÐMˆÐMä�%‹j˜1‹nØ(/°·	±	³Ñ(<ˆLÜ*¨8°\×5IÑ5IÓJˆHØ#/×#<Ñ#<×#AÑ#AÓ#CÐ Ø#ò E�Ü'-¨h¯n©n¸WÑ.E×.VÑ.VÓ'W�Ü�t“9˜q“=à(×,Ñ,¨g´u¸T³{Ð-CÕDð	Eð !×+Ñ+¨L×,@Ñ,@ÓAöØÀQÐJZÒEZ’òó .�ð &Ÿk™k¨'°4Ó8�ØÐ&Ü"-¨gÓ"6�KØ'2�G˜GÑ$Ø×"Ò" aÑ'Õ"Ø×(Ñ(×/Ñ/Ð0DÔEØ×%Ñ%×,Ñ,¨\×-CÑ-CÔDØ×'Ñ'Ð+=Ñ=ð  ×)Ñ)×-Ñ-¨l×.BÑ.BÔCà×%Ñ%¨¯©¸Ó)AÓAÜ˜;×3Ñ3Ó4°qÒ8Ü"%£%˜Ø#.×#;Ñ#;ò D˜CÜ#&Ó&^°S¸±VÔ&^Õ#^Ø '§¡¨CÔ 0Ø )× 0Ñ 0°#°a±&¸'Ð1BÕ CðDð
 $×0Ñ0×BÑBÀ7ÔKØ×$Ñ$ WÖ-ð1.ð8 ˜×,Ñ,Ð-ôM �%‹j˜1ŒnðP ÐùòU Nùòs   “JÃ+	JÃ5Jc                 óN   — | j                  |«       t        | j                  «      S rd   )rÂ   r$   rŠ   rÇ   s     r@   Ú	get_graphzLinker.get_graphº  s   € Ø�‰˜Ô!Ü�T—Z‘ZÓ Ð rI   c                 óÔ  — t        «       }t        «       }t        | j                  «      D ]6  \  }}|||<   |j                  |«      j	                  d¬«      }||d   dœ||<   Œ8 |j                  «       D ]h  \  }}| j                  j                  |d   «      D �cg c]  }||   ‘Œ	 }	}|	sŒ7| j                  j                  |d   «      D �cg c]  }||   ‘Œ	 c}|d<   Œj |S c c}w c c}w )a  Create a smaller summary of the graph, suitable for basic diagnostics
        and performance tuning. The summary includes only the edge structure,
        node types, and node names. Each of the n nodes is assigned an integer
        index 0, 1, 2,..., n-1 for compactnessTr¦   rD   )ÚnameÚtyper  Úsucc)ÚdictÚ	enumeraterŠ   r«   r¬   r7   rã   )
r‹   rJ   Úgraph_nodesÚ
index_dictÚ
node_indexÚ	node_namerŒ   rB   rÒ   rã   s
             r@   Úget_graph_summaryzLinker.get_graph_summary¾  sö   € ô
 “fˆÜ“Vˆ
Ü%.¨t¯z©zÓ%:ò 	YÑ!ˆJ˜	Ø$.ˆJ�yÑ!Ø—?‘? 9Ó-×5Ñ5ÀÐ5ÓEˆDØ/8À$ÀÑBWÑ&XˆK˜
Ò#ð	Yð
 !,× 1Ñ 1Ó 3ò 	\ÑˆJ˜Ø15·±×1FÑ1FÀtÈFÁ|Ó1TÖU¨A˜* Q›-ÐUˆJÐUÚØ7;·z±z×7LÑ7LÈTÐRXÉ\Ó7ZÖ[°! 
¨1£Ò[��V’ð	\ð
 Ðùò	 Vùâ[s   ÂC Ã
C%rd   ©rK   N)"r}   r~   r   r�   r�   rO   rœ   r¢   rž   Ústrr   r³   r   r·   rÂ   rÈ   rÅ   rÆ   Ústaticmethodrˆ   r‰   r   r   r   rÙ   r
   r   rä   r$   r  r   rN   r   r  r„   rI   r@   r†   r†   „   ss  „ ô4ò
"ò"ò5ò*ò"ð	L 3ð 	L°(ó 	LðE˜oð E¸ó Eð"B 8ó Bð., xð ,°Dó ,ðX]¨ð X]°dó X]ðt@¨ó @ð ð6Ø�z‰zð6Ø%-ð6à	�%˜ (Ð*Ñ+Ñ	,ò6ó ð6ðp ðCØ�z‰zðCàðCð ˜xÑ(ðCð ˜h™-ð	Cð 
ˆe�H˜hÐ&Ñ'Ñ	(òCó ðCðJ! (ð !¨uó !ð¨(ð °t¸CÀÀcÈ3ÀhÁÐ<OÑ7Pô rI   r†   c                   óL  — e Zd Zdd„Zd„ Zdededeee	f   deee	f   fd„Z
d	efd
„Zdededeeee	f      deeee   f   fd„Z	 ddededeeee	f      defd„Zdedededefd„Zddedefd„Zdedefd„Z	 ddedee   defd„Z	 	 	 ddededeeee	f      dedee   defd„Zy)ÚCompilerrK   Nc                 ó   — || _         y rd   )rF   )r‹   rF   s     r@   r�   zCompiler.__init__Ó  s	   € Øˆ�rI   c                 óB   — t        | j                  j                  «       y rd   )r'   rF   Úproject_target_pathr�   s    r@   Ú
initializezCompiler.initializeÖ  s   € Ü�t—{‘{×6Ñ6Õ7rI   rB   rJ   Úextra_contextc                 óò   — t        |t        «      rt        || j                  |«      }nt	        || j                  |«      }|j                  |«       t        |t        «      rt        j                  ||«       |S rd   )	Ú
isinstancer   r   rF   r   râ   r   r   Úadd_rendered_test_kwargs)r‹   rB   rJ   r  Úcontexts        r@   Ú_create_node_contextzCompiler._create_node_contextÛ  s]   € ô �dœLÔ)Ü8¸¸t¿{¹{ÈHÓU‰Gä4°T¸4¿;¹;ÈÓQˆGØ�‰�}Ô%ä�dœOÔ,ä×*Ñ*¨7°DÔ9àˆrI   r  c                 óf   — t        | j                  «      }|j                  }|j                  |«      S rd   )r   rF   ÚRelationÚadd_ephemeral_prefix)r‹   r  ÚadapterÚrelation_clss       r@   r!  zCompiler.add_ephemeral_prefixí  s,   € Ü˜dŸk™kÓ*ˆØ×'Ñ'ˆØ×0Ñ0°Ó6Ð6rI   Úmodelc                 óÂ  — |j                   €t        d|«      ‚t        | j                  j                  dd«      s|g fS |j
                  r||j                  fS t        |j                  «      dk(  rt        |t        «      sd|_        |g fS g }|j                  D �]n  }|j                  |j                  vrt        d|j                  › �«      ‚|j                  |j                     }t        |t        «      rJ ‚|j                  st        |j                  › d�«      ‚|j                  du r|j
                  du r|j                  }n:| j                  |||«      }| j!                  |||«      \  }}| j#                  |«       t%        ||«       t        |t&        «      r|j(                  n|j*                  }| j-                  |«      }	|j.                  xs |j                   }
d|	› d|
› d	�}t1        |t3        |j                  |¬
«      «       �Œq |j
                  s<t5        |j                   |«      }d|_        |j                   |_        ||_         ||_        ||j                  fS )am  This method is called by the 'compile_node' method. Starting
        from the node that it is passed in, it will recursively call
        itself using the 'extra_ctes'.  The 'ephemeral' models do
        not produce SQL that is executed directly, instead they
        are rolled up into the models that refer to them by
        inserting CTEs into the SQL.
        z*Cannot inject ctes into an uncompiled nodeÚinject_ephemeral_ctesTr   zFDuring compilation, found a cte reference that could not be resolved: z is not ephemeralr2   z as (
z
))re   rf   )Úcompiled_coder   ÚgetattrrF   ÚargsÚextra_ctes_injectedÚ
extra_ctesrR   r  r   re   rO   r   Úis_ephemeral_modelÚcompiledÚ_compile_codeÚ_recursively_prepend_ctesÚ_write_nodern   r   Úcte_nameÚ
identifierr!  Ú_pre_injected_sqlrk   r   Úinject_ctes_into_sql)r‹   r$  rJ   r  rh   rj   Ú	cte_modelrm   r1  Únew_cte_nameÚrendered_sqlrf   Úinjected_sqls                r@   r/  z"Compiler._recursively_prepend_ctesò  so  € ð ×ÑÐ&Ü!Ð"NÐPUÓVÐVô �t—{‘{×'Ñ'Ð)@À$ÔGØ˜2�;Ðð ×$Ò$Ø˜5×+Ñ+Ð,Ð,ô ˆu×ÑÓ  AÒ%ä˜e¤XÔ.Ø,0�Ô)Ø˜2�;Ðð -/ˆð ×#Ñ#ó )	PˆCØ�v‰v˜XŸ^™^Ñ+Ü&ð.Ø.1¯f©f¨Xð7óð ð !Ÿ™ s§v¡vÑ.ˆIÜ! )¬XÔ6Ð6Ð6à×/Ò/Ü&¨#¯&©&¨Ð1BÐ'CÓDÐDð
 ×!Ñ! TÑ)¨i×.KÑ.KÈtÑ.SØ%.×%9Ñ%9Ñ"ð !×.Ñ.¨y¸(ÀMÓR�	à04×0NÑ0NØ˜x¨ó1Ñ-�	Ð-ð × Ñ  Ô+ä" >Ð3EÔFô ˜iÔ)AÔBð ×"Ò"à×)Ñ)ð ð
  ×4Ñ4°XÓ>ˆLØ$×6Ñ6ÒQ¸)×:QÑ:QˆLØ�l�^ 7¨<¨.¸Ð<ˆCä˜~¬{¸c¿f¹fÈ#Ô/NÖOðS)	PðX ×(Ò(Ü/Ø×#Ñ#ØóˆLð )-ˆEÔ%Ø&+×&9Ñ&9ˆEÔ#Ø".ˆEÔØ-ˆEÔð �e×&Ñ&Ð&Ð&rI   c                 ód  — |€i }|j                   t        j                  k(  r^|j                  t        j
                  k(  rA| j                  |||«      }t        j                  d||«      }|j                  › d|› �|_
        n9| j                  |||«      }t        j                  |j                  ||«      |_
        d|_        |j                  t        j                  k(  re|j                  €Y|j                  rMt        | j                   «      }|j"                  }t%        |j'                  | j                   |«      «      }||_        t)        |t*        «      r^|j,                  D ]O  }	|	j.                  t0        j2                  k(  sŒ!|	j4                  sŒ.| j7                  |||	j4                  «      |	_        ŒQ |S )Nz{{ py_script_postfix(model) }}z

T)Úlanguager%   ÚpythonrD   r&   ÚModelr  r   Úget_renderedÚraw_coder'  r-  rE   Úrelation_nameÚis_relationalr   rF   r   r  Úcreate_fromr  r   Úall_constraintsr  r(   Úforeign_keyÚtoÚ/_compile_relation_for_foreign_key_constraint_to)
r‹   rB   rJ   r  r  Úpostfixr"  r#  r?  Ú
constraints
             r@   r.  zCompiler._compile_codeW  sy  € ð Ð ØˆMà�=‰=œM×0Ñ0Ò0°T×5GÑ5GÌ8Ï>É>Ò5YØ×/Ñ/°°hÀÓNˆGä×(Ñ(Ø0ØØóˆGð %)§M¡M ?°$°w°iÐ!@ˆDÕð ×/Ñ/°°hÀÓNˆGÜ!&×!3Ñ!3Ø—‘ØØó"ˆDÔð ˆŒð
 ×Ñ¤(§-¡-Ò/Ø×"Ñ"Ð*Ø×"Ò"ä! $§+¡+Ó.ˆGØ"×+Ñ+ˆLÜ × 8Ñ 8¸¿¹ÀdÓ KÓLˆMØ!.ˆDÔô �dœIÔ&Ø"×2Ñ2ò �
Ø—?‘?¤n×&@Ñ&@Ó@ÀZÇ]Ã]Ø$(×$XÑ$XØ  $¨
¯©ó%�J•Mðð ˆrI   Úto_expressionc                 óÞ  — 	 |j                  |«      }|st        ||«      ‚t	        | j
                  «      }t        |d«      re|j                  rY| j
                  j                  j                  r9t        |j                  j                  | j
                  |j                  «      «      S t        |j                  j                  | j
                  |«      «      S # t        $ r t        ||«      ‚w xY w)NÚdefer_relation)Úfind_node_from_ref_or_sourcer"   r    r!   r   rF   ÚhasattrrJ  r)  Údeferr  r   rA  )r‹   rJ   rB   rH  Úforeign_key_noder"  s         r@   rE  z8Compiler._compile_relation_for_foreign_key_constraint_to‹  sÏ   € ð	IØ'×DÑDÀ]ÓSÐñ  Ü.¨t°]ÓCÐCä˜dŸk™kÓ*ˆô Ð$Ð&6Ô7Ø ×/Ò/Ø—‘× Ñ ×&Ò&ä�w×'Ñ'×3Ñ3°D·K±KÐAQ×A`ÑA`ÓaÓbÐbä�w×'Ñ'×3Ñ3°D·K±KÐAQÓRÓSÐSøô ò 	IÜ3°D¸-ÓHÐHð	Iús   ‚C ÃC,c                 óB  — | j                  «        t        «       }|j                  |«       t        «       }t	        «       |d<   |j                  |«      |d<   |r5|j                  «        |j                  |«       |j                  |«      |d<   t        t        j                  j                  | j                  j                  d«      d«      5 }	 |j                  t        j                   |«      «       d d d «       t)        |«      }|r| j+                  ||«       | j                  j,                  j.                  dk7  rt)        |«      }t1        |«       t3        |j4                  «      S # t"        $ r"}t%        t'        d|› �¬«      «       Y d }~Œ›d }~ww xY w# 1 sw Y   Œ¤xY w)	NÚ_invocation_idÚlinkedÚwith_test_edgeszgraph_summary.jsonÚwz@An error was encountered writing the graph summary information: )ÚmsgrÝ   )r  r†   rÂ   r	  r-   r  Úbuild_parent_and_child_mapsrÈ   r­   ÚosÚpathr9   rF   r  ÚwriteÚjsonÚdumpsÚ	Exceptionr+   r,   rb   Úwrite_graph_filer)  ÚwhichrA   r$   rŠ   )	r‹   rJ   rX  rÈ   ÚlinkerÚ	summariesÚ
out_streamrÛ   r.   s	            r@   ÚcompilezCompiler.compile¤  sm  € Ø�‰ÔÜ“ˆØ×Ñ˜(Ô#ô ›&ˆ	Ü&7Ó&9ˆ	Ð"Ñ#Ø$×6Ñ6°xÓ@ˆ	�(Ññ Ø×0Ñ0Ô2Ø×!Ñ! (Ô+ð ,2×+CÑ+CÀHÓ+MˆIÐ'Ñ(äÜ�G‰G�L‰L˜Ÿ™×8Ñ8Ð:NÓOÐQTó
ð 
	àðØ× Ñ ¤§¡¨IÓ!6Ô7÷	
	ô   Ó)ˆáØ×!Ñ! &¨(Ô3ð �;‰;×Ñ×!Ñ! VÒ+Ü# HÓ-ˆEÜ Ô&ä�V—\‘\Ó"Ð"øô# ò ÜÜØ^Ð_`Ð^aÐbô÷ñ ûðú÷
	ð 
	ús0   ÃFÃ$E'Å'	FÅ0FÆFÆFÆFÆFr^  c                 óÊ   — t         }t        j                  j                  | j                  j
                  |«      }t        «       }|j                  r|j                  ||«       y y rd   )	Úgraph_file_namerV  rW  r9   rF   r  r#   Ú
WRITE_JSONr³   )r‹   r^  rJ   ÚfilenameÚ
graph_pathÚflagss         r@   r\  zCompiler.write_graph_fileÐ  sJ   € Ü"ˆÜ—W‘W—\‘\ $§+¡+×"AÑ"AÀ8ÓLˆ
Ü“ˆØ×ÒØ×Ñ˜z¨8Õ4ð rI   Úsplit_suffixc                 óš  — |j                   r,|j                  t        j                  t        j                  fv r|S t        t        t        «       ¬«      «       |j                  rg|j                  | j                  j                  d|«      |_        |j                  | j                  j                  |j                  |j                  «       |S )N)Ú	node_infor-  )r*  rD   r&   ÚSnapshotÚSeedr+   r   r)   r'  Úget_target_write_pathrF   Útarget_pathÚcompiled_pathÚ
write_nodeÚproject_root)r‹   rB   rh  s      r@   r0  zCompiler._write_nodeØ  s¡   € ð ×'Ò'¨4×+=Ñ+=Ü×ÑÜ�M‰MðB
ñ ,
ð ˆKÜÔ,´}³ÔGÔHà×ÒØ!%×!;Ñ!;Ø—‘×'Ñ'¨°\ó"ˆDÔð �O‰O˜DŸK™K×4Ñ4°d×6HÑ6HÈ$×J\ÑJ\Ô]ØˆrI   rX  c                 óê   — t        |t        «      r|S ddlm} t	        |d«      r|j                  «        | j                  |||«      }| j                  |||«      \  }}|r| j                  ||¬«       |S )a5  This is the main entry point into this code. It's called by
        CompileRunner.compile, GenericRPCRunner.compile, and
        RunTask.get_hook_sql. It calls '_compile_code' to render
        the node's raw_code into compiled_code, and then calls the
        recursive method to "prepend" the ctes.
        r   )ÚLexerÚget_default_instance)rh  )	r  r   Úsqlparse.lexerrs  rL  rt  r.  r/  r0  )r‹   rB   rJ   r  rX  rh  rs  r1   s           r@   Úcompile_nodezCompiler.compile_nodeé  sw   € ô  �dÔ.Ô/ØˆKõ 	)ä�5Ð0Ô1Ø×&Ñ&Ô(à×!Ñ! $¨°-Ó@ˆà×0Ñ0°°xÀÓO‰ˆˆaÙØ×Ñ˜T°ÐÔ=ØˆrI   r  rd   )TF)NTN)r}   r~   r   r�   r  r   r   r   r  r   r  r!  r	   r   r   r   r/  r.  rE  r$   ra  r†   r\  r0  Úboolrv  r„   rI   r@   r  r  Ò  s²  „ óò8ð
àðð ðð ˜C ˜H‘~ð	ð
 
ˆc�3ˆh‰óð$7¨ó 7ð
_'àð_'ð ð_'ð    S¨# X¡Ñ/ð	_'ð
 
ˆ  [Ñ 1Ð1Ñ	2ó_'ðR 37ñ	2àð2ð ð2ð    S¨# X¡Ñ/ð	2ð
 
ó2ðhTØ ðTØ(7ðTØHKðTà	óTñ2*# ð *#Èuó *#ðX5 vð 5¸ó 5ð DHñØ#ðØ3;¸C±=ðà	óð* 37ØØ&*ñàðð ðð    S¨# X¡Ñ/ð	ð
 ðð ˜s‘mðð 
ôrI   r  rf   Úctesc                 ó"  — t        |«      dk(  r| S t        j                  | «      }|d   }d}|j                  D ]R  }|j                  r|j
                  dk(  r|}Œ!|j                  r|j
                  dk(  r|�|} n|j                  rŒO|€ŒR n |€Ê|j                  «       }t        j                  j                  t        j                  j                  d«      }|j                  ||«       dj                  d„ |D «       «      dz   }t        j                  j                  t        j                  j                  |«      }	|j                  ||	«       t        |«      S dj                  d	„ |D «       «      }t        j                  j                  t        j                  j                  |«      }	|j                  ||	«       t        j                  j                  t        j                  j                  d«      }
|j                  |	|
«       t        |«      S )
aï  
    `ctes` is a list of InjectedCTEs like:

        [
            InjectedCTE(
                id="cte_id_1",
                sql="__dbt__cte__ephemeral as (select * from table)",
            ),
            InjectedCTE(
                id="cte_id_2",
                sql="__dbt__cte__events as (select id, type from events)",
            ),
        ]

    Given `sql` like:

      "with internal_cte as (select * from sessions)
       select * from internal_cte"

    This will spit out:

      "with __dbt__cte__ephemeral as (select * from table),
            __dbt__cte__events as (select id, type from events),
            internal_cte as (select * from sessions)
       select * from internal_cte"

    (Whitespace enhanced for readability.)
    r   NÚWITHÚ	RECURSIVEÚwithr0   c              3   ó4   K  — | ]  }|j                   –— Œ y ­wrd   ©rf   r•   s     r@   r˜   z'inject_ctes_into_sql.<locals>.<genexpr>>  ó   è ø€ Ò!6¨A !§%¥%Ñ!6ùó   ‚r2   c              3   ó4   K  — | ]  }|j                   –— Œ y ­wrd   r~  r•   s     r@   r˜   z'inject_ctes_into_sql.<locals>.<genexpr>F  r  r€  )rR   ÚsqlparseÚparseÚtokensÚ
is_keywordÚ
normalizedÚis_whitespaceÚtoken_firstrf   ÚTokenÚKeywordÚinsert_beforer9   Úinsert_afterÚPunctuationr  )rf   rx  Úparsed_stmtsÚparsedÚ	with_stmtÚtokenÚfirst_tokenÚ
with_tokenÚinjected_ctesÚinjected_ctes_tokenÚcomma_tokens              r@   r4  r4  
  s¶  € ô: ˆ4ƒy�A‚~Øˆ
ä—>‘> #Ó&€LØ˜!‰_€Fà€IØ—‘ò ˆØ×Ò × 0Ñ 0°FÒ :Ø‰IØ×Ò %×"2Ñ"2°kÒ"AÀiÐF[ØˆIÙØ×$Ó$¨Ñ)>Ùðð Ðð ×(Ñ(Ó*ˆÜ—\‘\×'Ñ'¬¯©×(?Ñ(?ÀÓHˆ
Ø×Ñ˜[¨*Ô5àŸ	™	Ñ!6°Ô!6Ó6¸Ñ<ˆÜ&Ÿl™l×0Ñ0´·±×1HÑ1HÈ-ÓXÐØ×Ñ˜JÐ(;Ô<ô ˆv‹;Ðð Ÿ	™	Ñ!6°Ô!6Ó6ˆÜ&Ÿl™l×0Ñ0´·±×1HÑ1HÈ-ÓXÐØ×Ñ˜IÐ':Ô;ä—l‘l×(Ñ(¬¯©×)DÑ)DÀdÓKˆØ×ÑÐ/°Ô=ô ˆv‹;ÐrI   )Ur�   rY  rV  r®   Úcollectionsr   r   Útypingr   r   r   r   r	   r
   r   Únetworkxrˆ   r‚  Údbt.trackingr4   Údbt.adapters.factoryr   Údbt.clientsr   Údbt.context.providersr   r   Údbt.contracts.graph.manifestr   r   Údbt.contracts.graph.nodesr   r   r   r   r   r   r   r   r   r   Údbt.events.typesr   r   Údbt.exceptionsr   r   r    r!   r"   Ú	dbt.flagsr#   Ú	dbt.graphr$   Údbt.node_typesr%   r&   Údbt_common.clients.systemr'   Ú dbt_common.contracts.constraintsr(   Údbt_common.events.contextvarsr)   Údbt_common.events.formatr*   Údbt_common.events.functionsr+   Údbt_common.events.typesr,   Údbt_common.invocationr-   rc  rN   rA   rH   rb   rk   rn   ru   Ú	dataclassrw   r†   r  r  r4  r„   rI   r@   ú<module>r­     s;  ðÛ Û Û 	Û ß *ß B× BÑ Bã Û ã Ý ,Ý ÷÷ <÷÷ ÷ ÷ C÷õ õ  Ý ß 2Ý 4Ý ;Ý 7Ý .Ý 2Ý (Ý 3à!€ð
0˜t H¨c MÑ2ó 
0ð˜ó ð˜hð ¨4°¸#°Ñ+>ó ò*'ò4ð

 (ð 
°xð 
ÀDÈÁNó 
ð ×Ñ÷ð ó ð÷Kñ K÷\
uñ uðp	D˜cð D¨¨kÑ):ð D¸sô DrI   