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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
U
¸ý°dÑã @sÊdZddlmZddlmZddlmZddlmZddlmZddlmZddlm    Z    dd    lm
Z
dd
lm Z dd lm Z d d l mZd dl mZd dl mZd dl mZd dl mZd dl mZd dlmZd dlmZd dlmZd dlmZd dlmZddl mZddl mZddlmZddlmZ ddl!m"Z"ddl!m#Z#ddl!m$Z$ddl!m%Z%dd l!m&Z&dd!l!m'Z'dd"l(m)Z)dd#l(m*Z*dd$l(m+Z+dd%l,m-Z-dd&l,m.Z.dd'l,m/Z/dd(lm0Z0dd)l1m2Z2e
rnd d*l3m4Z4d d+l3m5Z5d d,l3m6Z6d d-l7m8Z8d d.l9m:Z:d d/l9m;Z;d d0l9m<Z<d d1l9m=Z=d d2l>m?Z?dd3lm@Z@dd4lmAZAdd5lBmCZCe d6eDd7ZEe    dcd9d:d;d<d<d<d=d>d?d@œ    dAdB„ƒZFe    ddd9d:d;d<d<d<dCd>dDd@œ    dEdB„ƒZFded9d:d;d<d<d<dCd>dGd@œ    dHdB„ZFe    dfdJd:d;d<d<d=d<d?dKœdLdM„ƒZGe    dgdJd:d;d<d<dNd<dOdKœdPdM„ƒZGdhdJd:d;d<d<dNd<dQdKœdRdM„ZGdSdT„ZHGdUdV„dVeƒZIGdWdX„dXeIƒZJe* KdYdZ¡Gd[d\„d\eIe.ƒƒZLe* KdYd]¡Gd^d_„d_eJe/ƒƒZMe* KdYd`¡Gdadb„dbeJe-ƒƒZNdFS)izoadditional ORM persistence classes related to "bulk" operations,
specifically outside of the flush() process.
 
é)Ú annotations)ÚAny)Úcast)ÚDict)ÚIterable)ÚOptional)Úoverload)Ú TYPE_CHECKING)ÚTypeVar)ÚUnioné)Ú
attributes)Úcontext)Ú    evaluator)Úexc)Úloading)Ú persistence)ÚNO_VALUE)ÚAbstractORMCompileState)Ú FromStatement)ÚORMFromStatementCompileState)Ú QueryContexté)Úutil)ÚDialect)Úresult)Ú    coercions)Údml)Ú
expression)Úroles)Úselect)Úsqltypes)Ú_entity_namespace_key)Ú CompileState)ÚOptions)ÚDeleteDMLState)ÚInsertDMLState)ÚUpdateDMLState)Ú
EMPTY_DICT)ÚLiteral)ÚDMLStrategyArgument)ÚOrmExecuteOptionsParameter)ÚSynchronizeSessionArgument)ÚMapper)Ú_BindArguments)ÚORMExecuteState)ÚSession)ÚSessionTransaction)Ú InstanceState)Ú
Connection)Úcursor)Ú_CoreAnyExecuteParamsÚ_O)Úbound.z
Mapper[_O]z<Union[Iterable[InstanceState[_O]], Iterable[Dict[str, Any]]]r1Úboolz Literal[None]z$Optional[OrmExecuteOptionsParameter]ÚNone)    ÚmapperÚmappingsÚsession_transactionÚisstatesÚreturn_defaultsÚ render_nullsÚuse_orm_insert_stmtÚexecution_optionsÚreturncCsdS©N©©r:r;r<r=r>r?r@rArDrDúVd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\sqlalchemy/orm/bulk_persistence.pyÚ _bulk_insertJs rGzOptional[dml.Insert]zcursor.CursorResult[Any]cCsdSrCrDrErDrDrFrGXs Nz"Optional[cursor.CursorResult[Any]]c sÒˆj}|jjrtdƒ‚|rL|r<dd„ˆDƒ}    dd„|    Dƒ‰qddd„ˆDƒ‰ndd„ˆDƒ‰tˆˆƒ| |¡‰d}
‡fdd„|j ¡Dƒ} |r”d} nt| ƒd    kr¦d} nd
} | D]´\} }|dk    rԇfd d„|     ¡Dƒnd }‡‡fd d„t
j | ‡‡fdd„ˆDƒd| ||dDƒ}t
j |d|| || ||d}|dk    r®|j rB|
dkrH|}
q®|jr®| sXt‚|
 |¡}
q®|r²|r²ˆj}dd„ˆjDƒ}|    D]&\}‰|t‡fdd„|Dƒƒf|_qŠ|dk    rÎ|
dk    sÊt‚|
SdS)NzJconnection_callable / per-instance sharding not supported in bulk_insert()cSsg|]}||jf‘qSrD©Údict©Ú.0ÚstaterDrDrFÚ
<listcomp>zsz _bulk_insert.<locals>.<listcomp>cSsg|] \}}|‘qSrDrD)rKrLÚdict_rDrDrFrM{scSsg|]
}|j‘qSrDrHrJrDrDrFrM}scSsg|] }t|ƒ‘qSrDrH©rKÚmrDrDrFrMscs"g|]\}}|ˆjkr||f‘qSrD)Ú _pks_by_table)rKÚtableÚmp©r:rDrFrM†s
þTr Fcs g|]}|jˆdkr|j‘qS©r©Úkey©rKÚb©r;rDrFrM¡sþrDc        3s2|]*\}}}}}}}}d||ˆˆ|||fVqdSrCrD)    rKrLZ
state_dictÚparamsrSÚconnZ value_paramsZ has_all_pksZhas_all_defaults©Ú
connectionr:rDrFÚ    <genexpr>ªs$ ïøz_bulk_insert.<locals>.<genexpr>c3s|]}d|ˆˆfVqdSrCrD©rKÚmappingr]rDrFr_Às)Úbulkr>r?Úinclude_bulk_keys)Ú bookkeepingr@rAcSsg|]
}|j‘qSrDrV)rKÚprDrDrFrMÛscsg|] }ˆ|‘qSrDrD©rKrW)rNrDrFrMßs)Ú base_mapperÚsessionÚconnection_callableÚNotImplementedErrorÚ_expand_compositesr^Ú_sorted_tablesÚitemsÚlenÚ_get_embedded_bindparamsrZ_collect_insert_commandsZ_emit_insert_statementsÚ
_returningZ returns_rowsÚAssertionErrorZsplice_horizontallyZ_identity_classÚ_identity_key_propsÚtuplerW)r:r;r<r=r>r?r@rArgÚstatesZ return_resultZmappers_to_runrdrRÚ super_mapperÚextra_bp_namesÚrecordsrZ identity_clsZidentity_propsrLrD)r^rNr:r;rFrGfs‚
ÿ
 
 
þ  û þù
úìø
 
   þ
 
Tú Mapper[Any])r:r;r<r=Úupdate_changed_onlyÚuse_orm_update_stmtÚenable_check_rowcountrBcCsdSrCrD©r:r;r<r=ryrzr{rDrDrFÚ _bulk_updateçs
r}zOptional[dml.Update]z_result.Result[Any]cCsdSrCrDr|rDrDrFr}ôs
zOptional[_result.Result[Any]]c s0ˆj}ˆj‰ˆjr"ˆjjh ˆ¡‰‡fdd„‰|r\|rL‡‡fdd„ˆDƒ‰qtdd„ˆDƒ‰ndd„ˆDƒ‰tˆˆƒ|jjr„tdƒ‚|     |¡‰|dk    r¬‡fdd„| 
¡Dƒnd    }|j   ¡D]^\}    }
ˆ  |
¡rº|    ˆjkrØqºtjd|    ‡‡fd
d „ˆDƒd ||d } tj|d|
|    | d||dqº|dk    r,t ¡SdS)Ncs‡‡fdd„ˆj ¡DƒS)Ncs(i|] \}}|ˆjks|ˆkr||“qSrD)Zcommitted_state©rKÚkÚv)Ú search_keysrLrDrFÚ
<dictcomp>s
 
þz7_bulk_update.<locals>._changed_dict.<locals>.<dictcomp>)rIrm)r:rL)r)rLrFÚ _changed_dicts þz#_bulk_update.<locals>._changed_dictcsg|]}ˆˆ|ƒ‘qSrDrDrJ)rƒr:rDrFrMsz _bulk_update.<locals>.<listcomp>cSsg|]
}|j‘qSrDrHrJrDrDrFrMscSsg|] }t|ƒ‘qSrDrHrOrDrDrFrMszJconnection_callable / per-instance sharding not supported in bulk_update()cs g|]}|jˆdkr|j‘qSrUrVrXrZrDrFrM+sþrDc3s.|]&}d|ˆˆˆjr |ˆjjndfVqdSrC)Ú_version_id_proprWr`r]rDrFr_;s öÿøz_bulk_update.<locals>.<genexpr>T)rbrzrcF)rdrzr{)rgZ_primary_key_propkeysr„rWÚunionrkrhrirjr^rorlrmÚisarQrZ_collect_update_commandsZ_emit_update_statementsÚ_resultÚ null_result) r:r;r<r=ryrzr{rgrvrRrurwrD)rƒr^r:r;rrFr}s^     
ÿ
 
