zmc
2023-08-08 e792e9a60d958b93aef96050644f369feb25d61b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
U
¸ý°d¹lã@s˜dZddlmZddlmZddlmZddlmZddlmZddlmZdd    l    m
Z
dd
l    m Z dd l    m Zd d l    mZd d l    m Z d dl mZeràddlmZddlmZddlmZddlmZddlmZddlmZdd„ZGdd„dƒZGdd„dƒZGdd„deƒZGdd„dƒZ Gdd „d ee ƒZ!Gd!d"„d"e ƒZ"Gd#d$„d$e ƒZ#Gd%d&„d&e ƒZ$Gd'd(„d(e ƒZ%Gd)d*„d*e ƒZ&Gd+d,„d,e ƒZ'd-S).zïThe 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)Ú InstanceStatecs„|j‰‡fdd„}‡fdd„}‡fdd„}tj|d|ddd    tj|d
|dddd tj|d |dddd tj|d |dddd dS)z\Establish event listeners on object attributes which handle
    cascade-on-set/append.
 
    csh|dkr dS|j}|rd|jr&| d¡|jjjˆ}t |¡}|jj    rdˆ|j
krd|  |¡sd|  |¡|S)Nzcollection append) ÚsessionÚ_warn_on_eventsÚ_flush_warningÚmanagerÚmapperÚ_propsr
Úinstance_stateÚ_cascadeÚ save_updateÚkeyÚ_contains_stateÚ_save_or_update_state©ÚstateÚitemÚ    initiatorÚkwÚsessÚpropZ
item_state©r©úPd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\sqlalchemy/orm/unitofwork.pyÚappend2s 
 
ÿþý
z$track_cascade_events.<locals>.appendcsœ|dkr dS|j}|jjjˆ}|r>|jr>| |jr8dnd¡|dk    r˜|tjk    r˜|tj    k    r˜|j
j r˜t  |¡}|j  |¡r˜|r’||jkr’| |¡nd|_dS)Nzcollection removezrelated attribute deleteT)rrrrrrZuselistr
Ú    NEVER_SETÚPASSIVE_NO_RESULTrÚ delete_orphanrÚ
_is_orphanÚ_newÚexpungeZ_orphaned_outside_of_sessionr"r)r*r+ÚremoveIs.
ÿýÿþýü
  z$track_cascade_events.<locals>.removec    s¾||kr |S|j}|rº|jr&| d¡|jjjˆ}|dk    rlt |¡}|jj    rlˆ|j
krl|  |¡sl|  |¡|dk    rº|tj k    rº|tjk    rº|jjrºt |¡}||jkrº|j |¡rº| |¡|S)Nzrelated attribute set)rrrrrrr
rrrrr r!r-r.r/r1r0r2)    r#ZnewvalueZoldvaluer%r&r'r(Znewvalue_stateZoldvalue_stater)r*r+Úset_ks<
 
ÿþý
ÿþýü
ÿ
z"track_cascade_events.<locals>.set_Zappend_wo_mutationT)ÚrawÚ include_keyr,)r5Úretvalr6r3ÚsetN)rrÚlisten)Z
descriptorr(r,r3r4r*r)r+Útrack_cascade_events+sF  " %ÿÿÿÿr:c    @süeZdZUded<ded<ded<ded<d    ed
<dd œd d „Zedd„ƒZdd„Zdd„Zdd„Z    dd„Z
e j fdd„Z dd„Zdd„Zd9d d!d!d!d"d#d!d$œd%d&„Zd'd(„Zd)d*„Zejd+d,„ƒZd-d.„Zd/d0„Zd1d2„Zd3d4œd5d6„Zd3d4œd7d8„ZdS):ÚUOWTransactionrrrZ transactionzDict[str, Any]r
z7util.defaultdict[Mapper[Any], Set[DependencyProcessor]]Údepsz6util.defaultdict[Mapper[Any], Set[InstanceState[Any]]]Úmappers)rcCsR||_i|_t t¡|_t t¡|_i|_i|_tƒ|_    i|_
t dd„¡|_ dS)NcSs tƒtƒfS©N)r8r*r*r*r+Ú<lambda>Ðóz)UOWTransaction.__init__.<locals>.<lambda>) rr
r Ú defaultdictr8r<r=Úpresort_actionsÚpostsort_actionsÚ dependenciesÚstatesÚpost_update_states)Úselfrr*r*r+Ú__init__¥s  zUOWTransaction.__init__cCs
t|jƒSr>)ÚboolrE©rGr*r*r+Úhas_workÒszUOWTransaction.has_workcCsD|jr@z| |tj¡Wn&tjk
r>|j |g¡YdSXdS)zZReturn ``True`` if the given state is expired and was deleted
        previously.
        TF)ZexpiredZ _load_expiredr
