
    +hI                       d Z ddlmZ ddlmZ ddlZddlmZ ddlmZ ddlmZ	 dd	lm
Z
 dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddl m!Z! ddl m"Z" ddl m#Z# ddl$m%Z% ddl&m'Z' d  Z(d! Z)dDd"Z*d# Z+d$ Z,d% Z-d& Z.d' Z/	 	 	 dEd(Z0	 dDd)Z1d* Z2d+ Z3	 dFd,Z4	 dFd-Z5d. Z6d/ Z7d0 Z8d1 Z9d2 Z:d3 Z;d4 Z<d5 Z= ej|                         Z? G d6 d7e      Z@ G d8 d9      ZA ej                  d:d;       G d< d=eAe"             ZC ej                  d:d>       G d? d@eAe#e@             ZD ej                  d:dA       G dB dCeAe!e@             ZEy)Gzprivate module containing functions used to emit INSERT, UPDATE
and DELETE statements on behalf of a :class:`_orm.Mapper` and its descending
mappers.

The functions here are called only by the unit of work functions
in unitofwork.py.

    )chain)groupbyN   )
attributes)	evaluator)exc)loading)sync)NO_VALUE)	state_str   )future)sql)util)result)	coercions)
expression)	operators)roles)select)sqltypes)_entity_namespace_key)CompileState)Options)DeleteDMLState)InsertDMLState)UpdateDMLState)BooleanClauseList)LABEL_STYLE_TABLENAME_PLUS_COLc           	            j                   }|j                  j                  rt        d      |rL|r0|D cg c]  }||j                  f }}|D 	cg c]  \  }}	|		 }}}	n%|D cg c]  }|j                   }}nt        |      }|j                  |      |j                  j                         D ]L  \  }
} j                  |      s fdt        |
 fd|D        d||      D        }t        |d ||
||       N |r`|r] j                  } j                  D cg c]  }|j                   }}D ](  \  }}	|t        |D cg c]  }|	|   	 c}      f|_        * y y y c c}w c c}	}w c c}w c c}w c c}w )NzJconnection_callable / per-instance sharding not supported in bulk_insert()c           	   3   D   K   | ]  \  }}}}}}}}d ||
	|||f  y wN ).0state
state_dictparamsmpconnvalue_paramshas_all_pkshas_all_defaults
connectionmappers            M/var/www/html/venv/lib/python3.12/site-packages/sqlalchemy/orm/persistence.py	<genexpr>z_bulk_insert.<locals>.<genexpr>O   sM      
	 #  	
s    c              3   *   K   | ]
  }d |f  y wr"   r#   r$   mappingr-   r.   s     r/   r0   z_bulk_insert.<locals>.<genexpr>e   s     M$4Ms   T)bulkreturn_defaultsrender_nullsbookkeeping)base_mappersessionconnection_callableNotImplementedErrordictlistr-   _sorted_tablesitemsisa_collect_insert_commands_emit_insert_statements_identity_class_identity_key_propskeytuple)r.   mappingssession_transactionisstatesr5   r6   r9   r%   statesdict_tablesuper_mapperrecordsidentity_clspidentity_propsrF   r-   s   `                @r/   _bulk_insertrS   1   s    $$K""66!-
 	

 7?@euejj)@F@4:;.5%;H;089u

9H9>$//<J*99??A '
|zz,'
( *MHM /))
8 	 '	
A'
R 8--)/)C)CDA!%%DD" 	LE5^<cuSz<=EI	 $c A;9` E =s   E&E+(E1!E6E;c           	      \     j                   } j                   j                  r& j                  j                  hj	                        fd}|r3|r|D cg c]  } | |       }}n%|D cg c]  }|j
                   }}nt        |      }|j                  j                  rt        d      |j                  |      |j                  j                         D ]A  \  }}	 j                  |	      st        d | fd|D        d      }
t        |d |	||
d       C y c c}w c c}w )Nc                 `    t        fdj                   j                         D              S )Nc              3   P   K   | ]  \  }}|j                   v s|v r||f  y wr"   )committed_state)r$   kvsearch_keysr%   s      r/   r0   z6_bulk_update.<locals>._changed_dict.<locals>.<genexpr>   s6      
1E)))Q+-= F
s   #&)r=   r@   )r.   r%   rZ   s    `r/   _changed_dictz#_bulk_update.<locals>._changed_dict   s*     


((*
 
 	
    zJconnection_callable / per-instance sharding not supported in bulk_update()c              3   v   K   | ]0  }d |j                   r|j                   j                     nd f 2 y wr"   )_version_id_proprF   r2   s     r/   r0   z_bulk_update.<locals>.<genexpr>   sM         "22   7 7 ; ;<!