û þù
 ôíø
csV|j‰ˆsdStˆ ¡ƒ}‡fdd„|Dƒ}|D] }| |¡D]}|||ƒq>q0dS)Ncsi|]}|ˆ| ¡“qSrD)Z)_populate_composite_bulk_save_mappings_fnrf©Zcomposite_attrsrDrFr‚bsÿz&_expand_composites.<locals>.<dictcomp>)Z
compositesÚsetÚkeysÚ intersection)r:r;Zcomposite_keysZ
populatorsrarWrDr‰rFrk\s 
þrkc@steZdZUdZdZded<edd„ƒZedd„ƒZed    d
„ƒZ    ed d „ƒZ
ed d„ƒZ ddœdd„Z edd„ƒZ dS)Ú ORMDMLStateTNz&Optional[ORMFromStatementCompileState]Úfrom_statement_ctxc csôtj}|D]ä\}}t tj|¡}t|tƒrŒt||t    d}|t    krrt tj|¡|rhtjtj
|t   ¡ddn|fVqî|||  |¡|ƒEdHq
d|jkrÈ|j}    t|    d|    dƒ}
|||
  |¡|ƒEdHq
||sÒ|ntjtj
|t   ¡ddfVq
dS)N)ÚdefaultT)Útype_Zis_crudZentity_namespaceÚ    proxy_key)r'Ú_get_crud_kv_pairsrÚexpectrZ DMLColumnRoleÚ
isinstanceÚstrr"rÚExpressionElementRoler!ZNullTypeZ_bulk_update_tuplesÚ _annotations) Úclsr:Ú    statementÚ kv_iteratorÚneeds_to_be_cacheableZcore_get_crud_kv_pairsrr€ÚdescZk_annoÚattrrDrDrFÚ_get_orm_crud_kv_pairsosT 
 úü÷ ý 
ÿý ÿüüz"ORMDMLState._get_orm_crud_kv_pairscs6ˆjd‰ˆrˆjs t ˆ|¡S‡‡‡fdd„|DƒS)NÚplugin_subjectc    s&g|]}tˆ ˆjˆ| ¡d¡ƒ‘qS)F)rIržr:rm)rKZ
value_dict©r˜rŸr™rDrFrM­sûÿÿz8ORMDMLState._get_multi_crud_kv_pairs.<locals>.<listcomp>)Ú_propagate_attrsr:r'Ú_get_multi_crud_kv_pairs)r˜r™ršrDr rFr¢¤s
 
