
    ؄_                    ^   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 Zd Zd=dZd Zd Zd Zd Zd Z	 	 	 d>dZ	 d=dZd Zd Z 	 d?d Z!	 d?d!Z"d" Z#d# Z$d$ Z%d% Z&d& Z'd' Z(d( Z)d) Z*d* Z+ G d+ d,e,          Z- G d- d.e-          Z. G d/ d0e-          Z/ G d1 d2e-          Z0 G d3 d4e-          Z1 G d5 d6e.e0          Z2 G d7 d8e.e1          Z3 G d9 d:e/e0          Z4 G d; d<e/e1          Z5dS )@zprivate 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)_entity_descriptor)	state_str   )sql)util)
expression)_from_objectsc           
           j         }t          |          }|j        j        rt	          d          |r(|rd |D             }d |D             }nd |D             }nt          |          }|                    |          |j                                        D ]_\  }	}
 	                    |
          s fdt          |	 fd|D             d||          D             }t          |d ||
|	||	           `|rD|rD j        }d
  j        D             }|D ]+\  }|t          fd|D                       f|_        (d S d S d S )NzJconnection_callable / per-instance sharding not supported in bulk_insert()c                      g | ]}||j         fS  dict.0states     _/var/www/book.euthymeo.com/html/venv/lib/python3.11/site-packages/sqlalchemy/orm/persistence.py
<listcomp>z _bulk_insert.<locals>.<listcomp>7   s    @@@euej)@@@    c                     g | ]\  }}|S r   r   )r   r   dict_s      r   r   z _bulk_insert.<locals>.<listcomp>8   s    ;;;.5%;;;r   c                     g | ]	}|j         
S r   r   r   s     r   r   z _bulk_insert.<locals>.<listcomp>:       999u
999r   c           	   3   >   K   | ]\  }}}}}}}}d ||
	|||fV  d S Nr   )r   r   
state_dictparamsmpconnvalue_paramshas_all_pkshas_all_defaults
connectionmappers            r   	<genexpr>z_bulk_insert.<locals>.<genexpr>C   sk       
 
	 #  	
 
 
 
 
 
r   c              3   $   K   | ]
}d |fV  d S r"   r   r   mappingr*   r+   s     r   r,   z_bulk_insert.<locals>.<genexpr>Y   s,      MM$4MMMMMMr   T)bulkreturn_defaultsrender_nullsbookkeepingc                     g | ]	}|j         
S r   key)r   ps     r   r   z _bulk_insert.<locals>.<listcomp>k   s    DDDA!%DDDr   c                      g | ]
}|         S r   r   )r   r7   r   s     r   r   z _bulk_insert.<locals>.<listcomp>o   s    <<<cuSz<<<r   )base_mapper_cached_connection_dictsessionconnection_callableNotImplementedErrorlistr*   _sorted_tablesitemsisa_collect_insert_commands_emit_insert_statements_identity_class_identity_key_propstupler7   )r+   mappingssession_transactionisstatesr1   r2   r:   cached_connectionsstatestablesuper_mapperrecordsidentity_clsidentity_propsr   r*   r   s   `              @@r   _bulk_insertrR   #   s    $K0=="6 
!-
 
 	

  " 	:@@x@@@F;;F;;;HH99999HH>>$//<<J*9??AA (
 (
|zz,'' 	
 
 
 
 
( *MMMMMHMMM /)  )
 
 
8 	 '	
 	
 	
 	
 	
  8 -DD)CDDD" 	 	LE5<<<<^<<<==EII	   	 	r   c           
      6   
  j         }t          |          } j         j        r  j        j        h                              fd
|r|r
 fd|D             }nd |D             }nt          |          }|j        j        rt          d          |
                    |          |j                                        D ]Q\  }}                     |          st          d | fd|D             d          }	t          |d ||||	d	           Rd S )
Nc                 l    t          fdj                                         D                       S )Nc              3   @   K   | ]\  }}|j         v s|v ||fV  d S r"   )committed_state)r   kvsearch_keysr   s      r   r,   z6_bulk_update.<locals>._changed_dict.<locals>.<genexpr>   sO       
 
1E)))Q+-=-= F-=-=-=-=
 
r   )r   rA   )r+   r   rY   s    `r   _changed_dictz#_bulk_update.<locals>._changed_dict~   sO     
 
 
 
 

((**
 
 
 
 
 	
r   c                 (    g | ]} |          S r   r   )r   r   rZ   r+   s     r   r   z _bulk_update.<locals>.<listcomp>   s%    KKKfe44KKKr   c                     g | ]	}|j         
S r   r   r   s     r   r   z _bulk_update.<locals>.<listcomp>   r    r   zJconnection_callable / per-instance sharding not supported in bulk_update()c              3   X   K   | ]$}d |j         r|j         j                 nd fV  %d S r"   )_version_id_propr7   r.   s     r   r,   z_bulk_update.<locals>.<genexpr>   sg           "2" 7 ;<<!
     r   T)r0   Fr3   )r:   r;   _primary_key_propkeysr^   r7   unionr?   r<   r=   r>   r*   r@   rA   rB   _collect_update_commands_emit_update_statements)r+   rH   rI   rJ   update_changed_onlyr:   rK   rM   rN   rO   rZ   r*   rY   s   `         @@@r   _bulk_updaterd   s   s    $K0==.K G.2399+FF
 
 
 
 
  " 	:KKKKK(KKKHH99999HH>>"6 
!-
 
 	

 %//<<J*9??AA  
  
|zz,'' 	*      (   #
 
 
( 	 	
 	
 	
 	
 	
1 
  
r   Fc           	         |s0| j         s)t          | |          D ]}t          | |g|d           dS g }g }t          |           }t	          | ||          D ]B\  }}}	}
}}}|s|r|                    |||	|
|f           )|                    |||	|
f           C| j                                        D ]X\  }}	||	j        vrt          ||          }t          |||          }t          | |||	||           t          | |||	||           Yt          | |t          d |D             d |D                                  dS )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   .   K   | ]\  }}}}||||d fV  dS )FNr   )r   r   r#   r+   r*   s        r   r,   zsave_obj.<locals>.<genexpr>   sI        ;UJ
 
