o znh`@sdZddlmZddlmZddlmZddlmZddlmZddlmZddlm Z d d Z Gd d d e Z Gd dde Z Gddde ZGddde ZGddde eZGdddeZGdddeZGdddeZGdddeZGdddeZGdd d eZd!S)"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.  attributes)exc) persistence)util)event) topologicalcsj|jfdd}fdd}fdd}tj|d|ddd tj|d |ddd tj|d |ddd d S) z\Establish event listeners on object attributes which handle cascade-on-set/append. csn|durdS|j}|r5|jr|d|jjj}t|}|jj r5|j s+|j kr5| |s5| ||S)Nzcollection append)session_warn_on_events_flush_warningmanagermapper_propsrinstance_state_cascade save_updatecascade_backrefskey_contains_state_save_or_update_statestateitem initiatorsessprop item_staterD/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/unitofwork.pyappend s"    z$track_cascade_events..appendcs|durdS|j}|jjj}|r|jr||jrdnd|durO|tjurQ|tj urS|j j rUt |}|j |rW|rJ||jvrJ||dSd|_dSdSdSdSdSdS)Nzcollection removezrelated attribute deleteT)r r rrr r uselistr NEVER_SETPASSIVE_NO_RESULTr delete_orphanr _is_orphan_newexpunge_orphaned_outside_of_sessionrrrr remove6s0      z$track_cascade_events..removecs||ur|S|j}|r`|jr|d|jjj}|dur9t|}|jj r9|j s/|j kr9| |s9| ||dur`|tjur`|tjur`|jjr`t|}||jvr`|j|r`|||S)Nzrelated attribute set)r r r r rrrrrrrrrrr#r$r%r'r&r()rnewvalueoldvaluerrrnewvalue_stateoldvalue_staterrr set_Xs8        z"track_cascade_events..set_r!T)rawretvalr*setN)rrlisten) descriptorrr!r*r/rrr track_cascade_eventss   "%r5c@seZdZddZeddZddZddZd d Zd d Z e j fd dZ ddZ ddZ     d'ddZddZddZejddZddZdd Zd!d"Zd#d$Zd%d&ZdS)(UOWTransactioncCsR||_i|_tt|_tt|_i|_i|_t|_ i|_ tdd|_ dS)NcSs ttfSN)r2rrrr s z)UOWTransaction.__init__..) r rr defaultdictr2depsmapperspresort_actionspostsort_actions dependenciesstatespost_update_states)selfr rrr __init__s  zUOWTransaction.__init__cCs t|jSr7)boolr?rArrr has_works zUOWTransaction.has_workcCsD|jr z ||tjWdStjy|j|gYdSwdS)zVreturn true if the given state is expired and was deleted previously. TF)expired _load_expiredr PASSIVE_OFForm_excObjectDeletedErrorr _remove_newly_deletedrArrrr was_already_deletedsz"UOWTransaction.was_already_deletedcCs||jvo |j|dS)zWreturn true if the given state is marked as deleted within this uowtransaction.r?rLrrr is_deletedszUOWTransaction.is_deletedcCs(||jvr |j|S||j|<}|Sr7r)rAr callable_retrrr memos  zUOWTransaction.memocCs |j|d}|df|j|<dS)z;remove pending actions for a state from the uowtransaction.rNTNrO)rArisdeleterrr remove_state_actionssz#UOWTransaction.remove_state_actionsc Csd||f}||jvrD|j|\}}}|tj@sB|tj@rB|j|j}|||jtjtjB}|r8|jr8| }n|}|||f|j|<|S|j|j}|||j|tjB}|r_|jr_| }n|}|||f|j|<|S)zOfacade to attributes.get_state_history(), including caching of results.history) rSQL_OKr impl get_historydictrHLOAD_AGAINST_COMMITTED uses_objectsas_state) rArrpassivehashkeyrV state_historycached_passiverXrrr get_attribute_historys6         z$UOWTransaction.get_attribute_historycCs|df|jvS)NT)r<)rA processorrrr has_depzUOWTransaction.has_depcCs*||f}||jvrt|||j|<dSdSr7)r< Preprocess)rArc fromparentrrrr register_preprocessors z$UOWTransaction.register_preprocessorFNcCs|j|s|js|durtdt|||fdS||jvr@|jj }||j vr/| ||j | |||f|j|<dS|sM|sF|rM|df|j|<dS)NzJObject of type %s not in session, %s operation along '%s' will not proceedFT) r rdeletedrwarnorm_utilstate_class_strr?r rr;_per_mapper_flush_actionsadd)rArrTlistonly cancel_delete operationrrrrr register_object s$     zUOWTransaction.register_objectcCs0|jjj}|j|\}}||||dSr7)r r base_mapperr@rnupdate)rArpost_update_colsrr?colsrrr register_post_update-s  z#UOWTransaction.register_post_updatecCsft||j}t||j}|j||f|jD]}||q|jD]}|jr(q"|j }||q"dSr7) SaveUpdateAllrs DeleteAllr>rn_dependency_processorsper_property_preprocessors relationshipsviewonly_dependency_processor)rArsavesdeletesdeprrrr rm3s      z(UOWTransaction._per_mapper_flush_actionscCstddS)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. cSs |dj|dj|djuS)NrNr)rgetrr)tuprrr r8L z0UOWTransaction._mapper_for_dep..)r PopulateDictrDrrr _mapper_for_depAs zUOWTransaction._mapper_for_depcs|jfdd|DS)zmFilter the given list of InstanceStates to those relevant to the given DependencyProcessor. cs g|] }|jjfr|qSr)r r.0srmapper_for_deprr Urz8UOWTransaction.filter_states_for_dep..)r)rArr?rrr filter_states_for_depOsz$UOWTransaction.filter_states_for_depccs@||f}|jjD]}|j|D] }|j||kr|Vqq dSr7)rsself_and_descendantsr;r?)rArrTrochecktuprrrr states_for_mapper_hierarchyWs z*UOWTransaction.states_for_mapper_hierarchycsH d}tjD] }|rd}q |snqtjtj_}|rt fdd|D}tjD][}d|vsN|dj sN|dj sN| |rUj |q9|d|vruj |||dD] }j ||dfqgq9|d|vrj |||dD] }j |d|fqq9tdd jD|S) z}Generate the full, unsorted collection of PostSortRecs as well as dependency pairs for this UOWTransaction. TFc3s"|] }|t|fVqdSr7)r2per_state_flush_actions)rrecrDrr vs z3UOWTransaction._generate_actions..NrNrcSsg|]}|js|qSrdisabled)rarrr rsz4UOWTransaction._generate_actions..)listr<valuesexecuter find_cyclesr>r=cyclesrZr issupersetr*rnr2 difference)rArRactionrconvertedgerrrDr _generate_actions^sP        z UOWTransaction._generate_actionscCsd|}|jr!t|j|D]}|r|}||||sqdSt|j|D]}||q(dSr7) rrr sort_as_subsetsr>popexecute_aggregatesortr)rAr=r/nrrrr rs   zUOWTransaction.executecCs^|jsdSt|j}tdd|jD}||}|r#|j||r-|j|dSdS)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. Ncss |] \}\}}|r|VqdSr7r)rrrTrorrr rs   z8UOWTransaction.finalize_flush_changes..)r?r2itemsrr rK_register_persistent)rAr?isdelotherrrr finalize_flush_changess   z%UOWTransaction.finalize_flush_changes)FFFNN)__name__ __module__ __qualname__rBpropertyrErMrPrSrUrPASSIVE_NO_INITIALIZErbrdrhrrrwrmrmemoized_propertyrrrrrrrrrr r6s6-   / "  4 r6c@seZdZddZdS)IterateMappersMixincs.jrtfddjjjDSjjjS)Nc3s$|] }j|jfr|VqdSr7)rdependency_processor)rmrAuowrr rs z/IterateMappersMixin._mappers..)rgiterrparentrrrrrr _mapperss  zIterateMappersMixin._mappersN)rrrrrrrr rs rc@ eZdZdZddZddZdS)rf)rrg processedsetup_flush_actionscCs||_||_t|_d|_dSNF)rrgr2rr)rArrgrrr rBs zPreprocess.__init__cCst}t}||D]$}|j||jD]}|j|\}}|s.|r)||q||qq |r?|j|||j ||rN|j |||j ||sR|rp|j sn|j ||dse|j ||drn|j |d|_ dSdSNTF)r2rr;rrr?rnrpresort_deletesrt presort_savesrprop_has_changesper_property_flush_actions)rAr delete_states save_statesrrrTrorrr rs>     zPreprocess.executeNrrr __slots__rBrrrrr rfs rfc@r) PostSortRecrcGs<|f|}||jvr|j|St||j|<}d|_|Sr)r=object__new__r)clsrargsrrRrrr rs   zPostSortRec.__new__cCs||dSr7)r)rArrecsrrr rrezPostSortRec.execute_aggregateN)rrrrrrrrrr rs rc@s8eZdZdZddZddZddZdd Zd d Zd S) ProcessAll)rrTrgcCs*||_||_||_|j|jj|dSr7)rrTrgr:rrsrn)rArrrTrgrrr rBs zProcessAll.__init__cCs4||}|jr|j||dS|j||dSr7) _elementsrTrprocess_deletes process_saves)rArr?rrr rs zProcessAll.executecCstgSr7)rrrrr rsz"ProcessAll.per_state_flush_actionscCsd|jj|j|jfS)Nz%s(%s, isdelete=%s)) __class__rrrTrDrrr __repr__%s zProcessAll.__repr__ccsH||D]}|j|D]}|j|\}}||jkr |s |Vq qdSr7)rr;r?rT)rArrrrTrorrr r,szProcessAll._elementsN) rrrrrBrrrrrrrr r s rc@r) PostUpdateAllrrTcCs||_||_dSr7r)rArrrTrrr rB7s zPostUpdateAll.__init__cs:jj\}}fdd|D}tj||dS)Ncs$g|]}j|djkr|qSrN)r?rTrrrr r=s$z)PostUpdateAll.execute..)r@rr post_update)rArr?rvrrr r;szPostUpdateAll.executeNrrrrr r4s rc@0eZdZdZddZddZddZdd Zd S) rxrcC||_||jus JdSr7rrsrArrrrr rBEzSaveUpdateAll.__init__cCs t|j||jdd|dSr)rsave_objrrrrrr rI zSaveUpdateAll.executec cst||jdd}|jj}t||}|D]}t||}|j||f|Vq|j|jD]}| ||}| ||dq/dSr) rrrrsrySaveUpdateStater>rnr:rr) rArr?rs delete_allrrrstates_for_proprrr rP   z%SaveUpdateAll.per_state_flush_actionscCd|jj|jfSNz%s(%s)rrrrDrrr razSaveUpdateAll.__repr__NrrrrrBrrrrrrr rxB  rxc@r) ryrcCrr7rrrrr rBhrzDeleteAll.__init__cCs t|j||jdd|dSr)r delete_objrrrrrr rlrzDeleteAll.executec cst||jdd}|jj}t||}|D]}t||}|j||f|Vq|j|jD]}| ||}| ||dq/dSr) rrrrsrx DeleteStater>rnr:rr) rArr?rssave_allrrrrrrr rsrz!DeleteAll.per_state_flush_actionscCrrrrDrrr rrzDeleteAll.__repr__Nrrrrr ryerryc@(eZdZdZddZddZddZdS) ProcessStaterrTrcCs||_||_||_dSr7r)rArrrTrrrr rBs zProcessState.__init__csl|j|j|jfdd|D}|||jgdd|D}r.||dS||dS)Ncs.g|]}|jur|jur|jur|qSr)rrrTrrcls_rrTrr rs   z2ProcessState.execute_aggregate..cSg|]}|jqSrrrrrr r)rrrTdifference_updaterrrrArrour_recsr?rrr rs zProcessState.execute_aggregatecCs d|jj|jt|j|jfS)Nz%s(%s, %s, delete=%s))rrrrk state_strrrTrDrrr rs  zProcessState.__repr__NrrrrrBrrrrrr rs  rc@r) rrrcC||_|jj|_dSr7rrrsrArrrrr rBzSaveUpdateState.__init__csN|j|jfdd|D}||t|jgdd|D|dS)Nc$g|]}|jur|jur|qSrrrrrrrr rz5SaveUpdateState.execute_aggregate..cSrrrrrrr rr)rrrrrr)rArrrrrr rs  z!SaveUpdateState.execute_aggregatecCd|jjt|jfSrrrrkrrrDrrr r zSaveUpdateState.__repr__Nrrrrr rs  rc@r) rrcCrr7rrrrr rBrzDeleteState.__init__cs`|j|jfdd|D}|||jgdd|D}tfdd|DdS)Ncrrrrrrr rrz1DeleteState.execute_aggregate..cSrrrrrrr rrcsg|] }j|dr|qSrrOr)rrr rs)rrrrrrrr)rrrr rs  zDeleteState.execute_aggregatecCrrrrDrrr rrzDeleteState.__repr__Nrrrrr rs  rN)__doc__rrrIrrrkrr r5rr6rrfrrrrxryrrrrrrr s,       i> 2(###