ÿúz$ORMDMLState._get_multi_crud_kv_pairscCsD|s tdƒ‚|jd}|r |js.t |||¡St| |j|||¡ƒS)Nz0no test coverage for needs_to_be_cacheable=FalserŸ)rqr¡r:r'r’Úlistrž)r˜r™ršr›rŸrDrDrFr’¶s&ÿþ
 
ÿüÿzORMDMLState._get_crud_kv_pairscCs@|jjd}|j}|jr |j}n|jj}||j|j|j|jdœS)NÚ parententity)ÚnameÚtypeÚexprÚentityrR)    rRr—r:Úis_aliased_classr¥Úclass_Ú__name__r¨Ú local_table)r˜r™Úext_infor:Z _label_namerDrDrFÚget_entity_descriptionÌs ûz"ORMDMLState.get_entity_descriptioncs2dd„‰dd„‰‡fdd„‡fdd„|jDƒDƒS)NcSs|j dd¡S)Nr¤)r—Úget)ÚcrDrDrFÚ _ent_for_colßszCORMDMLState.get_returning_column_descriptions.<locals>._ent_for_colcSs4|dkr |S|j dd¡}|s"|St|j||ƒSdS)Nr‘)r—r¯Úgetattrr¨)r°Úentr‘rDrDrFÚ _attr_for_colâs zDORMDMLState.get_returning_column_descriptions.<locals>._attr_for_colcs.g|]&\}}|j|jˆ||ƒ|j|jdœ‘qS))r¥r¦r§Úaliasedr¨)rWr¦r©r¨)rKr°r³)r´rDrFrMësúûzAORMDMLState.get_returning_column_descriptions.<locals>.<listcomp>csg|]}|ˆ|ƒf‘qSrDrD©rKr°)r±rDrFrMós)Z_all_selected_columns)r˜r™rD)r´r±rFÚ!get_returning_column_descriptionsÝs    
 
ÿøz-ORMDMLState.get_returning_column_descriptions)Úuse_supplemental_colsc    Cs˜|jr”t|j|dd}|j|jŽ}||_t ||¡|_}| |¡|     ¡}d|_dd„|j
Dƒ}|sr|  |j ¡|rŠ|j |j d|iŽ}n
|j|Ž}|S)alestablish ORM column handlers for an INSERT, UPDATE, or DELETE
        which uses explicit returning().
 
        called within compilation level create_for_statement.
 
        The _return_orm_returning() method then receives the Result
        after the statement was executed, and applies ORM loading to the
        state that we first established here.
 
        F)Z_adapt_on_namesrDcSsg|]}|dk    r|‘qSrCrDr¶rDrDrFrMsz4ORMDMLState._setup_orm_returning.<locals>.<listcomp>Zsupplemental_cols)rprÚoptionsÚ _with_optionsÚselect_statementrÚcreate_for_statementrŽZ!setup_dml_returning_compile_stateZ    _generateZprimary_columnsÚextendÚ primary_keyr>Z    returning)    ÚselfÚcompilerÚorm_level_statementZdml_level_statementÚ
dml_mapperr¸ÚfsZfscZcols_to_returnrDrDrFÚ_setup_orm_returningøs6ý 
þ
  ô óÿz ORMDMLState._setup_orm_returningc CsN|j}|jj}|jrF| dtj¡}    t|j|j|||    ||ƒ}
t     ||
¡S|SdS)NÚ_sa_orm_load_options)
rZcompiledÚ compile_staterŽr¯rÚdefault_load_optionsr»rZ    instances) r˜rhr™r[rAÚbind_argumentsrZexecution_contextrÆÚ load_optionsZ querycontextrDrDrFÚ_return_orm_returning;s$ ÿù     z!ORMDMLState._return_orm_returning)r«Ú
__module__Ú __qualname__Zis_dml_returningrŽÚ__annotations__Ú classmethodržr¢r’r®r·rÄrÊrDrDrDrFrks 
 
4
 
 
 
!ù Crc
@sÊeZdZGdd„deƒZedddddœddddddddœd    d
„ƒZed d „ƒZed d„ƒZedd„ƒZ    edd„ƒZ
edd„ƒZ edd„ƒZ edd„ƒZ edd„ƒZedd„ƒZedd„ƒZedd „ƒZd!S)"ÚBulkUDCompileStatec@sreZdZUdZded<dZded<dZded<dZded    <dZded
<d Z    ded <d Z
ded<e Z d Z d Zd Zd S)z)BulkUDCompileState.default_update_optionsÚautor*Ú _dml_strategyr,Ú_synchronize_sessionFr8Ú_can_use_returningÚ_is_delete_usingÚ_is_update_fromTÚ
_autoflushNúOptional[Mapper[Any]]Ú_subject_mapper)r«rËrÌrÑrÍrÒrÓrÔrÕrÖrØr(Ú_resolved_valuesÚ_eval_conditionÚ _matched_rowsÚ_identity_tokenrDrDrDrFÚdefault_update_options]s
       rÝF©Ú is_multitableÚis_update_fromÚis_delete_usingÚis_executemanyrrxr8©Údialectr:rßràrárârBcCs
tƒ‚dSrC)rj)r˜rär:rßràrárârDrDrFÚcan_use_returningjs z$BulkUDCompileState.can_use_returningc
    Csâtj dddddddh||j¡\}}||d<z|jd    }Wn tk
