
    
 @g                   B   d 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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m0Z0 dd)l1m2Z2 e
rHdd*l3m4Z4 dd+l3m5Z5 dd,l3m6Z6 dd-l7m8Z8 dd.l9m:Z: dd/l9m;Z; dd0l9m<Z< dd1l9m=Z= dd2l>m?Z? dd3lm@Z@ dd4lmAZA dd5lBmCZC  ed6eD7          ZEe		 	 djdkdI            ZFe		 	 djdldL            ZF	 	 dmdndOZFe		 	 dodpdU            ZGe		 	 dodqdX            ZG	 	 drdsdZZGd[ ZH G d\ d]e          ZI G d^ d_eI          ZJ e*jK        d`da           G db dceIe.                      ZL e*jK        d`dd           G de dfeJe/                      ZM e*jK        d`dg           G dh dieJe-                      ZNdMS )tzoadditional ORM persistence classes related to "bulk" operations,
specifically outside of the flush() process.

    )annotations)Any)cast)Dict)Iterable)Optional)overload)TYPE_CHECKING)TypeVar)Union   )
attributes)context)	evaluator)exc)loading)persistence)NO_VALUE)AbstractORMCompileState)FromStatement)ORMFromStatementCompileState)QueryContext   )util)Dialect)result)	coercions)dml)
expression)roles)select)sqltypes)_entity_namespace_key)CompileState)Options)DeleteDMLState)InsertDMLState)UpdateDMLState)
EMPTY_DICT)Literal)DMLStrategyArgument)OrmExecuteOptionsParameter)SynchronizeSessionArgument)Mapper)_BindArguments)ORMExecuteState)Session)SessionTransaction)InstanceState)
Connection)cursor)_CoreAnyExecuteParams_O)bound.mapper
Mapper[_O]mappings<Union[Iterable[InstanceState[_O]], Iterable[Dict[str, Any]]]session_transactionr2   isstatesboolreturn_defaultsrender_nullsuse_orm_insert_stmtLiteral[None]execution_options$Optional[OrmExecuteOptionsParameter]returnNonec                    d S N r9   r;   r=   r>   r@   rA   rB   rD   s           S/var/www/piapp/venv/lib/python3.11/site-packages/sqlalchemy/orm/bulk_persistence.py_bulk_insertrM   J   	     C    Optional[dml.Insert]cursor.CursorResult[Any]c                    d S rI   rJ   rK   s           rL   rM   rM   X   rN   rO   N"Optional[cursor.CursorResult[Any]]c                     j         }|j        j        rt          d          |r(|rd D             }	d |	D             n)d D             nd D             t	                      |                    |          d }
 fd|j                                        D             }|rd}nt          |          dk    rd}nd	}|D ]\  }}| fd
|	                                D             nd} fdt          j        | fdD             d|||          D             }t          j        |d ||||||          }|,|j        r|
|}
|j        r|sJ |
                    |          }
|rD|rB j        }d  j        D             }|	D ]'\  }|t%          fd|D                       f|_        (||
J |
S d S )NzJconnection_callable / per-instance sharding not supported in bulk_insert()c                     g | ]}||j         fS rJ   dict.0states     rL   
<listcomp>z _bulk_insert.<locals>.<listcomp>z   s    @@@euej)@@@rO   c                    g | ]\  }}|S rJ   rJ   )rY   rZ   dict_s      rL   r[   z _bulk_insert.<locals>.<listcomp>{   s    ;;;.5%;;;rO   c                    g | ]	}|j         
S rJ   rV   rX   s     rL   r[   z _bulk_insert.<locals>.<listcomp>}       999u
999rO   c                ,    g | ]}t          |          S rJ   rV   rY   ms     rL   r[   z _bulk_insert.<locals>.<listcomp>       ...DGG...rO   c                0    g | ]\  }}|j         v ||fS rJ   )_pks_by_table)rY   tablempr9   s      rL   r[   z _bulk_insert.<locals>.<listcomp>   s9       E2F((( 
(((rO   Tr   Fc                <    g | ]}|j         d          v |j         S r   keyrY   br;   s     rL   r[   z _bulk_insert.<locals>.<listcomp>   s6       5HQK'' '''rO   rJ   c           	   3  >   K   | ]\  }}}}}}}}d ||
	|||fV  d S rI   rJ   )rY   rZ   
state_dictparamsrg   connvalue_paramshas_all_pkshas_all_defaults
connectionr9   s            rL   	<genexpr>z_bulk_insert.<locals>.<genexpr>   sk       
 
	 #  	
 
 
 
 
 
rO   c              3  $   K   | ]
}d |fV  d S rI   rJ   rY   mappingru   r9   s     rL   rv   z_bulk_insert.<locals>.<genexpr>   s,      MM$4MMMMMMrO   )bulkr@   rA   include_bulk_keys)bookkeepingrB   rD   c                    g | ]	}|j         
S rJ   rj   )rY   ps     rL   r[   z _bulk_insert.<locals>.<listcomp>   s    DDDA!%DDDrO   c                     g | ]
}|         S rJ   rJ   )rY   rk   r]   s     rL   r[   z _bulk_insert.<locals>.<listcomp>   s    <<<cuSz<<<rO   )base_mappersessionconnection_callableNotImplementedError_expand_compositesru   _sorted_tablesitemslen_get_embedded_bindparamsr   _collect_insert_commands_emit_insert_statements
_returningreturns_rowssplice_horizontally_identity_class_identity_key_propstuplerk   )r9   r;   r=   r>   r@   rA   rB   rD   r   statesreturn_resultmappers_to_runr|   rf   super_mapperextra_bp_namesrecordsr   identity_clsidentity_propsrZ   ru   r]   s   ``                   @@rL   rM   rM   f   s    $K"6 
!-
 
 	

  - 	:@@x@@@F;;F;;;HH99999HH..X...68,,,$//<<J8<M   $399;;  N  		^		q	 	  - ?J ?J| #.   ,EEGG     	
 
 
 
 
( 5MMMMMHMMM +)"0  )
 
 
< 4# 3/	
 	
 	
 *&1 J]5J &$ J"""" - A A& I I 8 -DD)CDDD" 	 	LE5<<<<^<<<==EII
 &((( '&rO   TMapper[Any]update_changed_onlyuse_orm_update_stmtenable_check_rowcountc                    d S rI   rJ   r9   r;   r=   r>   r   r   r   s          rL   _bulk_updater      	     CrO   Optional[dml.Update]_result.Result[Any]c                    d S rI   rJ   r   s          rL   r   r      r   rO   Optional[_result.Result[Any]]c                     j         } j         j        r  j        j        h                              fd|r|r fdD             n)d D             nd D             t                      |j        j        rt          d          |	                    |          | fd|
                                D             nd}|j                                        D ]g\  }	}
                     |
          r	|	 j        vr$t          j        d |	 fdD             d	||
          }t          j        |d |
|	|d||           h|t%          j                    S d S )Nc                R    fdj                                         D             S )Nc                6    i | ]\  }}|j         v s|v ||S rJ   )committed_state)rY   kvsearch_keysrZ   s      rL   
<dictcomp>z7_bulk_update.<locals>._changed_dict.<locals>.<dictcomp>  sA     
 
 
1E)))Q+-=-= q-=-=-=rO   )rW   r   )r9   rZ   r   s    `rL   _changed_dictz#_bulk_update.<locals>._changed_dict  sB    
 
 
 
 