Ú PASSIVE_OFFÚorm_excZObjectDeletedErrorrÚ_remove_newly_deleted©rGr#r*r*r+Úwas_already_deletedÖsz"UOWTransaction.was_already_deletedcCs||jko|j|dS)z[Return ``True`` if the given state is marked as deleted
        within this uowtransaction.r©rErOr*r*r+Ú
is_deletedâszUOWTransaction.is_deletedcCs,||jkr|j|S|ƒ|j|<}|SdSr>r    )rGrZ    callable_Úretr*r*r+Úmemoès
 
zUOWTransaction.memocCs |j|d}|df|j|<dS)z;Remove pending actions for a state from the uowtransaction.rTNrQ)rGr#Úisdeleter*r*r+Úremove_state_actionsïsz#UOWTransaction.remove_state_actionsc    Csàd||f}||jkrŒ|j|\}}}|tj@sÜ|tj@rÜ|j|j}| ||jtjtjBtjB¡}|rv|j    rv| 
¡}n|}|||f|j|<nP|j|j}| ||j|tjBtjB¡}|rÈ|j    rÈ| 
¡}n|}|||f|j|<|S)zOFacade to attributes.get_state_history(), including
        caching of results.Úhistory) r
ZSQL_OKrÚimplZ get_historyÚdictrLZLOAD_AGAINST_COMMITTEDZNO_RAISEZ uses_objectsZas_state)    rGr#rZpassiveZhashkeyrWZ state_historyZcached_passiverXr*r*r+Úget_attribute_historyösH
 
ÿþ ÿþý
 
 ÿþý
 
z$UOWTransaction.get_attribute_historycCs|df|jkS)NT)rB)rGÚ    processorr*r*r+Úhas_dep+szUOWTransaction.has_depcCs&||f}||jkr"t||ƒ|j|<dSr>)rBÚ
Preprocess)rGr[Ú
fromparentrr*r*r+Úregister_preprocessor.s
z$UOWTransaction.register_preprocessorFNzInstanceState[Any]rIz Optional[str]zOptional[MapperProperty])r#rUÚlistonlyÚ cancel_deleteÚ    operationr(ÚreturncCsœ|j |¡s8|js4|dk    r4t dt |¡||f¡dS||jkr~|jj    }||j
kr^|  |¡|j
|  |¡||f|j|<n|s˜|sŠ|r˜|df|j|<dS)NzJObject of type %s not in session, %s operation along '%s' will not proceedFT) rr Zdeletedr ÚwarnÚorm_utilZstate_class_strrErrr=Ú_per_mapper_flush_actionsÚadd)rGr#rUr`rarbr(rr*r*r+Úregister_object3s"     þÿ
 
 
 zUOWTransaction.register_objectcCs0|jjj}|j|\}}| |¡| |¡dSr>)rrÚ base_mapperrFrgÚupdate)rGr#Zpost_update_colsrrEÚcolsr*r*r+Úregister_post_updateUs
 
z#UOWTransaction.register_post_updatecCsft||jƒ}t||jƒ}|j ||f¡|jD]}| |¡q.|jD]}|jrPqD|j    }| |¡qDdSr>)
Ú SaveUpdateAllriÚ    DeleteAllrDrgZ_dependency_processorsZper_property_preprocessorsZ relationshipsZviewonlyZ_dependency_processor)rGrZsavesZdeletesÚdepr(r*r*r+rf[s  
 
z(UOWTransaction._per_mapper_flush_actionscCst dd„¡S)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¡|djkS)Nrr)rÚgetrr()Útupr*r*r+r?tr@z0UOWTransaction._mapper_for_dep.<locals>.<lambda>)r Z PopulateDictrJr*r*r+Ú_mapper_for_depis
ÿzUOWTransaction._mapper_for_depcs|j‰‡‡fdd„|DƒS)zmFilter the given list of InstanceStates to those relevant to the
        given DependencyProcessor.
 
        cs g|]}ˆ|jjˆfr|‘qSr*)rr©Ú.0Ús©roZmapper_for_depr*r+Ú