FJ>     r   c              3   0   K   | ]\  }}}}}||||d fV  dS )TNr   )r   r   r#   r+   r*   update_version_ids         r   r,   zsave_obj.<locals>.<genexpr>   sR       	 	% 
FJ=	 	 	 	 	 	r   )batch_sort_statessave_objr;   _organize_states_for_saveappendr@   rA   _pks_by_tablerC   ra   rb   rD    _finalize_insert_update_commandsr   )r:   rL   uowtransactionrf   r   states_to_updatestates_to_insertrK   r   r+   r*   has_identity
row_switchri   rM   insertupdates                    r   rl   rl      s     ++ !+v66 	H 	HE[5'>$GGGGG0== 
#;	G	GH H 	 	H: 	H##vz3DE    ##UE6:$FGGGG$399;; 
 
v,,,)%1ABB)E#3
 
 	 	
 	
 	
 	 	
 	
 	
 	
 % ?O  	 	 &	 	 		
 	
    r   c           	      "   t          |           }t          t          | ||                    }| j                                        D ]E\  j        vrfd|D             }t          | |||          }t          | |||           FdS )z\Issue UPDATE statements on behalf of a relationship() which
    specifies post_update.

    c           
   3      K   | ]<\  }}}}|j         v ||||j                            ||j                  nd fV  =d S r"   )ro   version_id_col#_get_committed_state_attr_by_column)r   r   r#   
sub_mapperr*   r+   rM   s        r   r,   zpost_update.<locals>.<genexpr>  s       
 
 :z:z
000  (4 :::v'<   
 1000
 
r   N)r;   r?    _organize_states_for_post_updater@   rA   ro   _collect_post_update_commands_emit_post_update_statements)	r:   rL   rq   post_update_colsrK   rr   rw   r+   rM   s	          @@r   post_updater     s    
 1==(fnMM  %399;; 
 
v,,,
 
 
 
 
 >N
 
 
  /8H
 
 	%	
 	
 	
 	
1
 
r   c           	         t          |           }t          t          | ||                    }| j        }t	          t          |                                                    D ]I}||         }||j        vr|j        r|j        r#t          | |||          }t          | |||||           J|D ]$\  }	}
}}}|j                            |||	           %dS )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@   reversedkeysro   inheritspassive_deletes_collect_delete_commands_emit_delete_statementsdispatchafter_delete)r:   rL   rq   rK   states_to_deletetable_to_mapperrM   r+   deleter   r#   r*   ri   s                r   
delete_objr   ;  s*    1==#KHH  "0O$33556677 
 
 ',,,_ 	!7 	)0@
 
 	 	
 	
 	
 	
 
@ @ 	$$VZ????@ @r   c              #     K   t          | ||          D ]\  }}}}t          |j                  }|j        p|                    |          }dx}	}
|s|j                            |||           n|j                            |||           |j        r|                    |||           |s||j        j	        v r|j        j	        |         }t          j        |          }|                    |          s|                    |          s7t          j        dt!          |          d|dt!          |                    |                     d|t!          |          t!          |                     |                    |           |}	|s|	r0|j        )|                    |	r|	n||	r|	j        n||j                  }
||||||	|
fV  dS )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boolr7   _identity_key_from_stater   before_insertbefore_update_validate_polymorphic_identityr<   identity_mapr   instance_statewas_already_deleted
is_deletedorm_exc
FlushErrorr   
_log_debugremove_state_actionsrz   r{   r   )r:   rL   rq   r   r   r+   r*   rt   instance_keyru   ri   instanceexistings                r   rm   rm   i  sX      -D^V- - B
 B
(ufj EIyJF$C$CE$J$J)--
&  	EO))&*eDDDDO))&*eDDD0 	H11&%GGG 	& 6 CCC%-:<HH!0::H!55h?? &%00:: !,, %U++++\\\9X;N;N;NP   &&" !e$$h''   33H===%
 	J 	F,A,M & J J(3

e#-8
5%! ! 
 	
 	
 	
 	
uB
 B
r   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   )r:   rL   rq   s      r   r}   r}     s     #;GGGr   c              #      K   t          | ||          D ]R\  }}}}|j                            |||           |j        |                    |||j                  }nd}|||||fV  SdS )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{   )r:   rL   rq   r   r   r+   r*   ri   s           r   r   r     s       -D^V- - D D(ufj 	%%fj%@@@ , & J Juf3! ! !%eVZ1BCCCCCD Dr   c           	   #     K   |D ]\  }}}}| |j         vri }	i }
|j        |          }|j        |          }t          |                              |          D ]{}||         }||         }|||vr|s|sTt          |d          st          |t          j                  r*t          |d          r|	                                n||
|<   q||	|j
        <   ||sE|j        |                              |	                              d |
D                       D ]}d|	|<   |r|rP|j        |                              |	          }|j        j        r!|j        |                              |	          }nd}ndx}}|j        dur=|j        6|j        |j        |          v r"|                    d          |	|j        j
        <   |||	|||
||fV  dS )zSIdentify sets of values to use in INSERT statements for a
    list of states.

    N__clause_element__c                     g | ]	}|j         
S r   r6   )r   cs     r   r   z,_collect_insert_commands.<locals>.<listcomp>  s    999qQU999r   TF)ro   _propkey_to_col_insert_cols_evaluating_nonesetintersectionhasattr
isinstancer   ClauseElementr   r7   _insert_cols_as_none
difference_pk_keys_by_tableissubsetr:   eager_defaults_server_default_colsversion_id_generatorrz   _cols_by_table)rM   rs   r0   r1   r2   r   r#   r+   r*   r$   r'   propkey_to_col	eval_nonepropkeyvaluecolcolkeyr(   r)   s                      r   rC   rC     sz      2B J
 J