((**
 
 
 	
rO   c                (    g | ]} |          S rJ   rJ   )rY   rZ   r   r9   s     rL   r[   z _bulk_update.<locals>.<listcomp>  s%    KKKfe44KKKrO   c                    g | ]	}|j         
S rJ   rV   rX   s     rL   r[   z _bulk_update.<locals>.<listcomp>  r_   rO   c                ,    g | ]}t          |          S rJ   rV   ra   s     rL   r[   z _bulk_update.<locals>.<listcomp>  rc   rO   zJconnection_callable / per-instance sharding not supported in bulk_update()c                <    g | ]}|j         d          v |j         S ri   rj   rl   s     rL   r[   z _bulk_update.<locals>.<listcomp>*  s6     	
 	
 	
u## E###rO   rJ   c              3  X   K   | ]$}d |j         r|j         j                 nd fV  %d S rI   )_version_id_proprk   rx   s     rL   rv   z_bulk_update.<locals>.<genexpr>:  sg           "2" 7 ;<<!
     rO   T)rz   r   r{   F)r|   r   r   )r   _primary_key_propkeysr   rk   unionr   r   r   r   ru   r   r   r   isare   r   _collect_update_commands_emit_update_statements_resultnull_result)r9   r;   r=   r>   r   r   r   r   r   rf   r   r   r   ru   r   s   ``          @@@rL   r   r      s;    $K.K G.2399+FF
 
 
 
 
  - 	:KKKKK(KKKHH99999HH..X...68,,,"6 
!-
 
 	

 %//<<J *	
 	
 	
 	
(AACC	
 	
 	
 	
    +9??AA "
 "
|zz,'' 	58L+L+L6      (    3,'
 
 
* 	+ 3"7		
 		
 		
 		
 		
 &"$$$ '&rO   c                    | j         sd S t                                                    }fd|D             }|D ]+}|                    |          D ]} ||         |           ,d S )Nc                F    i | ]}||                                          S rJ   ))_populate_composite_bulk_save_mappings_fn)rY   rk   composite_attrss     rL   r   z&_expand_composites.<locals>.<dictcomp>a  s<        	_S!KKMM  rO   )
compositessetkeysintersection)r9   r;   composite_keys
populatorsry   rk   r   s         @rL   r   r   [  s    'O --//00N   !  J  % %!..w77 	% 	%CJsOG$$$$	%% %rO   c                      e Zd ZU dZdZded<   ed             Zed             Zed             Z	ed             Z
ed	             Zdd
dZed             ZdS )ORMDMLStateTNz&Optional[ORMFromStatementCompileState]from_statement_ctxc              #    K   t           j        }|D ]i\  }}t          j        t          j        |          }t          |t                    rt          ||t                    }|t          u rYt          j        t          j        |          |r3t          j        t          j
        |t          j                    d          n|fV   |||                    |          |          E d {V  d|j        v rK|j        }	t          |	d         |	d                   }
 |||
                    |          |          E d {V  .||s|n2t          j        t          j
        |t          j                    d          fV  kd S )N)defaultT)type_is_crudentity_namespace	proxy_key)r(   _get_crud_kv_pairsr   expectr    DMLColumnRole
isinstancestrr#   r   ExpressionElementRoler"   NullType_bulk_update_tuples_annotations)clsr9   	statementkv_iteratorneeds_to_be_cacheablecore_get_crud_kv_pairsr   r   desck_annoattrs              rL   _get_orm_crud_kv_pairsz"ORMDMLState._get_orm_crud_kv_pairsn  s      "0!B ,	 ,	DAq !4a88A!S!! ),VQIII8##!()<a@@ 1	(!7"*"3"5"5$(	    
 
 
 
 
  65!0033-           
 $q~55,-.{0C  21,,Q//)          0AA")3&/11 $	  	
 
 
 
 
E,	 ,	rO   c                ~     j         d         rj        st          j        |          S  fd|D             S )Nplugin_subjectc           
         g | ]>}t                              j        |                                d                     ?S )F)rW   r   r9   r   )rY   