<listcomp>}sz8UOWTransaction.filter_states_for_dep.<locals>.<listcomp>)rr)rGrorEr*rvr+Úfilter_states_for_depwsz$UOWTransaction.filter_states_for_depccs>||f}|jjD](}|j|D]}|j||kr|VqqdSr>)riÚself_and_descendantsr=rE)rGrrUr`Zchecktupr#r*r*r+Ústates_for_mapper_hierarchys
 z*UOWTransaction.states_for_mapper_hierarchycsBd}tˆj ¡ƒD]}| ˆ¡rd}q|sq.qt ˆjtˆj ¡ƒ¡ˆ_}|r(‡fdd„|Dƒ}tˆjƒD]¸}d|ks˜|dj    s˜|dj    s˜| 
|¡r¦ˆj  |¡qn|d|kræˆj  |¡||dD]}ˆj  ||df¡qÊqn|d|krnˆj  |¡||dD]}ˆj  |d|f¡q
qndd    „ˆj ¡Dƒ  |¡S)
z}Generate the full, unsorted collection of PostSortRecs as
        well as dependency pairs for this UOWTransaction.
 
        FTcsi|]}|t| ˆ¡ƒ“qSr*)r8Úper_state_flush_actions)rtÚrecrJr*r+Ú
<dictcomp>žsz4UOWTransaction._generate_actions.<locals>.<dictcomp>NrrcSsh|]}|js|’qSr*©Údisabled)rtÚar*r*r+Ú    <setcomp>¶sz3UOWTransaction._generate_actions.<locals>.<setcomp>)ÚlistrBÚvaluesÚexecuterZ find_cyclesrDrCÚcyclesrÚ
issupersetr3rgÚ
difference)rGrSÚactionr…ÚconvertZedgeror*rJr+Ú_generate_actions†sJ    
 ÿ
 
ÿÿþýü    ÿþz UOWTransaction._generate_actionsÚNone)rccCsx| ¡}t|dd„d}|jrVt |j|¡D]&}t|ƒ}|r,| ¡}| ||¡q8q,nt     |j|¡D]}| 
|¡qddS)NcSs|jSr>)Úsort_key)r$r*r*r+r?¿r@z(UOWTransaction.execute.<locals>.<lambda>r)) rŠÚsortedr…rZsort_as_subsetsrDr8ÚpopÚexecute_aggregateÚsortr„)rGrCZsubsetr4Únr|r*r*r+r„ºs þ ÿzUOWTransaction.executecCsV|js
dSt|jƒ}dd„|j ¡Dƒ}| |¡}|rB|j |¡|rR|j |¡dS)zéMark 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.
 
        NcSsh|]\}\}}|r|’qSr*r*)rtrurUr`r*r*r+rás
z8UOWTransaction.finalize_flush_changes.<locals>.<setcomp>)rEr8Úitemsr‡rrNZ_register_persistent)rGrEZisdelÚotherr*r*r+Úfinalize_flush_changesÕs
ÿ
 z%UOWTransaction.finalize_flush_changes)FFFNN)Ú__name__Ú
__module__Ú __qualname__Ú__annotations__rHÚpropertyrKrPrRrTrVr
ZPASSIVE_NO_INITIALIZErZr\r_rhrlrfr Zmemoized_propertyrrrxrzrŠr„r”r*r*r*r+r;žs>
-
 ÿ
