o
    E6dl                    @  sp  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
r7d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d6eDd7ZEe		8	8dmdndIdJZFe		8	8dmdodMdJZF	N	NdpdqdPdJZFe		8	QdrdsdVdWZGe		8	QdrdtdZdWZG	N	Qdudvd\dWZGd]d^ ZHG d_d` d`eZIG dadb dbeIZJe*KdcddG dedf dfeIe.ZLe*KdcdgG dhdi dieJe/ZMe*KdcdjG dkdl dleJe-ZNdNS )wzoadditional 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_transactionr1   isstatesboolreturn_defaultsrender_nullsuse_orm_insert_stmtLiteral[None]execution_options$Optional[OrmExecuteOptionsParameter]returnNonec                 C     d S N r8   r:   r<   r=   r?   r@   rA   rC   rI   rI   vC:\Users\jesus\OneDrive\Desktop\erpjis_fastapi\backend\jisbackend\Lib\site-packages\sqlalchemy/orm/bulk_persistence.py_bulk_insertJ      rL   Optional[dml.Insert]cursor.CursorResult[Any]c                 C  rG   rH   rI   rJ   rI   rI   rK   rL   X   rM   N"Optional[cursor.CursorResult[Any]]c                   s  j }|jjrtd|r&|rdd D }	dd |	D ndd D ndd D t || d }
fdd|j D }|rJd}nt|d	krSd}nd
}|D ]W\}}|d urjfdd|	 D nd} fddt
j| fddD d|||dD }t
j|d ||||||d}|d ur|jr|
d u r|}
qW|jr|sJ |
|}
qW|r|rӈj}dd jD }|	D ]\}|tfdd|D f|_q|d ur|
d usJ |
S d S )NzJconnection_callable / per-instance sharding not supported in bulk_insert()c                 S  s   g | ]}||j fqS rI   dict.0staterI   rI   rK   
<listcomp>z       z _bulk_insert.<locals>.<listcomp>c                 S  s   g | ]\}}|qS rI   rI   )rT   rU   dict_rI   rI   rK   rV   {       c                 S     g | ]}|j qS rI   rQ   rS   rI   rI   rK   rV   }       c                 S     g | ]}t |qS rI   rQ   rT   mrI   rI   rK   rV      rY   c                   s"   g | ]\}}| j v r||fqS rI   )_pks_by_table)rT   tablempr8   rI   rK   rV      s
    
Tr   Fc                       g | ]}|j  d  v r|j qS r   keyrT   br:   rI   rK   rV      
    rI   c           	   	   3  s4    | ]\}}}}}}}}d || |||fV  qd S rH   rI   )	rT   rU   Z