value_dictr   r   r   s     rL   r[   z8ORMDMLState._get_multi_crud_kv_pairs.<locals>.<listcomp>  s`     
 
 
  **")9j6F6F6H6H%  
 
 
rO   )_propagate_attrsr9   r(   _get_multi_crud_kv_pairs)r   r   r   r   s   `` @rL   r   z$ORMDMLState._get_multi_crud_kv_pairs  sv    "34DE 	^%: 	!:;  
 
 
 
 
 
 *
 
 
 	
rO   c                    |s
J d            |j         d         }|r|j        st          j        |||          S t	          |                     |j        |||                    S )Nz0no test coverage for needs_to_be_cacheable=Falser   )r   r9   r(   r   listr   )r   r   r   r   r   s        rL   r   zORMDMLState._get_crud_kv_pairs  s     "	> 	>=	> 	> 	> #34DE 	^%: 	!4;(=   &&%%	 
 
 	
rO   c                    |j         j        d         }|j        }|j        r|j        }n|j        j        }||j        |j        |j        |j        dS )Nparententity)nametypeexprentityrf   )	rf   r   r9   is_aliased_classr   class___name__r   local_table)r   r   ext_infor9   _label_names        rL   get_entity_descriptionz"ORMDMLState.get_entity_description  s_    ?/?$ 	1"-KK -0K  MOo'
 
 	
rO   c                P    d d fdfd|j         D             D             S )Nc                8    | j                             dd           S )Nr   )r   get)cs    rL   _ent_for_colzCORMDMLState.get_returning_column_descriptions.<locals>._ent_for_col  s    >%%nd;;;rO   c                t    || S | j                             dd           }|s| S t          |j        ||           S )Nr   )r   r   getattrr   )r   entr   s      rL   _attr_for_colzDORMDMLState.get_returning_column_descriptions.<locals>._attr_for_col  sD    {**;==I 9sz9a888rO   c                b    g | ]+\  }}|j         |j         ||          |j        |j        d ,S ))r   r   r   aliasedr   )rk   r   r   r   )rY   r   r   r   s      rL   r[   zAORMDMLState.get_returning_column_descriptions.<locals>.<listcomp>  sZ     
 
 
 3 %a--/* 
 
 
rO   c                *    g | ]}| |          fS rJ   rJ   )rY   r   r   s     rL   r[   zAORMDMLState.get_returning_column_descriptions.<locals>.<listcomp>  s3       )*LLOO$  rO   )_all_selected_columns)r   r   r   r   s     @@rL   !get_returning_column_descriptionsz-ORMDMLState.get_returning_column_descriptions  ss    	< 	< 	<	9 	9 	9
 
 
 
   .7.M  
 
 
 	
rO   )use_supplemental_colsc                  |j         rt          |j         |d          } |j        di |j        } |j        |j         }|| _        t          j        ||          x| _	        }|
                    |           |                                }d|_         d |j        D             }|s|                    |j                   |r |j        |j        d|i}n
 |j        | }|S )al  establish ORM column handlers for an INSERT, UPDATE, or DELETE
        which uses explicit returning().

        called within compilation level create_for_statement.

        The _return_orm_returning() method then receives the Result
        after the statement was executed, and applies ORM loading to the
        state that we first established here.

        F)_adapt_on_namesrJ   c                    g | ]}||S rI   rJ   )rY   r   s     rL   r[   z4ORMDMLState._setup_orm_returning.<locals>.<listcomp>  s    NNNAarO   supplemental_cols)r   r   rD   _execution_optionsoptions_with_optionsselect_statementr   create_for_statementr   !setup_dml_returning_compile_state	_generateprimary_columnsextendprimary_keyr@   	returning)	selfcompilerorm_level_statementdml_level_statement
dml_mapperr  fsfsccols_to_returns	            rL   _setup_orm_returningz ORMDMLState._setup_orm_returning  s?   ( ) +	#.# %  B
 &%OO(;(NOOB0>?B$&D! -A"hOOPD#11*==="5"?"?"A"A-/*NN)<NNNN " >%%j&<===$ &I&9&I  +' '5' '##  'D&9&C#'# #"rO   c           	        |j         }|j        j        }|j        re|j        j        j        sT|                    dt          j                  }	t          |j        |j	        |||	||          }
t          j        ||
          S |S )N_sa_orm_load_options)r   compiledcompile_stater   compile_options_is_starr   r   default_load_optionsr  r   	instances)r   r   r   rp   rD   bind_argumentsr   execution_contextr  load_optionsquerycontexts              rL   _return_orm_returningz!ORMDMLState._return_orm_returning9  s     #N)2@ ,	!4DM	 -00&(I L (0.! L $V\:::MrO   )r   
__module____qualname__is_dml_returningr   __annotations__classmethodr   r   r   r   r  r  r(  rJ   rO   rL   r   r   j  s         AEEEEE1 1 [1f 
 
 [
" 
 
 [
* 
 
 [
  
 
 [
B #A# A# A# A# A#F   [  rO   r   c                  @   e Zd Z G d de          Zeddddddd            Zed             Zed             Zed             Z	ed             Z
ed             Zed             Zed             Zed             Zed             Zed             Zed             ZdS )BulkUDCompileStatec                      e Zd ZU dZded<   dZded<   dZded<   dZded	<   dZded
<   dZ	ded<   dZ
ded<   eZdZdZdZdS ))BulkUDCompileState.default_update_optionsautor+   _dml_strategyr-   _synchronize_sessionFr?   _can_use_returning_is_delete_using_is_update_fromT
_autoflushNOptional[Mapper[Any]]_subject_mapper)r   r)  r*  r3  r,  r4  r5  r6  r7  r8  r:  r)   _resolved_values_eval_condition_matched_rows_identity_tokenrJ   rO   rL   default_update_optionsr1  ]  s         -33333;AAAAA#(((((!&&&&& %%%%%
155555%rO   r?  Fis_multitableis_update_fromis_delete_usingis_executemanydialectr   r9   r   rA  r?   rB  rC  rD  rF   c                   t                      rI   )r   )r   rE  r9   rA  rB  rC  rD  s          rL   can_use_returningz$BulkUDCompileState.can_use_returningj  s     "###rO   c                z   t           j                            dh d||j                  \  }}||d<   	 |j        d         }|r|j        |d<   |d|j        iz  }n# t          $ r J d            w xY wd	|j        j        vr|d
diz  }nZt          |t                    s3|j        dk    r|d
diz  }n2|j        dk    rt          j        d          n|j        dk    r|d
diz  }|j        }	|	=|	dvrt          j        d          |j        dk    r|	dk    rt          j        d          |s|j        r|                                 |j        dk    rr|j        dk    r|                     ||||||          }ni|j        dk    r|                     ||||||          }nC|j        dk    r|                     ||||||          }n|j        dk    r|j        dk    r|ddiz  }|                    |j        |j        |j        |j        |j        d          }|t1          j        |                              d|i          fS )N_sa_orm_update_options>   	autoflushdml_strategyidentity_tokenrB  rC  synchronize_sessionclauser   r9   r:  F0statement had 'orm' plugin but no plugin_subjectr   r3  	core_onlyr2  ormrz   HCan't use "bulk" ORM insert strategy without passing separate parameters)r2  evaluatefetchFzSValid strategies for session synchronization are 'auto', 'evaluate', 'fetch', FalserT  zkThe 'fetch' synchronization strategy is not available for 'bulk' ORM updates (i.e. multiple parameter sets)rS  r4  )rM  rC  rB  rK  rG  )r/  r?  from_execution_optionsr  r   r9   KeyErrorrf   r   r   r   r3  sa_excInvalidRequestErrorr4  ArgumentErrorr8  _do_pre_synchronize_auto_do_pre_synchronize_evaluate_do_pre_synchronize_fetch	_annotater6  r7  r5  r   immutabledictr   )
r   r   r   rp   rD   r$  is_pre_eventupdate_optionsr   syncs
             rL   orm_pre_session_execz'BulkUDCompileState.orm_pre_session_execw  sE    5LL$   (
 
	
 $-x 	M&78HIN  M+9+@x(#4n6K"LL  	M 	M 	MLLLLL	M !===<<NNFD)) 
	<+v55?E"::-7702   8 +v55?F";;2???*=   +v55$'//0L  
  0	( %""$$$+u44!6&@@%(%A%A!)&&& &NN $8JFF%(%E%E!)&&& &NN $8GCC%(%B%B!)&&& &N  -77!6&@@"'=z&JJN "+++9+N'5'F&4&D$2$@)7)J  I 01177)>: 
 	
   A A.c                L   |d         }|j         dk    rH|j        dk    r|                     ||||           nT|j        dk    r|                     ||||           n0|j         dk    r%|j        dk    r|                     ||||           |S |                     ||||||          S )NrI  rQ  rS  rT  rz   )r3  r4  _do_post_synchronize_evaluate_do_post_synchronize_fetch"_do_post_synchronize_bulk_evaluater(  )r   r   r   rp   rD   r$  r   r`  s           rL   orm_setup_cursor_resultz*BulkUDCompileState.orm_setup_cursor_result  s    $ ++CD'5002j@@11Y     4??..Y   )V332j@@66VV^   M((
 
 	
rO   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.

        rJ   Nadditional_entity_criteriac              3  b   K   | ])}|j         s	|j        u |                              V  *d S rI   )include_aliasesr   _resolve_where_criteria)rY   aer   s     rL   rv   z@BulkUDCompileState._adjust_for_extra_criteria.<locals>.<genexpr>0  s[       ! ! %!
 *,h)>)>	 **844 *?)>)>)>! !rO   c              3  B   K   | ]}                     |          V  d S rI   )traverse)rY   critadapters     rL   rv   z@BulkUDCompileState._adjust_for_extra_criteria.<locals>.<genexpr><  s1      OO4 0 0 6 6OOOOOOrO   )r   _adapterr9   r   _single_table_criterion)r   global_attributesr   return_critrr  s     ` @rL   _adjust_for_extra_criteriaz-BulkUDCompileState._adjust_for_extra_criteria  s     '/'@J(##d )O
   5 ! ! ! !+18?C! ! !   K ?2>HOCEEK 	POOOO;OOOOOKrO   c                  	
 |j         |j        j         ur|S d |j         j        D             |                                D ]z}|j         np|j         |j        j         u rt          |j        |j        j                            }d ||         D             }                                D ]\  }}||         |<   {fdt          |j         j                  D             		fd|j        j        D             

fd|D             S )a  translate from local inherited table columns to base mapper
        primary key columns.

        Joined inheritance mappers always establish the primary key in terms of
        the base table.   When we UPDATE a sub-table, we can only get
        RETURNING for the sub-table's columns.

        Here, we create a lookup from the local sub table's primary key
        columns to the base table PK columns so that we can get identity
        key values from RETURNING that's against the joined inheritance
        sub-table.

        the complexity here is to support more than one level deep of
        inheritance, where we have to link columns to each other across
        the inheritance hierarchy.

        c                    i | ]}||S rJ   rJ   )rY   pks     rL   r   z@BulkUDCompileState._interpret_returning_rows.<locals>.<dictcomp>[  s    OOO"r2OOOrO   Nc                    i | ]\  }}||	S rJ   rJ   )rY   super_pksub_pks      rL   r   z@BulkUDCompileState._interpret_returning_rows.<locals>.<dictcomp>d  s    NNN/?x&(NNNrO   c                (    i | ]\  }}|         |S rJ   rJ   )rY   idxlpklocal_pk_to_base_pks      rL   r   z@BulkUDCompileState._interpret_returning_rows.<locals>.<dictcomp>h  s4     
 
 
S  $c
 
 
rO   c                     g | ]
}|         S rJ   rJ   )rY   bpklookups     rL   r[   z@BulkUDCompileState._interpret_returning_rows.<locals>.<listcomp>l  s*     
 
 
F3K
 
 
rO   c                H    g | ]t          fd D                       S )c              3  (   K   | ]}|         V  d S rI   rJ   )rY   r  rows     rL   rv   zJBulkUDCompileState._interpret_returning_rows.<locals>.<listcomp>.<genexpr>o  s'      >>3c#h>>>>>>rO   )r   )rY   r  primary_key_converts    @rL   r[   z@BulkUDCompileState._interpret_returning_rows.<locals>.<listcomp>o  s8    OOO3>>>>*=>>>>>OOOrO   )	r   r   r  iterate_to_rootinheritsrW   _table_to_equatedr   	enumerate)r   r9   rowsrg   t_to_e
col_to_colrz  super_r  r  r  s           @@@rL   _interpret_returning_rowsz,BulkUDCompileState._interpret_returning_rows@  sd   ( V%7%CCCK PO0B0NOOO((** 		= 		=B{"2;#:::".r{/FGHHFNN6":NNNJ17799 = =
F*4V*<#B''=
 
 
 
%f&8&DEE
 
 

 
 
 
#)#5#A
 
 
 POOO$OOOOrO   c                
  
 |j         |j        }fd|D             }|j        


fd|D             }g }|D ]H\  }}} ||          }	|	du s|	t          j        u r%|                    ||||	t          j        u f           I|S )Nc                    g | ]?}|j                                       |j        #|                                ||j        f@S rJ   )r9   r   expiredobjrW   )rY   rZ   r9   s     rL   r[   zGBulkUDCompileState._get_matched_objects_on_criteria.<locals>.<listcomp>v  s\     
 
 
|''
 16
YY[[%,
 
 
rO   c                8    g | ]\  }}}|j         k    |||fS rJ   rL  )rY   r  rZ   r]   rL  s       rL   r[   zGBulkUDCompileState._get_matched_objects_on_criteria.<locals>.<listcomp>~  s>       %C'>99 eU#999rO   T)r:  r<  r>  r   _EXPIRED_OBJECTappend)r   r`  r   eval_conditionraw_datar   r  rZ   r]   evaled_conditionrL  r9   s             @@rL    _get_matched_objects_on_criteriaz3BulkUDCompileState._get_matched_objects_on_criteriaq  s    /'7
 
 
 

 
 
 (7%   )1  H !) 	 	C-~c22
 !D((#y'@@@(I,EE	   rO   c                   |j         }|j        }t          j        |          }d}|j        r
||j        z  }i }|j        D ]}|j        r|                    |           |r||                     ||          z  }|r |j	        | }	nd }
|
}	|	S )NrJ   c                    dS NTrJ   )r  s    rL   r<  zJBulkUDCompileState._eval_condition_from_statement.<locals>._eval_condition  s    trO   )
r:  r   r   _EvaluatorCompiler_where_criteriar
  _is_criteria_optionget_global_criteriarw  process)r   r`  r   r9   
target_clsevaluator_compilerrq  ru  optr  r<  s              rL   _eval_condition_from_statementz1BulkUDCompileState._eval_condition_from_statement  s    /]
&9*EE$ 	.I--D* 	; 	;C& ;''(9::: 	NC223DfMMMD 	-7/7>NN   -NrO   c                    	 |                      ||          }||ddz   S # t          j        $ r Y nw xY w|ddiz  }|                     ||||||          S )a  setup auto sync strategy


        "auto" checks if we can use "evaluate" first, then falls back
        to "fetch"

        evaluate is vastly more efficient for the common case
        where session is empty, only has a few objects, and the UPDATE
        statement can potentially match thousands/millions of rows.

        OTOH more complex criteria that fails to work with "evaluate"
        we would hope usually correlates with fewer net rows.

        rS  )r<  r4  r4  rT  )r  r   UnevaluatableErrorr\  )r   r   r   rp   rD   r$  r`  r  s           rL   rZ  z+BulkUDCompileState._do_pre_synchronize_auto  s    2	 ??	 N "#1(2% %   + 	 	 	D	 	17;;,,
 
 	