rZd
sVtd ƒ‚Yn X|j|d <|d |ji7}t|t    ƒs¬|j
dkr–|ddi7}qÂ|j
dkrÂt   d¡‚n|j
dkrÂ|ddi7}|j }    |    dk    rþ|    dkrât  d¡‚|j
dkrþ|    dkrþt   d¡‚|sÊ|jr| ¡|j
dkr†|j dkrB| ||||||¡}nB|j dkrd| ||||||¡}n |j dkrª| ||||||¡}n$|j
dkrª|j dkrª|ddi7}| |j |j|j|j
|jdœ¡}|t |¡ d|i¡fS)NÚ_sa_orm_update_optionsÚsynchronize_sessionÚ    autoflushÚidentity_tokenráràÚ dml_strategyÚclauserŸFú0statement had 'orm' plugin but no plugin_subjectr:rØrÐrÑÚormrbúHCan't use "bulk" ORM insert strategy without passing separate parameters)rÐÚevaluateÚfetchFzSValid strategies for session synchronization are 'auto', 'evaluate', 'fetch', FalserðzkThe 'fetch' synchronization strategy is not available for 'bulk' ORM updates (i.e. multiple parameter sets)rïrÒ)rçráràrêrå)rÏrÝÚfrom_execution_optionsÚ_execution_optionsr¡ÚKeyErrorrqr:r”r£rÑÚsa_excÚInvalidRequestErrorrÒÚ ArgumentErrorrÖÚ_do_pre_synchronize_autoÚ_do_pre_synchronize_evaluateÚ_do_pre_synchronize_fetchÚ    _annotaterÔrÕrÓrÚ immutabledictr…)
r˜rhr™r[rArÈÚ is_pre_eventÚupdate_optionsrŸZsyncrDrDrFÚorm_pre_session_execws°úõý
 
 
 
ÿ
 ÿÿ  ú ú ú   ûÿ 
ÿþz'BulkUDCompileState.orm_pre_session_execcCs†|d}|jdkrJ|jdkr.| ||||¡qr|jdkrr| ||||¡n(|jdkrr|jdkrn| ||||¡|S| ||||||¡S)Nrærírïrðrb)rÑrÒÚ_do_post_synchronize_evaluateÚ_do_post_synchronize_fetchÚ"_do_post_synchronize_bulk_evaluaterÊ)r˜rhr™r[rArÈrrýrDrDrFÚorm_setup_cursor_resultïsB
 
ÿ
ÿ
 
ÿúz*BulkUDCompileState.orm_setup_cursor_resultcs~d}ˆjrˆjnd‰dˆjf|krF|t‡fdd„|dˆjfDƒƒ7}ˆjjdk    r`|ˆjjf7}ˆrzt‡fdd„|Dƒƒ}|S)aApply extra criteria filtering.
 
        For all distinct single-table-inheritance mappers represented in the
        table being updated or deleted, produce additional WHERE criteria such
        that only the appropriate subtypes are selected from the total results.
 
        Additionally, add WHERE criteria originating from LoaderCriteriaOptions
        collected from the statement.
 
        rDNZadditional_entity_criteriac3s(|] }|js|jˆkr| ˆ¡VqdSrC)Zinclude_aliasesr¨Z_resolve_where_criteria)rKZae)r­rDrFr_1s
üz@BulkUDCompileState._adjust_for_extra_criteria.<locals>.<genexpr>c3s|]}ˆ |¡VqdSrC)Ztraverse)rKÚcrit)ÚadapterrDrFr_=s)r©Z_adapterr:rsZ_single_table_criterion)r˜Úglobal_attributesr­Z return_critrD)rr­rFÚ_adjust_for_extra_criterias" þýÿþ
 z-BulkUDCompileState._adjust_for_extra_criteriacsÖ|j|jjk    r|Sdd„|jjDƒ‰| ¡D]f}|jdkr@q”n|j|jjkrPq,t|j|jjƒ}dd„||Dƒ}ˆ ¡D]\}}||ˆ|<q|q,‡fdd„t|jjƒDƒ‰‡fdd„|jjDƒ‰‡fdd„|DƒS)    aÇtranslate from local inherited table columns to base mapper
        primary key columns.
 
        Joined inheritance mappers always establish the primary key in terms of
        the base table.   When we UPDATE a sub-table, we can only get
        RETURNING for the sub-table's columns.
 
        Here, we create a lookup from the local sub table's primary key
        columns to the base table PK columns so that we can get identity
        key values from RETURNING that's against the joined inheritance
        sub-table.
 
        the complexity here is to support more than one level deep of
        inheritance, where we have to link columns to each other across
        the inheritance hierarchy.
 
        cSsi|]
}||“qSrDrD)rKÚpkrDrDrFr‚\sz@BulkUDCompileState._interpret_returning_rows.<locals>.<dictcomp>NcSsi|]\}}||“qSrDrD)rKZsuper_pkZsub_pkrDrDrFr‚escsi|]\}}ˆ||“qSrDrD)rKÚidxZlpk)Úlocal_pk_to_base_pkrDrFr‚isÿcsg|] }ˆ|‘qSrDrD)rKZbpk)ÚlookuprDrFrMmsz@BulkUDCompileState._interpret_returning_rows.<locals>.<listcomp>cs"g|]‰t‡fdd„ˆDƒƒ‘qS)c3s|]}ˆ|VqdSrCrD)rKr©ÚrowrDrFr_pszJBulkUDCompileState._interpret_returning_rows.<locals>.<listcomp>.<genexpr>)rs)rK)Úprimary_key_convertr rFrMps)    r¬rgr¾Ziterate_to_rootZinheritsrIZ_table_to_equatedrmÚ    enumerate)r˜r:ÚrowsrSZt_to_eZ
col_to_colrZsuper_rD)r    r
r rFÚ_interpret_returning_rowsAs& 
 
 
þ
ÿz,BulkUDCompileState._interpret_returning_rowsc
sˆ|j‰|j}‡fdd„|Dƒ}|j‰ˆdk    r>‡fdd„|Dƒ}g}|D]<\}}}||ƒ}    |    dksj|    tjkrF| ||||    tjkf¡qF|S)Ncs.g|]&}|j ˆ¡r|js| ¡||jf‘qSrD)r:r†ZexpiredÚobjrIrJrTrDrFrMws þzGBulkUDCompileState._get_matched_objects_on_criteria.<locals>.<listcomp>cs&g|]\}}}|jˆkr|||f‘qSrD©ré)rKrrLrNrrDrFrMs
þT)rØrÚrÜrZ_EXPIRED_OBJECTÚappend)
r˜rýrtÚeval_conditionÚraw_datarrrLrNZevaled_conditionrD)rér:rFÚ _get_matched_objects_on_criteriars2
þ
þÿþüÿz3BulkUDCompileState._get_matched_objects_on_criteriac Cs~|j}|j}t |¡}d}|jr*||j7}i}|jD]}|jr4| |¡q4|r^|| ||¡7}|rn|j    |Ž}    n dd„}
|
}    |    S)NrDcSsdS)NTrD)rrDrDrFrÚ¯szJBulkUDCompileState._eval_condition_from_statement.<locals>._eval_condition)
rØrªrÚ_EvaluatorCompilerÚ_where_criteriarºZ_is_criteria_optionZget_global_criteriarÚprocess) r˜rýr™r:Ú
target_clsÚevaluator_compilerrrÚoptrrÚrDrDrFÚ_eval_condition_from_statement™s"
 
 
  z1BulkUDCompileState._eval_condition_from_statementcCsVz| ||¡}Wntjk
r&YnX||ddœS|ddi7}| ||||||¡S)aÌsetup auto sync strategy
 
 
        "auto" checks if we can use "evaluate" first, then falls back
        to "fetch"
 
        evaluate is vastly more efficient for the common case
        where session is empty, only has a few objects, and the UPDATE
        statement can potentially match thousands/millions of rows.
 
        OTOH more complex criteria that fails to work with "evaluate"
        we would hope usually correlates with fewer net rows.
 
        rï)rÚrÒrÒrð)rrÚUnevaluatableErrorrù)r˜rhr™r[rArÈrýrrDrDrFr÷¶s(ÿþ úz+BulkUDCompileState._do_pre_synchronize_autoc    
CsRz| ||¡}Wn4tjk
rD}zt d|¡|‚W5d}~XYnX|d|iS)Nz{Could not evaluate current criteria in Python: "%s". Specify 'fetch' or False for the synchronize_session execution option.rÚ)rrrrôrõ)    r˜rhr™r[rArÈrýrÚerrrDrDrFrøæs" ÿþÿüÿz/BulkUDCompileState._do_pre_synchronize_evaluatecCs6|jr
gS|jrt|jƒS|jr.t|j ¡ƒSgSdSrC)Z _multi_valuesÚ_ordered_valuesr£Ú_valuesrm)r˜r:r™rDrDrFÚ_get_resolved_valuess
z'BulkUDCompileState._get_resolved_valuesc    Cslg}|D]^\}}|rXt|tjƒrXz|j|}Wntjk
rDYqfX| |j|f¡qt     d|¡‚q|S)NzCAttribute name not found, can't be synchronized back to objects: %r)
r”rZ ColumnElementZ_columntopropertyÚorm_excZUnmappedColumnErrorrrWrôrõ)r˜r:Úresolved_valuesÚvaluesrr€rrDrDrFÚ_resolved_keys_as_propnames s ÿÿz.BulkUDCompileState._resolved_keys_as_propnamesc svˆj‰tˆjˆjfŽ ˆ¡j|jŽ}|j|_d‰dddœ‡‡‡‡fdd„ }|j|||||d}    |         ¡}
ˆ|
ˆdœS)Nr/r)Ú orm_contextrBcsv|jjf|jŽ}ˆj|jˆˆjˆj|jd}ˆdk    rHˆ|krbt     d¡‚n|jr^|s^t     d¡‚n|‰|rnt
  ¡SdSdS)N)ràrárâzjFor synchronize_session='fetch', can't mix multiple backends where some support RETURNING and others don'tz‚For synchronize_session='fetch', can't use multiple parameter sets in ORM mode, which this backend does not support with RETURNING) rhZget_bindrÈrårärÕrÔrârôrõr‡rˆ)r'ÚbindZper_bind_result©rår˜r:rýrDrFÚskip_for_returning@s*ûÿ
ÿzHBulkUDCompileState._do_pre_synchronize_fetch.<locals>.skip_for_returning)rArÈZ
_add_event)rÛrÓ)
rØr r¾Zselect_identity_tokenÚ select_fromr¹rºrÚexecuteZfetchall) r˜rhr™r[rArÈrýZ select_stmtr*rÚ matched_rowsrDr)rFrùs,
ÿþÿ!ûþz,BulkUDCompileState._do_pre_synchronize_fetchN)r«rËrÌr$rÝrÎrårþrrrrrr÷rør"r&rùrDrDrDrFrÏ\s: ø  
w
,
$
0
&
 
/
 
 
 
rÏríÚinsertc    sŠeZdZUGdd„deƒZdZded<edd„ƒZedd    d
d d d ddœdd„ƒZ    eddœ‡fdd„ ƒZ
edd„ƒZ dd„Z dd„Z ‡ZS)Ú BulkORMInsertc@sVeZdZUdZded<dZded<dZded<dZd    ed
<d Zded <dZ    ded <dS)z$BulkORMInsert.default_insert_optionsrÐr*rÑFr8Ú _render_nullsÚ_return_defaultsNr×rØTrÖÚ_populate_existing)
r«rËrÌrÑrÍr0r1rØrÖr2rDrDrDrFÚdefault_insert_optionsrs
     r3NzOptional[FromStatement]r»c    Cstj ddddh||j¡\}}||d<z|jd}Wn tk
rTdsPtdƒ‚Yn X|j|d    <|d
|ji7}|s |jd krŠ|d d i7}q¶|jdkr¶t     
d¡‚n|jd kr¶|d di7}|jdkrØ|sÌt j }n |  t j ¡}|sê|jrê| ¡| d|ji¡}|t |¡  d|i¡fS)NÚ_sa_orm_insert_optionsrêrèZpopulate_existingrërŸFrìr:rØrÐrÑrírbrîÚraw)r/r3rñròr¡rórqr:rÑrôrõrZ_orm_load_exec_optionsr…rÖrúrrû)    r˜rhr™r[rArÈrüÚinsert_optionsrŸrDrDrFrþ|sRüý
 
 
ÿ
 
ÿ
ÿ
ÿþz"BulkORMInsert.orm_pre_session_execr0z
dml.Insertr5r+r.r3ú_result.Result©rhr™r[rArÈr\rBc
Cs<| d|j¡}|jdkr"t d¡‚|jdkrD|j||p8i|d}|S|jdkrÄ|j}    |jdk    rt|    jrtt     d|    ›¡‚|    dk    s€t
‚|j dk    sŽt
‚t |    t dt|tƒr¦|gn|ƒ|j d    |j|j||d
}n&|jd krä|j||pÚi|d}nt
ƒ‚t|jƒsø|S|jr(| d tj¡}
|
d di7}
| d |
i¡}| ||||||¡S)Nr4)r5rbrírÐzHValid strategies for ORM insert strategy are 'raw', 'orm', 'bulk', 'autor5)rArbz`bulk INSERT with a 'post values' clause (typically upsert) not supported for multi-table mapper úIterable[Dict[str, Any]]F)r=r>r?r@rArírÅr2T)r¯r3rÑrôrör,rØZ_post_values_clauseZ_multiple_persistence_tablesrõrqÚ _transactionrGrr”rIr1r0r8rpr2rrÇr…rÊ) r˜rhr™r[rArÈr\r6rr:rÉrDrDrFÚorm_execute_statementÁs‚ ÿ
ÿ
ÿ
ÿþÿ þõ
ÿ
ÿ ÿúz#BulkORMInsert.orm_execute_statement)rBc sztttƒj||f|Žƒ}|dk    r*|j }nd}|s6|S|jd}|j dd¡}|dkrb| |¡n|dkrv|     ||¡|S)NTrŸrêr5rbrí)
rr/Úsuperr¼Ústackr¡r—r¯Ú_setup_for_bulk_insertÚ_setup_for_orm_insert)r˜r™rÀÚkwr¿Útoplevelr:rê©Ú    __class__rDrFr¼s þ
 
  z"BulkORMInsert.create_for_statementcs dd„‡fdd„| ¡DƒDƒS)NcSs&i|]\}}}|dk    r|jn||“qSrCrV)rKÚcolrr€rDrDrFr‚5sÿz<BulkORMInsert._resolved_keys_as_col_keys.<locals>.<dictcomp>c3s$|]\}}ˆj |¡||fVqdSrC)r°r¯r~rTrDrFr_7sz;BulkORMInsert._resolved_keys_as_col_keys.<locals>.<genexpr>)rm)r˜r:Zresolved_value_dictrDrTrFÚ_resolved_keys_as_col_keys3s
 