state_dictparamsra   connZvalue_paramsZhas_all_pksZhas_all_defaults
connectionr8   rI   rK   	<genexpr>   s*    
z_bulk_insert.<locals>.<genexpr>c                 3  s    | ]	}d | fV  qd S rH   rI   rT   mappingrm   rI   rK   ro      s    )bulkr?   r@   include_bulk_keys)bookkeepingrA   rC   c                 S  rZ   rI   re   )rT   prI   rI   rK   rV      r[   c                      g | ]} | qS rI   rI   rT   rf   )rX   rI   rK   rV      rY   )base_mappersessionconnection_callableNotImplementedError_expand_compositesrn   _sorted_tablesitemslen_get_embedded_bindparamsr   Z_collect_insert_commandsZ_emit_insert_statements
_returningZreturns_rowsZsplice_horizontallyZ_identity_class_identity_key_propstuplerf   )r8   r:   r<   r=   r?   r@   rA   rC   rx   statesZreturn_resultZmappers_to_runrt   r`   super_mapperextra_bp_namesrecordsr   Zidentity_clsZidentity_propsrU   rI   )rn   rX   r8   r:   rK   rL   f   s   







TMapper[Any]update_changed_onlyuse_orm_update_stmtenable_check_rowcountc                 C  rG   rH   rI   r8   r:   r<   r=   r   r   r   rI   rI   rK   _bulk_update      
r   Optional[dml.Update]_result.Result[Any]c                 C  rG   rH   rI   r   rI   rI   rK   r      r   Optional[_result.Result[Any]]c                   s.  j }jjrjjhfdd |r.|r& fddD ndd D ndd D t |jjrBtd|	||d urVfdd|
 D nd	}|j D ]/\}	}
|
rk|	jvrlq]tjd |	fd
dD d||d}tj|d |
|	|d||d q]|d urt S d S )Nc                   s    fdd j  D S )Nc                   s(   i | ]\}}|j v s| v r||qS rI   )Zcommitted_staterT   kv)search_keysrU   rI   rK   
<dictcomp>  s
    z7_bulk_update.<locals>._changed_dict.<locals>.<dictcomp>)rR   r~   )r8   rU   )r   )rU   rK   _changed_dict  s   z#_bulk_update.<locals>._changed_dictc                   s   g | ]} |qS rI   rI   rS   )r   r8   rI   rK   rV     rW   z _bulk_update.<locals>.<listcomp>c                 S  rZ   rI   rQ   rS   rI   rI   rK   rV     r[   c                 S  r\   rI   rQ   r]   rI   rI   rK   rV     rY   zJconnection_callable / per-instance sharding not supported in bulk_update()c                   rc   rd   re   rg   ri   rI   rK   rV   *  rj   rI   c                 3  s0    | ]}d | j r|j j nd fV  qd S rH   )_version_id_proprf   rp   rm   rI   rK   ro   :  s    
z_bulk_update.<locals>.<genexpr>T)rr   r   rs   F)rt   r   r   )rx   Z_primary_key_propkeysr   rf   unionr|   ry   rz   r{   rn   r   r}   r~   isar_   r   Z_collect_update_commandsZ_emit_update_statements_resultnull_result)r8   r:   r<   r=   r   r   r   rx   r   r`   r   r   rI   )r   rn   r8   r:   r   rK   r      s`   	




c                   sV   | j   sd S t  } fdd|D }|D ]}||D ]}|| | qqd S )Nc                   s   i | ]	}| |   qS rI   )Z)_populate_composite_bulk_save_mappings_fnrw   Zcomposite_attrsrI   rK   r   a  s    z&_expand_composites.<locals>.<dictcomp>)Z
compositessetkeysintersection)r8   r:   Zcomposite_keysZ
populatorsrq   rf   rI   r   rK   r|   [  s   
r|   c                   @  st   e Zd ZU dZdZded< edd Zedd Zed	d
 Z	edd Z
edd ZddddZedd ZdS )ORMDMLStateTNz&Optional[ORMFromStatementCompileState]from_statement_ctxc                 c  s    t j}|D ]r\}}ttj|}t|trGt||t	d}|t	u r:ttj||r5tjtj
|t ddn|fV  q|||||E d H  qd|jv re|j}	t|	d |	d }
|||
||E d H  q||sj|ntjtj
|t ddfV  qd S )N)defaultT)type_Zis_crudZentity_namespace	proxy_key)r'   _get_crud_kv_pairsr   expectr   ZDMLColumnRole
isinstancestrr"   r   ExpressionElementRoler!   ZNullTypeZ_bulk_update_tuples_annotations)clsr8   	statementkv_iteratorneeds_to_be_cacheableZcore_get_crud_kv_pairsr   r   descZk_annoattrrI   rI   rK   _get_orm_crud_kv_pairsn  sV   

z"ORMDMLState._get_orm_crud_kv_pairsc                   s6   j d r
jst|S  fdd|D S )Nplugin_subjectc              	     s&   g | ]}t  j| d qS )F)rR   r   r8   r~   )rT   Z
value_dictr   r   r   rI   rK   rV     s    z8ORMDMLState._get_multi_crud_kv_pairs.<locals>.<listcomp>)_propagate_attrsr8   r'   _get_multi_crud_kv_pairs)r   r   r   rI   r   rK   r     s   

z$ORMDMLState._get_multi_crud_kv_pairsc                 C  sD   |sJ d|j d }|r|jst|||S t| |j|||S )Nz0no test coverage for needs_to_be_cacheable=Falser   )r   r8   r'   r   listr   )r   r   r   r   r   rI   rI   rK   r     s"   

zORMDMLState._get_crud_kv_pairsc                 C  s@   |j jd }|j}|jr|j}n|jj}||j|j|j|jdS )Nparententity)nametypeexprentityr`   )	r`   r   r8   is_aliased_classr   class___name__r   local_table)r   r   ext_infor8   Z_label_namerI   rI   rK   get_entity_description  s   z"ORMDMLState.get_entity_descriptionc                   s2   dd dd   fddfdd|j D D S )Nc                 S  s   | j dd S )Nr   )r   get)crI   rI   rK   _ent_for_col  s   zCORMDMLState.get_returning_column_descriptions.<locals>._ent_for_colc                 S  s0   |d u r| S | j dd }|s| S t|j|| S )Nr   )r   r   getattrr   )r   entr   rI   rI   rK   _attr_for_col  s   zDORMDMLState.get_returning_column_descriptions.<locals>._attr_for_colc                   s.   g | ]\}}|j |j |||j|jd qS ))r   r   r   aliasedr   )rf   r   r   r   )rT   r   r   )r   rI   rK   rV     s    zAORMDMLState.get_returning_column_descriptions.<locals>.<listcomp>c                   s   g | ]}| |fqS rI   rI   rT   r   )r   rI   rK   rV     s    )Z_all_selected_columns)r   r   rI   )r   r   rK   !get_returning_column_descriptions  s   
	
z-ORMDMLState.get_returning_column_descriptions)use_supplemental_colsc          	      C  s   |j rTt|j |dd}|jdi |j}|j|j }|| _t|| | _	}|
| | }d|_ dd |jD }|sB||j |rO|j|jd|i}|S |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)Z_adapt_on_namesrI   c                 S  s   g | ]}|d ur|qS rH   rI   r   rI   rI   rK   rV     s    z4ORMDMLState._setup_orm_returning.<locals>.<listcomp>Zsupplemental_cols)r   r   rC   _execution_optionsoptions_with_optionsselect_statementr   create_for_statementr   Z!setup_dml_returning_compile_stateZ	_generateZprimary_columnsextendprimary_keyr?   Z	returning)	selfcompilerorm_level_statementZdml_level_statement
dml_mapperr   fsZfscZcols_to_returnrI   rI   rK   _setup_orm_returning  s:   

z ORMDMLState._setup_orm_returningc                 C  sT   |j }|jj}|jr(|jjjs(|dtj}	t|j|j	|||	||}
t
||
S |S )N_sa_orm_load_options)r   compiledcompile_stater   compile_options_is_starr   r   default_load_optionsr   r   Z	instances)r   ry   r   rk   rC   bind_argumentsr   Zexecution_contextr   load_optionsZquerycontextrI   rI   rK   _return_orm_returning9  s(   
	z!ORMDMLState._return_orm_returning)r   
__module____qualname__Zis_dml_returningr   __annotations__classmethodr   r   r   r   r   r   r   rI   rI   rI   rK   r   j  s"   
 
3



!Cr   c                   @  s   e Zd ZG dd deZedddddd(ddZedd Zedd Zedd Z	edd Z
edd Zedd Zedd Zedd  Zed!d" Zed#d$ Zed%d& Zd'S ))BulkUDCompileStatec                   @  sr   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 )z)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   r   r   r   r   r   r   r   r   r(   _resolved_values_eval_condition_matched_rows_identity_tokenrI   rI   rI   rK   default_update_options]  s   
 r   Fis_multitableis_update_fromis_delete_usingis_executemanydialectr   r8   r   r   r>   r   r   r   rE   c                C  s   t  rH   )r{   )r   r   r8   r   r   r   r   rI   rI   rK   can_use_returningj  s   z$BulkUDCompileState.can_use_returningc           
      C  s  t jdh d||j\}}||d< z|jd }W n ty$   J dw |r3|j|d< |d|ji7 }d	|jjvr@|d
di7 }n't	|t
s\|jdkrQ|d
di7 }n|jdkr[tdn|jdkrg|d
di7 }|j}	|	d ur|	dvrwtd|jdkr|	dkrtd|s|jr|  |jdkr|jdkr| ||||||}n0|jdkr| ||||||}n |jdkr| ||||||}n|jdkr|jdkr|ddi7 }||j|j|j|j|jd}|t|d|ifS )N_sa_orm_update_options>   dml_strategyr   identity_token	autoflushr   synchronize_sessionclauser   F0statement had 'orm' plugin but no plugin_subjectr8   r   r   r   	core_onlyr   ormrr   HCan't use "bulk" ORM insert strategy without passing separate parameters)r   evaluatefetchFzSValid strategies for session synchronization are 'auto', 'evaluate', 'fetch', Falser  zkThe 'fetch' synchronization strategy is not available for 'bulk' ORM updates (i.e. multiple parameter sets)r  r   )r  r   r   r   r   )r   r   from_execution_optionsr   r   KeyErrorr8   r`   r   r   r   r   sa_excInvalidRequestErrorr   ArgumentErrorr   _do_pre_synchronize_auto_do_pre_synchronize_evaluate_do_pre_synchronize_fetch	_annotater   r   r   r   immutabledictr   )
r   ry   r   rk   rC   r   is_pre_eventupdate_optionsr   ZsyncrI   rI   rK   orm_pre_session_execw  s   