s     22c                    	 |                      ||          }n/# t          j        $ r}t          j        d|z            |d }~ww xY w|d|iz   S )Nz{Could not evaluate current criteria in Python: "%s". Specify 'fetch' or False for the synchronize_session execution option.r<  )r  r   r  rW  rX  )	r   r   r   rp   rD   r$  r`  r  errs	            rL   r[  z/BulkUDCompileState._do_pre_synchronize_evaluate  s    
	 ??	 NN + 	 	 	,8:=>  		 ~!
 
 	
s    AA  Ac                    |j         rg S |j        rt          |j                  S |j        r&t          |j                                                  S g S rI   )_multi_values_ordered_valuesr   _valuesr   )r   r9   r   s      rL   _get_resolved_valuesz'BulkUDCompileState._get_resolved_values  s[    " 	I& 		1222 		)//11222IrO   c                    g }|D ]w\  }}|rZt          |t          j                  r@	 |j        |         }|                    |j        |f           L# t          j        $ r Y ]w xY wt          j	        d|z            |S )NzCAttribute name not found, can't be synchronized back to objects: %r)
r   r   ColumnElement_columntopropertyr  rk   orm_excUnmappedColumnErrorrW  rX  )r   r9   resolved_valuesvaluesr   r   r   s          rL   _resolved_keys_as_propnamesz.BulkUDCompileState._resolved_keys_as_propnames
  s    # 	 	DAq *Q