5ù"
4r;c@seZdZdZdd„ZdS)ÚIterateMappersMixinr*cs2ˆjr$t‡‡fdd„ˆjjjDƒƒSˆjjjSdS)Nc3s"|]}ˆj|ˆjfr|VqdSr>)rrÚdependency_processor)rtÚm©rGÚuowr*r+Ú    <genexpr>ñsþz/IterateMappersMixin._mappers.<locals>.<genexpr>)r^Úiterr›Úparentryrrr*rr+Ú_mappersïs
þzIterateMappersMixin._mappersN)r•r–r—Ú    __slots__r¢r*r*r*r+ršësršc@s eZdZdZdd„Zdd„ZdS)r])r›r^Ú    processedÚsetup_flush_actionscCs||_||_tƒ|_d|_dS©NF)r›r^r8r¤r¥)rGr›r^r*r*r+rHszPreprocess.__init__cCsètƒ}tƒ}| |¡D]H}|j| |j¡D]0}|j|\}}|s,|rR| |¡q,| |¡q,q|r~|j ||¡|j     |¡|rœ|j 
||¡|j     |¡|s¤|rà|j sÜ|j  ||d¡sÊ|j  ||d¡rÜ|j  |¡d|_ dSdSdS©NTF)r8r¢r=r‡r¤rErgr›Zpresort_deletesrjZ presort_savesr¥Zprop_has_changesZper_property_flush_actions)rGržZ delete_statesZ save_statesrr#rUr`r*r*r+r„sB   ÿÿÿü zPreprocess.executeN)r•r–r—r£rHr„r*r*r*r+r]úsr]c@s eZdZdZdd„Zdd„ZdS)Ú PostSortRecr~cGs@|f|}||jkr|j|St |¡|j|<}d|_|SdSr¦)rCÚobjectÚ__new__r)ÚclsržÚargsrrSr*r*r+rª/s 
 
 
zPostSortRec.__new__cCs| |¡dSr>)r„)rGržÚrecsr*r*r+r8szPostSortRec.execute_aggregateN)r•r–r—r£rªrr*r*r*r+r¨,s    r¨c@s8eZdZdZdd„Zdd„Zdd„Zdd    „Zd
d „Zd S) Ú
ProcessAll)r›rUr^rŒcCs:||_d|jj|f|_||_||_|j|jj |¡dS)Nr®)r›rŒrUr^r<r¡rirg)rGržr›rUr^r*r*r+rH?sýÿzProcessAll.__init__cCs2| |¡}|jr |j ||¡n|j ||¡dSr>)Ú    _elementsrUr›Úprocess_deletesÚ process_saves)rGržrEr*r*r+r„Ls
zProcessAll.executecCstgƒSr>)r rr*r*r+r{Ssz"ProcessAll.per_state_flush_actionscCsd|jj|j|jfS)Nz%s(%s, isdelete=%s))Ú    __class__r•r›rUrJr*r*r+Ú__repr__Zs
ýzProcessAll.__repr__ccsF| |¡D]6}|j|D]&}|j|\}}||jkr|s|Vqq
dSr>)r¢r=rErU)rGržrr#rUr`r*r*r+r¯as
zProcessAll._elementsN)    r•r–r—r£rHr„r{r³r¯r*r*r*r+r®<s  r®c@s*eZdZdZdd„Ze d¡dd„ƒZdS)Ú PostUpdateAll)rrUrŒcCs||_||_d|j|f|_dS)Nr´)rrUÚ    _sort_keyrŒ)rGržrrUr*r*r+rHlszPostUpdateAll.__init__úsqlalchemy.orm.persistencecsBtjj}ˆjˆj\}}‡‡fdd„|Dƒ}| ˆj|ˆ|¡dS)Ncs$g|]}ˆj|dˆjkr|‘qS©r)rErUrsrr*r+rwusz)PostUpdateAll.execute.<locals>.<listcomp>)r Ú    preloadedÚorm_persistencerFrZ post_update)rGržÚ persistencerErkr*rr+r„qszPostUpdateAll.executeN)r•r–r—r£rHr Úpreload_moduler„r*r*r*r+r´isr´c@s:eZdZdZdd„Ze d¡dd„ƒZdd„Zd    d
„Z    d S) rm©rrŒcCs$||_d|jf|_||jks t‚dS)Nrm©rrµrŒriÚAssertionError©rGržrr*r*r+rH}s zSaveUpdateAll.__init__r¶cCs$tjj |j| |jdd¡|¡dSr¦)r r¸r¹Úsave_objrrzrr*r*r+r„‚s
ýzSaveUpdateAll.executec    cs€t| |jdd¡ƒ}|jj}t||ƒ}|D]$}t||ƒ}|j ||f¡|Vq*|j|jD]}|     ||¡}| 
||d¡q\dSr¦) r‚rzrrirnÚSaveUpdateStaterDrgr<rxr{)    rGržrEriZ
delete_allr#rˆroÚstates_for_propr*r*r+r{Šsÿ
 
 z%SaveUpdateAll.per_state_flush_actionscCsd|jj|jfS©Nz%s(%s)©r²r•rrJr*r*r+r³›szSaveUpdateAll.__repr__N©
