gdZddlmZddlmZddlmZddlmZddlmZddlmZ dd l m Z dd l m Z dd l m Z d dlmZd d lmZd dlmZGddZGddeZGddeZGddeZGddeZe ee ee eiZy)zRelationship dependencies. ) annotations) attributes)exc)sync) unitofwork)util) MANYTOMANY) MANYTOONE) ONETOMANY)sqlc~eZdZdZedZdZdZdZdZ dZ dZ d Z d Z d Zd Zd ZdZddZdZdZy)DependencyProcessorc||_|j|_|j|_|j|_|j|_|j |_|j |_|j|_|j|_|j|_ |jrtj|_ ntj|_ |jrtj|_ntj|_|jjd|j |_|j |_|jj$s"t'j(d|jzy)N_z|Can't build a DependencyProcessor for relationship %s. No target attributes to populate between parent and child are present)propcascademapperparent secondary direction post_updatepassive_deletespassive_updatesenable_typechecksrPASSIVE_NO_INITIALIZE_passive_delete_flag PASSIVE_OFF_passive_update_flag _sort_keykeysort_keysynchronize_pairssa_exc ArgumentError)selfrs J/opt/hc_python/lib64/python3.12/site-packages/sqlalchemy/orm/dependency.py__init__zDependencyProcessor.__init__s || kk kk ++#33#33!%!7!7   (2(H(HD %(2(>(>D %   (2(H(HD %(2(>(>D %#';;#8#8$((C 88yy**&&$&*ii0 +c2t|j|SN)_direction_to_processorr)clsrs r(from_relationshipz%DependencyProcessor.from_relationship;s&t~~6t<tj||jj} dx} }| |jvrd} |D]Z}|j|jjj||j|r |jnt j"}|sa|r1tj$||d|} rGtj&||} n0tj$||d|} rtj(||} | rsg} |D]l\}}||j*vrd}nE|j*|\}}|rtj&||df}ntj(||df}| j-|n D]\}}|j/|| | |||]y)zestablish actions and dependencies related to a flush. These actions will operate on all relevant states individually. This occurs only if there are cycles in the 'aggregated' version of events. TFN)NN)rr?rr>r@r=disabledcyclesr base_mappermanagerr"implget_all_pendingdictrrr ProcessState DeleteStateSaveUpdateStatestatesappendper_state_dependencies)r'r9rTisdeletechild_base_mapperrErGrCrB child_actionschild_in_cyclesrDrFparent_in_cyclesr5sum_ child_statechild child_actiondeletedlistonly childisdeletes r(per_state_flush_actionsz+DependencyProcessor.per_state_flush_actionsls!KK;; ..s4EF ",,S2CD &11#tT4HM%)M "#..sD%FJ"&J  cjj ( ! 2 22*51M43HIM#O"O%33T[[,,L.2 1N]szz)#' '11#t{{7N7NON(, ,L:+#' E==*//??  --#99 D * 7 7T4 O #%/%;%;C%GN'44S$uM ##-#=#=c5#IL " *.&K"#**4'3 .1jj.E+(" * 6 6sK H $,L !+ : :3 L %,L"((6+/&0=+ m++ " !! 0=_r*cyNFr' uowcommitrTs r(presort_deletesz#DependencyProcessor.presort_deletesr*cyrerfrgs r( presort_savesz!DependencyProcessor.presort_savesrjr*cyr,rfrgs r(process_deletesz#DependencyProcessor.process_deletes r*cyr,rfrgs r( process_savesz!DependencyProcessor.process_savesror*c|r |jr"tjtjz}nD|jt urtj }n!tjtjz}|D]4}|j||j|}|s#|jr4y|xr1|jj xr|j|jvS)NT)rrrINCLUDE_PENDING_MUTATIONSrr PASSIVE_NO_FETCH_RELATEDrget_attribute_historyr"emptyr_is_self_referentialrmappers)r'rhrTrWpassiveshistorys r(prop_has_changesz$DependencyProcessor.prop_has_changess4//00667 ^^y ( !99G&&)M)MM A 55a7KGw}} 5 6665KK9#4#44 r*c.|jjr$|"tjd|j||jj ||j s|jj |drOtjd|j|j|jj|jdztjd|j|j|jjdzyy)Nz+Can't flush None value found in collection )allow_subtypesTaEAttempting to flush an item of type %(x)s as a member of collection "%(y)s". Expected an object of type %(z)s or a polymorphic subclass of this type. If %(x)s is a subclass of %(z)s, configure mapper "%(zm)s" to load this subtype polymorphically, or set enable_typechecks=False to allow any subtype to be accepted for flush. )xyzzmzAttempting to flush an item of type %(x)s as a member of collection "%(y)s". Expected an object of type %(z)s or a polymorphic subclass of this type.)rrr)ruselistr FlushErrorr_canloadrclass_r4s r(_verify_canloadz#DependencyProcessor._verify_canload s 99  ..#'99/  t{{';'; d&<&<"<(<( {{##E$#?nn=#\\!YY![[//"kk $nn! #\\!YY![[//   -( r*ctr,NotImplementedError)r'r5r^associationrow clearkeysrhs r( _synchronizez DependencyProcessor._synchronize3 !##r*c |jjsytt|jg|jjDcgc]}|jc}z}|j d|ft Scc}w)N reverse_key)r_reverse_propertytuplesortedr"memoset)r'r9p process_keys r(_get_reversed_processed_setz/DependencyProcessor._get_reversed_processed_set6slyy** DHH: 0K0K L0K10K LL M xx 4c::!MsA>c |D]A}|r||j||jjDcgc]\}}| c}}yycc}}wr,)register_post_updaterr$)r'r5rhrelated is_m2o_deleterlrs r( _post_updatez DependencyProcessor._post_update?sPA AM..$))*E*EF*E$!QA*EF Gs Actr,rr'rhr5s r( _pks_changedz DependencyProcessor._pks_changedGrr*cN|jjd|jdS)N()) __class____name__r)r's r(__repr__zDependencyProcessor.__repr__Js>>22DII>>r*N)F)r __module__ __qualname__r) classmethodr/r3r:rHrcrirlrnrqr|rrrrrrrfr*r(rrsk:==M. 8pd  @'R$;$?r*rc<eZdZdZdZdZdZdZdZdZ dZ y ) OneToManyDPc |jrtj||jjd}tj||jjd} |j j ||f||f||f|| f| |f| |fgy|j j ||f||f||f||f||f||f||fgyr<rr PostUpdateAllrr? dependenciesupdate) r'r9rDrErFrGrBrCchild_post_updateschild_pre_updatess r(rAz%OneToManyDP.per_property_dependenciesOs   !+!9!9T[[44e" !+ 8 8T[[44d!     # # *-!:.!34"$56&7& 6      # #!:.-/ .1"N3"K0"M2 r*c z|jrtj||jjd} tj||jjd} |sI|r"|j j ||f|| fgy|j j ||f||f|| fgy|r"|j j || f| |fgy|j j || f| |fgy|s%|j j ||f||f||fgy|j j ||f||fgyr<r) r'r9 save_parent delete_parentr_rBrCrWrbrrs r(rVz"OneToManyDP.per_state_dependenciesxsr   !+!9!9T[[44e" !+ 8 8T[[44d!   $$++):6');<$$++(*5):6');<!$$++*,=>. >$$++*,=>. >     # # *-. ,/     # #.}0MN r*c|jj xr|jdk( }|D]}|j||j|j }|s-|j D]T}||j|dus|jjr|j|dD|j|V|s|jD]#}||j|d|j%y)NallFTrWdelete operationr) rrrrur"rr`r3 delete_orphanregister_object unchangedrr'rhrTshould_null_fksr5r{r^s r(rizOneToManyDP.presort_deletess  ## # ID,@,@E,I(I E55txx!:!:G$__E(T^^E-Be-K<<55%55ed5K%55e< -#!(!2!2 ,%55 % 6"3r*c 2|jd|ft}|jj xr|jdk( }|D]}|j ||}|r |j r"tjtjz}n!tjtjz}|j||j|}|r|jD]$} | |j| dd|j&|j!|j|j"D]} |jjs#|s|j| dd|j<|j%| dusP|j| dd|j|j&j)d| D]\} } } } |j| d |s|s|j*D]/} | |j| d|j d |j 1y) Nchildren_addedrTadd) cancel_deleterrFrrWrrrz pk changer)rrrrrrrrrrsrrur"addedrrrr`r3rcascade_iteratorr)r'rhrTrrr5 pks_changedryr{r^cmst_dct_s r(rlzOneToManyDP.presort_savess")94(@#F ** * 2((E11  E++Iu=K$"6"644 ::; ** ::;  55eTXXwOG$]]E(!11!*.&+!% 2+%%gmm4$__E<<55*%55 %).*2%)YY 6 .%7!11!%)&.!% 2 04{{/K/K$e0OAq#t&55cD5I0!-*!(!2!2 ,%55 % % $ 4 4*5%)YY 6"3er*c |js|jdk(s7|jd|ft}|D]}|j ||j |j }|s.|jD]S}||j|dus|j||dd|d|js=|s@|j|||gU|js|jjrt|jj|D]?}||j||dd|d|js)|s,|j|||gAyy)NrrFT)rrrrrur"rr`r3rrrrr difference)r'rhrTrr5r{r^s r(rnzOneToManyDP.process_deletessH   4#7#75#@&^^-=t,DcJN#99488T%>%>!(!- $u 5 > -- %udD)U $//E $ 1 1%UG L"1''t||/B/B%():):%;%F%F*&E %0 $ 1 1$)5$i!"$(#3#3$($5$5(-y5'%&&# $Ar*c t|jj xr|jdk( }|D] }|j||jt j }|s2|jD]<}|j||dd|d||js)|j|||g>|jD]D}|s|jjr|j|r/|j||dd|dF|j||s|jD]}|j||dd|d y)NrFT)rrrrur"rrrrrrr`r3rrrs r(rqzOneToManyDP.process_savesDs0 ** * 2((E11  E55txx!A!AG$]]E%%udE9e(T-=-=))%UGD +%__E' $ : : $u 5))!5$i -$$Y6!(!2!2))!5$y$"3/r*c |}|}|j|||js|j|ry|r6tj||j |j jytj||j||j |j j||jxr|yr,) rr is_deletedrclearrrr$populaterr) r'r5r^rrrhrsourcedests r(rzOneToManyDP._synchronizefs U# <  Y%9%9$%?   JJtT[[$))*E*E F MM   ++$$4 r*cntj|||j|jjSr,rsource_modifiedrrr$rs r(rzOneToManyDP._pks_changed},## udkk499+F+F  r*N) rrrrArVrirlrnrqrrrfr*r(rrNs0'R?B6BH%&X D. r*rc@eZdZdZdZdZdZdZdZdZ d d Z y) ManyToOneDPctj|||jjD]&}|jj t |(yr,)rr)rself_and_descendants_dependency_processorsrUDetectKeySwitch)r'rrs r(r)zManyToOneDP.__init__s?$$T40kk66F  ) ) 0 01F G7r*c x|jrtj||jjd}tj||jjd} |j j ||f||f||f|| f|| f| |f| |fgy|j j ||f||f||f||fgyr<rrrrr?rr) r'r9rDrErFrGrBrCparent_post_updatesparent_pre_updatess r(rAz%ManyToOneDP.per_property_dependenciess   ",":":T[[44e# ",!9!9T[[44d"     # # *-!:.!45!34"$67'7'8     # # *-.!=1#]3  r*c t|jr|sttj||jjd} |r"|j j || f| |fgy|j j ||f||f|| fgytj||jjd} |j j || f| |f| |fgy|sC|s"|j j ||f||fgy|j j ||fgy|r|j j ||fgyyr<r) r'r9rrr_rBrCrWrbrrs r(rVz"ManyToOneDP.per_state_dependenciess_   &0&>&>88%'#!$$++')<=0,?$$++(*5):6')<=&0%=%=88$&"  ''&(:;+];+\:   ''"J/*k1JK  ''*k)B(CD  ''-)F(GHr*c|jjs|jjr|D]}|j||j|j }|s-|jjr|j }n|j}|D]_}||j|dd|j|jjd|}|D]\}} } } |j| dayy)NTrrr) rrrrur"rsum non_deletedrrrr) r'rhrTr5r{todeleter^trrrrs r(rizManyToOneDP.presort_deletess <<  $,,"<"<#99488T%>%>||11#*;;=#*#6#6#8!) =$!11!%)&.!% 2 !KK885I/0OAq#t%55cD5I01"* #=r*c|D]}|j|d|j|jjs8|j ||j |j }|sb|jD]p}|j|dus|j|dd|j|jjd|}|D]\}}} } |j| dry)NrrFTrrr) rrrrrur"rr`r3rr) r'rhrTr5r{r^rrrrrs r(rlzManyToOneDP.presort_savessE  % %eu499 % M||))#99488T%>%>!(>>%0E9%55 %)-*2%)YY 6!% < z=DetectKeySwitch.per_property_preprocessors..us ;(( ;s)rrrr7r8s r(r:z*DetectKeySwitch.per_property_preprocessorspsO 99 & &## $ ; ; !!$.r*ctj||jj}tj||dd}|j j ||fgyre)rr>rrLr=rr)r'r9rDrBs r(rHz*DetectKeySwitch.per_property_flush_actions}sP!//T[[5L5LM **3eUC  , !; <=r*cyr,rf)r'r9rTrWs r(rcz'DetectKeySwitch.per_state_flush_actionsror*cyr,rfrgs r(rizDetectKeySwitch.presort_deletesror*cB|js|j||yyr,r_process_key_switches)r'r9rTs r(rlzDetectKeySwitch.presort_savess"##  & &vs 3$r*cZ|s)|jr|j||}t|Syre)r_key_switchersbool)r'r9rTrWds r(r|z DetectKeySwitch.prop_has_changess+D00##C0A7Nr*cJr,rfrgs r(rnzDetectKeySwitch.process_deletessur*cD|jsJ|j||yr,rrgs r(rqzDetectKeySwitch.process_savess# #### ""695r*c|jd|fd\}}|j|}|D]<}||vs|j||r|j|,|j|>|S)N pk_switchersc*ttfSr,)rrfr*r(z0DetectKeySwitch._key_switchers..s SUCENr*)runionrr)r'r9rTswitched notswitched allstatesrzs r(rzDetectKeySwitch._key_switcherssp # T "$:! +NN;/ A !$$S!,LLOOOA&  r*c |j||}|rU|jjjD],}t |j |j j s/|j}|j|jj|||j}|tjus||jjr |s|d}n|}tj |}||vs|j#|d|j$t'j(||j*||j |jj,||j$/yy)N)ryrF)rr identity_map all_states issubclassrrrPr2r"getr rPASSIVE_NO_RESULTrrinstance_staterrrrrr$) r'deplistrh switchersr5dict_r related_obj related_states r(rz%DetectKeySwitch._process_key_switchess6'' 7; #**77BBD!%,, 0B0BC ..2665$*C*C7:#?#??+yy((&$&-aj &- $.$=$=k$JM$ 1!11!5$*>*> ) KK! KK II77% 00-E r*ct|jxr6tj|||j|j j Sr,)rr"rrrrr$rs r(rzDetectKeySwitch._pks_changeds;EII 4#7#7 udkk499+F+F$  r*N)rrr__doc__r:rHrcrirlr|rnrqrrrrfr*r(rrds?  />   4 6 #J r*rcBeZdZdZdZdZdZdZdZdZ dZ d Z y ) ManyToManyDPc d|jj||f||f||f||f||f||f||fgyr,rr)r'r9rDrErFrGrBrCs r(rAz&ManyToManyDP.per_property_dependenciessW z*j)]+  -/ . ,  r*c |sF|r"|jj||f||fgy|jj||f||fgy|jj||f||fgyr,r$) r'r9rrr_rBrCrWrbs r(rVz#ManyToManyDP.per_state_dependenciess  ''!:.\0JK  ''!:.z0JK    # #. 0NO r*cz|js/|D])}|j||j|j+yyr,)rrur"r)r'rhrTr5s r(rizManyToManyDP.presort_deletess=## //488T%>%> $r*c8|jsE|D]@}|j||s|j||jtj }B|j jsy|D]}|j||jtj}|s1|jD]n}|j|dus|j|dd|j|jjd|D]\}}}} |j|dpy)NFTrrr)rrrur"rrrrrr`r3rrrr) r'rhrTr5r{r^rrrrs r(rlzManyToManyDP.presort_savess ## $$Y6'==txx)?)?G ||)) E55txx!A!AG$__E~~e,5!11!%)&.!% 2 04{{/K/K$e0OAq#t&55cD5I0- r*c  g}g}g}|j|}t}|D] |j |j|j}|s-|j D]7} | | | f|vri} |j | | d|ds'|j| 9|j fd|j D||j||j||||y)NFrc3&K|]}|f ywr,rfrrr5s r(rz/ManyToManyDP.process_deletes..[sC/B!Au:/B) rrrur"r non_addedrrUr _run_crud) r'rhrTsecondary_deletesecondary_insertsecondary_update processedtmpr{r^rr5s @r(rnzManyToManyDP.process_deletes<s 44Y? eE 55txx!:!:G$..0E}!-5%.I2M %'N,,&! !$++N;1" Cw/@/@/BCC14    S !  ')9;K r*c R g}g}g}|j|}t}|D] |j xr|j| }|r"tj tj z} n!tjtj z} |j |j| } | s| jD]5} | | f|vr i} |j | | d|ds%|j| 7| jD]5} | | f|vr i} |j | | d|ds%|j| 7|j fd| j| jzD|sG| jD]} i} t!j |j"| d|j$j&t!j| |j(| d|j$j*|j| ||j||j-||||y)NFrrc3&K|]}|f ywr,rfr*s r(rz-ManyToManyDP.process_saves..sO/N!Au:/Nr+old_)rrrrrrrsrrur"rrrUr`rrrrrr$rsecondary_synchronize_pairsr-)r'rhrTr.r/r0r1r2need_cascade_pksryr{r^rr5s @r(rqzManyToManyDP.process_savesds644Y? eE#'#7#77 D}|j|vr.|t j|j|jk(@c}}|j||} | jrZ| jt|k7rBt!j"d|jj$t|| jfz|r|d}|jj'j t j|jjDcgc]A}|j|vr1|t jd|jz|jk(Cc}}|j||} | jrZ| jt|k7rBt!j"d|jj$t|| jfz|r-|jj)}|j||yycc}wcc}w)Nr)type_zRDELETE statement on table '%s' expected to delete %d row(s); Only %d were matched.r5zRUPDATE statement on table '%s' expected to update %d row(s); Only %d were matched.) transaction connectionrrrwhererand_rr" bindparamtypeexecutesupports_sane_multi_rowcountrowcountlenrStaleDataError descriptionrinsert) r'rhr/r0r.r;rr statementresults r(r-zManyToManyDP._run_crudsJ**55dkkB -a0N--/55"&!1!1!1A55N2S]]155??!1I '' 3CDF335//S)9%::((722,- -a0N--/55"&!1!1!1A55N2S]]6AEE>HH!1I '' 3CDF335//S)9%::((722,- --/I   y*: ; a4s8AJ AJ c |j||y|d|jj|sI|jsrOs# "!!n?n?b r %r j ^%^Br )r jx &x x { { r*