s   69T)r4   Fr7   )r9   _primary_key_propkeysr^   rF   unionr=   r>   r:   r;   r<   r-   r?   r@   rA   _collect_update_commands_emit_update_statements)r.   rH   rI   rJ   update_changed_onlyr9   r[   r%   rM   rN   rO   r-   rZ   s   `          @@r/   _bulk_updaterd   ~   s8    $$K..K..22399+F
 BJKfe4KHK089u

9H9>""66!-
 	

 %//<J*99??A 
|zz,'*  ( #
( 	 	
1
 L9s   D$2D)c           	         |s.| j                   s"t        | |      D ]  }t        | |g|d        yg }g }t        | ||      D ]:  \  }}}}	}
}}|
s|r|j	                  ||||	|f       &|j	                  ||||	f       < | j
                  j                         D ]K  \  }}||j                  vrt        ||      }t        |||      }t        | ||||       t        | ||||       M t        | |t        d |D        d |D                     y)a;  Issue ``INSERT`` and/or ``UPDATE`` statements for a list
    of objects.

    This is called within the context of a UOWTransaction during a
    flush operation, given a list of states to be flushed.  The
    base mapper in an inheritance hierarchy handles the inserts/
    updates for all descendant mappers.

    T)singleNc              3   4   K   | ]  \  }}}}||||d f  yw)FNr#   )r$   r%   r&   r.   r-   s        r/   r0   zsave_obj.<locals>.<genexpr>  s+      ;UJ
 
FJ>s   c              3   6   K   | ]  \  }}}}}||||d f  yw)TNr#   )r$   r%   r&   r.   r-   update_version_ids         r/   r0   zsave_obj.<locals>.<genexpr>  s4      	% 
FJ=	s   )batch_sort_statessave_obj_organize_states_for_saveappendr?   r@   _pks_by_tablerB   ra   rb   rC    _finalize_insert_update_commandsr   )r9   rK   uowtransactionrf   r%   states_to_updatestates_to_insertrL   r.   r-   has_identity
row_switchri   rM   insertupdates                   r/   rl   rl      so    +++!+v6 	HE[5'>$G	H 
#;	GH 	:##vz3DE ##UE6:$FGH  %3399; 
v,,,)%1AB)E#3
 	 	
 	 	
#
2 %?O	 &		
r\   c                     t        t        | ||            }| j                  j                         D ]>  \  j                  vrfd|D        }t        | |||      }t        | ||       @ y)z\Issue UPDATE statements on behalf of a relationship() which
    specifies post_update.

    c           
   3      K   | ]G  \  }}}}|j                   v r2||||j                  j                  ||j                        nd f I y wr"   )ro   version_id_col#_get_committed_state_attr_by_column)r$   r%   r&   
sub_mapperr-   r.   rM   s        r/   r0   zpost_update.<locals>.<genexpr>!  so      
 :z:z
000  ((4 :::v'<'< 

s   AAN)r>    _organize_states_for_post_updater?   r@   ro   _collect_post_update_commands_emit_post_update_statements)r9   rK   rq   post_update_colsrr   rw   r.   rM   s         @@r/   post_updater     s     (fnM %3399; 
v,,,
 >N
  /8H
 	%	
1
r\   c                 ~   t        t        | ||            }| j                  }t        t        |j	                                     D ]L  }||   }||j
                  vr|j                  r|j                  r0t        | |||      }t        | ||||       N |D ]%  \  }}	}}
}|j                  j                  ||
|       ' y)zIssue ``DELETE`` statements for a list of objects.

    This is called within the context of a UOWTransaction during a
    flush operation.

    N)r>   _organize_states_for_deleter?   reversedkeysro   inheritspassive_deletes_collect_delete_commands_emit_delete_statementsdispatchafter_delete)r9   rK   rq   states_to_deletetable_to_mapperrM   r.   deleter%   r&   r-   ri   s               r/   
delete_objr   >  s     #KH "00O$33567 
 ',,,__!7!7)0@
 	 	

2 
@ 	$$VZ?@r\   c              #     K   t        | ||      D ]  \  }}}}t        |j                        }|j                  xs |j                  |      }dx}	}
|s|j                  j                  |||       n|j                  j                  |||       |j                  r|j                  |||       |s||j                  j                  v r|j                  j                  |   }t        j                  |      }|j                  |      s{|j                  |      s1t        j                  dt!        |      d|dt!        |             n9| j#                  d|t!        |      t!        |             |j%                  |       |}	|s|	r;|j&                  /|j)                  |	r|	n||	r|	j*                  n||j&                        }
||||||	|
f  yw)aT  Make 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_statesboolrF   _identity_key_from_stater   before_insertbefore_update_validate_polymorphic_identityr:   identity_mapr   instance_statewas_already_deleted
is_deletedr   warnr   
_log_debugremove_state_actionsrz   r{   r=   )r9   rK   rq   r%   rL   r.   r-   rt   instance_keyru   ri   instanceexistings                r/   rm   rm   i  s     -D^V- B
(ufj EIIyyJF$C$CE$J)--
& OO))&*eDOO))&*eD0011&%G  6 6 C CC%--::<HH!00:H!55h?%00:II %U+\9X;NP  **& %!%(!(+ #77A!)JJF,A,A,M & J J(
e#-
5%%! 
 	
uB
s   GGc                     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   )r9   rK   rq   s      r/   r}   r}     s     #;GGr\   c              #      K   t        | ||      D ]Y  \  }}}}|j                  j                  |||       |j                  |j	                  |||j                        }nd}|||||f [ yw)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)r   r   before_deleterz   r{   )r9   rK   rq   r%   rL   r.   r-   ri   s           r/   r   r     s      -D^V- D(ufj 	%%fj%@  , & J Juf33! !%eVZ1BCCDs   A+A-c           	   #     K   |D ]  \  }}}}| |j                   vri }	i }
|j                  |    }|j                  |    }t        |      j	                  |      D ]n  }||   }||   }|||vr|s|sHt        |d      st        |t        j                        r"t        |d      r|j                         n||
|<   `||	|j                  <   p |sO|j                  |    j                  |	      j                  |
D cg c]  }|j                   c}      D ]  }d|	|<   	 |r|rV|j                  |    j                  |	      }|j                  j                   r|j"                  |    j                  |	      }nd}ndx}}|j$                  durO|j&                  C|j&                  |j(                  |    v r(|j%                  d      |	|j&                  j                  <   |||	|||
||f  yc c}w w)zSIdentify sets of values to use in INSERT statements for a
    list of states.

    N__clause_element__TF)ro   _propkey_to_col_insert_cols_evaluating_nonesetintersectionhasattr
isinstancer   ClauseElementr   rF   _insert_cols_as_none
difference_pk_keys_by_tableissubsetr9   eager_defaults_server_default_colsversion_id_generatorrz   _cols_by_table)rM   rs   r4   r5   r6   r%   r&   r.   r-   r'   r*   propkey_to_col	eval_nonepropkeyvaluecolccolkeyr+   r,   s                       r/   rB   rB     s/     2B J
-z6:,,,//677>	>*77
C 	(Gw'E )C}I!5l34eS%6%67 u&:; ,,. S! #(sww	("  ++E2F#L9qQUU9:&
 "&v&  !2259BB6JK!!00#)#>#>u#E#N#N$  $( -11{ ''u4%%1%%)>)>u)EE060K0K1F6((,,-
 	
 		
CJ
L :s   C5G+7G&

C!G+c              #     K   |D ]m  \  }}}}||j                   vr|j                   |   }i }	|j                  |   |rLt        fdt              j	                        j                  |j                  |         D              }
d}ni }
t              j	                  |j                        D ]  }|   }|   }t        |d      st        |t        j                        r"t        |d      r|j                         n||	|<   U|j                  |   j                  j                  ||j                  |         dus||
|j                   <    |j"                  j$                  r|j&                  |   j)                  |
      }nd}||j*                  |j,                  |   v r|su|
ss|	sq|j.                  j1                         D ]R  }|j                  |j                      j                  j3                  |t4        j6                        }|j8                  sR n |j*                  }|
 xr |	 }||
|j:                  <   |s|j                   |
vr/|j<                  dur!|j=                  |      }||
|j                   <   n&|j<                  du r|r||
|j                   <   n|
s|	sd}d}|r<t        fdt              j	                  |j                  |         D              }n)i }|D ]!  }|j.                  |   j                   }|j                  |   j                  j3                  |t4        j>                        }|j8                  r{|j@                  rd||f| j4                  v r;d}|j8                  d   ||j:                  <   |
jC                  |j                   d       n?|j@                  d   ||j:                  <   ||	v rd}n|jD                  d   ||j:                  <   ||j:                     	tG        jH                  d	|d
|       |
s|	r|
jK                  |       ||
|||	||f .|s2|jL                  |   D ]*  \  }}tO        jP                  |||||| |jR                         , p yw)at  Identify 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.

    c              3   F   K   | ]  }|   j                   |   f  y wr"   rF   r$   r   r   r&   s     r/   r0   z+_collect_update_commands.<locals>.<genexpr>X  s.        (,,j.ABs   !Tr   NFc              3   ^   K   | ]$  }|   j                   j                  |      f & y wr"   )_labelgetr   s     r/   r0   z+_collect_update_commands.<locals>.<genexpr>  s2        (//1HIs   *-pk_cascadedr   zCan't update table , using NULL for primary key value on column )*ro   r   r=   r   r   r   _pk_attr_keys_by_tablerW   r   r   r   r   r   managerimplis_equalrF   r9   r   _server_onupdate_default_colsr   rz   r   _columntopropertyvaluesget_historyr   PASSIVE_NO_INITIALIZEaddedr   r   PASSIVE_OFFdeletedpop	unchangedorm_exc
FlushErrorrw   _table_to_equatedr
   populatepassive_updates)rq   rM   rr   r4   r%   r.   r-   ri   pksr*   r'   r,   r   r   r   prophistory	no_paramsvalr+   expect_pk_cascaded	pk_paramsmequated_pairsr   r&   s                           @@r/   ra   ra   6  s    ( 