ÿþz(BulkORMInsert._resolved_keys_as_col_keyscCs0ttj|jƒ}}|j||||dd}||_dS)NF©rÂr¸)rrÚInsertr™rÄ)r¿rÀr:r™rÁrDrDrFr?<sûz#BulkORMInsert._setup_for_orm_insertcsvttj|jƒ}}|j}|d|d‰}| ¡}ˆ|_|jrX‡fdd„|j ¡Dƒ|_|j    ||||dd}||_dS)zÑestablish an INSERT statement within the context of
        bulk insert.
 
        This method will be within the "conn.execute()" call that is invoked
        by persistence._emit_insert_statement().
 
        Z_emit_insert_tableZ_emit_insert_mappercs i|]\}}|jˆkr||“qSrD©rR©rKrDÚval©Zemit_insert_tablerDrFr‚\s
þz8BulkORMInsert._setup_for_bulk_insert.<locals>.<dictcomp>TrFN)
rrrGr™r—Ú_clonerRÚ_dict_parametersrmrÄ)r¿rÀr™rÁÚanZemit_insert_mapperrDrKrFr>Hs&þ
þûz$BulkORMInsert._setup_for_bulk_insert)r«rËrÌr$r3r»rÍrÎrþr;r¼rEr?r>Ú __classcell__rDrDrBrFr/ps
 