-z6:,,,/67>	>**77
CC 	( 	(Gw'E )C}I!5!5l!5 
(344
(eS%677
( u&:;;E,,... S!! #(sw 	& +E2F##99L999::& &
 "&v 	2 	2 !259BB6JJK!0 (#)#>u#E#N#N$ $   $(  -11{ 'u44%1%)>u)EEE060K0K1 1F6(,-
 	
 		
 		
 		
 		
CJ
 J
r   c              #     K   |D ]\  }}}}||j         vr|j         |         }i }	|j        |         |r]t          fdt                                                                      |j        |                   D                       }
d}ni }
t                                        |j                  D ]}|         }|         }t          |d          st          |t          j                  r*t          |d          r|                                n||	|<   f|j        |         j                            ||j        |                   dur
||
|j        <   |j        j        r!|j        |                             |
          }nd}||j        |j        |         v r|sa|
s_|	s]|j                                        D ]A}|j        |j                 j                            |t4          j                  }|j        r nB|j        }|
 o|	 }||
|j        <   |s	|j        |
vr)|j        dur |                    |          }||
|j        <   n|j        du r|r
||
|j        <   n|
s|	sjd}d}|rHt          fdt                                        |j        |                   D                       }ni }|D ]}|j        |         j        }|j        |         j                            |t4          j                  }|j        rb|j         rd||f| j        v r3d}|j        d         ||j        <   |
!                    |j        d           n1|j         d         ||j        <   ||	v rd}n|j"        d         ||j        <   ||j                 tG          j$        d	|d
|          |
s|	r#|
%                    |           ||
|||	||fV  |r2|j&        |         D ]$\  }}tO          j(        |||||| |j)                   %dS )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   B   K   | ]}|         j         |         fV  d S r"   r6   r   r   r   r#   s     r   r,   z+_collect_update_commands.<locals>.<genexpr>X  sI          (,j.AB     r   Tr   NFc              3   \   K   | ]&}|         j                             |          fV  'd S r"   )_labelgetr   s     r   r,   z+_collect_update_commands.<locals>.<genexpr>  sP          (/1H1HI     r   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_tablerV   r   r   r   r   r   managerimplis_equalr7   r:   r   _server_onupdate_default_colsr   rz   r   _columntopropertyvaluesget_historyr   PASSIVE_NO_INITIALIZEaddedr   r   PASSIVE_OFFdeletedpop	unchangedr   r   rw   _table_to_equatedr
   populatepassive_updates)rq   rM   rr   r0   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 h 	 ,,,"5)/6 )	(      ">22j))F9%@AA	    F  $F~..;;%  , , #7+$W-5"677 ,:3,< < ,
 #5*>??#00222" !%% M'*/88u4W=      
 ',F37O!0 (8?(6"" !  $(  )%)>u)EEE   < 
 #4;;==  D#mDH5:FFz:+K G }  'C"
7<'7I!2F3: 
4v---U::112CDD"%sw,55)5
 #4sw 	L 	" &	      ">22??1%8       II I   237;-05AA:z'=  = A#O0)5#6)45 5 .2*07a0@	#*-

37D1111 180B	#*-,..*/K,3,=a,@Icj)SZ(0!,,49EE33@   1  	\ 	MM)$$$ 	 	 	 	 	   	 %+$<U$C 	 	 =!"*   Ah hr   c              #     K   |D ]?\  }}}}}	|j         |         }
i }d}|j        |         D ]}||
v r,|                    |||t          j                  ||j        <   2||v s|j        c|j        |         }|j        |j	                 j
                            ||t          j                  }|j        r|j        d         }|||j	        <   d}|ru|	j|j        |j        |         v rV|j        }|	||j        <   t          |j	                  r1|j	        |vr(|j        dur|                    |	          }|||j	        <   |||||fV  AdS )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   r7   r   r   r   r   rz   r   r   )r:   rq   rM   rr   r   r   r#   r+   r*   ri   r   r$   hasdatar   r   r   r   r   s                     r   r~   r~     s      
-@ -@ 	
 "5)(/ 	# 	#Cczz%+%E%E:sJ4J &F & &sz"" (((CL,D/4-16BB:z'G  = ##M!,E&+F37O"G 	@!-)V-B5-III +%6sz" OO*v--35@@ 556GHHC&)F37OVZ????[-@ -@r   c              #   (  K   |D ]\  }}}}}||j         vri }	|j         |         D ]?}
|                    |||
          x|	|
j        <   }|t          j        d|d|
          @|#|j        |j        |         v r||	|j        j        <   |	|fV  dS )zSIdentify values to use in DELETE statements for a list of
    states to be deleted.NzCan't delete from table r   )ro   r{   r7   r   r   rz   r   )r:   rq   rM   r   r   r#   r+   r*   ri   r$   r   r   s               r   r   r   '  s
      
! ! 	 ,,,'. 	 	C BBz3 F }(( 16ss<    )%)>u)EEE0AF6(,-j     =! !r   Tc                 z   j         duoj         j                 v fd}|                     df|          }t          |d           D ]h\  \  }	}
}}}}d}t	          |          }|}d}|s|                                }d}nJ|r%|s#j        j        r|                                }d}n#j         |                    j                   }d}|s|	j        j	        n|	j        j
        }|o|	j        j        }|o }|rm|D ]i\  }}}}	}}}|	                    |                    |          |          }|r't          |||||j        j        d         |d	  	         ||j        z  }|}jn|s`|}|D ]Z\  }}}}	}}}||	                             ||          }|r't          |||||j        j        d         |d	  	         ||j        z  }[nd |D             }|p|ot%          |          d	k    }||	                             ||          }||j        z  }|D ]4\  }}}}	}}}|r't          |||||j        j        d         |d	  	         5|rA|t%          |          k    r,t'          j        d