h 	 ,,,""5)//6  ">2j)F99%@A	 F  $F~.;;%% , #7+$W-5"67:3,,<
 #5*>? 002" !% MM'*//88u44W=   
 ',F377O-,0 !!0088?(6" ! $(  )%%)>)>u)EE <
 #44;;= D#mmDHH5::FFz:+K+KG }} ''C"
7<'7I!2F3:: v---U:112CD"%sww,,5)
 #4swwL"  ">2??11%8  I I  2237;;--055AA:z'='= ==#OO)5#6)445 .2*07a0@	#**-

377D1 180B	#**-,.*/K,3,=,=a,@Icjj)SZZ(0!,,493@ 1: \MM)$ 	 	   %+$<$<U$C 	 =!"**	hs"   D=Q9CQ9GQ96AQ99A Q9c              #   *  K   |D ]  \  }}}}}	|j                   |   }
i }d}|j                  |   D ]  }||
v r1|j                  |||t        j                        ||j
                  <   8||v s|j                  I|j                  |   }|j                  |j                     j                  j                  ||t        j                        }|j                  s|j                  d   }|||j                  <   d} |s|	|j                  |j                  |   v rl|j                  }|	||j
                  <   t        |j                        r<|j                  |vr.|j                   dur |j!                  |	      }|||j                  <   |||||f  yw)zrIdentify sets of values to use in UPDATE statements for a
    list of states within a post_update operation.

    F)passiveNr   T)ro   r   _get_state_attr_by_columnr   r   r   onupdater   r   rF   r   r   r   r   rz   r   r   )r9   rq   rM   rr   r   r%   r&   r.   r-   ri   r   r'   hasdatar   r   r   r   r   s                     r/   r~   r~     s     
-@ 	
 ""5)((/ 	#Ccz%+%E%E:sJ4J4J &F &szz" ((CLL,D//4--166BB:z'G'G ==#MM!,E&+F377O"G	# !-))V-B-B5-II ++%6szz" Ov-335@ 556GHC&)F377OVZ??[-@s   A7F:AF$F=BFc              #   f  K   |D ]  \  }}}}}||j                   vri }	|j                   |   D ]A  }
|j                  |||
      x|	|
j                  <   }|(t        j                  d|d|
       |4|j
                  |j                  |   v r||	|j
                  j                  <   |	|f  yw)zSIdentify values to use in DELETE statements for a list of
    states to be deleted.NzCan't delete from table r   )ro   r{   rF   r   r   rz   r   )r9   rq   rM   r   r%   r&   r.   r-   ri   r'   r   r   s               r/   r   r   '  s      
! 	 ,,,''. 	C BBz3F }(( 16s< 	 )%%)>)>u)EE0AF6((,,-j  =!s   AB1AB1c                    j                   duxr j                   j                     v d| j                  i}fd}| j                  df|      }t	        |d       D ]  \  \  }	}
}}}}d}t        |      }|}d}|s|j                         }d}nV|r+|s)j                  j                  r|j                         }d}n)j                   |j                  j                         }d}|s|	j                  j                  n|	j                  j                  }|xr |	j                  j                  }|xr  }|r}|D ]v  \  }}}}	}}}|	j                  |j                  |      ||	      }|r5t        |||||j                   j"                  d   |d|j$                  
       ||j&                  z  }|}x n|sm|}|D ]e  \  }}}}	}}}|	j                  |||	      }|r5t        |||||j                   j"                  d   |d|j$                  
       ||j&                  z  }g n|D cg c]  }|d
   	 }}|xs |xr t)        |      dk(  }|	j                  |||	      }||j&                  z  }|D ][  \  }}}}	}}}|st        |||||j                   j"                  d   |d|j                   j*                  s|j$                  nd
       ] r>|t)        |      k7  st-        j.                  dj0                  t)        |      |fz        st3        j4                  dj                  j6                  z          yc c}w )z`Emit UPDATE statements corresponding to value lists collected
    by _collect_update_commands().Ncompiled_cachec                     t        j                  t        j                        } j                     D ]I  }| j
                  j                  |t        j                  |j                  |j                        k(         K re| j
                  j                  j                  t        j                  j                  j                  j                  j                        k(         j                         j                  |       }|S N)type_)r   _construct_rawr   and_ro   clausesrn   r   	bindparamr   typerz   rw   wherer   r   stmtr.   needs_version_idrM   s      r/   update_stmtz,_emit_update_statements.<locals>.update_stmt`  s    #229>>B''. 	COO""s}}SZZsxx@@	
 OO""%%==))00 //44 ||~##G,r\   rw   c                 R    | d   t        | d         t        | d         | d   | d   fS N   r            r   r   recs    r/   <lambda>z)_emit_update_statements.<locals>.<lambda>{  4    FAKQLFF
 r\   r   FTexecution_optionsr   r   MUPDATE statement on table '%s' expected to update %d row(s); %d were matched.MDialect %s does not support updated rowcount - versioning cannot be verified.)rz   r   _compiled_cache_memor   r>   r5   r9   r   dialectsupports_sane_rowcount supports_sane_rowcount_returningsupports_sane_multi_rowcount_execute_20r   
_postfetchcontextcompiled_parametersreturned_defaultsrowcountlenexecutemanyr   StaleDataErrordescriptionr   r   dialect_description)r9   rq   r.   rM   rw   r8   r  r   cached_stmtr-   	paramkeyshasvaluer,   r+   rO   rows	statementr5   assert_singlerowassert_multirowallow_multirowr%   r&   r'   r*   r   check_rowcountr   multiparamsr   s     ``                         @r/   rb   rb   N  s    	T) 	B!!V%:%:5%AA 
 *;+F+FG( ##Xu$5{CK
 
	
	
` 	HY*:K w-	!113I"O$""11!113I"O"".!11&2G2GHI"O # 55##DD 	  @""?? 	 *B2B.B 2 	 **$$\2&7 + 
 &"		55a8$++ 

"!1;2> "!1 ' 	 $"..!6=N / A
 #""*!!&II99!<( // AJJ&D9'< 299#s1v99!0 "$>[)9Q)>  **{>O +  

"  	 $"""*!!&II99!<( #$99#8#8 //!%4 s7|#,,9((#g,=>  II3))//0y`Z :s   /M
c                 .   | j                  d|f|j                        }d| j                  i}t        |d       D ]  \  \  }}	}
}}}|}|r(|s"| j                  r|j
                  j                  s|r|
st        |      }|D cg c]  }|d   	 }}|j                  |||      }|smt        ||j                  j                        D ]T  \  \  }}}}}}}}}|r7t        ||||||||d|j                  j                  s|j                  nd
       Ht        |||       V t        |      }|