(@AA 1!3A6D MM48Q-0000 2   D
 079:;   s   AA#"A#c                     j          t          j        j        fz                                  j        |j         }|j        |_        d d fd}|                    |||||          }	|		                                }
|
dz   S )	Norm_contextr0   rF   r   c                4    | j         j        di | j        }                    |j        j        j        | j                  }|k    rt          j	        d          n| j        r|st          j	        d          ||rt          j                    S d S )N)rB  rC  rD  zjFor synchronize_session='fetch', can't mix multiple backends where some support RETURNING and others don'tzFor synchronize_session='fetch', can't use multiple parameter sets in ORM mode, which this backend does not support with RETURNINGrJ   )r   get_bindr$  rG  rE  r7  r6  rD  rW  rX  r   r   )r  bindper_bind_resultrG  r   r9   r`  s      rL   skip_for_returningzHBulkUDCompileState._do_pre_synchronize_fetch.<locals>.skip_for_returning>  s    /;&/MM+2LMMD "33-= . ?*9 4  O !,$77 4    8 + 4O 40-   %4! *,,,trO   )rD   r$  
_add_event)r=  r5  )r  r0   rF   r   )
r:  r!   r  select_identity_tokenselect_fromr	  r
  r  executefetchall)r   r   r   rp   rD   r$  r`  select_stmtr  r   matched_rowsrG  r9   s   `     `    @@rL   r\  z,BulkUDCompileState._do_pre_synchronize_fetch  s      /FV'6+G*IIK[  i-/ 	
 '0&?# !	 	 	 	 	 	 	 	 	B /)) ! 
 
 (()"3!
 !
 
 	
rO   NrE  r   r9   r   rA  r?   rB  r?   rC  r?   rD  r?   rF   r?   )r   r)  r*  r%   r?  r-  rG  rb  rh  rw  r  r  r  rZ  r[  r  r  r\  rJ   rO   rL   r/  r/  \  s                $$ %$
$ 
$ 
$ 
$ 
$ [
$ u
 u
 [u
n )
 )
 [)
V " " ["H .P .P [.P` $ $ [$L   [8 -
 -
 [-
^ 
 
 [
2   [   [" N
 N
 [N
 N
 N
rO   r/  rQ  insertc                       e Zd ZU  G d de          ZdZded<   ed             Zedd            Z	ed fd            Z
ed             Zd Zd Z xZS )BulkORMInsertc                  d    e Zd ZU dZded<   dZded<   dZded<   dZd	ed
<   dZded<   dZ	ded<   dS )$BulkORMInsert.default_insert_optionsr2  r+   r3  Fr?   _render_nulls_return_defaultsNr9  r:  Tr8  _populate_existing)
r   r)  r*  r3  r,  r  r  r:  r8  r  rJ   rO   rL   default_insert_optionsr  p  sz         -33333#####!&&&&&155555
#(((((((rO   r  NzOptional[FromStatement]r  c                   t           j                            dh d||j                  \  }}||d<   	 |j        d         }|r|j        |d<   |d|j        iz  }n# t          $ r J d            w xY w|s3|j        d	k    r|d
diz  }n2|j        dk    rt          j	        d          n|j        d	k    r|d
diz  }|j        dk    r.|st          j        }n|                    t          j                  }|s|j        r|                                 |                    d|j        i          }|t          j        |                              d|i          fS )N_sa_orm_insert_options>   rJ  rK  rA   populate_existingrN  r   r9   r:  FrO  r2  r3  rQ  rz   rR  rawrK  )r  r  rU  r  r   r9   rV  r3  rW  rX  r   _orm_load_exec_optionsr   r8  r]  r   r^  )	r   r   r   rp   rD   r$  r_  insert_optionsr   s	            rL   rb  z"BulkORMInsert.orm_pre_session_execz  s    0GG$NNN(	
 
	
 $-x 	M&78HIN  M+9+@x(#4n6K"LL  	M 	M 	MLLLLL	M  
	<+v55?E"::-7702   8 +v55?F";;'500 % $+$B!!$5$;$;2% %!  	! 9 	!   ''^9:
 
	
 01177)>: 
 	
rc  r   r1   r   
dml.Insertrp   r6   rD   r,   r$  r/   rq   r4   rF   _result.Resultc           
     4   |                     d| j                  }|j        dvrt          j        d          |j        dk    r|                    ||pi |          }|S |j        dk    r|j        }	|j        |	j        rt          j	        d|	           |	J |j
        J t          |	t          dt          |t                    r|gn|          |j
        d	|j        |j        ||
          }n4|j        dk    r|                    ||pi |          }nt#                      t%          |j                  s|S |j        r>|                     dt*          j                  }
|
ddiz  }
|                    d|
i          }|                     ||||||          S )Nr  )r  rz   rQ  r2  zHValid strategies for ORM insert strategy are 'raw', 'orm', 'bulk', 'autor  )rD   rz   z`bulk INSERT with a 'post values' clause (typically upsert) not supported for multi-table mapper Iterable[Dict[str, Any]]F)r>   r@   rA   rB   rD   rQ  r  r  T)r   r  r3  rW  rY  r  r:  _post_values_clause_multiple_persistence_tablesrX  _transactionrM   r   r   rW   r  r  AssertionErrorr?   r   r  r   r"  r   r(  )r   r   r   rp   rD   r$  rq   r  r   r9   r&  s              rL   orm_execute_statementz#BulkORMInsert.orm_execute_statement  s?    +..$c&@
 
 ' 0
 
 
 &2   '500\\6<R;L "  F M'611#3F -97 : 0'$' '   %%%'333!. *64 8 8DVHHf  $ . ?+9$-"3  FF )U22\\6<R;L "  FF !"""I()) 	M, 	,00&(I L 1488L 1 7 7'6! ! ((
 
 	
rO   c                F   t          t           t                      j        ||fi |          }|	|j         }nd}|s|S |j        d         }|j                            dd          }|dk    r|                    |           n|dk    r|	                    ||           |S )NTr   rK  r  rz   rQ  )
r   r  superr  stackr   r   r   _setup_for_bulk_insert_setup_for_orm_insert)	r   r   r  kwr  toplevelr9   rK  	__class__s	           rL   r  z"BulkORMInsert.create_for_statement  s    (EGG(HCCCC
 

 #>)HHH 	K+,<= -11.%HH6!!''1111U""&&x888rO   c                X    d fd|                                 D             D             S )Nc                .    i | ]\  }}}||j         n||S rI   rj   )rY   colr   r   s       rL   r   z<BulkORMInsert._resolved_keys_as_col_keys.<locals>.<dictcomp>0  s:     
 
 