j        t%          |          |fz            Er!t-          j        d|j        j        z             jdS )z`Emit UPDATE statements corresponding to value lists collected
    by _collect_update_commands().Nc                     t          j                    } j                 D ]>}| j                            |t          j        |j        |j                  k               ?rK| j                            j        t          j        j        j        j        j                  k               	                    |           }|S N)type_)
r   and_ro   clausesrn   	bindparamr   typerz   rw   clauser   stmtr+   needs_version_idrM   s      r   update_stmtz,_emit_update_statements.<locals>.update_stmt_  s    '. 	 	CN!!s}SZsx@@@@     	N!!%=)0 /4     ||F##r   rw   c                     | d         t          | d                   t          | d                   | d         | d         fS N   r            r   r   recs    r   <lambda>z)_emit_update_statements.<locals>.<lambda>z  8    FAKKQLLFF
 r   r   FTc                     g | ]
}|d          S r   r   r   r   s     r   r   z+_emit_update_statements.<locals>.<listcomp>  s    999#s1v999r   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   _memor   r?   r1   r:   r   dialectsupports_sane_rowcount supports_sane_rowcount_returningsupports_sane_multi_rowcountexecuter   
_postfetchcontextcompiled_parametersrowcountlenr   StaleDataErrordescriptionr   warndialect_description)r:   rq   rK   r+   rM   rw   r4   r   cached_stmtr*   	paramkeyshasvaluer)   r(   rO   rows	statementr1   assert_singlerowassert_multirowallow_multirowr   r#   r$   r'   r   check_rowcountmultiparamsr   s      ``                       @r   rb   rb   N  sX    	T) 	B!V%:5%AA 
      ( ##Xu$5{CCK
 
	
 	
	
 	
W W 	HY*:K w--	 	#!1133I"OO		#$		# "1		#
 "1133I"OO".!11&2GHHI"O #EJ55#D 	  @"? 	 *B2B.B [	 2 2 	 &&y'7'7'E'EvNN &"	5a8$
 
 
 
"!1124 " @!1 ' ' 	 $*:6>>!6 A
 # ""*!!&I9!<( 
 
 
 AJ&DD7': :9999!0 "$>[)9)9Q)>  'z2::{  
"   	 $" ""*!!&I9!<( 
 
 
  	s7||##,9(#g,,=>   $  	I3)/0  gW Wr   c                 D   |                      d|f|j                  }t          |d           D ]\  \  }}	}
}}}|}|r|s| j        r|j        j        s|r|
st          |          }d |D             }||                             ||          }|rTt          ||j	        j
                  D ]9\  \  }}}}}}}}}|rt          ||||||||d	  	         (t          |||           :|s| j        r|                                }n!|j        |                    |j                  }|D ]\  }}}}}}}}|r*|                    |                    |          |          }n||                             ||          }|j	        j        }|Xt          ||j        |                   D ]<\  }}|j        |         }|(||v s|                    |j                  
|||j        <   =|r;|r(t          |||||||j	        j
        d         |d	  	         t          |||           dS )z`Emit INSERT statements corresponding to value lists collected
    by _collect_insert_commands().rv   c                     | d         t          | d                   t          | d                   | d         | d         fS r   r   r   s    r   r   z)_emit_insert_statements.<locals>.<lambda>"  r   r   c                     g | ]
}|d          S r   r   r   s     r   r   z+_emit_insert_statements.<locals>.<listcomp>9  s    555c3q6555r   FNr   )r  rv   r   r   r  implicit_returningr?   r  zipr
  r  r	  _postfetch_bulk_saver1   rz   r   inserted_primary_keyro   r   r   r7   )r:   rq   rK   r+   rM   rv   r4   r  r*   pkeysr  r(   r)   rO   r  r  r   r   r#   r$   
mapper_recr&   r'   last_inserted_paramsresultprimary_keypkr   r   s                                r   rD   rD     sS    ##Xu$5u|DDK
 
	
 	
	
 	
pL pL 	DUHk3C  	 `	L !`	L #1	`	L
 ")<`	L `	L `	L 7mmG55W555K":.66y+NNA L !)"?@@L L 	""$#(( L"&*!!&0(!
 
 
 
 -ZUKKKK $ M(B M%5577		&2%55f6KLL	 .L .L 	    '//!((66 FF 0
;CC!6 F %nA*#&#V%9%%@$ $ 6 6C  *;C@><//)~~dh77?35Jtx0 L L"&*!!&""N>qA(!
 
 
 
 -ZUKKK].LEpL pLr   c                    j         duoj         j                 v fd}|                     df|          }t          |d           D ]\  }}	d}
t	          |	          }	|d         }j         |j        j        n|j        j        }|o|j        j        } p|}|sY|}|	D ]S\  }}}}}||         	                    ||          }t          ||||||j        j        d                    |
|j        z  }
Tnyd |	D             }|p|ot          |          dk    }||         	                    ||          }|
|j        z  }
|	D ]-\  }}}}}t          ||||||j        j        d                    .|rA|
t          |	          k    r,t          j        dj        t          |	          |
fz            hr!t%          j        d	|j        j        z             dS )
zeEmit UPDATE statements corresponding to value lists collected
    by _collect_post_update_commands().Nc                     t          j                    } j                 D ]>}| j                            |t          j        |j        |j                  k               ?rK| j                            j        t          j        j        j        j        j                  k               	                    |           }j        |
                    j                  }|S r   )r   r   ro   r   rn   r   r   r   rz   rw   r1   r   s      r   r   z1_emit_post_update_statements.<locals>.update_stmt  s    '. 	 	CN!!s}SZsx@@@@     	N!!%=)0 /4     ||F## ,''(=>>Dr   r   c                 <    | d         t          | d                   fS )N   r   )r   r   s    r   r   z._emit_post_update_statements.<locals>.<lambda>  s    SVSQ[[) r   r   c                     g | ]
\  }}}}}|S r   r   )r   r   r#   r$  r&   r$   s         r   r   z0_emit_post_update_statements.<locals>.<listcomp>  s2       ?E:z4   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  )r:   rq   rK   r+   rM   rw   r   r  r7   rO   r  r*   r  r  r  r  r   r#   r$  r$   r   r  r   s      ``                 @r   r   r     s    	T) 	B!V%:5%AA 
      0 !!=%"8+FFI  ))  G GW w--V
 $, 55#D 	  @"? 	 .-@ $	-NEL # #Az:z6&z2::9fMM&"I1!4   
"# CJ  K
 -  :S%5%5%:  #:.66y+NNAAJDEL 	 	Az:z6&"I1!4     	s7||##,9(#g,,=>   $  	I3)/0  GG Gr   c                 "   j         duoj         j                 v fd}|                     df|          }t          |d           D ]<\  }}	d |	D             }
||         }t	          |
          }d}d}rx|j        j        sl|j        j        r(d}|