s'|j
                  j                   rt#        |      dkD  rd	}nd}|s| j                  r|j%                         }nC|j&                  |j%                  |j&                        }n|r |j$                  |j(                   }|r|D cg c]  }|d   	 }}|j                  |||      }|st+        j,                  ||j                  j                  |j.                  |j0                  xs d
      D ]  \  \  }}}}}}}}}}}|t3        j4                  d|z        t        ||j6                  |         D ]?  \  }}|j8                  |   }|j;                  |j<                        1|||j<                  <   A |rt        ||||||||d|
       t        |||        |D ]-  \  }}}}}}}}|r$|j                  |j?                  |      ||      }n|j                  |||      }|j@                  } | t3        j4                  d|d      t        | |j6                  |         D ]C  \  }}|j8                  |   }||v s|j;                  |j<                        5|||j<                  <   E |s|rOt        |||||||j                  j                  d   |d|j                  j                  s|j                  nd
       !t        |||       0  yc c}w c c}w )z`Emit INSERT statements corresponding to value lists collected
    by _collect_insert_commands().rv   r   c                 R    | d   t        | d         t        | d         | d   | d   fS r   r   r   s    r/   r   z)_emit_insert_statements.<locals>.<lambda>-  r   r\   r   r  FNr   Tr#   zMulti-row INSERT statement for %s did not produce the correct number of INSERTed rows for RETURNING.  Ensure there are no triggers or special driver issues preventing INSERT from functioning properly.z Single-row INSERT statement for z did not produce a new primary key result being invoked.  Ensure there are no triggers or special driver issues preventing INSERT from functioning properly.r   )!r  rv   r  r   r   r  implicit_returningr>   r  zipr  r  r  r  r  _postfetch_bulk_saveinsert_executemany_returningr  r5   rz   primary_keyr   zip_longestinserted_primary_key_rowsreturned_defaults_rowsr   r   ro   r   r   rF   r   inserted_primary_key)!r9   rq   r.   rM   rv   r8   r  r  r-   pkeysr  r+   r,   rO   r  r   r  r   r%   r&   r'   
mapper_recr)   r*   last_inserted_paramsdo_executemanyr*  r  pkr   r   r   r&  s!                                    r/   rC   rC     s    ##Xu$5u||DK);+F+FG
 
	
	
XP 	DUHk3C  	  "11!))<< 7mG-45c3q65K5&&;:K ' A  !))"?"?@L 	""$#(("&*!!&0(!#$99#8#8 //!% -ZUK;LD 7mG&&CCL1$!%!&#(B(B%557	&&2%55f6K6KL	5I55u7H7HI	189#s1v99**{>O +   ))		5533006B	:P 	!&"& (',,,) 07 #*"4"4!8
 ;E!E#  (+0"007( :GB $.#?#?#DD)~~dhh7?79
488 4: !& * . % % * ! 4 , % 1 1ZOu:PJ ;P 	 $#!+!7!7%,,\:".? "8 " ",!7!7%".? "8 " #)"="=K"*%00 8BD  $'#V%9%9%%@$ 6C  *;;C@</)~~dhh7?35Jtxx06 # & * . % % * & & B B1 E , %'-~~'A'A !' 8 8%) 1ZOw;P{XP> 6v :s   P>Pc                 x   d| j                   i}j                  duxr j                  j                     v fd}| j                  df|      }t	        |d       D ]  \  }}	d}
t        |	      }	|d   }j                  |j                  j                  n|j                  j                  }|xr |j                  j                  } xs |}|s[|}|	D ]S  \  }}}}}|j                  |||      }t        ||||||j                  j                  d          |
|j                  z  }
U n|	D cg c]
  \  }}}}}| }}}}}}|xs |xr t        |      dk(  }|j                  |||      }|
|j                  z  }
|	D ]0  \  }}}}}t        ||||||j                  j                  d          2 |r>|
t        |	      k7  slt!        j"                  d	j$                  t        |	      |
fz        st'        j(                  d
j                  j*                  z          yc c}}}}}w )zeEmit UPDATE statements corresponding to value lists collected
    by _collect_post_update_commands().r   Nc                  ^   t        j                  t        j                        } j                     D ]I  }| j
                  j                  |t        j                  |j                  |j                        k(         K re| j
                  j                  j                  t        j                  j                  j                  j                  j                        k(         j                         j                  |       }j                  |j                  j                        }|S r   )r   r   r   r   ro   r   rn   r   r   r   r   rz   rw   r   r5   r   s      r/   r   z1_emit_post_update_statements.<locals>.update_stmt  s    #229>>B''. 	COO""s}}SZZsxx@@	
 OO""%%==))00 //44 ||~##G,  ,''(=(=>Dr\   r   c                 (    | d   t        | d         fS )N   r   )r   r   s    r/   r   z._emit_post_update_statements.<locals>.<lambda>0  s    SVSQ[) r\   r   r  r   r  r  )r  rz   r   r  r   r>   r  r  r	  r
  r  _postfetch_post_updater  r  r  r  r   r  r  r   r   r  )r9   rq   r.   rM   rw   r  r   r  rF   rO   r  r-   r  r  r  r  r%   r&   r,  r'   r   r)   r  r   s     ``                   @r/   r   r     s    *;+F+FG 	T) 	B!!V%:%:5%AA 
0 !!=%"8+FI  ) MW w-V
 $$, 55##DD 	  @""?? 	 .-@-NEL #Az:z6**v9J +  '"II11!4 

"#& DK ?E:z4 K 
 -  :S%5%:  &&;:K ' A AJJDEL 	Az:z6&"II11!4	 s7|#,,9((#g,=>  II3))//0SMNs   <H3c                    j                   duxr j                   j                     v fd}| j                  df|      }t        |d       D ]  \  }}|D 	cg c]  \  }	}|		 }
}	}d| j                  i}t        |
      }d}d}rj                  j                  s|j                  j                  r-d}|
D ]%  }	|j                  ||	|	      }||j                  z  }' net        j                  d
|j                  j                  z         |j                  ||
|	       n$j                  ||
|	      }sd}|j                  }| j                  s|dkD  s||k7  s|j                  j                  st        |
      dk(  s:|r't        j                  dj                  ||fz         ct!        j"                  dj                  ||fz         yc c}}	w )z`Emit DELETE statements corresponding to value lists collected
    by _collect_delete_commands().Nc                     t        j                  t        j                        } j                     D ]I  }| j
                  j                  |t        j                  |j                  |j                        k(         K re| j
                  j                  j                  t        j                  j                  j                  j                  j                        k(         j                         j                  |       S r   )r   r   r   r   ro   r   rn   r   r   rF   r   rz   r   r   )r   r   r.   need_version_idrM   s     r/   delete_stmtz,_emit_delete_statements.<locals>.delete_stmt  s    #229>>B''. 	COO""s}}SWWCHH==	
 OO""%%==))--V5J5J5O5O ||~##G,,r\   r   c                     | d   S )Nr   r#   r   s    r/   r   z)_emit_delete_statements.<locals>.<lambda>  s
    A r\   r   Fr   r  zMDialect %s does not support deleted rowcount - versioning cannot be verified.Tr   zDELETE 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.)rz   r   r  r   r  r  r  r
  r  r  r  r   r   r  confirm_deleted_rowsr  r   r  )r9   rq   r.   rM   r   r8  r  r-   recsr'   del_objectsr  expectedrows_matched	only_warnr   r7  s     ``            @r/   r   r   ~  s'    	T) 	B!!V%:%:5%AA 