DY
 r/Úupdatec
s¨eZdZedd„ƒZdd„Zdd„Zeddd    d
d d d dœ‡fdd„ ƒZedddddœddddddddœdd„ƒZedd„ƒZ    edd„ƒZ
edd„ƒZ edd „ƒZ ‡Z S)!Ú BulkORMUpdatecKsF| |¡}|j dd¡}|dkr.| ||¡n|dkrB| ||¡|S)NrêÚ unspecifiedrb)rírR)Ú__new__r—r¯Ú_setup_for_bulk_updateÚ_setup_for_orm_update)r˜r™rÀr@r¿rêrDrDrFr¼os
ÿ z"BulkORMUpdate.create_for_statementc Ks2|}|jjd}|j|_}| ||¡|_|j||ddd|jrNt|jƒ|_| ¡}|j    |_|j
rn|j|_
n|jr||j|_|  |j |¡}|r˜|j |Ž}tj|||f|Žd}    |j dd¡}
|j dd¡} | dk    rî|
dkoì|j|j||jd} |
dkr| rd}    |jt|j    jƒŽ}|j|||||    d    }||_dS)
Nr¤T©rAZprocess_criteria_for_toplevelFrçrårð)rßrF)rRr—r:r"rÙÚ_init_global_attributesr!rIrLr¬r rrÚwherer'Ú__init__r¯rårärßr>r£r¾rÄr™) r¿r™rÀr@rÁr­r:Únew_stmtÚnew_critr¸rçrårDrDrFrUsn  ü 
ÿ
ÿÿÿþ 
ÿûz#BulkORMUpdate._setup_for_orm_updatec s~ttj|ƒ}|j}|d|d‰}| ¡}ˆ|_tj|||f|Ž|jrTt     
d¡‚|j rt‡fdd„|j   ¡Dƒ|_ ||_ dS)zÑestablish an UPDATE statement within the context of
        bulk insert.
 
        This method will be within the "conn.execute()" call that is invoked
        by persistence._emit_update_statement().
 
        Z_emit_update_tableZ_emit_update_mapperzšbulk ORM UPDATE does not support ordered_values() for custom UPDATE statements with bulk parameter sets.  Use a non-bulk UPDATE statement or use values().cs i|]\}}|jˆkr||“qSrDrHrI©Zemit_update_tablerDrFr‚øs
