L iidZddlmZddlmZddlmZddlmZddlmZddlmZdd l m Z dd l m Z dd l m Zd d l mZd d l m Z d dl mZer$ddlmZddlmZddlmZddlmZddlmZddlmZdZGddZGddZGddeZGddZ Gddee Z!Gd d!e Z"Gd"d#e Z#Gd$d%e Z$Gd&d'e Z%Gd(d)e Z&Gd*d+e Z'y,)-zThe internals for the unit of work system. The session's flush() process passes objects to a contextual object here, which assembles flush tasks based on mappers and their properties, organizes them in order of dependency, and executes. ) annotations)Any)Dict)Optional)Set) TYPE_CHECKING attributes)exc)util)event) topological)DependencyProcessor)MapperProperty)Mapper)Session)SessionTransaction) InstanceStatec|jfd}fd}fd}tj|d|ddtj|d|dddtj|d |dddtj|d |dddy ) z\Establish event listeners on object attributes which handle cascade-on-set/append. cb|y|j}|r|jr|jd|jjj }t j|}|jjr1|jk(r"|j|s|j||S)Nzcollection append) session_warn_on_events_flush_warningmanagermapper_propsr instance_state_cascade save_updatekey_contains_state_save_or_update_statestateitem initiatorkwsessprop item_stater"s _/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/sqlalchemy/orm/unitofwork.pyappendz$track_cascade_events..append2s < }} ####$78==''..s3D#2248J ))IMM),,Z8**:6 c|y|j}|jjj}|r+|jr|j |j rdnd||tjur|tjurr|jjr[tj|}|jj|r*|r ||jvr|j|yd|_yyyyyy)Nzcollection removezrelated attribute deleteT)rrrrrruselistr NEVER_SETPASSIVE_NO_RESULTr delete_orphanr _is_orphan_newexpunge_orphaned_outside_of_sessionr%s r-removez$track_cascade_events..removeIs < }}}}##**3/ D((   <<$/   J000J888 ++$2248J{{%%j1J$))3LL& ?CJ;2 ,91 r/c||ur|S|j}|r)|jr|jd|jjj }|\t j|}|jjr1 |jk(r"|j|s|j|||t jurw|t jure|jjrOt j|}||j vr,|jj#|r|j%||S)Nzrelated attribute set)rrrrrrr rr r!r"r#r$r2r3r4r6r5r7) r&newvalueoldvaluer(r)r*r+newvalue_stateoldvalue_stater"s r-set_z"track_cascade_events..set_ks x O}} ####$;<==''..s3D#!+!:!:8!DMM-- - 00@..~>$J$8$88J$@$@@MM//",!:!:8!D!TYY.4;;3I3I"4LL*r/append_wo_mutationT)raw include_keyr.)rAretvalrBr9setN)r"rlisten) descriptorr+r.r9r?r"s @r-track_cascade_eventsrG+s ((C. CD"H LL(&d LLHf$t LLHf$t LLE4T$Dr/ceZdZUded<ded<ded<ded<d ed <dd Zed Zd ZdZdZ dZ e jfdZ dZdZ d d dZdZdZej(dZdZdZdZd!dZd!dZy)"UOWTransactionrrr transactionzDict[str, Any]r z7util.defaultdict[Mapper[Any], Set[DependencyProcessor]]depsz6util.defaultdict[Mapper[Any], Set[InstanceState[Any]]]mappersc||_i|_tjt|_tjt|_i|_i|_t |_ i|_ tjd|_ y)Nc*ttfSN)rDr/r-z)UOWTransaction.__init__..sCE35>r/) rr r defaultdictrDrKrLpresort_actionspostsort_actions dependenciesstatespost_update_states)selfrs r-__init__zUOWTransaction.__init__sy  $$S) '', " !#  E  #'"2"23I"Jr/c,t|jSrO)boolrVrXs r-has_workzUOWTransaction.has_worksDKK  r/c|jr" |j|tjyy#tj $r|j j|gYywxYw)zZReturn ``True`` if the given state is expired and was deleted previously. TF)expired _load_expiredr PASSIVE_OFForm_excObjectDeletedErrorr_remove_newly_deletedrXr&s r-was_already_deletedz"UOWTransaction.was_already_deletedsY == ##E:+A+AB--  22E7; s 0/A"!A"cF||jvxr|j|dS)z[Return ``True`` if the given state is marked as deleted within this uowtransaction.rrVres r- is_deletedzUOWTransaction.is_deleteds& #= E(:1(==r/cl||jvr|j|S|x|j|<}|SrOr )rXr" callable_rets r-memozUOWTransaction.memos7 $// !??3' ')2 4DOOC 3Jr/cJ|j|d}|df|j|<y)z;Remove pending actions for a state from the uowtransaction.rTNrh)rXr&isdeletes r-remove_state_actionsz#UOWTransaction.remove_state_actionss*;;u%a(&- Er/cd||f}||jvr|j|\}}}|tjzs|tjzr|j|j}|j ||j tj tjztjz}|r|jr|j}n|}|||f|j|<|S|j|j}|j ||j |tjztjz}|r|jr|j}n|}|||f|j|<|S)zOFacade to attributes.get_state_history(), including caching of results.history) r SQL_OKrimpl get_historydictraLOAD_AGAINST_COMMITTEDNO_RAISE uses_objectsas_state) rXr&r"passivehashkeyrr state_historycached_passiverts r-get_attribute_historyz$UOWTransaction.get_attribute_historysm eS) doo %59__W5M 2G]N #Z%6%66j///}}S)..**JJ** 778 ))*t00$+$4$4$6M$+M,3]G+L($!==%**D&& 334%%&G4,, ' 0 0 2 ' (/'HDOOG $r/c"|df|jvS)NT)rS)rX processors r-has_depzUOWTransaction.has_dep*s4 D$8$888r/c\||f}||jvrt|||j|<yyrO)rS Preprocess)rXr fromparentr"s r-register_preprocessorz$UOWTransaction.register_preprocessor-s6*% d** *(29j(ID  % +r/Nc |jj|sA|js4|2tjdt j |d|d|dy||jvre|jj}||jvr|j||j|j|||f|j|<y|s|s|r|df|j|<y)NzObject of type z not in session, z operation along 'z' will not proceedFT) rr#deletedr warnorm_utilstate_class_strrVrrrL_per_mapper_flush_actionsadd)rXr&rolistonly cancel_delete operationr+rs r-register_objectzUOWTransaction.register_object2s||++E2==Y%:  //6 4I   #]]))FT\\)..v6 LL $ $U +"*H!5DKK ]&.%6 E"r/c|jjj}|j|\}}|j ||j |yrO)rr base_mapperrWrupdate)rXr&post_update_colsrrVcolss r-register_post_updatez#UOWTransaction.register_post_updateTsD%%11..v6  5 $%r/cPt||j}t||j}|jj ||f|j D]}|j ||jD],}|jr|j}|j |.yrO) SaveUpdateAllr DeleteAllrUr_dependency_processorsper_property_preprocessors relationshipsviewonly_dependency_processor)rXrsavesdeletesdepr+s r-rz(UOWTransaction._per_mapper_flush_actionsZsdF$6$67D&"4"45 ug./00 1C  * *4 0 1(( 1D}},,C  * *4 0  1r/c.tjdS)areturn a dynamic mapping of (Mapper, DependencyProcessor) to True or False, indicating if the DependencyProcessor operates on objects of that Mapper. The result is stored in the dictionary persistently once calculated. cv|djj|dj|djuS)Nrr )rgetr"r+)tups r-rQz0UOWTransaction._mapper_for_dep..ss.A ))#a&**5QDr/)r PopulateDictr\s r-_mapper_for_depzUOWTransaction._mapper_for_dephs  D  r/c||j}|Dcgc] }||jj|fs|"c}Scc}w)zmFilter the given list of InstanceStates to those relevant to the given DependencyProcessor. )rrr)rXrrVmapper_for_depss r-filter_states_for_depz$UOWTransaction.filter_states_for_depvs9 --!Ma^QYY5E5Es4K%LMMMs 99c#K||f}|jjD]-}|j|D]}|j||k(s|/ywrO)rself_and_descendantsrLrV)rXrrorchecktupr&s r-states_for_mapper_hierarchyz*UOWTransaction.states_for_mapper_hierarchy~sYh'((== Ff- ;;u%1K  s AA Ac  d}t|jjD]}|j|sd}|snBt j |j t|jjx|_}|r1|Dcic]}|t|j|}}t|j D]}d|vs/|djs |djs|j|r|j j|R|d|vrI|j j|||dD]"}|j j||df$|d|vs|j j|||dD]"}|j j|d|f$|jjDchc]}|jr|c}j|Scc}wcc}w)z}Generate the full, unsorted collection of PostSortRecs as well as dependency pairs for this UOWTransaction. TFNrr )listrSvaluesexecuter find_cyclesrUrTcyclesrDper_state_flush_actionsdisabled issupersetr9r difference) rXrlactionrrecconvertedgeras r-_generate_actionsz UOWTransaction._generate_actionss Ct33::<= >>$'C   +66   tD$9$9$@$@$BC   f HN@CS44T:;;GT../ >DLAw''Aw''((.%%,,T2!W&%%,,T2&tAw/>))--sDGn=>!W&%%,,T2&tAw/>))--tAwn=> >$,,335 QZZA *V  10 s"HH .H cv|j}t|d}|jrYtj|j |D]5}t |}|s|j}|j|||r%7ytj|j |D]}|j|y)Nc|jSrO)sort_key)r's r-rQz(UOWTransaction.execute..s T]]r/)r") rsortedrrsort_as_subsetsrUrDpopexecute_aggregatesortr)rXrTsubsetr?nrs r-rzUOWTransaction.executes113! *  ;;%55!!#3 46{ A''d3  4#''(9(9;KL " D! "r/cV|jsyt|j}|jjDchc] \}\}}|s |}}}}|j|}|r|jj ||r|jj |yycc}}}w)zMark processed objects as clean / deleted after a successful flush(). This method is called within the flush() method after the execute() method has succeeded and the transaction has been committed. N)rVrDitemsrrrd_register_persistent)rXrVrrorisdelothers r-finalize_flush_changesz%UOWTransaction.finalize_flush_changess{{ T[[!/3{{/@/@/B  +1*xhA  !!%(  LL . .u 5  LL - -e 4   s  B$B$)rr)FFFNN)r&zInstanceState[Any]ror[rr[rr[rz Optional[str]r+zOptional[MapperProperty]returnr[)rNone)__name__ __module__ __qualname____annotations__rYpropertyr]rfrirmrpr PASSIVE_NO_INITIALIZErrrrrrr memoized_propertyrrrrrrrPr/r-rIrIs ## AA CC+KZ!! > .#-"B"B3j9J##')- !      ! '   D& 1     N 2h"65r/rIceZdZdZdZy)IterateMappersMixinrPcjr3tfdjjjDSjj jS)Nc3XK|]!}j|jfr|#ywrO)rdependency_processor).0mrXuows r- z/IterateMappersMixin._mappers..s2&&4+D+D'EFs'*)riterrparentrrrXrs``r-_mapperszIterateMappersMixin._mapperssP ??2299NN  ,,33HH Hr/N)rrr __slots__rrPr/r-rrs IIr/rceZdZdZdZdZy)r)rr processedsetup_flush_actionscL||_||_t|_d|_yNF)rrrDrr)rXrrs r-rYzPreprocess.__init__s"$8!$#( r/ct}t}|j|D]i}|j|j|jD]<}|j |\}}|r|r|j |,|j |>k|r7|jj|||jj||r7|jj|||jj||s|ri|js\|jj||ds|jj||dr"|jj|d|_ yyNTF)rDrrLrrrVrrpresort_deletesr presort_savesrprop_has_changesper_property_flush_actions)rXr delete_states save_statesrr&rors r-rzPreprocess.executesD e mmC( /FV,77G /'*zz%'8$8%))%0#.  / /   % % 5 5c= I NN ! !- 0   % % 3 3C E NN ! !+ . K++))::,,==e))DDSI+/(r/N)rrrrrYrrPr/r-rrsI) !r/rceZdZdZdZdZy) PostSortRec)rc|f|z}||jvr|j|Stj|x|j|<}d|_|Sr)rTobject__new__r)clsrargsr"rls r-rzPostSortRec.__new__-sVftm #&& &'', ,.4nnS.A AC  % CLJr/c&|j|yrO)r)rXrrecss r-rzPostSortRec.execute_aggregate6s Sr/N)rrrrrrrPr/r-rr*sIr/rc.eZdZdZdZdZdZdZdZy) ProcessAll)rrorrc||_d|jj|f|_||_||_|j|j j j|y)Nr)rrrorrKrrr)rXrrrors r-rYzProcessAll.__init__=s_$8!   % % . .   ! $ %,,889==  r/c|j|}|jr|jj||y|jj ||yrO) _elementsrorprocess_deletes process_saves)rXrrVs r-rzProcessAll.executeJsC$ ==  % % 5 5c6 B  % % 3 3C @r/ctgSrO)rrs r-rz"ProcessAll.per_state_flush_actionsQs Bxr/ch|jjd|jd|jdS)N(z , isdelete=)) __class__rrror\s r-__repr__zProcessAll.__repr__Xs) NN # #  % % MM  r/c#K|j|D]?}|j|D]+}|j|\}}||jk(s%|r(|-AywrO)rrLrVro)rXrrr&rors r-rzProcessAll._elements_s\mmC( FV, '*zz%'8$8t}},XK  sAA A AN) rrrrrYrrr rrPr/r-rr:s!LI  A  r/rcFeZdZdZdZej ddZy) PostUpdateAll)rrorcH||_||_d|j|f|_y)Nr )rro _sort_keyr)rXrrros r-rYzPostUpdateAll.__init__js$   (&*:*:HE r/sqlalchemy.orm.persistencectjj}|j|j\}}|Dcgc]$}|j |d|j k(s#|&}}|j|j|||ycc}wNr)r preloadedorm_persistencerWrrVro post_update)rXr persistencerVrrs r-rzPostUpdateAll.executeosrnn44 --dkk: #Iszz!}Q'74=='H!II VS$?Js $B BN)rrrrrYr preload_modulerrPr/r-r r gs10IF T56@7@r/r cReZdZdZdZej ddZdZdZ y)rrrcX||_d|jf|_||jusJy)NrrrrrrXrrs r-rYzSaveUpdateAll.__init__{s/ (&*:*:; +++++r/rctjjj|j|j |jdd|yr)r rrsave_objrrrs r-rzSaveUpdateAll.executes: &&// KK  + +DKK F  r/c#Kt|j|jdd}|jj}t ||}|D]/}t ||}|j j||f|1|j|jD]'}|j||}|j||d)ywr) rrrrrSaveUpdateStaterUrrKrr) rXrrVr delete_allr&rrstates_for_props r-rz%SaveUpdateAll.per_state_flush_actionss  + +DKK F kk-- sK0  E%S%0F    &*!5 6L  88DKK( EC!77VDO  ' '_e D ECCcN|jjd|jdSNrrr rrr\s r-r zSaveUpdateAll.__repr__>>22DKK@@r/N rrrrrYr rrrr rPr/r-rrxs:&I, T56 7 E"Ar/rcReZdZdZdZej ddZdZdZ y)rrcX||_d|jf|_||jusJy)Nrrrs r-rYzDeleteAll.__init__s/ $f&6&67 +++++r/rctjjj|j|j |jdd|yr)r rr delete_objrrrs r-rzDeleteAll.executes: &&11 KK  + +DKKu E  r/c#Kt|j|jdd}|jj}t ||}|D]/}t ||}|j j||f|1|j|jD]'}|j||}|j||d)ywr) rrrrr DeleteStaterUrrKrr) rXrrVrsave_allr&rrr"s r-rz!DeleteAll.per_state_flush_actionss  + +DKKu E kk--  k2 E!e,F    (F!3 4L  88DKK( DC!77VDO  ' '_d C Dr#cN|jjd|jdSr%r&r\s r-r zDeleteAll.__repr__r'r/Nr(rPr/r-rrs:&I, T56 7 D"Ar/rc"eZdZdZdZdZdZy) ProcessState)rror&rcT||_d|jf|_||_||_yNr2)rrror&)rXrrror&s r-rYzProcessState.__init__s+$8!')=)F)FG    r/c|j}|j}|j}|Dcgc].}|j|ur|j|ur|j|ur|0}}|j||jg|Dcgc]}|jc}z}|r|j ||y|j ||ycc}wcc}wrO)r rrodifference_updater&rr) rXrrcls_rrorour_recsrVs r-rzProcessState.execute_aggregates~~#88== {{d"&&*>> h&    x(**( ;Q ;;  0 0f = . .sF ; !)>? r/rcjtjj}|j}|j}|Dcgc]"}|j|us|j|us!|$}}|j ||j ||jg|Dcgc]}|jc}z|ycc}wcc}wrO)r rrr rr6rr&)rXrrrr7rr8r9s r-rz!SaveUpdateState.execute_aggregatesnn44 ~~ q{{d2qxx67IA   x( TZZLX#>AGG#>>  $?sB+ B+B+ B0 ct|jjdtj|jdSr%r rrr;r&r\s r-r zSaveUpdateState.__repr__+ NN # #   tzz *  r/N rrrrrYr rrr rPr/r-r r s4-I@ T56  7   r/r cLeZdZdZdZej ddZdZy)r.r=c||_|jj|_d|jjf|_y)Nr.r?r@s r-rYzDeleteState.__init__s0 ll.. & (=(=> r/rctjj}|j}|j}|Dcgc]"}|j|us|j|us!|$}}|j ||j g|Dcgc]}|j c}z}|j||D cgc]} |j| ds| c} |ycc}wcc}wcc} wr) r rrr rr6r&r,rV) rXrrrr7rr8r9rVrs r-rzDeleteState.execute_aggregate snn44 ~~ q{{d2qxx67IA   x(**( ;Q ;; ;1#**Q-*:Q;S  !<;s#C CCC)C C ct|jjdtj|jdSr%rCr\s r-r zDeleteState.__repr__rDr/NrErPr/r-r.r.s3-I? T56  7   r/r.N)(__doc__ __future__rtypingrrrrrr r rbr rrr dependencyr interfacesrrrrrrr&rrGrIrrrrr rrr2r r.rPr/r-rPs# /* +$odJ5J5Z I I/$/d   * $k* Z@K@""AK"AJ"A "AJ! ;! H k 8 + r/