Q CGGAq
 
 
rO   c              3  X   K   | ]$\  }}j                             |          ||fV  %d S rI   )r   r   )rY   r   r   r9   s      rL   rv   z;BulkORMInsert._resolved_keys_as_col_keys.<locals>.<genexpr>2  sK        ,0Aqa!Q'     rO   )r   )r   r9   resolved_value_dicts    ` rL   _resolved_keys_as_col_keysz(BulkORMInsert._resolved_keys_as_col_keys.  sS    
 
   4G4M4M4O4O  
 
 
 	
rO   c                    t          t          j        | j                  x}}|                     ||||d          }|| _        d S )NFr  r  )r   r   Insertr   r  )r  r  r9   r   r  s        rL   r  z#BulkORMInsert._setup_for_orm_insert7  sQ    *.sz4>*J*JJ	'--"' . 
 
	 #rO   c                   t          t          j        | j                  x}}|j        }|d         |d         c}|                                }|_        | j        r*fd| j                                        D             | _        | 	                    ||||d          }| j
        %| j
        j        j        rt          j        d          || _        dS )zestablish an INSERT statement within the context of
        bulk insert.

        This method will be within the "conn.execute()" call that is invoked
        by persistence._emit_insert_statement().

        _emit_insert_table_emit_insert_mapperc                .    i | ]\  }}|j         u ||S rJ   rf   )rY   r  valemit_insert_tables      rL   r   z8BulkORMInsert._setup_for_bulk_insert.<locals>.<dictcomp>W  7     % % %C9 111 S111rO   Tr  NzCan't use RETURNING * with bulk ORM INSERT.  Please use a different INSERT form, such as INSERT..VALUES or INSERT with a Core Connection)r   r   r  r   r   _clonerf   _dict_parametersr   r  r   r   r!  rW  CompileError)r  r  r   r  anemit_insert_mapperr  s         @rL   r  z$BulkORMInsert._setup_for_bulk_insertC  s    +/sz4>*J*JJ	'# #$$% 	.-
 $$&&	+	  	% % % % $ 5 ; ; = =% % %D! --)"& . 
 
	 #/'7@ 0 %3   #rO   )r   r1   r   r  rp   r6   rD   r,   r$  r/   rq   r4   rF   r  )rF   r  )r   r)  r*  r%   r  r  r,  r-  rb  r  r  r  r  r  __classcell__r  s   @rL   r  r  n  s        ) ) ) ) ) ) ) ) 154444A
 A
 [A
F V
 V
 V
 [V
p      [, 
 
 [

# 
# 
#,# ,# ,# ,# ,# ,# ,#rO   r  updatec                       e Zd Zed             Zd Zd Zed# fd            Zedddddd$d            Zed             Z	ed              Z
ed!             Zed"             Z xZS )%BulkORMUpdatec                J   |                      |           }|j                            dd          }|j         }|r|dk    r|                    ||           nK|dk    s|dk    r#d|j        j        vrt          j        |||fi | n|r|dv r|                    ||           |S )NrK  unspecifiedrz   rP  r   )rQ  r  )	__new__r   r   r  _setup_for_bulk_updaterf   r(   __init___setup_for_orm_update)r   r   r  r  r  rK  r  s          rL   r  z"BulkORMUpdate.create_for_statementt  s    {{3 -11M
 
  ~% 		<..''	8<<<<K''},,io&BBB#D)XDDDDDD 	<\-CCC&&y(;;;rO   c                B   |}|j          }|j        j        d         }|j        x| _        }|                     ||          | _        |                     ||||           |j        rt          | j                  | _        |	                                }|j
        r| j        |_
        n|j        r| j        |_        |                     | j        |          }	|	r
 |j        |	 }t          j        | ||fi | d}
|sd }n|j                            dd           }|j                            dd           }|dur(|dk    o!|                     |j        || j                  }|dk    r|rd}
 |j        |j        j         }|r|                     |||||
	          }|| _        d S )
Nr   r  process_criteria_for_toplevelFrM  rG  rT  )rA  Tr  )r  rf   r   r9   r  r;  _init_global_attributesr  rW   r  r  rw  ru  wherer(   r	  r   rG  rE  rA  r@   r  r  r   )r  r   r  r  r  r  r   r9   new_stmtnew_critr  rM  rG  s                rL   r
  z#BulkORMUpdate._setup_for_orm_update  s/   '~%?/?'.f $ 9 9&) L L$$*2	 	% 	
 	
 	
  	@$()>$?$?D!##%% $ 	5'+'<H$$ 	5#4H22"F
 
  	1%x~x0H 	h??B??? % 	"&"*"7";";%t# # %155
 
 E)) $w. **$fD<N +    ')).?)$(! 0x/1KLH 	00#!&; 1  H "rO   c                p   t          t          j        |          }|j        }|d         |d         c}|                                }|_        t          j        | ||fi | | j        rt          j
        d          | j        r*fd| j                                        D             | _        || _        dS )zestablish an UPDATE statement within the context of
        bulk insert.

        This method will be within the "conn.execute()" call that is invoked
        by persistence._emit_update_statement().

        _emit_update_table_emit_update_mapperzbulk ORM UPDATE does not support ordered_values() for custom UPDATE statements with bulk parameter sets.  Use a non-bulk UPDATE statement or use values().c                .    i | ]\  }}|j         u ||S rJ   r  )rY   r  r  emit_update_tables      rL   r   z8BulkORMUpdate._setup_for_bulk_update.<locals>.<dictcomp>  r  rO   N)r   r   Updater   r  rf   r(   r	  r  rW  rX  r  r   r   )r  r   r  r  r  _r  s         @rL   r  z$BulkORMUpdate._setup_for_bulk_update  s     Y//	# #$$% 	1
 $$&&	+	i@@R@@@ 	,=     	% % % % $ 5 ; ; = =% % %D!
 #rO   r   r1   r   
dml.Updaterp   r6   rD   r,   r$  r/   rq   r4   rF   r  c           
     *   |                     d| j                  }|j        dvrt          j        d          |j        dk    r|j         }|j        dk    sJ |j        r|j        dk    rt          j        d          |j        }	|	J |j	        J t          |	t          dt          |t                    r|gn|          |j	        d	d	||
          }
