id^dZddlmZddlmZddlZddlmZddlmZddlmZ dd lm Z dd lm Z dd l m Z dd l mZd dlmZd dlmZd dlmZd dlmZd dlmZdZdZd=dZdZdZdZdZdZ d>dZ d=dZdZdZ d?d Z! d?d!Z"d"Z#d#Z$d$Z%d%Z&d&Z'd'Z(d(Z)d)Z*d*Z+Gd+d,e,Z-Gd-d.e-Z.Gd/d0e-Z/Gd1d2e-Z0Gd3d4e-Z1Gd5d6e.e0Z2Gd7d8e.e1Z3Gd9d:e/e0Z4Gd;dz _bulk_insert..7s@@@euej)@@@cg|]\}}|Srr)rrdict_s rrz _bulk_insert..8s;;;.5%;;;rcg|] }|j Srrrs rrz _bulk_insert..:999u 999rc 3>K|]\}}}}}}}}d|| |||fVdSNr) rr state_dictparamsmpconn value_params has_all_pkshas_all_defaults connectionmappers r z_bulk_insert..Csk    #        rc3$K|] }d|fV dSr"rrmappingr*r+s rr,z_bulk_insert..Ys,MM$4MMMMMMrT)bulkreturn_defaults render_nulls bookkeepingcg|] }|j Srkey)rps rrz _bulk_insert..ksDDDA!%DDDrc g|] }| Srr)rr7rs rrz _bulk_insert..os<<>$// <._changed_dict..sO  1E)))Q+-=-=F-=-=-=-=  r)rrA)r+rrYs `r _changed_dictz#_bulk_update.._changed_dict~sO      ((**      rc(g|]}|Srr)rrrZr+s rrz _bulk_update..s%KKK fe44KKKrcg|] }|j Srrrs rrz _bulk_update..r rzJconnection_callable / per-instance sharding not supported in bulk_update()c3XK|]$}d|jr|jjndfV%dSr")_version_id_propr7r.s rr,z_bulk_update..sg  "2" 7 ;<<!       rT)r0Fr3)r:r;_primary_key_propkeysr^r7unionr?r<r=r>r*r@rArB_collect_update_commands_emit_update_statements) r+rHrIrJupdate_changed_onlyr:rKrMrNrOrZr*rYs ` @@@r _bulk_updaterdss$K0==.K G.2399+FF      "  :KKKKK(KKKHH99999HH>>"6 ! -   %// <.sI  ;UJ  FJ>      rc30K|]\}}}}}||||dfVdS)TNr)rrr#r+r*update_version_ids rr,zsave_obj..sR  %  FJ=      r)batch _sort_statessave_objr;_organize_states_for_saveappendr@rA _pks_by_tablerCrarbrD _finalize_insert_update_commandsr)r:rLuowtransactionrfrstates_to_updatestates_to_insertrKrr+r* has_identity row_switchrirMinsertupdates rrlrls ++!+v66 H HE [5'>$ G G G G G0== #; G GHH     H: H  # #vz3DE      # #UE6:$F G G G G$399;;  v , , , )%1ABB) E#3                       %   ?O     &      rc "t|}tt|||}|jD]E\jvrfd|D}t ||||}t||||FdS)z\Issue UPDATE statements on behalf of a relationship() which specifies post_update. c 3K|]<\}}}}|jv||||j||jndfV=dSr")roversion_id_col#_get_committed_state_attr_by_column)rrr# sub_mapperr*r+rMs rr,zpost_update..s  :z:z 000(4:::v'< 1000  rN)r;r? _organize_states_for_post_updater@rAro_collect_post_update_commands_emit_post_update_statements) r:rLrqpost_update_colsrKrrrwr+rMs @@r post_updaters 1==(fnMM%399;;  v , , ,      >N    / 8H   %           1  rc t|}tt|||}|j}t t|D]I}||}||jvr|jr|jr#t||||}t||||||J|D]$\} } }} } |j || | %dS)zIssue ``DELETE`` statements for a list of objects. This is called within the context of a UOWTransaction during a flush operation. N) r;r?_organize_states_for_deleter@reversedkeysroinheritspassive_deletes_collect_delete_commands_emit_delete_statementsdispatch after_delete) r:rLrqrKstates_to_deletetable_to_mapperrMr+deleterr#r*ris r delete_objr;s*1==#KHH"0O$33556677   ' , , ,  _ !7  ) 0@               @@  $$VZ????@@rc #Kt|||D]\}}}}t|j}|jp||}dx} } |s|j|||n|j||||jr|||||s||jj vr|jj |} tj | } | | s| | s7tjdt!|d|dt!| |d|t!|t!| || | } |s| r0|j)|| r| n|| r| jn||j} |||||| | fVdS)aTMake an initial pass across a set of states for INSERT or UPDATE. This includes splitting out into distinct lists for each, calling before_insert/before_update, obtaining key information for each state including its dictionary, mapper, the connection to use for the execution per state, and the identity flag. Nz New instance z with identity key z$ conflicts with persistent instance zPdetected row switch for identity %s. will update %s, remove %s from transaction)_connections_for_statesboolr7_identity_key_from_stater before_insert before_update_validate_polymorphic_identityr< identity_maprinstance_statewas_already_deleted is_deletedorm_exc FlushErrorr _log_debugremove_state_actionsrzr{r) r:rLrqrrr+r*rt instance_keyruriinstanceexistings rrmrmisX-D^V--B B (ufjEI yJF$C$CE$J$J )-- & E O ) )&*e D D D D O ) )&*e D D D  0 H  1 1&% G G G & 6 CCC%-:<HH!0::H!55h?? &%00::!,,%U++++\\\9X;N;N;NP &&"!e$$h'' 33H===%  J F,A,M & J J(3 e#-8 5%!!             uB B rc$t|||S)zMake an initial pass across a set of states for UPDATE corresponding to post_update. This includes obtaining key information for each state including its dictionary, mapper, the connection to use for the execution per state. )r)r:rLrqs rr}r}s #; G GGrc#Kt|||D]R\}}}}|j||||j||||j}nd}|||||fVSdS)zMake an initial pass across a set of states for DELETE. This includes calling out before_delete and obtaining key information for each state including its dictionary, mapper, the connection to use for the execution per state. N)rr before_deleterzr{)r:rLrqrrr+r*ris rrrs-D^V-- D D(ufj %%fj%@@@  , & J Juf3!!  !% eVZ1BCCCCC D Drc #K|D]\}}}}||jvri} i} |j|} |j|} t| |D]{} || }| | }||| vr|s|sTt |dst |tjr*t |dr| n|| |<q|| |j <||sE|j | |  d| DD]}d| |<|r|rP|j || }|jjr!|j|| }nd}ndx}}|jdur=|j6|j|j|vr"|d| |jj <||| ||| ||fVdS)zSIdentify sets of values to use in INSERT statements for a list of states. N__clause_element__cg|] }|j Srr6)rcs rrz,_collect_insert_commands..s999qQU999rTF)ro_propkey_to_col_insert_cols_evaluating_noneset intersectionhasattr isinstancer ClauseElementrr7_insert_cols_as_none difference_pk_keys_by_tableissubsetr:eager_defaults_server_default_colsversion_id_generatorrz_cols_by_table)rMrsr0r1r2rr#r+r*r$r'propkey_to_col eval_nonepropkeyvaluecolcolkeyr(r)s rrCrCsz2BJ J -z6: , , ,  /67> >**77 CC ( (Gw'E )C}I!5!5l!5 (344 (eS%677 ( u&:;;E,,...S!! #(sw &+E2F##99L999:: & & "&v 2 2!259BB6JJK!0 (#)#>u#E#N#N$$  $(  -1 1 {  'u 4 4%1%)>u)EEE060K0K11F6(, -          CJ J rc #K|D]\}}}}||jvr|j|}i} |j||r]tfdt|j|D} d} ni} t|jD]} | } | }t| dst| tj r*t| dr| n| | |<f|j | j| |j| dur | | |j<|jjr!|j|| } nd} ||j|j|vr|sa| s_| s]|jD]A}|j |jj|t4j}|jrnB|j}| o| }|| |j<|s |j| vr)|jdur ||}|| |j<n|jdur |r || |j<n| s| sjd}d}|rHtfdt|j|D}ni}|D]}|j|j} |j | j|t4j}|jrb|j r d||f|jvr3d}|jd||j<| !|jdn1|j d||j<|| vrd}n|j"d||j<||jtGj$d |d || s| r#| %||| ||| | |fV|r2|j&|D]$\}}tOj(|||||||j)%dS) atIdentify sets of values to use in UPDATE statements for a list of states. This function works intricately with the history system to determine exactly what values should be updated as well as how the row should be matched within an UPDATE statement. Includes some tricky scenarios where the primary key of an object might have been changed. c3BK|]}|j|fVdSr"r6rrrr#s rr,z+_collect_update_commands..XsI (,j.ABrTrNFc3\K|]&}|j|fV'dSr")_labelgetrs rr,z+_collect_update_commands..sP (/1H1HIr pk_cascadedrzCan't update table , using NULL for primary key value on column )*rorrrrr_pk_attr_keys_by_tablerVrrrrrmanagerimplis_equalr7r:r_server_onupdate_default_colsrrzr_columntopropertyvalues get_historyrPASSIVE_NO_INITIALIZEaddedrr PASSIVE_OFFdeletedpop unchangedrrrw_table_to_equatedr populatepassive_updates)rqrMrrr0rr+r*ripksr'r$r)rrrprophistory no_paramsvalr(expect_pk_cascaded pk_paramsm equated_pairsrr#s @@rrara6s(  hh   , , , "5) /6 ) (">22j))F9%@AA F $  F~..;;% , ,#7+$W-5"677,:3,<<, #5*>??#00222"!%%M'*/88u4W=   ',F37O!0 (8?(6""! $(   )%)>u)EEE  <  #4;;==D#mDH5:FFz:+KG}'C" 7<'7I!2F3:  4v---U::112CDD"%sw,55)5 #4sw L   " & ">22??1%8  III   237;-05AA:z'==A#O 0)5#6)455.2*07 a0@ #*- 37D1111180B #*-,..*/K,3,=a,@Icj)SZ(0!,,49EE33@1  \  MM) $ $ $         %+$u)EEE0AF6(, -j     =!!rTc zjduojjvfd}|df|}t|dD]h\\} } } } } }d}t |}|}d}| s|}d}nJ|r%| s#jjr|}d}n#j|j}d}|s | jj n | jj }|o | jj }| o }| rm|D]i\}}}} }} } | | ||}|r't|||||jjd|d ||jz }|}jn|s`|}|D]Z\}}}} }} } ||  ||}|r't|||||jjd|d ||jz }[nd|D}|p|ot%|d k}||  ||}||jz }|D]4\}}}} }} } |r't|||||jjd|d 5|rA|t%|kr,t'jd jt%||fzEr!t-jd |jjzjdS) z`Emit UPDATE statements corresponding to value lists collected by _collect_update_commands().Nctj}jD]>}|j|tj|j|jk?rK|jjtjjjjjk |}|SN)type_) rand_roclausesrn bindparamrtyperzrwclauserstmtr+needs_version_idrMs r update_stmtz,_emit_update_statements..update_stmt_s'.  C N ! !s}SZsx@@@@       N ! !%=)0 /4   ||F## rrwc|dt|dt|d|d|dfSNr rrrecs rz)_emit_update_statements..z8 F AKK QLL F F  rrFTcg|] }|d Sr rrrs rrz+_emit_update_statements..s999#s1v999rrMUPDATE statement on table '%s' expected to update %d row(s); %d were matched.MDialect %s does not support updated rowcount - versioning cannot be verified.)rzr_memorr?r1r:rdialectsupports_sane_rowcount supports_sane_rowcount_returningsupports_sane_multi_rowcountexecuter _postfetchcontextcompiled_parametersrowcountlenrStaleDataError descriptionrwarndialect_description)r:rqrKr+rMrwr4r cached_stmtr* paramkeyshasvaluer)r(rOrows statementr1assert_singlerowassert_multirowallow_multirowrr#r$r'rcheck_rowcount multiparamsrs `` @rrbrbNsX T) B  !V%:5%A A (##Xu$5{CCK     WW HY*:Kw--  #!1133I"OO  #$ #"1 # "1133I"OO  " .!11&2GHHI"O# EJ  5 5#D   @"? *B2B.B [  2 2  &&y'7'7 'E'EvNN &" 5a8$    "!11 24"@ !1''  $*:6>>!6A # ""*!!&I9!<(    AJ&DD7'::9999 !0"$>[)9)9Q)>'z2::{ "  $" ""*!!&I9!<(      s7||##,9(#g,,=>$  I3)/0   gWWrc D|d|f|j}t|dD]\\}} } } } } |}|r| s|jr |jjs| r| st | } d| D}||||}|rTt| |j j D]9\\}}}}}}} } }|rt||||||||d (t|||:| s|jr| }n!|j| |j}| D]\}}}}}}} } |r*||||}n||||}|j j}|Xt||j|D]<\}}|j|}|(||vs||j |||j<=|r;|r(t|||||||j j d|d t|||dS)z`Emit INSERT statements corresponding to value lists collected by _collect_insert_commands().rvc|dt|dt|d|d|dfSrrrs rrz)_emit_insert_statements.."rrcg|] }|d Srrrs rrz+_emit_insert_statements..9s555c3q6555rFNr)rrvrrrimplicit_returningr?rzipr r r _postfetch_bulk_saver1rzrinserted_primary_keyrorrr7)r:rqrKr+rMrvr4rr*pkeysrr(r)rOrrrrr#r$ mapper_recr&r'last_inserted_paramsresult primary_keypkrrs rrDrDsS##Xu$5u|DDK     pLpL DUHk3C ` L!` L#1 ` L ")< ` L` L` L7mmG55W555K":.66y+NNA L!)"?@@LL  ""$#(( L"&*!!&0(!    -ZUKKKK$ M (B M%5577 &2%55f6KLL . L. L   '//!((66FF0 ;CC!6F%nA *#&#V%9%%@$$66C *;C@><//)~~dh77?35Jtx0L L"&*!!&""N>qA(!    -ZUKKK]. LEpLpLrc jduojjvfd}|df|}t|dD]\}} d} t | } |d} j | jjn | jj} | o | jj}  p| }|sY| }| D]S\}}}} }||  ||}t||||||j j d| |j z } Tnyd| D}| p| ot|dk}||  ||}| |j z } | D]-\}}}} }t||||||j j d.|rA| t| kr,tjdjt| | fzhr!t%jd |jjzdS) zeEmit UPDATE statements corresponding to value lists collected by _collect_post_update_commands().Nctj}jD]>}|j|tj|j|jk?rK|jjtjjjjjk |}j| j}|Sr) rrrorrnrrrrzrwr1rs rrz1_emit_post_update_statements..update_stmts'.  C N ! !s}SZsx@@@@       N ! !%=)0 /4   ||F##  ,''(=>>D rrc<|dt|dfS)Nr)rrs rrz._emit_post_update_statements..sSVSQ[[)rrcg|] \}}}}}| Srr)rrr#r$r&r$s rrz0_emit_post_update_statements..s2?E:z4rrrr)rzrrrr?rrrrr_postfetch_post_updater r r r rrrrrr)r:rqrKr+rMrwrrr7rOrr*rrrrrr#r$r$rrrs `` @rrrs T) B  !V%:5%A A 0!!=%"8+FFI  ))GG Ww--V $,   5 5#D   @"? .-@$ -NEL # #Az:z6&z2::9fMM&"I1!4 " #CJK - :S%5%5%: #:.66y+NNA AJ DEL  Az:z6&"I1!4  s7||##,9(#g,,=>$  I3)/0   GGGrc"jduojjvfd}|df|}t|dD]<\}} d| D} ||}t | } d} d} rx|jjsl|jjr(d} | D]"}|||}| |j z } #nYtj d |jj z||| n!||| }sd } |j } |j rm| dkrg| | kra|jjst | d krB| r!tj d j| | fztjd j| | fz>dS) z`Emit DELETE statements corresponding to value lists collected by _collect_delete_commands().Nctj}jD]>}|j|tj|j|jk?rK|jjtjjjjjk |Sr) rrrorrnrr7rrzr)rrr+need_version_idrMs r delete_stmtz,_emit_delete_statements..delete_stmts'.  C N ! !s}SWCH====       N ! !%=)-V5J5O   ||F###rrc|dS)Nrrrs rrz)_emit_delete_statements.. s Arcg|]\}}|Srr)rr$r*s rrz+_emit_delete_statements..!s==="4&*v===rFrzMDialect %s does not support deleted rowcount - versioning cannot be verified.TrzDELETE statement on table '%s' expected to delete %d row(s); %d were matched. Please set confirm_deleted_rows=False within the mapper configuration to prevent this warning.)rzrrrr rrrrr rrrconfirm_deleted_rowsrrr)r:rqrKr+rMrr2rr*recs del_objectsexpected rows_matched only_warnr$rr1s `` @rrrsX T) B  !V%:5%A A $$$$$$$"!!8U"3[AAI#F,>,>??== D===== ' 3 {##    &&C &!8 ; *//F"**9f==A AJ.LL/ 7 (<= ""9k::::""9k::A" ! :L  , r!!L(("?){##q((   =((LA B,=((LA Bo==rc6 |D]\ }}}}|jrC  fd|jD}|r  j|g}|jr2| j|j|j <|j dur3|j j j vr ||j j g|rO|  _ tj|j| j ||s|j|| n|j|| |j dur-|j &||j j t-jddS)zzfinalize state on states that have been inserted or updated, including calling after_insert/after_update events. cg|]A}|jr|jr*|jjvs|js|js|jjv:|jBSr)expire_on_flushdeferredr7r)rr8rs rrz4_finalize_insert_update_commands..is{   )  "#  01u /B/B-0C!" 0C E33E433rNF) refresh_stateonly_load_propsz2Instance does not contain a non-NULL version value)_readonly_propsunmodified_intersection_expire_attributesrrextend_unloaded_non_objectr&_server_default_plus_onupdate_propkeysrzrr^r7unloadedrr load_on_identr<queryr after_insert after_updaterr) r:rqrLr#r+r*rtreadonly toload_nowrs @rrprp`s @F>>;z6:|  ! ?44    #3   H ?((X>>>   %    *77A     ! -+u44&*en<<!!6#:#>"?@@@  #<(Hy>>rc||rdS|jjj}|jjj}j,jj|vrt|jgz}tj j j } | rg} |D][} | j |vrP| j vrG|| j |j | j <| r%| j | j \| r#| r!j j ||| |r)||jfd|DdSdS)NcFg|]}|jv j|jSrrr7rrr+s rrz*_postfetch_post_update..<   000(+/000r)rr compiledprefetch postfetchrzrr?r class_managerr refresh_flushr7rrnrDr) r+rqrMrrr&r$ prefetch_colspostfetch_colsrXload_evt_attrsrs ` rr.r.s  ''N+4M^,6N )  !V%:5%A A A]++v/D.EE -6DEEM GG 5F??qF$<<<5;AE]E&*1-1 2 G%%f&>q&A&EFFF  %33 >>       J    '          rc |jjj} |jjj} |jjjj,jj|vrt| jgz} tj j j } | rg} ro|jj } | aD]^}|j r |jjrj|}|r,| |||j<| r| |j_| D][}|j|vrP|jvrG||j|j|j<| r%| j|j\| r#| r!j j ||| |r#|r!| fd|D| r'||jfd| Dj|D]$\}}t/j||||||j%dS)zExpire attributes in need of newly persisted database state, after an INSERT or UPDATE statement has proceeded for that state.Nc*g|]}|jr|v |Sr)r')rrreturning_colss rrz_postfetch..s:   ? (+.'@'@'@'@'@rcFg|]}|jv j|jSrrQrRs rrz_postfetch..rSr)r rTrUrV returningrzrr?rrWrrXreturned_defaultsr'isinsertrrr7rnrErDrrr rr)r+rqrMrrr&r$r'isupdaterYrZrXr[rowrrrrrr^s` @rr r sN+4M^,6N^,6N )  !V%:5%A A A]++v/D.EE -6DEEM8n. ?% 8 8?v~'> /33C888&)#hE$(O$8&--dh777 GG 5F??qF$<<<5;AE]E&*1-1 2 G%%f&>q&A&EFFF  %33 >>     L       '          J    '      #4U;   =      "       rcX|j|D]\}}tj|||dSr")rr bulk_populate_inherit_keys)r+rrMrrs rr!r!/sD"4U;AA= 'q-@@@@AArc# K|jjr |jj}n|j|}d}t ||D];}|r|||}|jj}||j||fV.Qs"T++&6,  r)r PopulateDict)r:s`rr;r;Ns,        rc|t|}td|D}|| t||j}nB#t$r5}t jtjd|z|Yd}~nd}~wwxYwt|tj d|zS)Nc3(K|] }|j |VdSr"r6)rss rr,z_sort_states..Ys)==115+@CD              wH/??@@@  sA B +BBceZdZdZdZdZedZedZ dZ dZ dZ e jd d Zd Zd Zd S)BulkUDz;Handle bulk update and deletes via a :class:`_query.Query`.c|d|_|j|_|dS)NF)enable_eagerloadsrJ _bind_mapperr+_validate_query_state)selfrJs r__init__zBulkUD.__init__qsD,,U33 j--//  ""$$$$$rc <dddtjfdddtjfdddtjfdd dtjfd d dtjfd d dtjffD]>\}}}}|t|j||st jd|d?dS)N_limitzlimit()_offsetzoffset() _order_byz order_by()F _group_byz group_by() _distinctz distinct() _from_objz2join(), outerjoin(), select_from(), or from_self()rz1Can't call Query.update() or Query.delete() when z has been called)r}is_eqgetattrrJr{r|)rattrmethnamenotsetops rrzBulkUD._validate_query_statevs y$ 5  D(, 7 ,x| < ,x| < ,x| <D   +    &D(FB2gdj$//88 0019<   rc|jjSr")rJr<rs rr<zBulkUD.sessions z!!rc  ||}||S#t$r`}tjtjddt d|Dz|Yd}~dSd}~wwxYw)Nz3Valid strategies for session synchronization are %sz, c34K|]}t|VdSr")repr)rxs rr,z"BulkUD._factory..s(0I0IQa0I0I0I0I0I0Irrs)KeyErrorrrzr{ ArgumentErrorjoinrw)clslookupsynchronize_sessionargklassrs r_factoryzBulkUD._factorys ./E5#;     K$ $ &0I0I&0I0I0I*I*I J JL!$            s A9AA44A9c||||||dSr")_do_before_compile_do_pre_do_pre_synchronize_do_exec_do_post_synchronize_do_postrs rexec_z BulkUD.exec_sc !!!    """  !!### rcr|j||j|_|jj|_dSr")rJ _execute_crudr+r&r )rrs r _execute_stmtzBulkUD._execute_stmts-j..tT[AA  , rctr")r>rs rrzBulkUD._do_before_compiles!###rzsqlalchemy.orm.querycn|j}|||_t|jd|jrt }|jD]T}t||js|n(|t|j Ut|dkrtj d||_n$|djj|_|j}|jr|dSdS)NrrzLThis operation requires only one Table or entity be specified as the target.)rJ QueryContextr r _entities _ColumnEntityrclearrwrcolumnr r{r|r primary_table_only_entity_zeror+ local_tabler< _autoflush)rquerylibrJtablesentr<s rrzBulkUD._do_pres9 ,,U33 eoa((*@ A A !UUF = =!#x'=>>=LLNNNEMM- ";";<<<<6{{a09 &,ZZ\\"""'!8!85""[   -   !     ! !rcdSr"rrs rrzBulkUD._do_pre_synchronize rcdSr"rrs rrzBulkUD._do_post_synchronizerrN)__name__ __module__ __qualname____doc__rrpropertyr< classmethodrrrrr dependenciesrrrrrrrrnsEE%%% (""X"  [ ---$$$T-.. ! !/. !D        rrceZdZdZdZdZdS) BulkEvaluatezDBulkUD which does the 'evaluate' method of session state resolution.cdSr"r)revaluator_compilers r_additional_evaluatorsz#BulkEvaluate._additional_evaluatorsrrc|j}|j tj}|j||jnd||nG#tj$r5}tj tj d|z|Yd}~nd}~wwxYwfd|j jD|_dS)NcdS)NTr)ris reval_conditionz8BulkEvaluate._do_pre_synchronize..eval_conditions4rztCould not evaluate current criteria in Python: "%s". Specify 'fetch' or False for the synchronize_session parameter.)from_cg|]?\\}}}}t|tj|j2|=|@Sr) issubclassrrexpired)rrr(identity_tokenrir target_clss rrz4BulkEvaluate._do_pre_synchronize..sx #z** -c22: s##  r)rJ _mapper_zeroclass_rEvaluatorCompiler whereclauseprocessrUnevaluatableErrorrrzr{r|r<rrAmatched_objects)rrJrrrrs @@rrz BulkEvaluate._do_pre_synchronizes> ''))0  !*!t|j|}|| |dt |tj r)|| || ||f| ||f|S)NrA) rrrAr+rr string_typesr rE_bulk_update_tuplesrQueryableAttributern)rrrWrXdescs r_resolved_valueszBulkUpdate._resolved_values/s t{G,, DK      & &DAq { &a!233*-dk1==DMM$":":1"="=>>>>:#@AA*MM!"7"7":":;;;;MM1a&)))) q!f%%%% rcg}|jD]\}}t|tjr||j|f**55kBB    JJu    !!&)))))rN)rrrrrrrrrrrs<%%*****rrceZdZdZdZdS)rzSBulkUD which handles DELETEs using the "evaluate" method of session resolution.cb|jjd|jDdS)Nc6g|]}tj|Sr)rr)rris rrz;BulkDeleteEvaluate._do_post_synchronize..s# L L LZ &s + + L L Lr)rJr<_remove_newly_deletedrrs rrz'BulkDeleteEvaluate._do_post_synchronizes= 00 L Lt7K L L L     rNrrrrrrrrrrs-%%     rrceZdZdZdZdS)rzPBulkUD which handles UPDATEs using the "fetch" method of session resolution.c|jj|jtfdfd|jDD}|j}td|D}|D]4}||j}|r||5 |dS)Nc`g|]*}|jv tjj|+Sr)rrr)r identity_keyr<s rrz8BulkUpdateFetch._do_post_synchronize..sH     7#777)'*>|*LMM877rcTg|]$}t|%Sr)identity_key_from_primary_keyr?)rr' target_mappers rrz8BulkUpdateFetch._do_post_synchronize..sF%%%$"??[))%%%rc3 K|] \}}|V dSr"r)rrWrXs rr,z7BulkUpdateFetch._do_post_synchronize..s&**41aQ******r) rJr<rrrrrr _expire_stater#)rrLrattribr to_expirer<r1s @@rrz$BulkUpdateFetch._do_post_synchronizes*$ //11     %%%%(,'8 %%%      8**6***** 8 8E++EJ77I 8%%eY777!!&)))))rNr*rrrrrs-%%*****rrceZdZdZdZdS)rzPBulkUD which handles DELETEs using the "fetch" method of session resolution.c |jj}|j}|jD]`}|t |}||jvr3|tj |j|gadSr") rJr<rrr0r?rr)rr)rr<r1r'r.s rrz$BulkDeleteFetch._do_post_synchronizes*$ //11 ,  K)FF[!!Lw333--"1#0>  rNr*rrrrrs-%%rr)F)FFF)T)6r itertoolsrrr}rrrrr r baser r r{rrrsql.baserrRrdrlrrrmr}rrCrar~rrbrDrrrpr.r r!rr;rkobjectrrrrrrrrrrrrr=s$$$$$$$$$$$$MMM`B B B JSSSSl* * * Z+@+@+@\N N N b H H HDDD6  U U U U r38vvvvr5@5@5@p$!$!$!\~~~~P~L~L~L~LBpppfZZZzCCCL& & & R] ] ] @AAA 4444.e e e e e Ve e e P* * * * * 6* * * Z        Y1Y1Y1Y1Y1Y1Y1Y1x 1 1 1 1 1 1 1 1F&*&*&*&*&*z&*&*&*R     z   *****i***<ir