z'BulkUDCompileState.orm_pre_session_execc                 C  s   |d }|j dkr%|jdkr| |||| n"|jdkr$| |||| n|j dkr9|jdkr7| |||| |S | ||||||S )Nr   r  r  r  rr   )r   r   _do_post_synchronize_evaluate_do_post_synchronize_fetch"_do_post_synchronize_bulk_evaluater   )r   ry   r   rk   rC   r   r   r  rI   rI   rK   orm_setup_cursor_result  s2   




z*BulkUDCompileState.orm_setup_cursor_resultc                   s~   d}j rjnd djf|v r#|tfdd|djf D 7 }jjdur0|jjf7 } r=t fd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.

        rI   NZadditional_entity_criteriac                 3  s*    | ]}|j s|j u r| V  qd S rH   )Zinclude_aliasesr   Z_resolve_where_criteria)rT   Zae)r   rI   rK   ro   0  s    
z@BulkUDCompileState._adjust_for_extra_criteria.<locals>.<genexpr>c                 3  s    | ]}  |V  qd S rH   )traverse)rT   crit)adapterrI   rK   ro   <  s    )r   Z_adapterr8   r   Z_single_table_criterion)r   global_attributesr   Zreturn_critrI   )r  r   rK   _adjust_for_extra_criteria  s"   
z-BulkUDCompileState._adjust_for_extra_criteriac                   s   |j |jj ur	|S dd |j jD  | D ]2}|jdu r n*|j |jj u r'qt|j|jj  }dd || D }  D ]
\}}||  |< q=q fddt|j jD fdd|jjD fd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                 S  s   i | ]}||qS rI   rI   )rT   pkrI   rI   rK   r   [  r[   z@BulkUDCompileState._interpret_returning_rows.<locals>.<dictcomp>Nc                 S  s   i | ]\}}||qS rI   rI   )rT   Zsuper_pkZsub_pkrI   rI   rK   r   d  rW   c                   s   i | ]	\}} | |qS rI   rI   )rT   idxZlpk)local_pk_to_base_pkrI   rK   r   h  s    c                   rv   rI   rI   )rT   Zbpk)lookuprI   rK   rV   l  s    z@BulkUDCompileState._interpret_returning_rows.<locals>.<listcomp>c                   s"   g | ] t  fd dD qS )c                 3      | ]} | V  qd S rH   rI   )rT   r   rowrI   rK   ro   o      zJBulkUDCompileState._interpret_returning_rows.<locals>.<listcomp>.<genexpr>)r   )rT   )primary_key_convertr$  rK   rV   o  s   " )	r   rx   r   Ziterate_to_rootZinheritsrR   Z_table_to_equatedr~   	enumerate)r   r8   rowsra   Zt_to_eZ
col_to_colr  Zsuper_rI   )r!  r"  r'  rK   _interpret_returning_rows@  s(   