|                     ||||||
          S t                                          ||||||          S )NrI  )rQ  r2  rz   rP  zOValid strategies for ORM UPDATE strategy are 'orm', 'auto', 'bulk', 'core_only'rz   rT  rS  zbulk synchronize of persistent objects not supported when using bulk update with additional WHERE criteria right now.  add synchronize_session=None execution option to bypass synchronize of persistent objects.r  F)r>   r   r   r   )r   r?  r3  rW  rY  r  r4  rX  r:  r  r   r   r   rW   rh  r  r  )r   r   r   rp   rD   r$  rq   r`  r   r9   r   r  s              rL   r  z#BulkORMUpdate.orm_execute_statement  s    +..$c&@
 
 ' 0
 
 
 &9   '611(1(A$A!!6'AAAA )
"7:EE0   $3F%%%'333!. *64 8 8DVHHf  $$)$-&;  F ..!   7700!  rO   Fr@  rE  r   r9   r   rA  r?   rB  rC  rD  c                   |j         o|j        j        }|sdS |r|j        S |r|j        S |r$|j        st          j        d|j         d          dS )NF	Dialect "z" does not support RETURNING with UPDATE..FROM; for synchronize_session='fetch', please add the additional execution option 'is_update_from=True' to the statement to indicate that a separate SELECT should be used for this backend.T)update_returningr   implicit_returningupdate_executemany_returningupdate_returning_multifromrW  r  r   r   rE  r9   rA  rB  rC  rD  normal_answers           rL   rG  zBulkORMUpdate.can_use_returningZ  s     $N);)N 	  	5 	877  
	55 	7#E 	%EGL E E E   trO   c                   |sd S |j         }d |j        D             }|j        }|D ]|                    fd|D             |j                  }|                    |          }	|	sBt                                        |          }
|	j        }|	j	        
                    |
          }|D ]}||v r|         ||<   |	j        j                            |	d |           |	                    |t          |                     |

                    |                              |          }|r|	                    ||           d S )Nc                    g | ]	}|j         
S rJ   rj   )rY   props     rL   r[   zDBulkORMUpdate._do_post_synchronize_bulk_evaluate.<locals>.<listcomp>  s    CCC48CCCrO   c              3  (   K   | ]}|         V  d S rI   rJ   )rY   rk   params     rL   rv   zCBulkORMUpdate._do_post_synchronize_bulk_evaluate.<locals>.<genexpr>  s'      //s//////rO   )r:  r   identity_mapidentity_key_from_primary_keyr>  fast_get_stater   
differencerW   
unmodifiedr   managerdispatchrefresh_commitr   _expire_attributes)r   r   rp   r   r`  r9   pk_keysr(  identity_keyrZ   evaluated_keysr]   to_evaluaterk   	to_expirer'  s                  @rL   rg  z0BulkORMUpdate._do_post_synchronize_bulk_evaluate  s     	F/CC(BCCC+ 	; 	;E!??////w///. L !//==E  ZZ227;;NJE*77GGK" , ,%<<!&sE#JM"**5$DDDMM%k!2!2333
 '33E::EE I  ;((	:::;	; 	;rO   c                    |                      ||j                                                  }|                     |||d |D                        d S )Nc                "    g | ]\  }}}}|||fS rJ   rJ   )rY   r  rZ   r]   r  s        rL   r[   z?BulkORMUpdate._do_post_synchronize_evaluate.<locals>.<listcomp>  s(    MMM%9S%c5% MMMrO   )r  r(  
all_states#_apply_update_set_values_to_objects)r   r   r   r   r`  matched_objectss         rL   re  z+BulkORMUpdate._do_post_synchronize_evaluate  sl     >> ++--
 

 	//MM_MMM		
 	
 	
 	
 	
rO   c                  	 j         	|j        }|r%|                     	|          }fd|D             }nj        }fd	fdd |D             D             D             }|sd S |                     |d |D                        d S )Nc                @    g | ]}t          |          j        fz   S rJ   r   r>  rY   r  r`  s     rL   r[   z<BulkORMUpdate._do_post_synchronize_fetch.<locals>.<listcomp>  :        c

n<>>  rO   c                <    g | ]}|j         v j         |         S rJ   )r(  )rY   r3  r   s     rL   r[   z<BulkORMUpdate._do_post_synchronize_fetch.<locals>.<listcomp>  s=     
 
 
 w333  . 433rO   c                    g | ];\  }}j         |j         k                        t          |          |          <S )Nr  )r>  r)  r   )rY   r  rL  target_mapperr`  s      rL   r[   z<BulkORMUpdate._do_post_synchronize_fetch.<locals>.<listcomp>  sh     
! 
! 
!
 0K "19!^%CCC ;;%%#1 <   DCCrO   c                2    g | ]}|d d         |d         fS )r   rJ   )rY   r  s     rL   r[   z<BulkORMUpdate._do_post_synchronize_fetch.<locals>.<listcomp>  s6     4 4 4-0S2YB(4 4 4rO   c                `    g | ]+}|t          j        |          t          j        |          f,S rJ   )r   instance_stateinstance_dict)rY   r  s     rL   r[   z<BulkORMUpdate._do_post_synchronize_fetch.<locals>.<listcomp>  sK        	 -c22,S11  rO   )r:  returned_defaults_rowsr  r=  r:  )
r   r   r   r   r`  rI  pk_rowsr  objsrC  s
    `  `    @rL   rf  z(BulkORMUpdate._do_post_synchronize_fetch  s0    '6!'!>! 
	8335 G   "  LL
 *7L
 
 
 

! 
! 
! 
! 
!
4 44@4 4 4
! 
! 
!
 
 
   	F//     		
 	
 	
 	
 	
rO   c                   |j         }|j        }t          j        |          }|                     ||          }|                     ||          }	i }
|	D ]R\  }}	 |                    t          j        t          j
        |                    }||
|<   ># t          j        $ r Y Ow xY wt          |
                                          }d |	D             }t                      }|D ]\  }}}|j                            |          }|D ]}||v r |
|         |          ||<   |j        j                            |d|           |                    |t          |                     |                    |                              |          }|r|                    ||           |                    |           |                    |           dS )zeapply values to objects derived from an update statement, e.g.
        UPDATE..SET <values>

        c                    h | ]\  }}|S rJ   rJ   )rY   r   r   s      rL   	<setcomp>zDBulkORMUpdate._apply_update_set_values_to_objects.<locals>.<setcomp>	  s    ;;;1!;;;rO   N)r:  r   r   r  r  r  r  r   r   r    r   r  r   r   r   r,  r   r-  r.  r/  r0  r+  r1  add_register_altered)r   r   r`  r   r;  r9   r  r  r  resolved_keys_as_propnamesvalue_evaluatorsrk   value
_evaluatorr4  attribr   r  rZ   r]   r5  r6  s                         rL   r:  z1BulkORMUpdate._apply_update_set_values_to_objects  s     /]
&9*EE2269EE%(%D%DO&
 &
" 4 	3 	3JC3/77$U%@%HH 
 )3 %% /   
 .335566;; :;;;!0 	 	C*77GGK" < <%<<!6!1#!6s!;!;E#JM"**5$DDDMM%k!2!2333
 ++E22==kJJI ;((	:::JJu!!&)))))s   2BB#"B#)r   r1   r   r  rp   r6   rD   r,   r$  r/   rq   r4   rF   r  r  )r   r)  r*  r-  r  r
  r  r  rG  rg  re  rf  r:  r   r  s   @rL   r  r  r  s3         [,]" ]" ]"~"# "# "#H I I I I I [IV  $$ %$" " " " " ["H (; (; [(;T 
 
 [
 1
 1
 [1
f 1* 1* [1* 1* 1* 1* 1*rO   r  deletec                       e Zd Zed             Zed fd            Zedddddd d            Zed             Zed             Z xZ	S )!BulkORMDeletec           	     f   |                      |           }|j                            dd          }|dk    s|dk    r$d|j        j        vrt	          j        |||fi | |S |j         }|}|j        j        d         }|j        x|_        }	|                    ||||           |	                                }
| 
                    |j        |	          }|r
 |