þz8BulkORMUpdate._setup_for_bulk_update.<locals>.<dictcomp>N)rrZUpdater—rLrRr'rYr rôrõrMrmr™)r¿r™rÀr@rNÚ_rDr\rFrTÛs" þÿ
þz$BulkORMUpdate._setup_for_bulk_updater0z
dml.Updater5r+r.r3r7r8c     sØ| d|j¡}|jdkr"t d¡‚|jdkr¾|j }|jdksBt‚|jr\|jdkr\t d¡‚|j    }    |    dk    snt‚|j
dk    s|t‚t |    t dt |tƒr”|gn|ƒ|j
d    d    ||d
}
| ||||||
¡Stƒ ||||||¡SdS) Nræ)rírÐrbzBValid strategies for ORM UPDATE strategy are 'orm', 'auto', 'bulk'rbrðrïzÑbulk synchronize of persistent objects not supported when using bulk update with additional WHERE criteria right now.  add synchronize_session=None execution option to bypass synchronize of persistent objects.r9F)r=ryrzr{)r¯rÝrÑrôrörrÒrqrõrØr:r}rr”rIrr<r;) r˜rhr™r[rArÈr\rýr{r:rrBrDrFr;ÿsb ÿ
ÿ
ÿþÿ þö ú    úz#BulkORMUpdate.orm_execute_statementFrÞrrxr8rãcCsL|jo |jj}|sdS|r |jS|r*|jS|rH|jsHt d|j›d¡‚dS)NFú    Dialect "zæ" does not support RETURNING with UPDATE..FROM; for synchronize_session='fetch', please add the additional execution option 'is_update_from=True' to the statement to indicate that a separate SELECT should be used for this backend.T)Zupdate_returningr¬Úimplicit_returningZupdate_executemany_returningZupdate_returning_multifromrôÚ CompileErrorr¥©r˜rär:rßràrárâZ normal_answerrDrDrFråGs ÿ
 ÿzBulkORMUpdate.can_use_returningcsÞ|sdS|j}dd„|jDƒ}|j}|D]°‰| ‡fdd„|Dƒ|j¡}| |¡}    |    sXq(tˆƒ |¡}
|    j} |    j     
|
¡} | D]} | | kr|ˆ| | | <q||    j j   |    d| ¡|     | t| ƒ¡|
 
| ¡ | ¡}|r(|     | |¡q(dS)NcSsg|]
}|j‘qSrDrV)rKÚproprDrDrFrMuszDBulkORMUpdate._do_post_synchronize_bulk_evaluate.<locals>.<listcomp>c3s|]}ˆ|VqdSrCrDrf©ÚparamrDrFr_{szCBulkORMUpdate._do_post_synchronize_bulk_evaluate.<locals>.<genexpr>)rØrrÚ identity_mapÚidentity_key_from_primary_keyrÜZfast_get_staterŠÚ
differencerIÚ
unmodifiedrŒÚmanagerÚdispatchÚrefreshÚ_commitr£Ú_expire_attributes)r˜rhr[rrýr:Zpk_keysreÚ identity_keyrLÚevaluated_keysrNÚ to_evaluaterWÚ    to_expirerDrcrFrms4þ
 
ÿz0BulkORMUpdate._do_post_synchronize_bulk_evaluatecCs0| ||j ¡¡}| |||dd„|Dƒ¡dS)NcSsg|]\}}}}|||f‘qSrDrD)rKrrLrNr]rDrDrFrM¦s
z?BulkORMUpdate._do_post_synchronize_evaluate.<locals>.<listcomp>)rreÚ
all_statesÚ#_apply_update_set_values_to_objects)r˜rhr™rrýÚmatched_objectsrDrDrFrÿ˜sþ üz+BulkORMUpdate._do_post_synchronize_evaluatec    sˆˆj‰|j}|r0| ˆ|¡}‡fdd„|Dƒ}nˆj}‡fdd„‡‡fdd„dd„|DƒDƒDƒ}|sjdS| ˆˆ|dd„|Dƒ¡dS)Ncsg|]}t|ƒˆjf‘qSrD©rsrÜ©rKr ©rýrDrFrMµsÿz<BulkORMUpdate._do_post_synchronize_fetch.<locals>.<listcomp>cs g|]}|ˆjkrˆj|‘qSrD)re)rKrn)rhrDrFrM¼s
ôcs6g|].\}}ˆjdks |ˆjkrˆjt|ƒ|d‘qS)Nr)rÜrfr£)rKr¾ré)Ú target_mapperrýrDrFrM¾s
 