z,BulkUDCompileState._interpret_returning_rowsc           
        s   |j |j}fdd|D }|j  d ur fdd|D }g }|D ]\}}}||}	|	du s5|	tju rA|||||	tju f q#|S )Nc                   s.   g | ]}|j  r|js| ||jfqS rI   )r8   r   ZexpiredobjrR   rS   rb   rI   rK   rV   v  s    
zGBulkUDCompileState._get_matched_objects_on_criteria.<locals>.<listcomp>c                   s&   g | ]\}}}|j  kr|||fqS rI   r   )rT   r+  rU   rX   r,  rI   rK   rV   ~  s
    
T)r   r   r   r   Z_EXPIRED_OBJECTappend)
r   r  r   eval_conditionraw_datar   r+  rU   rX   Zevaled_conditionrI   )r   r8   rK    _get_matched_objects_on_criteriaq  s0   


z3BulkUDCompileState._get_matched_objects_on_criteriac                 C  s   |j }|j}t|}d}|jr||j7 }i }|jD ]
}|jr$|| q|r/|| ||7 }|r8|j	| }	|	S dd }
|
}	|	S )NrI   c                 S  s   dS NTrI   )r+  rI   rI   rK   r     s   zJBulkUDCompileState._eval_condition_from_statement.<locals>._eval_condition)
r   r   r   _EvaluatorCompiler_where_criteriar   Z_is_criteria_optionZget_global_criteriar  process)r   r  r   r8   
target_clsevaluator_compilerr  r  optr.  r   rI   rI   rK   _eval_condition_from_statement  s&   




z1BulkUDCompileState._eval_condition_from_statementc                 C  sT   z|  ||}W n
 tjy   Y nw ||dd S |ddi7 }| ||||||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.

        r  )r   r   r   r  )r8  r   UnevaluatableErrorr  )r   ry   r   rk   rC   r   r  r.  rI   rI   rK   r    s(   z+BulkUDCompileState._do_pre_synchronize_autoc           	   
   C  sH   z|  ||}W n tjy } ztd| |d }~ww |d|i S )Nz{Could not evaluate current criteria in Python: "%s". Specify 'fetch' or False for the synchronize_session execution option.r   )r8  r   r9  r  r  )	r   ry   r   rk   rC   r   r  r.  errrI   rI   rK   r    s"   