j        | }
t	          j        ||
|fi | d}|sd }n|j                            dd           }|j                            dd           }|durB|d	k    o;|                    |j        |	|j        |j                            d
d                    }|rd} |
j        |
j        j         }
|r|                    |||
|	|          }
|
|_        |S )NrK  r  rP  r   r  FrM  rG  rT  rC  )rA  rC  Tr  )r  r   r   rf   r&   r	  r  r9   r  r  rw  ru  r  rG  rE  rA  r@   r  r  r   )r   r   r  r  r  rK  r  r  r   r9   r  r  r  rM  rG  s                  rL   r  z"BulkORMDelete.create_for_statement%  sS   {{3 -11M
 

 K''},,io&BBB#D)XDDDDDK~%'?/?'.f$$*2	 	% 	
 	
 	
 ##%%11"F
 
  	1%x~x0H 	h??B??? % 	"&"*"7";";%t# # %155
 
 E)) $w. **$"&"4$,$9$=$=)5% %	 +     	M$(!/x/1KLH 	00#!&; 1  H "rO   r   r1   r   
dml.Deleterp   r6   rD   r,   r$  r/   rq   r4   rF   r  c                    |                     d| j                  }|j        dk    rt          j        d          |j        dvrt          j        d          t                                          ||||||          S )NrI  rz   zBulk ORM DELETE not supported right now. Statement may be invoked at the Core level using session.connection().execute(stmt, parameters))rQ  r2  rP  zGValid strategies for ORM DELETE strategy are 'orm', 'auto', 'core_only')r   r?  r3  rW  rX  rY  r  r  )	r   r   r   rp   rD   r$  rq   r`  r  s	           rL   r  z#BulkORMDelete.orm_execute_statement~  s     +..$c&@
 
 '611,A   '/KKK&  
 ww,,Y(9>4
 
 	
rO   Fr@  rE  r   r9   r   rA  r?   rB  rC  rD  c                   |j         o|j        j        }|sdS |r|j        S |r$|j        st	          j        d|j         d          dS )NFr  z" does not support RETURNING with DELETE..USING; for synchronize_session='fetch', please add the additional execution option 'is_delete_using=True' to the statement to indicate that a separate SELECT should be used for this backend.T)delete_returningr   r  delete_returning_multifromrW  r  r   r!  s           rL   rG  zBulkORMDelete.can_use_returning  s     $N);)N 	  	5  	 55 	7#E 	 %EGL E E E   trO   c                   |                      ||j                                                  }g }|D ]?\  }}}	}
|
r!|                    |	|j        j                   *|                    |           @|r|                    |           d S d S rI   )r  r(  r9  _expire	_modifiedr  _remove_newly_deleted)r   r   r   r   r`  r;  	to_deleter  rZ   r]   is_partially_expireds              rL   re  z+BulkORMDelete._do_post_synchronize_evaluate  s     >> ++--
 

 	5D 	( 	(1Aue1# (eW%9%CDDDD  '''' 	5)))44444	5 	5rO   c                n   j         }|j        }|r%|                     ||          }fd|D             }nj        }|D ]t}	|	dd         }
|	d         }|                    t          |
          |          }||j        v r3|                    t          j	        |j        |                   g           ud S )Nc                @    g | ]}t          |          j        fz   S rJ   r>  r?  s     rL   r[   z<BulkORMDelete._do_post_synchronize_fetch.<locals>.<listcomp>  r@  rO   r   rE  r  )
r:  rI  r  r=  r)  r   r(  rb  r   rG  )r   r   r   r   r`  rC  rI  rJ  r  r  r  rL  r3  s       `        rL   rf  z(BulkORMDelete._do_post_synchronize_fetch  s    '6!'!>! 
	8335 G   "  LL
 *7L 	 	Cad)K WN )FF[!!- G  L w333--"1#0>   	 	rO   )r   r1   r   rZ  rp   r6   rD   r,   r$  r/   rq   r4   rF   r  r  )
r   r)  r*  r-  r  r  rG  re  rf  r   r  s   @rL   rX  rX  #  s        V V [Vp 
 
 
 
 
 [
>  $$ %$& & & & & [&P 5 5 [5& $ $ [$ $ $ $ $rO   rX  )..)r9   r:   r;   r<   r=   r2   r>   r?   r@   r?   rA   r?   rB   rC   rD   rE   rF   rG   )r9   r:   r;   r<   r=   r2   r>   r?   r@   r?   rA   r?   rB   rP   rD   rE   rF   rQ   )NN)r9   r:   r;   r<   r=   r2   r>   r?   r@   r?   rA   r?   rB   rP   rD   rE   rF   rS   ).T)r9   r   r;   r<   r=   r2   r>   r?   r   r?   r   rC   r   r?   rF   rG   )r9   r   r;   r<   r=   r2   r>   r?   r   r?   r   r   r   r?   rF   r   r  )r9   r   r;   r<   r=   r2   r>   r?   r   r?   r   r   r   r?   rF   r   )O__doc__
__future__r   typingr   r   r   r   r   r	   r
   r   r    r   r   r   r   r  r   r   baser   r   r   r   r   rW  r   enginer   r   r   sqlr   r   r   r    r!   r"   sql.baser#   r$   r%   sql.dmlr&   r'   r(   r)   util.typingr*   _typingr+   r,   r-   r9   r.   r   r/   r0   r1   r2   rZ   r3   r4   r5   engine.interfacesr6   objectr7   rM   r   r   r   r/  
plugin_forr  r  rX  rJ   rO   rL   <module>ru     s;   
 # " " " " "                                                                                                       , , , , , , " " " " " " 1 1 1 1 1 1 ! ! ! ! ! !                   & & & & & &                                     , , , , , , # # # # # #       $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $       ! ! ! ! ! ! :,,,,,,333333333333''''''((((((      ++++++$$$$$$######999999WT    
 *->A
 
 
 
 

 
 14>A
 
 
 
 

( 15>B} } } } }@ 
 *-"&	 	 	 	 
	 
 14"&	 	 	 	 
	$ 15"&X% X% X% X% X%v% % %o o o o o) o o odO
 O
 O
 O
 O
 O
 O
 O
d ))@# @# @# @# @#K @# @# *)@#F ))m* m* m* m* m*& m* m* *)m*` ))\ \ \ \ \& \ \ *)\ \ \rO   