r•r–r—r£rHr r»r„r{r³r*r*r*r+rmzs 
rmc@s:eZdZdZdd„Ze d¡dd„ƒZdd„Zd    d
„Z    d S) rnr¼cCs$||_d|jf|_||jks t‚dS)Nrnr½r¿r*r*r+rH¢s zDeleteAll.__init__r¶cCs$tjj |j| |jdd¡|¡dSr§)r r¸r¹Ú
delete_objrrzrr*r*r+r„§s
ýzDeleteAll.executec    cs€t| |jdd¡ƒ}|jj}t||ƒ}|D]$}t||ƒ}|j ||f¡|Vq*|j|jD]}|     ||¡}| 
||d¡q\dSr§) r‚rzrrirmÚ DeleteStaterDrgr<rxr{)    rGržrEriZsave_allr#rˆrorÂr*r*r+r{¯sÿ
 
 z!DeleteAll.per_state_flush_actionscCsd|jj|jfSrÃrÄrJr*r*r+r³ÀszDeleteAll.__repr__NrÅr*r*r*r+rnŸs 
rnc@s(eZdZdZdd„Zdd„Zdd„ZdS)    Ú ProcessState)r›rUr#rŒcCs"||_d|jf|_||_||_dS©NrÈ)r›rŒrUr#)rGržr›rUr#r*r*r+rHÇs zProcessState.__init__csj|j‰|j‰|j‰‡‡‡fdd„|Dƒ}| |¡|jgdd„|Dƒ}ˆrZˆ ||¡n ˆ ||¡dS)Ncs.g|]&}|jˆkr|jˆkr|jˆkr|‘qSr*)r²r›rU©rtÚr©Úcls_r›rUr*r+rwÑs
 
 
 
üz2ProcessState.execute_aggregate.<locals>.<listcomp>cSsg|]
}|j‘qSr*©r#rÊr*r*r+rwÙs)r²r›rUÚdifference_updater#r°r±)rGržr­Úour_recsrEr*rÌr+rÍsþ
zProcessState.execute_aggregatecCs d|jj|jt |j¡|jfS)Nz%s(%s, %s, delete=%s))r²r•r›reÚ    state_strr#rUrJr*r*r+r³ßs 
üzProcessState.__repr__N)r•r–r—r£rHrr³r*r*r*r+rÈÄsrÈc@s2eZdZdZdd„Ze d¡dd„ƒZdd„Zd    S)
rÁ©r#rrŒcCs"||_|jj|_d|jjf|_dSrÉ©r#rrirµrŒ©rGržr#r*r*r+rHës
zSaveUpdateState.__init__r¶csVtjj}|j‰|j‰‡‡fdd„|Dƒ}| |¡| ˆ|jgdd„|Dƒ|¡dS)Ncs$g|]}|jˆkr|jˆkr|‘qSr*©r²rrÊ©rÍrr*r+rwõs
 
z5SaveUpdateState.execute_aggregate.<locals>.<listcomp>cSsg|]
}|j‘qSr*rÎrÊr*r*r+rwús)r r¸r¹r²rrÏrÀr#)rGržr­rºrÐr*rÖr+rðs ÿ
ÿz!SaveUpdateState.execute_aggregatecCsd|jjt |j¡fSrér²r•rerÑr#rJr*r*r+r³ýs
þzSaveUpdateState.__repr__N©    r•r–r—r£rHr r»rr³r*r*r*r+rÁès
 
rÁc@s2eZdZdZdd„Ze d¡dd„ƒZdd„Zd    S)
rÇrÒcCs"||_|jj|_d|jjf|_dS)NrÇrÓrÔr*r*r+rHs
zDeleteState.__init__r¶cshtjj}|j‰|j‰‡‡fdd„|Dƒ}| |¡|jgdd„|Dƒ}| ˆ‡fdd„|Dƒˆ¡dS)Ncs$g|]}|jˆkr|jˆkr|‘qSr*rÕrÊrÖr*r+rws
 
z1DeleteState.execute_aggregate.<locals>.<listcomp>cSsg|]
}|j‘qSr*rÎrÊr*r*r+rwscsg|]}ˆj|dr|‘qSr·rQrs)ržr*r+rws)r r¸r¹r²rrÏr#rÆ)rGržr­rºrÐrEr*)rÍrržr+r s ÿ
ÿzDeleteState.execute_aggregatecCsd|jjt |j¡fSrÃr×rJr*r*r+r³s
þzDeleteState.__repr__NrØr*r*r*r+rÇs
 
rÇN)(Ú__doc__Ú
__future__rÚtypingrrrrrÚr
r rMr rerrÚ
dependencyrZ
interfacesrrrrrrr#rr:r;ršr]r¨r®r´rmrnrÈrÁrÇr*r*r*r+Ú<module>
sB                  sO2-%%$