-$ !!8U"3[AI#F,>? C
D8<="4&*v==-{/J/JK{#	 &&CC!!88  * /F"..!6=N / A !AJJ.L/ 		7 ((<<=
 &&{>O '  &&;:K ' A # 	::L ,,r!L(""??{#q(
 		= (((LA	B ,,= (((LA	B {C=s   #G!c                    |D ]a  \  }}}}}|j                   r|j                  |j                   D cg c]n  }|j                  r$|j                  rH|j                  |j
                  v s0|j                  s0|j                  s$|j                  |j
                  vr|j                  p c}      }	|	r|j                  |j
                  |	       g }
| j                  r4|
j                  |j                  j                  |j                               |j                  V|j                  du rH|j                  j                  |j                  v r&|
j                  |j                  j                  g       |
rl| j!                  |      |_        t#        j$                  |      j'                  t(              }t+        j,                  |j.                  ||j                  ||
       |s|j0                  j3                  |||       n|j0                  j5                  |||       |j                  du s&|j                  4||j                  j                     Ot7        j8                  d       yc c}w )zzfinalize state on states that have been inserted or updated,
    including calling after_insert/after_update events.

    NF)refresh_stateonly_load_propsz2Instance does not contain a non-NULL version value)_readonly_propsunmodified_intersectionexpire_on_flushdeferredrF   r=   _expire_attributesr   extend_unloaded_non_objectr   &_server_default_plus_onupdate_propkeysrz   r   r^   unloadedr   r   r   set_label_styler   r	   load_on_identr:   r   after_insertafter_updater   r   )r9   rq   rK   r%   r&   r.   r-   rt   rQ   readonly
toload_nowr   s               r/   rp   rp     s   
 @F B;z6:|!!44 $33))!"quu

/B -- !

EE3 EEH ((X>
 
%%**77AA !!-++u4&&**enn<!!6#:#:#>#>"?@#<<UCEI==(88.D !!&&		# * OO((UCOO((UC ''50%%1&11556>((H ABs   A3I)
c                 x   |j                  |      ry |j                  j                  j                  }|j                  j                  j                  }| j
                  4| j
                  | j                  |   v rt        |      | j
                  gz   }t        | j                  j                  j                        }	|	rg }
|D ]t  }|j                  |v s|| j                  v s!||j                     || j                  |   j                  <   |	sM
j                  | j                  |   j                         v |	r)
r'| j                  j                  j                  |||
       |rP|j                  |j                   |D cg c])  }|| j                  v r| j                  |   j                  + c}       y y c c}w r"   )r   r  compiledprefetch	postfetchrz   r   r>   r   class_managerr   refresh_flushrF   r   rn   rH  r=   )r.   rq   rM   r%   rL   r   r'   prefetch_colspostfetch_colsrX  load_evt_attrsr   s               r/   r4  r4  ,  s      'NN++44M^^,,66N 	)!!V%:%:5%AA]+v/D/D.EE--66DDEM G55F?qF$<$<<5;AEE]E&**1-112%%f&>&>q&A&E&EF	G %%33>>	
   JJ (000 ((+//	
 s    .F7
c
           
         |j                   j                  j                  }
|j                   j                  j                  }|j                   j                  j                  }| j
                  4| j
                  | j                  |   v rt        |
      | j
                  gz   }