z/BulkUDCompileState._do_pre_synchronize_evaluatec                 C  s2   |j rg S |jrt|jS |jrt|j S g S rH   )Z_multi_values_ordered_valuesr   _valuesr~   )r   r8   r   rI   rI   rK   _get_resolved_values  s   
z'BulkUDCompileState._get_resolved_valuesc              	   C  sh   g }|D ]-\}}|r+t |tjr+z|j| }W n
 tjy!   Y qw ||j|f qt	d| |S )NzCAttribute name not found, can't be synchronized back to objects: %r)
r   r   ZColumnElementZ_columntopropertyorm_excZUnmappedColumnErrorr-  rf   r  r  )r   r8   resolved_valuesvaluesr   r   r   rI   rI   rK   _resolved_keys_as_propnames
  s   z.BulkUDCompileState._resolved_keys_as_propnamesc                   sp   j tjjf  j|j }|j|_d  d	 fdd}|j|||||d}	|		 }
|
 d S )
Norm_contextr/   rE   r   c                   st   | j jdi | j}j|jjj| jd} d ur& |kr%t	dn| jr0|s0t	d| |r8t
 S d S )N)r   r   r   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 RETURNINGrI   )ry   Zget_bindr   r   r   r   r   r   r  r  r   r   )rB  bindZper_bind_resultr   r   r8   r  rI   rK   skip_for_returning>  s,   
zHBulkUDCompileState._do_pre_synchronize_fetch.<locals>.skip_for_returning)rC   r   Z
_add_event)r   r   )rB  r/   rE   r   )
r   r    r   Zselect_identity_tokenselect_fromr   r   r3  executeZfetchall)r   ry   r   rk   rC   r   r  Zselect_stmtrE  r   matched_rowsrI   rD  rK   r    s*   
!z,BulkUDCompileState._do_pre_synchronize_fetchNr   r   r8   r   r   r>   r   r>   r   r>   r   r>   rE   r>   )r   r   r   r$   r   r   r   r  r  r  r*  r0  r8  r  r  r=  rA  r  rI   rI   rI   rK   r   \  s<    
w
+
$
0
&

/



r   r  insertc                      sv   e Zd ZU G dd deZdZded< edd Zed ddZ	ed! fddZ
edd Zdd Zdd Z  ZS )"BulkORMInsertc                   @  sV   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 )z$BulkORMInsert.default_insert_optionsr   r*   r   Fr>   _render_nulls_return_defaultsNr   r   Tr   _populate_existing)
r   r   r   r   r   rL  rM  r   r   rN  rI   rI   rI   rK   default_insert_optionsp  s   
 rO  NzOptional[FromStatement]r   c           	      C  s
  t jdh d||j\}}||d< z|jd }W n ty$   J dw |r3|j|d< |d|ji7 }|sL|jd	krA|d
di7 }n|jdkrKt	dn|jd	krW|d
di7 }|jdkrh|sbt
j}n|t
j}|sq|jrq|  |d|ji}|t|d|ifS )N_sa_orm_insert_options>   r   r   Zpopulate_existingr  r   Fr  r8   r   r   r   r  rr   r  rawr   )rK  rO  r	  r   r   r
  r8   r   r  r  r   Z_orm_load_exec_optionsr   r   r  r   r  )	r   ry   r   rk   rC   r   r  insert_optionsr   rI   rI   rK   r  z  sX   






z"BulkORMInsert.orm_pre_session_execry   r0   r   
dml.Insertrk   r5   rC   r+   r   r.   rl   r3   rE   _result.Resultc              
   C  s:  | d| j}|jdvrtd|jdkr"|j||pi |d}|S |jdkrb|j}	|jd ur:|	jr:t	d|	 |	d us@J |j
d usGJ t|	tdt|trS|gn||j
d	|j|j||d
}n|jdkrr|j||pmi |d}nt t|js||S |jr| dtj}
|
ddi7 }
|d|
i}| ||||||S )NrP  )rQ  rr   r  r   zHValid strategies for ORM insert strategy are 'raw', 'orm', 'bulk', 'autorQ  )rC   rr   z`bulk INSERT with a 'post values' clause (typically upsert) not supported for multi-table mapper Iterable[Dict[str, Any]]F)r=   r?   r@   rA   rC   r  r   rN  T)r   rO  r   r  r  rG  r   Z_post_values_clauseZ_multiple_persistence_tablesr  _transactionrL   r   r   rR   rM  rL  AssertionErrorr>   r   rN  r   r   r   r   )r   ry   r   rk   rC   r   rl   rR  r   r8   r   rI   rI   rK   orm_execute_statement  sx   








