
    [h                   N   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	d8d8d9dldJ            ZFe	d8d8d9dmdM            ZFdNdNd9dndPZFe	d8dQdRdodW            ZGe	d8dQdRdpdZ            ZGdNdQdRdqd\ZGd] ZH G d^ d_e          ZI G d` daeI          ZJ e*jK        dbdc           G dd deeIe.                      ZL e*jK        dbdf           G dg dheJe/                      ZM e*jK        dbdi           G dj dkeJe-                      ZNdNS )rzoadditional 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.)use_orm_insert_stmtexecution_optionsmapper
Mapper[_O]mappings<Union[Iterable[InstanceState[_O]], Iterable[Dict[str, Any]]]session_transactionr2   isstatesboolreturn_defaultsrender_nullsr9   Literal[None]r:   $Optional[OrmExecuteOptionsParameter]returnNonec                   d S N r;   r=   r?   r@   rB   rC   r9   r:   s           n/var/www/api.easyaligner.net/htdocs/venv_linux/lib/python3.11/site-packages/sqlalchemy/orm/bulk_persistence.py_bulk_insertrM   J   s	     3    Optional[dml.Insert]cursor.CursorResult[Any]c                   d S rI   rJ   rK   s           rL   rM   rM   X   s	      #srN   N"Optional[cursor.CursorResult[Any]]c               |     j         }|j        j        rt          d          |rZt          r+t          t          t          t                                      |rd D             }	d |	D             ntd D             ngt          r2t          t          t          t          t          f                            |rt                    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 |
                    |          }
|rE|rC j        }d  j        D             }|	D ](\  }|t7          fd|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>   s    @@@euej)@@@rN   c                    g | ]\  }}|S rJ   rJ   )rX   rY   dict_s      rL   rZ   z _bulk_insert.<locals>.<listcomp>   s    ;;;.5%;;;rN   c                    g | ]	}|j         
S rJ   rU   rW   s     rL   rZ   z _bulk_insert.<locals>.<listcomp>       999u
999rN   c                ,    g | ]}t          |          S rJ   rU   rX   ms     rL   rZ   z _bulk_insert.<locals>.<listcomp>   s    222AQ222rN   c                0    g | ]\  }}|j         v ||fS rJ   )_pks_by_table)rX   tablempr;   s      rL   rZ   z _bulk_insert.<locals>.<listcomp>   s9       E2F((( 
(((rN   Tr   Fc                <    g | ]}|j         d          v |j         S r   keyrX   br=   s     rL   rZ   z _bulk_insert.<locals>.<listcomp>   s6       5HQK'' '''rN   rJ   c           	   3  >   K   | ]\  }}}}}}}}d ||
	|||fV  d S rI   rJ   )rX   rY   
state_dictparamsre   connvalue_paramshas_all_pkshas_all_defaults
connectionr;   s            rL   	<genexpr>z_bulk_insert.<locals>.<genexpr>   sk       
 
	 #  	
 
 
 
 
 
rN   c              3  $   K   | ]
}d |fV  d S rI   rJ   rX   mappingrs   r;   s     rL   rt   z_bulk_insert.<locals>.<genexpr>   s,      MM$4MMMMMMrN   )bulkrB   rC   include_bulk_keys)bookkeepingr9   r:   c                    g | ]	}|j         
S rJ   rh   )rX   ps     rL   rZ   z _bulk_insert.<locals>.<listcomp>   s    DDDA!%DDDrN   c                     g | ]
}|         S rJ   rJ   )rX   ri   r\   s     rL   rZ   z _bulk_insert.<locals>.<listcomp>   s    <<<cuSz<<<rN   )base_mappersessionconnection_callableNotImplementedErrorr
   r   r   r3   r7   r   strr   list_expand_compositesrs   _sorted_tablesitemslen_get_embedded_bindparamsr   _collect_insert_commands_emit_insert_statements
_returningreturns_rowssplice_horizontally_identity_class_identity_key_propstupleri   )r;   r=   r?   r@   rB   rC   r9   r:   r~   statesreturn_resultmappers_to_runrz   rd   super_mapperextra_bp_namesrecordsr   identity_clsidentity_propsrY   rs   r\   s   ``                   @@rL   rM   rM   f   sa    $K"6 
!-
 
 	

  - 	CH]2%67BBH 	:@@x@@@F;;F;;;HH99999HH 	@HT#s(^4h??H 	3 H~~HH 32222H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 &((( '&rN   T)use_orm_update_stmtenable_check_rowcountMapper[Any]update_changed_onlyr   r   c                   d S rI   rJ   r;   r=   r?   r@   r   r   r   s          rL   _bulk_updater      s	     3rN   Optional[dml.Update]_result.Result[Any]c                   d S rI   rJ   r   s          rL   r   r     s	     #rN   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)rX   kvsearch_keysrY   s      rL   
<dictcomp>z7_bulk_update.<locals>._changed_dict.<locals>.<dictcomp>)  sA     
 
 
1E)))Q+-=-= q-=-=-=rN   )rV   r   )r;   rY   r   s    `rL   _changed_dictz#_bulk_update.<locals>._changed_dict(  sB    
 
 
 
 