t        | j                  j                  j                        }|rg }|r|	}|t        ||      D ]s  \  }}|j                  r|j                   j                  r)| j                  j!                  |      }|sG|||j"                  <   |sYj%                  |j"                         u |
D ]t  }|j"                  |v s|| j                  v s!||j"                     || j                  |   j"                  <   |sMj%                  | j                  |   j"                         v |r)r'| j                  j                  j                  |||       |r1|r/|j'                  |D cg c]  }|j                  r||vr| c}       |rO|j)                  |j*                  |D cg c])  }|| j                  v r| j                  |   j"                  + c}       | j,                  |   D ]*  \  }}t/        j0                  ||||||| j2                         , yc c}w c c}w )zExpire attributes in need of newly persisted database state,
    after an INSERT or UPDATE statement has proceeded for that
    state.N)r  rT  rU  rV  	returningrz   r   r>   r   rW  r   rX  r#  r&  isinsertr   r   rF   rn   rI  rH  r=   r   r
   r   r   )r.   rq   rM   r%   rL   r   r'   r*   isupdater  rY  rZ  returning_colsrX  r[  row	row_valuer   r   r   r   r   s                         r/   r  r  U  s     NN++44M^^,,66N^^,,66N 	)!!V%:%:5%AA]+v/D/D.EE--66DDEM?"%c>": 8	3 ??v~~'>'> //33C8&/E$((O$&--dhh78   G55F?qF$<$<<5;AEE]E&**1-112%%f&>&>q&A&E&EF	G %%33>>	
 L 	 (??s.'@ 	
   JJ (000 ((+//	
 #44U; 	
=""	
	
)s   J;	.K 
c                 `    | j                   |   D ]  \  }}t        j                  |||        y r"   )r   r
   bulk_populate_inherit_keys)r.   rL   rM   r   r   s        r/   r$  r$    s5    "44U; A=''q-@Ar\   c              #   D  K   |j                   j                  r|j                   j                  }n|j                  j                  |       }d}t	        | |      D ]C  }|r || |j                               }|j                  j                  }||j                  |f E yw)zReturn an iterator of (state, state.dict, mapper, connection).

    The states are sorted according to _sort_states, then paired
    with the connection they should be using for the given
    unit of work transaction.

    N)	r:   r;   transactionr-   rk   objr   r.   r=   )r9   rq   rK   r;   r-   r%   r.   s          r/   r   r     s      11,44HH#//::;G
"k62 4,[%))+FJ%%UZZ334s   BB c                 Z   t        |      }t        d |D              }|j                  |       	 t        || j                        }t        |t        j                  d            z   S # t        $ r7}t        j                  t        j                  d|z        |       Y d }~^d }~ww xY w)Nc              3   :   K   | ]  }|j                   |  y wr"   r   )r$   ss     r/   r0   z_sort_states.<locals>.<genexpr>  s     =1155+<Q=s   r   z^Could not sort objects by primary key; primary key values must be sortable in Python (was: %s))replace_contextinsert_order)r   difference_updatesorted_persistent_sortkey_fn	TypeErrorr   raise_sa_excInvalidRequestErroroperator
attrgetter)r.   rK   pending
persistentpersistent_sortederrs         r/   rk   rk     s    &kG===Jj)
"F99
 	wH//?@
	  
&&>@CD  	
 	

s   A* *	B*3-B%%B*c                       e Zd Z G d de      Zed        Zed        Zed        Zed        Z	ed        Z
ed        Zed	        Zy
)BulkUDCompileStatec                   0    e Zd ZdZdZdZeZeZeZ	dZ
dZdZy))BulkUDCompileState.default_update_optionsevaluateTN)__name__
__module____qualname___synchronize_session
_autoflush_subject_mapper_EMPTY_DICT_resolved_values_resolved_keys_as_propnames_value_evaluators_matched_objects_matched_rows_refresh_identity_tokenr#   r\   r/   default_update_optionsr}    s5    )
&&1#'"&r\   r  c                    |r||fS t         j                  j                  ddh||j                        \  }}|j                  }||dvrt        j                  d      ||d<   	 |j                  d   }	|	j                  |d<   |d	|	j                  iz  }|j                  r|j                          |j                  d|j                  i      }|j                  d
k(  r| j                  ||||||      }n%|j                  dk(  r| j                  ||||||      }|t        j                  |      j!                  d|i      fS # t        $ r J d       w xY w)N_sa_orm_update_optionssynchronize_session)r~  fetchFzKValid strategies for session synchronization are 'evaluate', 'fetch', Falseclauseplugin_subjectr.   0statement had 'orm' plugin but no plugin_subjectr  r~  r  )r{  r  from_execution_options_execution_optionsr  rr  ArgumentError_propagate_attrsr.   KeyErrorr  	_annotate_do_pre_synchronize_evaluate_do_pre_synchronize_fetchr   immutabledictr`   )
clsr:   r  r'   r  bind_argumentsis_reentrant_invokeupdate_optionsr
   r  s
             r/   orm_pre_session_execz'BulkUDCompileState.orm_pre_session_exec  s    ///
 55LL$"#((	
	
 2277**5 
 $-x 	=&778HIN (6'<'<N8$,n.C.CDD$$ ''"N$G$GH
	 ..*< ==!N 00G; ::!N 0177)>:
 	
Q  	MLLL5	Ms   $D? ?Ec                     |d   }|j                   dk(  r| j                  |||       |S |j                   dk(  r| j                  |||       |S )Nr  r~  r  )r  _do_post_synchronize_evaluate_do_post_synchronize_fetch)r  r:   r  r'   r  r  r   r  s           r/   orm_setup_cursor_resultz*BulkUDCompileState.orm_setup_cursor_resultL  s]    & ++CD..*<--gv~N  00G;**7FNKr\   c                 :   d}j                   rj                  nddj                  f|v r&|t        fd|dj                  f   D              z  }j                  j                  |j                  j                  fz  }rt        fd|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.

        r#   Nadditional_entity_criteriac              3   t   K   | ]/  }|j                   s|j                  u r|j                         1 y wr"   )include_aliasesentity_resolve_where_criteria)r$   aeext_infos     r/   r0   z@BulkUDCompileState._adjust_for_extra_criteria.<locals>.<genexpr>|  s:      ! %%h)>	 **84!s   58c              3   @   K   | ]  }j                  |        y wr"   )traverse)r$   critadapters     r/   r0   z@BulkUDCompileState._adjust_for_extra_criteria.<locals>.<genexpr>  s     O4 0 0 6Os   )is_aliased_class_adapterr.   rG   _single_table_criterion)r  global_attributesr  return_critr  s     ` @r/   _adjust_for_extra_criteriaz-BulkUDCompileState._adjust_for_extra_criteriag  s     '/'@'@(##d )OO
  5 !+18??C!  K ??22>HOOCCEEKO;OOKr\   c                    |j                   }|j                  }t        x}	}
	 t        j                  |      }d}|j
                  r||j
                  z  }i }|j                  D ]   }|j                  s|j                  |       " |r|| j                  ||      z  }|r |j                  | }nd }|j                   dk(  r|j"                  }n|}|j                   dk(  ri| j%                  ||      }i }	| j'                  ||      }
|
D ]>  \  }}	 j                  t)        j*                  t,        j.                  |            }||	|<   @ |j0                  j3                         D cg c]t  }|j4                  j7                  |      rW|j8                  sK |j;                               r5|j<                  |j>                  |j<                  k(  r|j;                         v }}|||	|
dz   S # t        j                  $ r8}t        j                  t        j                  d|z        |       Y d }~|d }~ww xY w# t        j                  $ r Y Ew xY wc c}w )Nr#   c                      y)NTr#   )rg  s    r/   eval_conditionzGBulkUDCompileState._do_pre_synchronize_evaluate.<locals>.eval_condition  s    r\   z{Could not evaluate current criteria in Python: "%s". Specify 'fetch' or False for the synchronize_session execution option.)from_lambda_elementrw   )r  r  r  ) r  class_r  r   EvaluatorCompiler_where_criteria_with_options_is_criteria_optionget_global_criteriar  processUnevaluatableErrorr   rq  rr  rs  __visit_name__	_resolved_get_resolved_valuesr  r   expectr   ExpressionElementRoler   
all_statesr.   rA   expiredrg  r  identity_token)r  r:   r  r'   r  r  r  r.   
target_clsvalue_evaluatorsresolved_keys_as_propnamesevaluator_compilerr  r  optr  ry  effective_statementresolved_valuesrF   r   
_evaluatorr%   matched_objectss                           r/   r  z/BulkUDCompileState._do_pre_synchronize_evaluate  s     //]]
8CC5	!*!<!<Z!HD((	111 " .. ?**++,=>? !66%v  !;!3!;!;T!B  ##'77 #,"5"5"+--9!66+O  "),)H)H*& 9 7
U7!3!;!;!(()D)DeL"J -7$S)7 !--88:
||'MMuyy{+66> ''!99: IIK
 
  /!1+E!
 
 	
i ++ 	KK**<>AB
  	> !33 
s7   AG' 2?G' 3H5#A9I'H2:-H--H25IIc                     |j                   rg S |j                  rt        |j                        S |j                  r#t        |j                  j	                               S g S r"   )_multi_values_ordered_valuesr>   _valuesr@   )r  r.   r  s      r/   r  z'BulkUDCompileState._get_resolved_values  sR    ""I&&	1122	))//122Ir\   c                    g }|D ]  \  }}t        |t        j                        r|j                  |j                  |f       >t        |d      r|j                         }|rHt        |t        j                        r.	 |j                  |   }|j                  |j                  |f       t        j                  d|z         |S # t        j                  $ r Y w xY w)Nr   zInvalid expression type: %r)r   r   QueryableAttributern   rF   r   r   r   ColumnElementr   r   UnmappedColumnErrorrr  rs  )r  r.   r  r   rX   rY   attrs          r/   r  z.BulkUDCompileState._resolved_keys_as_propnames  s    # 	DAq!Z::;quuaj)01((**Q
(@(@A1!33A6D MM488Q-0001A5 	$  22 s   <CCCc                 
   |j                   } t        |j                  |j                  fz    j	                  |      j
                  |j                   }|j                  |_        d }	|j                  |||||	      }