z#BulkORMInsert.orm_execute_statementc                   s   t tt j||fi |}|d ur|j }nd}|s|S |jd }|jdd}|dkr4|| |S |dkr>|	|| |S )NTr   r   rQ  rr   r  )
r   rK  superr   stackr   r   r   _setup_for_bulk_insert_setup_for_orm_insert)r   r   r   kwr   toplevelr8   r   	__class__rI   rK   r     s"   


z"BulkORMInsert.create_for_statementc                   s    dd  fdd|  D D S )Nc                 S  s&   i | ]\}}}|d ur|j n||qS rH   re   )rT   colr   r   rI   rI   rK   r   0  s    z<BulkORMInsert._resolved_keys_as_col_keys.<locals>.<dictcomp>c                 3  s&    | ]\}} j |||fV  qd S rH   )r   r   r   rb   rI   rK   ro   2  s    
z;BulkORMInsert._resolved_keys_as_col_keys.<locals>.<genexpr>)r~   )r   r8   Zresolved_value_dictrI   rb   rK   _resolved_keys_as_col_keys.  s
   
z(BulkORMInsert._resolved_keys_as_col_keysc                 C  s0   t tj| j }}| j||||dd}|| _d S )NFr   r   )r   r   Insertr   r   )r   r   r8   r   r   rI   rI   rK   r\  7  s   
z#BulkORMInsert._setup_for_orm_insertc                   s   t tj| j }}|j}|d |d  }| } |_| jr, fdd| j D | _| j	||||dd}| j
durE| j
jjrEt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().

        Z_emit_insert_tableZ_emit_insert_mapperc                       i | ]\}}|j  u r||qS rI   r`   rT   ra  valZemit_insert_tablerI   rK   r   W  
    
z8BulkORMInsert._setup_for_bulk_insert.<locals>.<dictcomp>Trc  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   rd  r   r   _cloner`   _dict_parametersr~   r   r   r   r   r  CompileError)r   r   r   r   anZemit_insert_mapperrI   ri  rK   r[  C  s2   

	
z$BulkORMInsert._setup_for_bulk_insert)ry   r0   r   rS  rk   r5   rC   r+   r   r.   rl   r3   rE   rT  )rE   rK  )r   r   r   r$   rO  r   r   r   r  rX  r   rb  r\  r[  __classcell__rI   rI   r_  rK   rK  n  s   
 
CX
rK  updatec                      s   e Zd Zedd Zdd Zdd Zed, fddZedddddd-d"d#Zed$d% Z	ed&d' Z
ed(d) Zed*d+ Z  ZS ).BulkORMUpdatec                 K  s   |  | }|jdd}|j }|r|dkr||| |S |dks,|dkr9d|jjvr9tj|||fi | |S |r?|dv rE||| |S )Nr   unspecifiedrr   r  r   )r  rr  )	__new__r   r   rZ  _setup_for_bulk_updater`   r'   __init___setup_for_orm_update)r   r   r   r]  r   r   r^  rI   rI   rK   r   t  s    

z"BulkORMUpdate.create_for_statementc                 K  sH  |}|j  }|jjd }|j | _}| ||| _| j||||d |jr+t| j| _|	 }|j
|_|jr;| j|_n|jrB| j|_| | j|}	|	rP|j|	 }tj| ||fi | d}
|sbd }n|jdd }|jdd }|dur|dko| j|j|| jd}|dkr|rd}
|jt|j
j }|r| j|||||
d	}|| _d S )
Nr   r^  Zprocess_criteria_for_toplevelFr  r   r  )r   Trc  )rZ  r`   r   r8   r=  r   _init_global_attributesr<  rR   rk  r   r;  r  r  wherer'   ru  r   r   r   r   r?   r   r   r   r   )r   r   r   r]  r   r^  r   r8   new_stmtnew_critr   r  r   rI   rI   rK   rv    sl   