øþcSs g|]}|dd…|df‘qS)réÿÿÿÿrDrvrDrDrFrMÃscSs"g|]}|t |¡t |¡f‘qSrD)r Úinstance_stateÚ instance_dict)rKrrDrDrFrMÓs
üý)rØÚreturned_defaults_rowsrrÛrs)    r˜rhr™rrýr|Úpk_rowsr-ÚobjsrD)rhrxrýrFr©s8ÿ
þ
 ÿûþúüz(BulkORMUpdate._do_post_synchronize_fetchc    Cs2|j}|j}t |¡}| ||¡}| ||¡}    i}
|    D]@\} } z| t t    j
| ¡¡} Wntj k
rlYq6X| |
| <q6t |
  ¡ƒ}dd„|    Dƒ}tƒ}|D]†\}}}|j |¡}|D]} | |kr¶|
| |ƒ|| <q¶|jj |d|¡| |t |ƒ¡| |¡ |¡}|r| ||¡| |¡qœ| |¡dS)zeapply values to objects derived from an update statement, e.g.
        UPDATE..SET <values>
 
        cSsh|] \}}|’qSrDrDr~rDrDrFÚ    <setcomp>øszDBulkORMUpdate._apply_update_set_values_to_objects.<locals>.<setcomp>N)rØrªrrr"r&rrr“rr–rr£r‹rŠrhrŒrirjrkrlrgrmÚaddZ_register_altered)r˜rhrýr™rtr:rrr$Zresolved_keys_as_propnamesZvalue_evaluatorsrWÚvalueZ
_evaluatorroÚattribrtrrLrNrprqrDrDrFrsÝs@
 ÿ  ÿ
    z1BulkORMUpdate._apply_update_set_values_to_objects)r«rËrÌrÎr¼rUrTr;rårrÿrrsrOrDrDrBrFrQms(
\$ Gø %
*
 
3rQÚdeletec
s€eZdZedd„ƒZeddddddd    d
œ‡fd d „ ƒZed d d d dœddddddddœdd„ƒZedd„ƒZedd„ƒZ‡Z    S)Ú BulkORMDeletec Ksú| |¡}|}|jjd}|j|_}|j||ddd| ¡}|j|_| |j|¡}    |    rd|j    |    Ž}t
j |||f|Žd}
|j  dd¡} |j  dd¡} | dk    rÆ| dkoÄ|j |j||j|j  dd¡d    } | rÜd}
|j|jjŽ}|j|||||
d
}||_|S) Nr¤TrVFrçrårðrá)rßrárF)rSrRr—r:rWrLr¬rrrXr%rYr¯rårärßr>r¾rÄr™) r˜r™rÀr@r¿rÁr­r:rZr[r¸rçrårDrDrFr¼sh
  üÿ
ÿÿÿüþ ûz"BulkORMDelete.create_for_statementr0z
dml.Deleter5r+r.r3r7r8csL| d|j¡}|jdkr"t d¡‚|jdkr6t d¡‚tƒ ||||||¡S)NrærbzˆBulk ORM DELETE not supported right now. Statement may be invoked at the Core level using session.connection().execute(stmt, parameters))rírÐz:Valid strategies for ORM DELETE strategy are 'orm', 'auto')r¯rÝrÑrôrõrör<r;)r˜rhr™r[rArÈr\rýrBrDrFr;]s( ÿ
ÿ
ÿÿz#BulkORMDelete.orm_execute_statementFrÞrrxr8rãcCsB|jo |jj}|sdS|r |jS|r>|js>t d|j›d¡‚dS)NFr^zè" does not support RETURNING with DELETE..USING; for synchronize_session='fetch', please add the additional execution option 'is_delete_using=True' to the statement to indicate that a separate SELECT should be used for this backend.T)Zdelete_returningr¬r_Zdelete_returning_multifromrôr`r¥rarDrDrFrå€s ÿ
 ÿzBulkORMDelete.can_use_returningc CsZ| ||j ¡¡}g}|D],\}}}    }
|
r<| |    |jj¡q| |¡q|rV| |¡dSrC)rrerrZ_expireZ    _modifiedrÚ_remove_newly_deleted) r˜rhr™rrýrtZ    to_deleter]rLrNZis_partially_expiredrDrDrFrÿªsþ z+BulkORMDelete._do_post_synchronize_evaluatec sŒˆj}|j}|r0| ||¡}‡fdd„|Dƒ}nˆj}|D]L}    |    dd…}
|    d} |jt|
ƒ| d} | |jkr:| t     |j| ¡g¡q:dS)Ncsg|]}t|ƒˆjf‘qSrDrurvrwrDrFrMËsÿz<BulkORMDelete._do_post_synchronize_fetch.<locals>.<listcomp>rryr)
rØr|rrÛrfr£rer…r rz) r˜rhr™rrýrxr|r}r-r r¾rérnrDrwrFr¾s2ÿ
þ þ
ÿÿÿz(BulkORMDelete._do_post_synchronize_fetch)
r«rËrÌrÎr¼r;rårÿrrOrDrDrBrFr„s
G "ø )
r„)..)..)NN).T).T)NT)OÚ__doc__Ú
__future__rÚtypingrrrrrrr    r
r Úr rrrr#rrÚbaserrrrrrôrZenginerrr‡Zsqlrrrrr r!Zsql.baser"r#r$Zsql.dmlr%r&r'r(Z util.typingr)Ú_typingr*r+r,r:r-rhr.r/r0r1rLr2r3r4Zengine.interfacesr5Úobjectr6rGr}rkrrÏZ
plugin_forr/rQr„rDrDrDrFÚ<module>
s¼                                                    ø" ø"ø ù  ù ù[r
}
(