D ]"}|                    ||          }||j	        z  }#nYt          j        d	|j        j        z             |                    ||
           n!|                    ||
          }sd
}|j	        }| j        rm|dk    rg||k    ra|j        j        st	          |
          dk    rB|r!t          j        dj        ||fz             t          j        dj        ||fz            >dS )z`Emit DELETE statements corresponding to value lists collected
    by _collect_delete_commands().Nc                     t          j                    } j                 D ]>}| j                            |t          j        |j        |j                  k               ?rK| j                            j        t          j        j        j        j        j                  k               	                    |           S r   )
r   r   ro   r   rn   r   r7   r   rz   r   )r   r   r+   need_version_idrM   s     r   delete_stmtz,_emit_delete_statements.<locals>.delete_stmt  s    '. 	 	CN!!s}SWCH====     	N!!%=)-V5J5O     ||F###r   r   c                     | d         S )Nr   r   r   s    r   r   z)_emit_delete_statements.<locals>.<lambda>   s
    A r   c                     g | ]\  }}|S r   r   )r   r$   r*   s      r   r   z+_emit_delete_statements.<locals>.<listcomp>!  s    ==="4&*v===r   Fr   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  confirm_deleted_rowsr  r   r  )r:   rq   rK   r+   rM   r   r2  r  r*   recsdel_objectsexpectedrows_matched	only_warnr$   r   r1  s      ``           @r   r   r     sX    	T) 	B!V%:5%AA 
$ $ $ $ $ $ $" !!8U"3[AAI#F,>,>?? = =
D====='
3
{##	 	&&C	& !8 ;  * / /F"**9f==A AJ.LL/ 	7 (<=  
 ""9k::::""9k::A" ! 	:L ,	r!!L(("? ) {##q((
  	= ((LA	B    ,= ((LA	B  o= =r   c                 6  	 |D ]\  	}}}}|j         rC	                    	fd|j         D                       }|r	                    	j        |           g }| j        r2|                    	j                            |j                             |j	        <|j
        du r3|j        j        	j        v r |                    |j        j        g           |rO|                     	          	_        t          j        |j                            |          	j        	|           |s|j                            ||	           n|j                            ||	           |j
        du r-|j	        &||j        j                 t-          j        d          dS )zzfinalize state on states that have been inserted or updated,
    including calling after_insert/after_update events.

    c                     g | ]A}|j         r|j        r*|j        j        v s|j         s|j        s|j        j        v:|j        BS r   )expire_on_flushdeferredr7   r   )r   r8   r   s     r   r   z4_finalize_insert_update_commands.<locals>.<listcomp>i  s{       )	
 "#
 01u
/B/B - 0C !"
	 0C
 E33 E 433r   NF)refresh_stateonly_load_propsz2Instance does not contain a non-NULL version value)_readonly_propsunmodified_intersection_expire_attributesr   r   extend_unloaded_non_objectr   &_server_default_plus_onupdate_propkeysrz   r   r^   r7   unloadedr   r	   load_on_identr<   queryr   after_insertafter_updater   r   )
r:   rq   rL   r#   r+   r*   rt   readonly
toload_nowr   s
            @r   rp   rp   `  s   
 @F > >;z6:|! 	?44   #3   H  ?((X>>>
 
% 	*77A    !-+u44&*en<<!!6#:#>"?@@@ 	#<<UCCEI!&,,V44	# *	     	DO((UCCCCO((UCCC '500%1&156>(H  y> >r   c                     |                     |          rd S |j        j        j        }|j        j        j        } j        , j         j        |         v rt          |           j        gz   }t           j	        j
        j                  }	|	rg }
|D ][}|j        |v rP| j        v rG||j                 | j        |         j        <   |	r%|
                     j        |         j                   \|	r#|
r! j	        j
                            |||
           |r)|                    |j         fd|D                        d S d S )Nc                 F    g | ]}|j         v j         |         j        S r   r   r7   r   r   r+   s     r   r   z*_postfetch_post_update.<locals>.<listcomp>  <       000 (+/000r   )r   r
  compiledprefetch	postfetchrz   r   r?   r   class_managerr   refresh_flushr7   r   rn   rD  r   )r+   rq   rM   r   r   r&  r$   prefetch_colspostfetch_colsrX  load_evt_attrsr   s   `           r   r.  r.    s      '' N+4M^,6N 	)!V%:5%AAA]++v/D.EE-6DEEM  G G5F??qF$<<<5;AE]E&*1-12 G%%f&>q&A&EFFF 
 
%33>>	
 	
 	
  
  J   '  	
 	
 	
 	
 	

 
r   c	           
          |j         j        j        }	|j         j        j        }
|j         j        j         j        , j         j        |         v rt          |	           j        gz   }	t           j	        j
        j                  }|rg }ro|j         j        }|aD ]^}|j        r|j         j        r j                            |          }|r,||         ||j        <   |r|                    |j                   _|	D ][}|j        |v rP| j        v rG||j                 | j        |         j        <   |r%|                     j        |         j                   \|r#|r! j	        j
                            |||           |r#|r!|
                    fd|D                        |
r'|                    |j         fd|
D                         j        |         D ]$\  }}t/          j        |||||| j                   %dS )zExpire attributes in need of newly persisted database state,
    after an INSERT or UPDATE statement has proceeded for that
    state.Nc                 *    g | ]}|j         r|v|S r   )r'  )r   r   returning_colss     r   r   z_postfetch.<locals>.<listcomp>  s:       ? (+.'@'@ '@'@'@r   c                 F    g | ]}|j         v j         |         j        S r   rQ  rR  s     r   r   z_postfetch.<locals>.<listcomp>  rS  r   )r
  rT  rU  rV  	returningrz   r   r?   r   rW  r   rX  returned_defaultsr'  isinsertr   r   r7   rn   rE  rD  r   r   r
   r   r   )r+   rq   rM   r   r   r&  r$   r'   isupdaterY  rZ  rX  r[  rowr   r   r   r   r   r^  s   `                  @r   r	  r	    s    N+4M^,6N^,6N 	)!V%:5%AAA]++v/D.EE-6DEEM  8n.?% 8 8 ? v~'>  /33C88 8&)#hE$(O$ 8&--dh777 G G5F??qF$<<<5;AE]E&*1-12 G%%f&>q&A&EFFF 
 