z#BulkORMUpdate._setup_for_orm_updatec                   s   t tj|}|j}|d |d  }| } |_tj| ||fi | | jr,t	
d| jr< fd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().

        Z_emit_update_tableZ_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                   re  rI   rf  rg  Zemit_update_tablerI   rK   r   
  rj  z8BulkORMUpdate._setup_for_bulk_update.<locals>.<dictcomp>N)r   r   ZUpdater   rk  r`   r'   ru  r;  r  r  rl  r~   r   )r   r   r   r]  rn  _rI   r|  rK   rt    s"   

z$BulkORMUpdate._setup_for_bulk_updatery   r0   r   
dml.Updaterk   r5   rC   r+   r   r.   rl   r3   rE   rT  c              	     s   | d| j}|jdvrtd|jdkr_|j }|jdks!J |jr.|jdkr.td|j}	|	d us7J |j	d us>J t
|	tdt|trJ|gn||j	d	d	||d
}
| ||||||
S t ||||||S )Nr   )r  r   rr   r  zOValid strategies for ORM UPDATE strategy are 'orm', 'auto', 'bulk', 'core_only'rr   r  r  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.rU  F)r=   r   r   r   )r   r   r   r  r  r3  r   r  r   rV  r   r   r   rR   r  rY  rX  )r   ry   r   rk   rC   r   rl   r  r   r8   r   r_  rI   rK   rX    s^   



	z#BulkORMUpdate.orm_execute_statementFr   r   r   r8   r   r   r>   r   r   r   c                C  sL   |j o|jj}|sdS |r|jS |r|jS |r$|js$t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)Zupdate_returningr   implicit_returningZupdate_executemany_returningZupdate_returning_multifromr  rm  r   r   r   r8   r   r   r   r   Znormal_answerrI   rI   rK   r   ]  s   
zBulkORMUpdate.can_use_returningc                   s   |sd S |j }dd |jD }|j}|D ]X | fdd|D |j}||}	|	s,qt |}
|	j}|	j	
|
}|D ]}||v rJ | ||< q>|	jj|	d | |	|t| |

||}|rl|	|| qd S )Nc                 S  rZ   rI   re   )rT   proprI   rI   rK   rV     r[   zDBulkORMUpdate._do_post_synchronize_bulk_evaluate.<locals>.<listcomp>c                 3  r#  rH   rI   rw   paramrI   rK   ro     r&  zCBulkORMUpdate._do_post_synchronize_bulk_evaluate.<locals>.<genexpr>)r   r   identity_mapidentity_key_from_primary_keyr   Zfast_get_stater   
differencerR   
unmodifiedr   managerdispatchrefresh_commitr   _expire_attributes)r   ry   rk   r   r  r8   Zpk_keysr  identity_keyrU   evaluated_keysrX   to_evaluaterf   	to_expirerI   r  rK   r    s:   

z0BulkORMUpdate._do_post_synchronize_bulk_evaluatec                 C  s0   |  ||j }| |||dd |D  d S )Nc                 S  s   g | ]\}}}}|||fqS rI   rI   )rT   r+  rU   rX   r}  rI   rI   rK   rV     s    z?BulkORMUpdate._do_post_synchronize_evaluate.<locals>.<listcomp>)r0  r  
all_states#_apply_update_set_values_to_objects)r   ry   r   r   r  matched_objectsrI   rI   rK   r    s   z+BulkORMUpdate._do_post_synchronize_evaluatec           	        s   j |j}|r| |}fdd|D }nj} fddfdddd |D D D }|s5d S |  |dd |D  d S )Nc                      g | ]
}t | jf qS rI   r   r   rT   r%  r  rI   rK   rV         z<BulkORMUpdate._do_post_synchronize_fetch.<locals>.<listcomp>c                   s    g | ]}| j v r j | qS rI   )r  )rT   r  )ry   rI   rK   rV     s
    
c                   s6   g | ]\}}j d u s|j kr jt||dqS )Nr,  )r   r  r   )rT   r   r   )target_mapperr  rI   rK   rV     s    

c                 S  s    g | ]}|d d |d fqS )r   rI   r  rI   rI   rK   rV     s    c                 S  s"   g | ]}|t |t |fqS rI   )r   instance_stateinstance_dict)rT   r+  rI   rI   rK   rV     s    )r   returned_defaults_rowsr*  r   r  )	r   ry   r   r   r  r  pk_rowsrH  ZobjsrI   )ry   r  r  rK   r    s6   

z(BulkORMUpdate._do_post_synchronize_fetchc              	   C  s.  |j }|j}t|}| ||}| ||}	i }
|	D ]\}}z|tt	j
|}W n
 tjy5   Y qw ||
|< qt|
 }dd |	D }t }|D ]B\}}}|j|}|D ]}||v rh|
| |||< qZ|jj|d| ||t| |||}|r||| || qM|| dS )zeapply values to objects derived from an update statement, e.g.
        UPDATE..SET <values>

        c                 S  s   h | ]\}}|qS rI   rI   r   rI   rI   rK   	<setcomp>  rY   zDBulkORMUpdate._apply_update_set_values_to_objects.<locals>.<setcomp>N)r   r   r   r2  r=  rA  r4  r   r   r   r   r9  r   r   r   r  r   r  r  r  r  r  r  addZ_register_altered)r   ry   r  r   r  r8   r5  r6  r?  Zresolved_keys_as_propnamesZvalue_evaluatorsrf   valueZ
_evaluatorr  attribr   r+  rU   rX   r  r  rI   rI   rK   r    sB   

z1BulkORMUpdate._apply_update_set_values_to_objects)ry   r0   r   r~  rk   r5   rC   r+   r   r.   rl   r3   rE   rT  rI  )r   r   r   r   r   rv  rt  rX  r   r  r  r  r  ro  rI   rI   r_  rK   rq  r  s*    
b$K$
*

3rq  deletec                      s`   e Zd Zedd Zed$ fddZedddddd%ddZed d! Zed"d# Z  Z	S )&BulkORMDeletec                 K  sX  |  | }|jdd}|dks|dkr'd|jjvr'tj|||fi | |S |j }|}|jjd }|j |_}	|j||||d |	 }
|	j
|
_| |j|	}|rX|
j| }
tj||
|fi | d}|sjd }n|jdd }|jdd }|dur|d	ko|j|j|	|j|jd
dd}|rd}|
j|
jj }
|r|j|||
|	|d}
|
|_|S )Nr   rr  r  r   rw  Fr  r   r  r   )r   r   Trc  )rs  r   r   r`   r%   ru  rZ  r8   rx  rk  r   r  r  ry  r   r   r   r?   r   r   r   )r   r   r   r]  r   r   r^  r   r   r8   rz  r{  r   r  r   rI   rI   rK   r   (  sx   

z"BulkORMDelete.create_for_statementry   r0   r   
dml.Deleterk   r5   rC   r+   r   r.   rl   r3   rE   rT  c                   sL   | d| j}|jdkrtd|jdvrtdt ||||||S )Nr   rr   zBulk ORM DELETE not supported right now. Statement may be invoked at the Core level using session.connection().execute(stmt, parameters))r  r   r  zGValid strategies for ORM DELETE strategy are 'orm', 'auto', 'core_only')r   r   r   r  r  r  rY  rX  )r   ry   r   rk   rC   r   rl   r  r_  rI   rK   rX    s   


z#BulkORMDelete.orm_execute_statementFr   r   r   r8   r   r   r>   r   r   r   c                C  sB   |j o|jj}|sdS |r|jS |r|jst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)Zdelete_returningr   r  Zdelete_returning_multifromr  rm  r   r  rI   rI   rK   r     s   
zBulkORMDelete.can_use_returningc                 C  s^   |  ||j }g }|D ]\}}}	}
|
r||	|jj q|| q|r-|| d S d S rH   )r0  r  r  Z_expireZ	_modifiedr-  _remove_newly_deleted)r   ry   r   r   r  r  Z	to_deleter}  rU   rX   Zis_partially_expiredrI   rI   rK   r    s   z+BulkORMDelete._do_post_synchronize_evaluatec                   s    j }|j}|r| ||} fdd|D }n j}|D ]&}	|	dd }
|	d }|jt|
|d}||jv rC|t	|j| g qd S )Nc                   r  rI   r  r  r  rI   rK   rV     r  z<BulkORMDelete._do_post_synchronize_fetch.<locals>.<listcomp>r   r  r,  )
r   r  r*  r   r  r   r  r  r   r  )r   ry   r   r   r  r  r  r  rH  r%  r   r   r  rI   r  rK   r    s4   

z(BulkORMDelete._do_post_synchronize_fetch)ry   r0   r   r  rk   r5   rC   r+   r   r.   rl   r3   rE   rT  rI  )
r   r   r   r   r   rX  r   r  r  ro  rI   rI   r_  rK   r  &  s    
Y(
r  )..)r8   r9   r:   r;   r<   r1   r=   r>   r?   r>   r@   r>   rA   rB   rC   rD   rE   rF   )r8   r9   r:   r;   r<   r1   r=   r>   r?   r>   r@   r>   rA   rN   rC   rD   rE   rO   )NN)r8   r9   r:   r;   r<   r1   r=   r>   r?   r>   r@   r>   rA   rN   rC   rD   rE   rP   ).T)r8   r   r:   r;   r<   r1   r=   r>   r   r>   r   rB   r   r>   rE   rF   )r8   r   r:   r;   r<   r1   r=   r>   r   r>   r   r   r   r>   rE   r   r1  )r8   r   r:   r;   r<   r1   r=   r>   r   r>   r   r   r   r>   rE   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   r  r   Zenginer   r   r   sqlr   r   r   r   r    r!   Zsql.baser"   r#   r$   Zsql.dmlr%   r&   r'   r(   Zutil.typingr)   Z_typingr*   r+   r,   r8   r-   ry   r.   r/   r0   r1   rU   r2   r3   r4   Zengine.interfacesr5   objectr6   rL   r   r|   r   r   Z
plugin_forrK  rq  r  rI   rI   rI   rK   <module>   s   	 [ s    
  
   
6