|
j                         }t        }|j                  dk(  r|j                  }n|}|j                  dk(  r|j                  }t        j                  |      }| j!                  ||      }| j#                  ||      }| j#                  ||      }i }|D ]>  \  }}	 |j%                  t'        j(                  t*        j,                  |            }|||<   @ nt        }||||dz   S # t        j.                  $ r Y fw xY w)Nc                      | j                   j                  di | j                  }|j                  j                  rt        j                         S y )Nr#   )r:   get_bindr  r  full_returning_resultnull_result)orm_contextbinds     r/   skip_for_full_returningzMBulkUDCompileState._do_pre_synchronize_fetch.<locals>.skip_for_full_returning!  sB    /;&&//M+2L2LMD||****,,r\   )
_add_eventr  rw   )r  r  r  )r  r   r&  select_identity_tokenselect_fromoptionsr  r  executefetchallr  r  r  r  r   r  r  r  r  r   r  r   r  r  )r  r:   r  r'   r  r  r  r.   select_stmtr  r   matched_rowsr  r  r  r  r  r  rF   r   r  s                        r/   r  z,BulkUDCompileState._do_pre_synchronize_fetch  s     //FV''6+G+G*IIK[ Wi--/ 	
 '0&?&?#	 . ! 
 (&##'77 #,"5"5"+--9J!*!<!<Z!H!66+O *-)H)H*& *-)H)H*&  "8 7
U7!3!;!;!(()D)DeL"J -7$S)7 *5&!1)+E!
 
 	
 !33 s   "3E,,FFN)r  r  r  r   r  classmethodr  r  r  r  r  r  r  r#   r\   r/   r{  r{    s    	' 	' N
 N
`  4 " "H ]
 ]
~    , K
 K
r\   r{  c                   ,    e Zd Zed        Zed        Zy)ORMDMLStatec                 
   |j                   j                  d   }|j                  }|j                  r|j                  }n|j
                  j                  }||j
                  |j                  |j                  |j                  dS )Nparententity)namer   exprr  rM   )	rM   _annotationsr.   r  r  r  r  r  local_table)r  r  r  r.   _label_names        r/   get_entity_descriptionz"ORMDMLState.get_entity_description^  sm    ??//?$$"--K --00K  MMOOoo''
 	
r\   c           
          d }d }|j                   D cg c]  }| ||      f c}D cg c]<  \  }}|j                  |j                   |||      |j                  |j                  d> c}}S c c}w c c}}w )Nc                 :    | j                   j                  dd       S )Nr  )r  r   )r   s    r/   _ent_for_colzCORMDMLState.get_returning_column_descriptions.<locals>._ent_for_colq  s    >>%%nd;;r\   c                 x    || S | j                   j                  dd       }|s| S t        |j                  ||       S )N	proxy_key)r  r   getattrr  )r   entr  s      r/   _attr_for_colzDORMDMLState.get_returning_column_descriptions.<locals>._attr_for_colt  s=    {**;=Iszz9a88r\   )r  r   r  aliasedr  )_all_selected_columnsrF   r   r  r  )r  r  r  r  r   r  s         r/   !get_returning_column_descriptionsz-ORMDMLState.get_returning_column_descriptionso  s    	<	9$ /8.M.M)*LO$
 3 %a-//**
 	

s   A1AA6N)r  r  r  r  r  r  r#   r\   r/   r  r  ]  s(    
 
  
 
r\   r  ormrv   c                   ,    e Zd Zed        Zed        Zy)	ORMInsertc                     ||d<   	 |j                   d   }|j                  |d<   |t        j                  |      fS # t        $ r J d       w xY w)Nr  r  r.   r  )r  r.   r  r   r  )r  r:   r  r'   r  r  r  r  s           r/   r  zORMInsert.orm_pre_session_exec  sr     $-x 	=&778HIN (6'<'<N8$ 01
 	
  	MLLL5	Ms	   < Ac                     |S r"   r#   )r  r:   r  r'   r  r  r   s          r/   r  z!ORMInsert.orm_setup_cursor_result  s	     r\   N)r  r  r  r  r  r  r#   r\   r/   r  r    s(    
 
, 	 	r\   r  rw   c                   L    e Zd Zed        Zed        Zed        Zed        Zy)BulkORMUpdatec                    | j                  |       }|j                  j                  d   }|j                  x|_        }i |_        | j                  ||      |_        i }|j                  D ]   }|j                  s|j                  |       " |j                  s&|j                  rt        |j                        |_        t        j                  j                  t        j                        }	|	j                  j!                  |j                         |j"                  |	_        |j$                  r|j                  |	_        n|j                  r|j                  |	_        | j'                  ||      }
|
r |	j(                  |
 }	|j                  j+                  dd       dk(  rP|j,                  j.                  r:|	j0                  rt3        j4                  d       |	j6                  |j8                   }	t;        j<                  ||	|fi | |S )Nr  r  r  z?Can't use synchronize_session='fetch' with explicit returning())__new__rM   r  r.   extra_criteria_entitiesr  r  r  r  r  _preserve_parameter_orderr  r=   r   Update__dict__rw   r  r  r  r   r   r  r  
_returningrr  rs  r]  r&  r   __init__)r  r  compilerkwselfr  r.   extra_criteria_attributesr  new_stmtnew_crits              r/   create_for_statementz"BulkORMUpdate.create_for_statement  s    {{3??//?'.f')$ # 8 8 K$&!** 	CC&&''(AB	C 22y7H7H$()>)>$?D!::%%cjj1  !3!34++ $$'+'<'<H$#44H11%v
 %x~~x0H !!%%&;TBgM  //""000  *x))6+=+=>Hh?B?r\   c           
      z   |j                   d   }t        j                  }|r|j                  s	 |||      S |j                  }g }|D ]p  \  }}t	        j
                  t        j                  |      }t        |t        j                        rt        ||t              }	|	t        u rK|j                  |t	        j
                  t        j                  |t        j                          d      f       |j#                   |||	j%                  |                   d|j&                  v rG|j&                  }
t        |
d   |
d         }|j#                   |||j%                  |                   '|j                  |t	        j
                  t        j                  |t        j                          d      f       s |S )Nr  )defaultT)r   is_crudentity_namespacer  )r  r   _get_crud_kv_pairsr.   r   r  r   DMLColumnRoler   r   string_typesr   r   rn   r  r   NullTyperI  _bulk_update_tuplesr  )r  r  kv_iteratorr  core_get_crud_kv_pairsr.   r   rX   rY   desck_annor  s               r/   r   z BulkORMUpdate._get_crud_kv_pairs  s   "334DE!/!B!B^%:%:))[AA&& ,	DAq  !4!4a8A!T../,VQI8#MM%,, % ; ; !&.&7&7&9(,	
 MM.%t'?'?'B
 $q~~5,-.{0C *!4#;#;A#> !((!77"*"3"3"5$(	
E,	Z r\   c                    t               }t        |j                  j                               }|j                  }t        d |D              }|j
                  D ]  }t        j                  |      t        j                  |      }
}	|j                  |	j                  |j                  k7  rT|	j                  j                  |      }|D ]  }||
v s |j                  |   |      |
|<   ! |	j                  j                  j                  |	d |       |	j!                  |
t        |             |j                  |
      j#                  |      }|r|	j%                  |
|       |j'                  |	        |j)                  |       y )Nc              3   &   K   | ]	  \  }}|  y wr"   r#   r$   rX   rY   s      r/   r0   z>BulkORMUpdate._do_post_synchronize_evaluate.<locals>.<genexpr>0	       *41aQ*   )r   r>   r  r   r  r  r   r   instance_dictr  r  
unmodifiedr   r   r   refresh_commitr   rH  add_register_altered)r  r:   r   r  rK   evaluated_keysr   attribrg  r%   rL   to_evaluaterF   	to_expires                 r/   r  z+BulkORMUpdate._do_post_synchronize_evaluate*	  sj    n>>CCEF;;*6**!22 	C ))#.((- E 66B((!99:   **77GK" L%<!F!A!A#!Fs!KE#JL MM""**5$DMM%k!23++E2==kJI((	:JJu?	@ 	!!&)r\   c           	         |j                   }t               }t        |j                  j	                               }|j
                  r5|j                         D cg c]  }t        |      |j                  fz    }}n|j                  }|D cg c]  }|dd |d   f c}D 	
cg c]<  \  }	}
|j                  |
|j                  k(  r|j                  t        |	      |
      > c}
}	D cg c]  }||j                  v r|j                  |   ! }}|j                  }t        d |D              }|D ]  }t        j                  |      t        j                  |      }}|j                   j#                  |      }|D ]  }||v s |j                  |   |      ||<   ! |j$                  j&                  j)                  |d |       |j+                  |t        |             |j#                  |      j-                  |      }|r|j/                  ||       |j1                  |        |j3                  |       y c c}w c c}w c c}
}	w c c}w )Nr   r:  r  c              3   &   K   | ]	  \  }}|  y wr"   r#   r+  s      r/   r0   z;BulkORMUpdate._do_post_synchronize_fetch.<locals>.<genexpr>s	  r,  r-  )r  r   r>   r  r   returns_rowsallrG   r  r  identity_key_from_primary_keyr   r  r   r   r.  r/  r   r   r   r0  r1  r   rH  r2  r3  )r  r:   r   r  target_mapperrK   r4  ra  r  r&  r  identity_keyobjsr   r5  rg  r%   rL   r6  rF   r7  s                        r/   r  z(BulkORMUpdate._do_post_synchronize_fetchS	  sN   &66n>>CCEF "::< c
nDDFFL 
 *77L 5A4-0S2YB(4
!
 0K "99A!^%K%KK ;;%#1 < 
!
 w333   .
 
   ;;*6** 	C))#.((- E
  **77GK" L%<!F!A!A#!Fs!KE#JL MM""**5$DMM%k!23++E2==kJI((	:JJu%	& 	!!&)[4
!
s    H6H;"AI )$IN)r  r  r  r  r  r   r  r  r#   r\   r/   r  r    sS    8 8t 9 9v &* &*P 4* 4*r\   r  r   c                   <    e Zd Zed        Zed        Zed        Zy)BulkORMDeletec                    | j                  |       }|j                  j                  d   }|j                  x|_        }i |_        i }|j
                  D ]   }|j                  s|j                  |       " | j                  ||      }	|	r |j                  |	 }|rN|j                  j                  dd       dk(  r/|j                  j                  r |j                  |j                   }t        j                   |||fi | |S )Nr  r  r  )r  rM   r  r.   r  r  r  r  r  r   r   r  r  r]  r&  r   r  )
r  r  r  r  r  r  r.   r  r  r  s
             r/   r  z"BulkORMDelete.create_for_statement	  s   {{3??//?'.f')$$&!** 	CC&&''(AB	C 11%v
 '	2I %%))*?F  //+	++V-?-?@Ii@R@r\   c                     |j                  |j                  D cg c]  }t        j                  |       c}       y c c}w r"   )_remove_newly_deletedr  r   r   )r  r:   r   r  rg  s        r/   r  z+BulkORMDelete._do_post_synchronize_evaluate	  s@     	%% *:: ))#.	
s   >c                    |j                   }|j                  r5|j                         D cg c]  }t        |      |j                  fz    }}n|j
                  }|D ]i  }|dd }|d   }|j                  t        |      |      }	|	|j                  v s8|j                  t        j                  |j                  |	         g       k y c c}w )Nr   r:  r9  )r  r;  r<  rG   r  r  r=  r>   r   rE  r   r   )
r  r:   r   r  r>  ra  r  r&  r  r?  s
             r/   r  z(BulkORMDelete._do_post_synchronize_fetch	  s    &66 "::< c
nDDFFL 
 *77L 	Ca)K WN )FF[!- G L w333--"11#00>	s    C	N)r  r  r  r  r  r  r  r#   r\   r/   rB  rB  	  s=     @ 
 
  r\   rB  )F)FFF)T)F__doc__	itertoolsr   r   rt   r   r   r   r   r	   r
   baser   r   rr  r   r   r   enginer   r  r   r   r   r   r   r   sql.baser   r   r   sql.dmlr   r   r   sql.elementsr   sql.selectabler   rS   rd   rl   r   r   rm   r}   r   rB   ra   r~   r   rb   rC   r   r   rp   r4  r  r$  r   rk   r  r  r{  r  
plugin_forr  r  rB  r#   r\   r/   <module>rQ     s                 &       , #  $ $ $ , ;JZ?
DPf(
V(@VN
b	HD6 
U
r 38vr5@p$!Z Hb gPTxvaHGT&
R^
BA
44. !d  "k
 k
\+
 +
\ )"^ " *"J )V*K1C V* *V*r )IK1C I *Ir\   