((**
 
 
 	
rN   c                (    g | ]} |          S rJ   rJ   )rX   rY   r   r;   s     rL   rZ   z _bulk_update.<locals>.<listcomp>1  s%    KKKfe44KKKrN   c                    g | ]	}|j         
S rJ   rU   rW   s     rL   rZ   z _bulk_update.<locals>.<listcomp>3  r^   rN   c                ,    g | ]}t          |          S rJ   rU   r`   s     rL   rZ   z _bulk_update.<locals>.<listcomp>5  s    ...DGG...rN   zJconnection_callable / per-instance sharding not supported in bulk_update()c                <    g | ]}|j         d          v |j         S rg   rh   rj   s     rL   rZ   z _bulk_update.<locals>.<listcomp>C  s6     	
 	
 	
u## E###rN   rJ   c              3  X   K   | ]$}d |j         r|j         j                 nd fV  %d S rI   )_version_id_propri   rv   s     rL   rt   z_bulk_update.<locals>.<genexpr>S  sg           "2" 7 ;<<!
     rN   T)rx   r   ry   F)rz   r   r   )r~   _primary_key_propkeysr   ri   unionr   r   r   r   rs   r   r   r   isarc   r   _collect_update_commands_emit_update_statements_resultnull_result)r;   r=   r?   r@   r   r   r   r~   r   rd   r   r   r   rs   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		
 		
 		
 		
 		
 &"$$$ '&rN   c                    | j         sd S t                                                    }fd|D             }|D ]+}|                    |          D ]} ||         |           ,d S )Nc                F    i | ]}||                                          S rJ   ))_populate_composite_bulk_save_mappings_fn)rX   ri   composite_attrss     rL   r   z&_expand_composites.<locals>.<dictcomp>z  s<        	_S!KKMM  rN   )
compositessetkeysintersection)r;   r=   composite_keys
populatorsrw   ri   r   s         @rL   r   r   t  s    'O --//00N   !  J  % %!..w77 	% 	%CJsOG$$$$	%% %rN   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
isinstancer   r#   r   ExpressionElementRoler"   NullType_bulk_update_tuples_annotations)clsr;   	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_pairs  s      "0!B 0	 0	DAq !4a88A!S!! -,VQIII8##!()<a@@  5#I, % ; !&.&7&9&9(,	    "#      65!0033-           
 $q~55,-.{0C  21,,Q//)            5&-!7"*"3"5"5$(	      I0	 0	rN   c                ~     j         d         rj        st          j        |          S  fd|D             S )Nplugin_subjectc           
         g | ]>}t                              j        |                                d                     ?S )F)rV   r   r;   r   )rX   
value_dictr   r   r   s     rL   rZ   z8ORMDMLState._get_multi_crud_kv_pairs.<locals>.<listcomp>  s`     
 
 
  **")9j6F6F6H6H%  
 
 
rN   )_propagate_attrsr;   r(   _get_multi_crud_kv_pairs)r   r   r   r   s   `` @rL   r   z$ORMDMLState._get_multi_crud_kv_pairs  sv    "34DE 	^%: 	!:;  
 
 
 
 
 
 *
 
 
 	