%33>>	
 	
 	
  

L 

 	   '  	
 	
 	
  
  J   '  	
 	
 	
 #4U; 	
 	
="	
 	
 	
 	
	
 	
r   c                 X    | j         |         D ]\  }}t          j        |||           d S r"   )r   r
   bulk_populate_inherit_keys)r+   r   rM   r   r   s        r   r!  r!  /  sD    "4U; A A='q-@@@@A Ar   c              #     K   |j         j        r|j         j        }n|j                            |           }d}t	          | |          D ];}|r || |                                          }|j        j        }||j        ||fV  <dS )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   )r:   rq   rL   r=   r*   r   r+   s          r   r   r   4  s       1 #,4H#/::;GG
"k622 4 4 	G,,[%))++FFJ%UZ333334 4r   c                 2     t          j         fd          S )Nc                 :    |                      j                  S )N)compiled_cache)execution_options_compiled_cache)r&   r:   s    r   r   z)_cached_connection_dict.<locals>.<lambda>Q  s"    T++&6 , 
 
 r   )r   PopulateDict)r:   s   `r   r;   r;   N  s,    	
 	
 	
 	
  r   c                 |   t          |          }t          d |D                       }|                    |           	 t          || j                  }nB# t          $ r5}t          j        t          j        d|z            |           Y d }~nd }~ww xY wt          |t          j
        d                    |z   S )Nc              3   (   K   | ]}|j         	|V  d S r"   r6   )r   ss     r   r,   z_sort_states.<locals>.<genexpr>Y  s)      ==115+<Q+<+<+<+<==r   r6   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+   rL   pending
persistentpersistent_sortederrs         r   rk   rk   W  s   &kkG=======Jj)))
"F9
 
 
  
 
 
&>@CD   	
 	
 	
 	
 	
 	
 	
 	
 	

 	wH/??@@@
	s   A 
B +BBc                       e Zd ZdZd Zd Zed             Zed             Z	d Z
d Zd Z ej        d	          d
             Zd Zd ZdS )BulkUDz;Handle bulk update and deletes via a :class:`_query.Query`.c                     |                     d          | _        | j                                        | _        |                                  d S )NF)enable_eagerloadsrJ  _bind_mapperr+   _validate_query_state)selfrJ  s     r   __init__zBulkUD.__init__q  sD    ,,U33
j--//""$$$$$r   c           	      <   ddd t           j        fddd t           j        fdddt           j        fdd	dt           j        fd
ddt           j        fdddt           j        ffD ]>\  }}}} |t          | j        |          |          st          j        d|d          ?d S )N_limitzlimit()_offsetzoffset()	_order_byz
order_by()F	_group_byz
group_by()	_distinctz
distinct()	_from_objz2join(), outerjoin(), select_from(), or from_self()r   z1Can't call Query.update() or Query.delete() when z has been called)r}  is_eqgetattrrJ  r{  r|  )r  attrmethnamenotsetops        r   r  zBulkUD._validate_query_statev  s    y$5
D(,7,x|<,x|<,x|<D	+
 	 	&D(FB 2gdj$//88 0019<  	 	r   c                     | j         j        S r"   )rJ  r<   r  s    r   r<   zBulkUD.session  s    z!!r   c                     	 ||         } || S # t           $ r`}t          j        t          j        dd                    t          d |D                                 z            |           Y d }~d S d }~ww xY w)Nz3Valid strategies for session synchronization are %sz, c              3   4   K   | ]}t          |          V  d S r"   )repr)r   xs     r   r,   z"BulkUD._factory.<locals>.<genexpr>  s(      0I0IQa0I0I0I0I0I0Ir   rs  )KeyErrorr   rz  r{  ArgumentErrorjoinrw  )clslookupsynchronize_sessionargklassr  s         r   _factoryzBulkUD._factory  s    	./E 5#;  	 	 	K$ $		&0I0I&0I0I0I*I*I J JL  !$         	s    
A9AA44A9c                     |                                   |                                  |                                  |                                  |                                  |                                  d S r"   )_do_before_compile_do_pre_do_pre_synchronize_do_exec_do_post_synchronize_do_postr  s    r   exec_zBulkUD.exec_  sc    !!!  """!!###r   c                 r    | j                             || j                  | _        | j        j        | _        d S r"   )rJ  _execute_crudr+   r&  r  )r  r   s     r   _execute_stmtzBulkUD._execute_stmt  s-    j..tT[AA,r   c                     t                      r"   )r>   r  s    r   r  zBulkUD._do_before_compile  s    !###r   zsqlalchemy.orm.queryc                 n   | j         }|                    |          | _        t          |j        d         |j                  rt                      }|j        D ]T}t          ||j                  s|                                  n(|                    t          |j
                             Ut          |          dk    rt          j        d          |                                | _        n$|                    d          j        j        | _        |j        }|j        r|                                 d S d S )Nr   r   zLThis operation requires only one Table or entity be specified as the target.)rJ  QueryContextr
  r   	_entities_ColumnEntityr   clearrw   r   columnr  r{  r|  r   primary_table_only_entity_zeror+   local_tabler<   
_autoflush)r  querylibrJ  tablesentr<   s         r   r  zBulkUD._do_pre  s9   
,,U33eoa((*@AA 	!UUF = =!#x'=>> =LLNNNEMM-
";";<<<<6{{a09  
 &,ZZ\\"" "'!8!85" " [ 
 - 	!     	! 	!r   c                     d S r"   r   r  s    r   r  zBulkUD._do_pre_synchronize      r   c                     d S r"   r   r  s    r   r  zBulkUD._do_post_synchronize  r  r   N)__name__
__module____qualname____doc__r  r  propertyr<   classmethodr  r  r  r  r   dependenciesr  r  r  r   r   r   r  r  n  s        EE% % %
  ( " " X"   [  - - -$ $ $ T-.. !  ! /. !D      r   r  c                       e Zd ZdZd Zd ZdS )BulkEvaluatezDBulkUD which does the 'evaluate' method of session state resolution.c                     d S r"   r   )r  evaluator_compilers     r   _additional_evaluatorsz#BulkEvaluate._additional_evaluators  r  r   c                    | j         }|                                j        	 t          j                  }|j        |                    |j                  nd |                     |           nG# t          j        $ r5}t          j
        t          j        d|z            |           Y d }~nd }~ww xY wfd|j        j                                        D             | _        d S )Nc                     dS )NTr   )ri  s    r   eval_conditionz8BulkEvaluate._do_pre_synchronize.<locals>.eval_condition  s    4r   ztCould not evaluate current criteria in Python: "%s". Specify 'fetch' or False for the synchronize_session parameter.)from_c                 X    g | ]&\  \  }}}}t          |           |          $|'S r   )
issubclass)r   r  r(  identity_tokenri  r  
target_clss        r   r   z4BulkEvaluate._do_pre_synchronize.<locals>.<listcomp>  s`      
  
  
 #z** 
 0>~c/B/B 
 
  
  
r   )rJ  _mapper_zeroclass_r   EvaluatorCompilerwhereclauseprocessr  UnevaluatableErrorr   rz  r{  r|  r<   r   rA   matched_objects)r  rJ  r  r  r  r  s       @@r   r  z BulkEvaluate._do_pre_synchronize  s>   
''))0
	!*!<Z!H!H ,!3!;!;E<M!N!N      ''(:;;;;+ 	 	 	K*57:; 
         	 
  
  
  
  
 m06688 
  
  
s   AA3 3B7+B22B7N)r  r  r  r  r  r  r   r   r   r  r    s8        NN  "
 "
 "
 "
 "
r   r  c                       e Zd ZdZd ZdS )	BulkFetchzABulkUD which does the 'fetch' method of session state resolution.c                    | j         }|j        }|                                }|j                            | j        j                  }|                    || j        |j	                  
                                | _        d S )N)r+   r$   )rJ  r<   _compile_contextr  with_only_columnsr  r'  r  r+   _paramsfetchallmatched_rows)r  rJ  r<   r
  select_stmts        r   r  zBulkFetch._do_pre_synchronize  s|    
-((**'99*
 
 $OOEM , 
 

(** 	r   N)r  r  r  r  r  r   r   r   r  r    s)        KK	 	 	 	 	r   r  c                   v     e Zd ZdZ fdZed             Zd Zed             Z	ed             Z
d Zd Z xZS )	
BulkUpdatezBulkUD which handles UPDATEs.c                 t    t          t          |                               |           || _        || _        d S r"   )superr  r  r   update_kwargs)r  rJ  r   r  	__class__s       r   r  zBulkUpdate.__init__  s6    j$((///*r   c                 d    t                               t          t          t          d||||          S N)evaluatefetchF)r  r  BulkUpdateEvaluateBulkUpdateFetchr  )r  rJ  r  r   r  s        r   factoryzBulkUpdate.factory  s9    .(! 
  

 

 
	
r   c                     | j         j        j        r.| j         j        j        D ]} || j         |           }||| _         d S d S r"   )rJ  r   before_compile_updater  fn	new_querys      r   r  zBulkUpdate._do_before_compile&  ^    :4 	+j)? + +Btz400	(!*DJ		+ 	++ +r   c                 "   g }t          | j        d          r| j                                        n| j        D ]\  }}| j        rt	          |t
          j                  r>t          | j        |          }|                    |	                    |                     dt	          |t          j                  r)|                    |	                    |                     |                    ||f           |                    ||f           |S )NrA   )r   r   rA   r+   r   r   string_typesr   rE  _bulk_update_tuplesr   QueryableAttributern   )r  r   rW   rX   descs        r   _resolved_valueszBulkUpdate._resolved_values-  s	    t{G,,DK	& 	&DAq
 { 	&a!233 *-dk1==DMM$":":1"="=>>>>:#@AA *MM!"7"7":":;;;;MM1a&))))q!f%%%%r   c                    g }| j         D ]\  }}t          |t          j                  r|                    |j        |f           <t          |d          r|                                }| j        r_t          |t          j
                  rE	 | j        j        |         }|                    |j        |f           # t          j        $ r Y w xY wt          j        d|z            |S )Nr   zInvalid expression type: %r)r   r   r   r  rn   r7   r   r   r+   r   ColumnElementr   r   UnmappedColumnErrorr{  r|  )r  r   rW   rX   r  s        r   "_resolved_values_keys_as_propnamesz-BulkUpdate._resolved_values_keys_as_propnamesA  s   ) 	 	DAq!Z:;; +quaj)))011 +((**{ 
z!Z-EFF 
1;8;D MM48Q-0000 2   D
 01A5   s   B;;CCc                     | j         }| j                            dd          st          |          }t	          j        | j        | j        j        |fi | j        }| 	                    |           d S )Npreserve_parameter_orderF)
r   r  r   r   r   rw   r  r
  r  r  )r  r   r   s      r   r  zBulkUpdate._do_execX  s    &!%%&@%HH 	"&\\FjL$
 
  	
 
 	;'''''r   c                 R    | j         j        }|j                            |            d S r"   )rJ  r<   r   after_bulk_updater  r<   s     r   r  zBulkUpdate._do_postg  )    *$**400000r   )r  r  r  r  r  r  r  r  r  r   r  r  r  __classcell__r  s   @r   r  r    s        ''+ + + + +
 
 
 [
+ + +   X&   X,( ( (1 1 1 1 1 1 1r   r  c                   J     e Zd ZdZ fdZed             Zd Zd Zd Z	 xZ
S )
BulkDeletezBulkUD which handles DELETEs.c                 X    t          t          |                               |           d S r"   )r  r  r  )r  rJ  r  s     r   r  zBulkDelete.__init__o  s'    j$((/////r   c                 `    t                               t          t          t          d||          S r  )r  r  BulkDeleteEvaluateBulkDeleteFetchr  )r  rJ  r  s      r   r  zBulkDelete.factoryr  s3    .(! 
  
 
 	
r   c                     | j         j        j        r.| j         j        j        D ]} || j         |           }||| _         d S d S r"   )rJ  r   before_compile_deleter  s      r   r  zBulkDelete._do_before_compile~  r  r   c                 x    t          j        | j        | j        j                  }|                     |           d S r"   )r   r   r  r
  r  r  )r  r2  s     r   r  zBulkDelete._do_exec  s5    j!3T\5MNN;'''''r   c                 R    | j         j        }|j                            |            d S r"   )rJ  r<   r   after_bulk_deleter	  s     r   r  zBulkDelete._do_post  r
  r   )r  r  r  r  r  r  r  r  r  r  r  r  s   @r   r  r  l  s        ''0 0 0 0 0 	
 	
 [	
+ + +( ( (
1 1 1 1 1 1 1r   r  c                       e Zd ZdZd Zd ZdS )r  zSBulkUD which handles UPDATEs using the "evaluate"
    method of session resolution.c                     i | _         | j        }|D ]4\  }}|                    t          j        |                    | j         |<   5d S r"   )value_evaluatorsr  r  r   _literal_as_binds)r  r  r   r7   r   s        r   r  z)BulkUpdateEvaluate._additional_evaluators  s]     "8  	 	JC);)C)C,U33* *D!#&&	 	r   c                    | j         j        }t                      }t          | j                                                  }| j        D ]}t          j        |          t          j	        |          }}|j
                            |          }|D ]} | j        |         |          ||<   |j        j                            |d |           |                    |t          |                     |                    |t          |                              |                     |                    |           |                    |           d S r"   )rJ  r<   r   r?   r  r   r  r   r   instance_dict
unmodifiedr   r   r   refresh_commitrD  r   add_register_altered)	r  r<   rL   evaluated_keysri  r   r   to_evaluater7   s	            r   r  z'BulkUpdateEvaluate._do_post_synchronize  sI   *$d388::;;' 	 	C)#..(-- E  *77GGK" = =7T237<<c

M"**5$DDDMM%k!2!2333 $$s>**55kBB   JJu!!&)))))r   N)r  r  r  r  r  r  r   r   r   r  r    s<        % %  * * * * *r   r  c                       e Zd ZdZd ZdS )r  zSBulkUD which handles DELETEs using the "evaluate"
    method of session resolution.c                 b    | j         j                            d | j        D                        d S )Nc                 6    g | ]}t          j        |          S r   )r   r   )r   ri  s     r   r   z;BulkDeleteEvaluate._do_post_synchronize.<locals>.<listcomp>  s#    LLLZ&s++LLLr   )rJ  r<   _remove_newly_deletedr  r  s    r   r  z'BulkDeleteEvaluate._do_post_synchronize  s=    
00LLt7KLLL	
 	
 	
 	
 	
r   Nr  r  r  r  r  r   r   r   r  r    s-        % %
 
 
 
 
r   r  c                       e Zd ZdZd ZdS )r  zPBulkUD which handles UPDATEs using the "fetch"
    method of session resolution.c                    | j         j        | j                                         t          fdfd| j        D             D                       }| j        }t          d |D                       }|D ]4}|                    |j                  }|r                    ||           5	                    |           d S )Nc                 `    g | ]*}|j         v t          j        j         |                   +S r   )r   r   r   )r   identity_keyr<   s     r   r   z8BulkUpdateFetch._do_post_synchronize.<locals>.<listcomp>  sH     	 	 	   7#777 )'*>|*LMM 877r   c                 T    g | ]$}                     t          |                    %S r   )identity_key_from_primary_keyr?   )r   r'  target_mappers     r   r   z8BulkUpdateFetch._do_post_synchronize.<locals>.<listcomp>  sF     % % % $ "??[)) % % %r   c              3       K   | ]	\  }}|V  
d S r"   r   )r   rW   rX   s      r   r,   z7BulkUpdateFetch._do_post_synchronize.<locals>.<genexpr>  s&      **41aQ******r   )
rJ  r<   r  r   r  r  r   r   _expire_stater"  )r  rL   r   attribr   	to_expirer<   r0  s         @@r   r  z$BulkUpdateFetch._do_post_synchronize  s   *$
//11	 	 	 	% % % % (,'8	% % %	 	 	
 
 8**6***** 	8 	8E++EJ77I 8%%eY777!!&)))))r   Nr)  r   r   r   r  r    s-        % %* * * * *r   r  c                       e Zd ZdZd ZdS )r  zPBulkUD which handles DELETEs using the "fetch"
    method of session resolution.c                     | j         j        }| j                                         }| j        D ]`}|                    t          |                    }||j        v r3|                    t          j	        |j        |                   g           ad S r"   )
rJ  r<   r  r  r/  r?   r   r(  r   r   )r  r<   r0  r'  r-  s        r   r  z$BulkDeleteFetch._do_post_synchronize  s    *$
//11, 	 	K )FF[!! L w333--"1#0>   	 	r   Nr)  r   r   r   r  r    s-        % %    r   r  )F)FFF)T)6r  	itertoolsr   r   r}   r   r   r   r   r	   r
   baser   r   r{  r   r   r   sql.baser   rR   rd   rl   r   r   rm   r}   r   rC   ra   r~   r   rb   rD   r   r   rp   r.  r	  r!  r   r;   rk   objectr  r  r  r  r  r  r  r  r  r   r   r   <module>r<     s                                               $ $ $ $ $ $                               $ $ $ $ $ $M M M`B
 B
 B
JS S S Sl*
 *
 *
Z+@ +@ +@\N
 N
 N
b	H 	H 	HD D D6 
U
 U
 U
 U
r 38v v v vr5@ 5@ 5@p$! $! $!\ ~ ~ ~ ~P ~L ~L ~L ~LBp p pfZ Z ZzC C CL&
 &
 &
R]
 ]
 ]
@A A A
4 4 44    .e e e e eV e e eP(
 (
 (
 (
 (
6 (
 (
 (
V       Y1 Y1 Y1 Y1 Y1 Y1 Y1 Y1x 1  1  1  1  1  1  1  1F%* %* %* %* %*z %* %* %*P
 
 
 
 
z 
 
 
* * * * *i * * *<    i     r   