rN   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   r;   r(   r   r   r   )r   r   r   r   r   s        rL   r   zORMDMLState._get_crud_kv_pairs  s     "	> 	>=	> 	> 	> #34DE 	^%: 	!4;(=   &&%%	 
 
 	
rN   c                    |j         j        d         }|j        }|j        r|j        }n|j        j        }||j        |j        |j        |j        dS )Nparententity)nametypeexprentityrd   )	rd   r   r;   is_aliased_classr   class___name__r   local_table)r   r   ext_infor;   _label_names        rL   get_entity_descriptionz"ORMDMLState.get_entity_description  s_    ?/?$ 	1"-KK -0K  MOo'
 
 	
rN   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;;;rN   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8rN   c                b    g | ]+\  }}|j         |j         ||          |j        |j        d ,S ))r   r   r   aliasedr   )ri   r   r   r   )rX   r   r   r   s      rL   rZ   zAORMDMLState.get_returning_column_descriptions.<locals>.<listcomp>  sZ     
 
 
 3 %a--/* 
 
 
rN   c                *    g | ]}| |          fS rJ   rJ   )rX   r   r   s     rL   rZ   zAORMDMLState.get_returning_column_descriptions.<locals>.<listcomp>  s3       )*LLOO$  rN   )_all_selected_columns)r   r   r   r   s     @@rL   !get_returning_column_descriptionsz-ORMDMLState.get_returning_column_descriptions  ss    	< 	< 	<	9 	9 	9
 
 
 
   .7.M  
 
 
 	
rN   )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   )rX   r   s     rL   rZ   z4ORMDMLState._setup_orm_returning.<locals>.<listcomp>8  s    NNNAarN   supplemental_cols)r   r   r:   _execution_optionsoptions_with_optionsselect_statementr   create_for_statementr   !setup_dml_returning_compile_state	_generateprimary_columnsextendprimary_keyrB   	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D#c 11*==="5"?"?"A"A-/*NN)<NNNN " >%%j&<===$ &I&9&I  +' '5' '##  'D&9&C#'# #"rN   c           
        |j         }|j        j        }|j        rf|j        j        j        sU|                    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   rn   r:   bind_argumentsr   execution_contextr  load_optionsquerycontexts              rL   _return_orm_returningz!ORMDMLState._return_orm_returningV  s     #N)2@ ,	!4DM	 -00&(I L (0.!	 	L $V\:::MrN   )r   
__module____qualname__is_dml_returningr   __annotations__classmethodr   r   r   r   r   r  r%  rJ   rN   rL   r   r     s         AEEEEE5 5 [5n 
 
 [
" 
 
 [
* 
 
 [
  
 
 [
B #A# A# A# A# A#F     [     rN   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Zded<   dS ))BulkUDCompileState.default_update_optionsautor+   _dml_strategyr-   _synchronize_sessionFrA   _can_use_returning_is_delete_using_is_update_fromT
_autoflushNOptional[Mapper[Any]]_subject_mapper_populate_existing)r   r&  r'  r0  r)  r1  r2  r3  r4  r5  r7  r)   _resolved_values_eval_condition_matched_rows_identity_tokenr8  rJ   rN   rL   default_update_optionsr.  {  s         -33333;AAAAA#(((((!&&&&& %%%%%
155555%#(((((((rN   r=  Fis_multitableis_update_fromis_delete_usingis_executemanydialectr   r;   r   r?  rA   r@  rA  rB  rF   c                   t                      rI   )r   )r   rC  r;   r?  r@  rA  rB  s          rL   can_use_returningz$BulkUDCompileState.can_use_returning  s     "###rN   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_tokenr@  rA  populate_existingsynchronize_sessionclauser   r;   r7  F0statement had 'orm' plugin but no plugin_subjectr   r0  	core_onlyr/  ormrx   HCan't use "bulk" ORM insert strategy without passing separate parameters)r/  evaluatefetchFzSValid strategies for session synchronization are 'auto', 'evaluate', 'fetch', FalserS  zkThe 'fetch' synchronization strategy is not available for 'bulk' ORM updates (i.e. multiple parameter sets)rR  r1  )rL  rA  r@  rI  rE  )r,  r=  from_execution_optionsr  r   r;   KeyErrorrd   r   r   r   r0  sa_excInvalidRequestErrorr1  ArgumentErrorr5  _do_pre_synchronize_auto_do_pre_synchronize_evaluate_do_pre_synchronize_fetch	_annotater3  r4  r2  r   immutabledictr   )
r   r   r   rn   r:   r!  is_pre_eventupdate_optionsr   syncs
             rL   orm_pre_session_execz'BulkUDCompileState.orm_pre_session_exec  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 )NrG  rP  rR  rS  rx   )r0  r1  _do_post_synchronize_evaluate_do_post_synchronize_fetch"_do_post_synchronize_bulk_evaluater%  )r   r   r   rn   r:   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((
 
 	
rN   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)rX   aer   s     rL   rt   z@BulkUDCompileState._adjust_for_extra_criteria.<locals>.<genexpr>P  s[       ! ! %!
 *,h)>)>	 **844 *?)>)>)>! !rN   c              3  B   K   | ]}                     |          V  d S rI   )traverse)rX   critadapters     rL   rt   z@BulkUDCompileState._adjust_for_extra_criteria.<locals>.<genexpr>\  s1      OO4 0 0 6 6OOOOOOrN   )r   _adapterr;   r   _single_table_criterion)r   global_attributesr   return_critrq  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rN   c                    	 |j         |j        j         ur |                    |j         j                  n|                    |j                  n# t          $ r g cY S w xY wfd|D             S )a  return rows that indicate PK cols in mapper.primary_key position
        for RETURNING rows.

        Prior to 2.0.36, this method seemed to be written for some kind of
        inheritance scenario but the scenario was unused for actual joined
        inheritance, and the function instead seemed to perform some kind of
        partial translation that would remove non-PK cols if the PK cols
        happened to be first in the row, but not otherwise.  The joined
        inheritance walk feature here seems to have never been used as it was
        always skipped by the "local_table" check.

        As of 2.0.36 the function strips away non-PK cols and provides the
        PK cols for the table in mapper PK order.

        c                &    g | ]} |          S rJ   rJ   )rX   rowpk_keyss     rL   rZ   z@BulkUDCompileState._interpret_returning_rows.<locals>.<listcomp>  s!    ------rN   )r   r~   _tuple_getterr  rU  )r   r   r;   rowsrz  s       @rL   _interpret_returning_rowsz,BulkUDCompileState._interpret_returning_rows`  s    $	!);)GGG
 !..v/A/MNN ..v/ABB 	 	 	 III		 .-------s   AA A A 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   )r;   r   expiredobjrV   )rX   rY   r;   s     rL   rZ   zGBulkUDCompileState._get_matched_objects_on_criteria.<locals>.<listcomp>  s\     
 
 
|''
 16
YY[[%,
 
 
rN   c                8    g | ]\  }}}|j         k    |||fS rJ   rJ  )rX   r  rY   r\   rJ  s       rL   rZ   zGBulkUDCompileState._get_matched_objects_on_criteria.<locals>.<listcomp>  s>       %C'>99 eU#999rN   T)r7  r:  r<  r   _EXPIRED_OBJECTappend)r   r_  r   eval_conditionraw_datar   r  rY   r\   evaled_conditionrJ  r;   s             @@rL    _get_matched_objects_on_criteriaz3BulkUDCompileState._get_matched_objects_on_criteria  s    /'7
 
 
 

 
 
 (7%   )1  H !) 	 	C-~c22
 !D((#y'@@@(I,EE	   rN   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    trN   )
r7  r   r   _EvaluatorCompiler_where_criteriar  _is_criteria_optionget_global_criteriarv  process)r   r_  r   r;   
target_clsevaluator_compilerrp  rt  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rN   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.

        rR  )r:  r1  r1  rS  )r  r   UnevaluatableErrorr[  )r   r   r   rn   r:   r!  r_  r  s           rL   rY  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  rV  rW  )	r   r   r   rn   r:   r!  r_  r  errs	            rL   rZ  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   r;   r   s      rL   _get_resolved_valuesz'BulkUDCompileState._get_resolved_values  s[    " 	I& 		1222 		)//11222IrN   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  ri   orm_excUnmappedColumnErrorrV  rW  )r   r;   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)r@  rA  rB  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!  rE  rC  r4  r3  rB  rV  rW  r   r   )r  bindper_bind_resultrE  r   r;   r_  s      rL   skip_for_returningzHBulkUDCompileState._do_pre_synchronize_fetch.<locals>.skip_for_returningP  s    /;&/MM+2LMMD "33-= . ?*9 4  O !,$77 4    8 + 4O 40-   %4! *,,,trN   )r:   r!  
_add_event)r;  r2  )r  r0   rF   r   )
r7  r!   r  select_identity_tokenselect_fromr  r  r  executefetchall)r   r   r   rn   r:   r!  r_  select_stmtr  r   matched_rowsrE  r;   s   `     `    @@rL   r[  z,BulkUDCompileState._do_pre_synchronize_fetch.  s      /FV'6+G*IIK[  i-/ 	
 '0&?# !	 	 	 	 	 	 	 	 	B /)) ! 
 
 (()"3!
 !
 
 	
rN   NrC  r   r;   r   r?  rA   r@  rA   rA  rA   rB  rA   rF   rA   )r   r&  r'  r%   r=  r*  rE  ra  rg  rv  r}  r  r  rY  rZ  r  r  r[  rJ   rN   rL   r,  r,  z  s       ) ) ) ) ) ) ) )  $$ %$
$ 
$ 
$ 
$ 
$ [
$ v
 v
 [v
p )
 )
 [)
V " " ["H  .  . [ .D $ $ [$L   [8 -
 -
 [-
^ 
 
 [
2   [   [" N
 N
 [N
 N
 N
rN   r,  rP  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_optionsr/  r+   r0  FrA   _render_nulls_return_defaultsNr6  r7  Tr5  r8  )
r   r&  r'  r0  r)  r  r  r7  r5  r8  rJ   rN   rL   default_insert_optionsr    sz         -33333#####!&&&&&155555
#(((((((rN   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>   rH  rI  rC   rK  rM  r   r;   r7  FrN  r/  r0  rP  rx   rQ  rawrI  )r  r  rT  r  r   r;   rU  r0  rV  rW  r   _orm_load_exec_optionsr   r5  r\  r   r]  )	r   r   r   rn   r:   r!  r^  insert_optionsr   s	            rL   ra  z"BulkORMInsert.orm_pre_session_exec  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)>: 
 	
rb  r   r1   r   
dml.Insertrn   r6   r:   r,   r!  r/   ro   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  rx   rP  r/  zHValid strategies for ORM insert strategy are 'raw', 'orm', 'bulk', 'autor  )r:   rx   z`bulk INSERT with a 'post values' clause (typically upsert) not supported for multi-table mapper Iterable[Dict[str, Any]]F)r@   rB   rC   r9   r:   rP  r  r8  T)r   r  r0  rV  rX  r  r7  _post_values_clause_multiple_persistence_tablesrW  _transactionrM   r   r   rV   r  r  AssertionErrorrA   r   r8  r   r  r   r%  )r   r   r   rn   r:   r!  ro   r  r   r;   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! ! ((
 
 	
rN   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   rI  r  rx   rP  )
r   r  superr	  stackr   r   r   _setup_for_bulk_insert_setup_for_orm_insert)	r   r   r  kwr  toplevelr;   rI  	__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rN   c                X    d fd|                                 D             D             S )Nc                .    i | ]\  }}}||j         n||S rI   rh   )rX   colr   r   s       rL   r   z<BulkORMInsert._resolved_keys_as_col_keys.<locals>.<dictcomp>B  s:     
 
 
Q CGGAq
 
 
rN   c              3  X   K   | ]$\  }}j                             |          ||fV  %d S rI   )r   r   )rX   r   r   r;   s      rL   rt   z;BulkORMInsert._resolved_keys_as_col_keys.<locals>.<genexpr>D  sK        ,0Aqa!Q'     rN   )r   )r   r;   resolved_value_dicts    ` rL   _resolved_keys_as_col_keysz(BulkORMInsert._resolved_keys_as_col_keys@  sS    
 
   4G4M4M4O4O  
 
 
 	
rN   c                    t          t          j        | j                  x}}|                     ||||d          }|| _        d S )NFr  r   )r   r   Insertr   r  )r  r  r;   r   r  s        rL   r  z#BulkORMInsert._setup_for_orm_insertI  sQ    *.sz4>*J*JJ	'--"' . 
 
	 #rN   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   rd   )rX   r  valemit_insert_tables      rL   r   z8BulkORMInsert._setup_for_bulk_insert.<locals>.<dictcomp>i  7     % % %C9 111 S111rN   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   _clonerd   _dict_parametersr   r  r   r  r  rV  CompileError)r  r  r   r  anemit_insert_mapperr  s         @rL   r  z$BulkORMInsert._setup_for_bulk_insertU  s    +/sz4>*J*JJ	'# #$$% 	.-
 $$&&	+	  	% % % % $ 5 ; ; = =% % %D! --)"& . 
 
	 #/'7@ 0 %3   #rN   )r   r1   r   r  rn   r6   r:   r,   r!  r/   ro   r4   rF   r  )rF   r  )r   r&  r'  r%   r  r  r)  r*  ra  r  r	  r  r  r  __classcell__r  s   @rL   r  r    s        ) ) ) ) ) ) ) ) 154444A
 A
 [A
F V
 V
 V
 [V
p      [, 
 
 [

# 
# 
#,# ,# ,# ,# ,# ,# ,#rN   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 )NrI  unspecifiedrx   rO  r   )rP  r  )	__new__r   r   r  _setup_for_bulk_updaterd   r(   __init___setup_for_orm_update)r   r   r  r  r  rI  r  s          rL   r	  z"BulkORMUpdate.create_for_statement  s    {{3 -11M
 
  ~% 		<..''	8<<<<K''},,io&BBB#D)XDDDDDD 	<\-CCC&&y(;;;rN   c                   |}|j          }|j        j        d         }|j        x| _        }|                     ||          | _        |                     ||||           |j        rt          | j                  | _        |	                                }|j        j        d         |u r|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_toplevelFrL  rE  rS  )r?  Tr  )r  rd   r   r;   r  r9  _init_global_attributesr  rV   r  r   r  rv  rt  wherer(   r  r   rE  rC  r?  rB   r  r  r   )r  r   r  r  r  r  r   r;   new_stmtnew_critr   rL  rE  s                rL   r  z#BulkORMUpdate._setup_for_orm_update  sN   '~%?/?'.f $ 9 9&) L L$$*2	 	% 	
 	
 	
  	@$()>$?$?D!##%%>&~6&@@#/HN $ 	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 "rN   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  )rX   r  r  emit_update_tables      rL   r   z8BulkORMUpdate._setup_for_bulk_update.<locals>.<dictcomp>  r  rN   N)r   r   Updater   r  rd   r(   r  r  rV  rW  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!
 #rN   r   r1   r   
dml.Updatern   r6   r:   r,   r!  r/   ro   r4   rF   r  c           
        |                     d| j                  }|j        r>|                     dt          j                  }|ddiz  }|                    d|i          }|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 )NrG  r  r8  T)rP  r/  rx   rO  zOValid strategies for ORM UPDATE strategy are 'orm', 'auto', 'bulk', 'core_only'rx   rS  rR  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=  r8  r   r  r   r0  rV  rX  r  r1  rW  r7  r  r   r   r   rV   rg  r  r  )r   r   r   rn   r:   r!  ro   r_  r#  r   r;   r   r  s               rL   r  z#BulkORMUpdate.orm_execute_statement#  s    +..$c&@
 
 , 	,00&(I L 1488L 1 7 7'6! ! ' 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!  rN   Fr>  rC  r   r;   r   r?  rA   r@  rA  rB  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_multifromrV  r  r   r   rC  r;   r?  r@  rA  rB  normal_answers           rL   rE  zBulkORMUpdate.can_use_returningy  s     $N);)N 	  	5 	877  
	55 	7#E 	%EGL E E E   trN   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   rh   )rX   props     rL   rZ   zDBulkORMUpdate._do_post_synchronize_bulk_evaluate.<locals>.<listcomp>  s    CCC48CCCrN   c              3  (   K   | ]}|         V  d S rI   rJ   )rX   ri   params     rL   rt   zCBulkORMUpdate._do_post_synchronize_bulk_evaluate.<locals>.<genexpr>  s'      //s//////rN   )r7  r   identity_mapidentity_key_from_primary_keyr<  fast_get_stater   
differencerV   
unmodifiedr   managerdispatchrefresh_commitr   _expire_attributes)r   r   rn   r   r_  r;   rz  r  identity_keyrY   evaluated_keysr\   to_evaluateri   	to_expirer  s                  @rL   rf  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  ;((	:::;	; 	;rN   c           
        |                      ||j                                                  }|                     ||||j        j        d         d |D             |                                |                                           d S )Nr   c                "    g | ]\  }}}}|||fS rJ   rJ   )rX   r  rY   r\   r  s        rL   rZ   z?BulkORMUpdate._do_post_synchronize_evaluate.<locals>.<listcomp>  s(    MMM%9S%c5% MMMrN   )r  r  
all_states#_apply_update_set_values_to_objectsr   compiled_parametersprefetch_colspostfetch_cols)r   r   r   r   r_  matched_objectss         rL   rd  z+BulkORMUpdate._do_post_synchronize_evaluate  s     >> ++--
 

 	//N.q1MM_MMM  ""!!##	
 	
 	
 	
 	
rN   c           
       	 j         	|j        }|r&|                     |	|          }fd|D             }nj        }fd	fdd |D             D             D             }|sd S |                     ||j        j        d         d |D             |                                |                                           d S )Nc                @    g | ]}t          |          j        fz   S rJ   r   r<  rX   ry  r_  s     rL   rZ   z<BulkORMUpdate._do_post_synchronize_fetch.<locals>.<listcomp>  :        c

n<>>  rN   c                <    g | ]}|j         v j         |         S rJ   )r  )rX   r  r   s     rL   rZ   z<BulkORMUpdate._do_post_synchronize_fetch.<locals>.<listcomp>  s=     
 
 
 w333  . 433rN   c                    g | ];\  }}j         |j         k                        t          |          |          <S )Nr  )r<  r  r   )rX   r  rJ  target_mapperr_  s      rL   rZ   z<BulkORMUpdate._do_post_synchronize_fetch.<locals>.<listcomp>  sh     
! 
! 
!
 0K "19!^%CCC ;;%%#1 <   DCCrN   c                2    g | ]}|d d         |d         fS )r   rJ   )rX   ry  s     rL   rZ   z<BulkORMUpdate._do_post_synchronize_fetch.<locals>.<listcomp>  s6     4 4 4-0S2YB(4 4 4rN   r   c                `    g | ]+}|t          j        |          t          j        |          f,S rJ   )r   instance_stateinstance_dict)rX   r  s     rL   rZ   z<BulkORMUpdate._do_post_synchronize_fetch.<locals>.<listcomp>  sK        	 -c22,S11  rN   )	r7  returned_defaults_rowsr}  r;  r"  r   r#  r$  r%  )
r   r   r   r   r_  r4  pk_rowsr  objsr.  s
    `  `    @rL   re  z(BulkORMUpdate._do_post_synchronize_fetch  s_    '6!'!>! 		833'= G   "  LL
 *7L
 
 
 

! 
! 
! 
! 
!
4 44@4 4 4
! 
! 
!
 
 
   	F//N.q1        ""!!##	
 	
 	
 	
 	
rN   c                   |j         j        }t          j        |          }	|                     |          }
|                     |
          }i }|D ]R\  }}	 |	                    t          j        t          j
        |                    }|||<   ># t          j        $ r Y Ow xY wt          |                                          d |D             }t                      }fd|D             }fd|D                                           }fd|D             }|D ]\  }}}|                    fd|D                        |                    |j        |           |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   )rX   r   r   s      rL   	<setcomp>zDBulkORMUpdate._apply_update_set_values_to_objects.<locals>.<setcomp>5  s    ;;;1!;;;rN   c                J    h | ]}|j         v r|j        v r|j         v| S rJ   )ri   r  )rX   r   effective_paramsr  r;   s     rL   r9  zDBulkORMUpdate._apply_update_set_values_to_objects.<locals>.<setcomp>9  sN     
 
 
u(((V---^++	  ,++rN   c                F    h | ]}|j         v j         |         j        S rJ   r  ri   rX   r   r;   s     rL   r9  zDBulkORMUpdate._apply_update_set_values_to_objects.<locals>.<setcomp>@  s<     
 
 
F,,, $Q'+,,,rN   c                B    g | ]}j         |         j        |j        fS rJ   r=  r>  s     rL   rZ   zEBulkORMUpdate._apply_update_set_values_to_objects.<locals>.<listcomp>F  s8     
 
 
9:V%a(,ae4
 
 
rN   c                (    i | ]\  }}||         S rJ   rJ   )rX   col_to_propc_keyr;  s      rL   r   zEBulkORMUpdate._apply_update_set_values_to_objects.<locals>.<dictcomp>M  s5       *U  !1%!8  rN   N)r7  r   r   r  r  r  r  r   r   r    r   r  r   r   r   r  r  r  rV   r  r   r  r  r  r  add_register_altered)r   r   r_  r   r;  r&  r$  r%  r  r  r  resolved_keys_as_propnamesvalue_evaluatorsri   value
_evaluatorattribr   to_prefetchr  prefetch_transferr  rY   r\   r  r  r;   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;; :;;;
 
 
 
 
 
"
 
 

 
 
 
#
 
 
 *^
$
$	 	
 
 
 
>I
 
 
 "1 	 	CLL   .?     $$UZ;;;*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  rn   r6   r:   r,   r!  r/   ro   r4   rF   r  r  )r   r&  r'  r*  r	  r  r  r  rE  rf  rd  re  r"  r  r  s   @rL   r  r    s:         [,`" `" `"D"# "# "#H S S S S S [Sj  $$ %$" " " " " ["H (; (; [(;T 
 
 [
$ 3
 3
 [3
j U* U* [U* U* U* U* U*rN   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           	        |                      |           }|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        j        d         |	u r|	j
        |
_        |                     |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 )NrI  r  rO  r   r  FrL  rE  rS  rA  )r?  rA  Tr  )r  r   r   rd   r&   r  r  r;   r  r  r   rv  rt  r  rE  rC  r?  rB   r  r  r   )r   r   r  r  r  rI  r  r  r   r;   r  r  r   rL  rE  s                  rL   r	  z"BulkORMDelete.create_for_statementm  sr   {{3 -11M
 

 K''},,io&BBB#D)XDDDDDK~%'?/?'.f$$*2	 	% 	
 	
 	
 ##%%>&~6&@@#/HN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 "rN   r   r1   r   
dml.Deletern   r6   r:   r,   r!  r/   ro   r4   rF   r  c                    |                     d| j                  }|j        dk    rt          j        d          |j        dvrt          j        d          t                                          ||||||          S )NrG  rx   zBulk ORM DELETE not supported right now. Statement may be invoked at the Core level using session.connection().execute(stmt, parameters))rP  r/  rO  zGValid strategies for ORM DELETE strategy are 'orm', 'auto', 'core_only')r   r=  r0  rV  rW  rX  r  r  )	r   r   r   rn   r:   r!  ro   r_  r  s	           rL   r  z#BulkORMDelete.orm_execute_statement  s     +..$c&@
 
 '611,A   '/KKK&  
 ww,,Y(9>4
 
 	
rN   Fr>  rC  r   r;   r   r?  rA   r@  rA  rB  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_multifromrV  r  r   r
  s           rL   rE  zBulkORMDelete.can_use_returning  s     $N);)N 	  	5  	 55 	7#E 	 %EGL E E E   trN   c                   |                      ||j                                                  }g }|D ]?\  }}}	}
|
r!|                    |	|j        j                   *|                    |           @|r|                    |           d S d S rI   )r  r  r!  _expire	_modifiedr  _remove_newly_deleted)r   r   r   r   r_  r&  	to_deleter  rY   r\   is_partially_expireds              rL   rd  z+BulkORMDelete._do_post_synchronize_evaluate  s     >> ++--
 

 	5D 	( 	(1Aue1# (eW%9%CDDDD  '''' 	5)))44444	5 	5rN   c                p   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   rZ   z<BulkORMDelete._do_post_synchronize_fetch.<locals>.<listcomp>3  r+  rN   r   r0  r  )
r7  r4  r}  r;  r  r   r  rX  r   r2  )r   r   r   r   r_  r.  r4  r5  r  ry  r  rJ  r  s       `        rL   re  z(BulkORMDelete._do_post_synchronize_fetch&  s    '6!'!>! 
	833'= G   "  LL
 *7L 	 	Cad)K WN )FF[!!- G  L w333--"1#0>   	 	rN   )r   r1   r   rP  rn   r6   r:   r,   r!  r/   ro   r4   rF   r  r  )
r   r&  r'  r*  r	  r  rE  rd  re  r  r  s   @rL   rN  rN  k  s        Y Y [Yv 
 
 
 
 
 [
>  $$ %$& & & & & [&P 5 5 [5& $ $ [$ $ $ $ $rN   rN  )r;   r<   r=   r>   r?   r2   r@   rA   rB   rA   rC   rA   r9   rD   r:   rE   rF   rG   )r;   r<   r=   r>   r?   r2   r@   rA   rB   rA   rC   rA   r9   rO   r:   rE   rF   rP   )r;   r<   r=   r>   r?   r2   r@   rA   rB   rA   rC   rA   r9   rO   r:   rE   rF   rR   )r;   r   r=   r>   r?   r2   r@   rA   r   rA   r   rD   r   rA   rF   rG   )r;   r   r=   r>   r?   r2   r@   rA   r   rA   r   r   r   rA   rF   r   )r;   r   r=   r>   r?   r2   r@   rA   r   rA   r   r   r   rA   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   rV  r   enginer   r   r   sqlr   r   r   r    r!   r"   sql.baser#   r$   r%   sql.dmlr&   r'   r(   r)   util.typingr*   _typingr+   r,   r-   r;   r.   r   r/   r0   r1   r2   rY   r3   r4   r5   engine.interfacesr6   objectr7   rM   r   r   r   r,  
plugin_forr  r  rN  rJ   rN   rL   <module>rk     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U U U U U Up 
 *-"&	 	 	 	 	 
	 
 14"&	 	 	 	 	 
	& 15"&Y% Y% Y% Y% Y% Y%x% % %t t t t t) t t tnC
 C
 C
 C
 C
 C
 C
 C
L ))@# @# @# @# @#K @# @# *)@#F ))c* c* c* c* c*& c* c* *)c*L ))_ _ _ _ _& _ _ *)_ _ _rN   