o
    Šåg× ã                   @  s|  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	d8d8d9œdodJdK„ƒZFe	d8d8d9œdpdNdK„ƒZFdOdOd9œdqdQdK„ZFe	d8dRdSœdrdXdY„ƒZGe	d8dRdSœdsd\dY„ƒZGdOdRdSœdtd^dY„ZGd_d`„ ZHG dadb„ dbeƒZIG dcdd„ ddeIƒZJe* Kdedf¡G dgdh„ dheIe.ƒƒZLe* Kdedi¡G djdk„ dkeJe/ƒƒZMe* Kdedl¡G dmdn„ dneJe-ƒƒZNdOS )uzoadditional 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_transactionr1   ÚisstatesÚboolÚreturn_defaultsÚrender_nullsr8   úLiteral[None]r9   ú$Optional[OrmExecuteOptionsParameter]ÚreturnÚNonec                C  ó   d S ©N© ©r:   r<   r>   r?   rA   rB   r8   r9   rI   rI   ú[/var/www/html/flaskapp/venv/lib/python3.10/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ƒ‚|r1trtttt  ˆƒ‰|r)dd„ ˆD ƒ}	dd„ |	D ƒ‰n(dd„ ˆD ƒ‰n tr>ttt	t
tf  ˆƒ‰|rEtˆƒ‰ndd„ ˆD ƒ‰tˆˆƒ | |¡‰ d }
‡fdd„|j ¡ D ƒ}|rid}nt|ƒd	krrd}nd
}|D ]W\}}|d ur‰‡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Á|}
qv|jrÍ|sÈJ ‚|
 |¡}
qv|ró|róˆj}dd„ ˆjD ƒ}|	D ]\}‰|t‡fdd„|D ƒƒd f|_qß|d urÿ|
d usýJ ‚|
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 _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©r:   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   Ú
state_dictÚparamsra   ÚconnÚvalue_paramsÚhas_all_pksÚhas_all_defaults©Ú
connectionr:   rI   rK   Ú	<genexpr>À   s*   € ïø
ÿz_bulk_insert.<locals>.<genexpr>c                 3  s   � | ]	}d |ˆˆ fV  qd S rH   rI   ©rT   Úmappingrq   rI   rK   rs   Ö   s   € )ÚbulkrA   rB   Úinclude_bulk_keys)Úbookkeepingr8   r9   c                 S  rZ   rI   re   )rT   ÚprI   rI   rK   rV   ñ   r[   c                   s   g | ]}ˆ | ‘qS rI   rI   ©rT   rf   )rX   rI   rK   rV   õ   rY   )Úbase_mapperÚsessionÚconnection_callableÚNotImplementedErrorr	   r   r   r2   r6   r   Ústrr   ÚlistÚ_expand_compositesrr   Ú_sorted_tablesÚitemsÚlenÚ_get_embedded_bindparamsr   Ú_collect_insert_commandsÚ_emit_insert_statementsÚ
_returningÚreturns_rowsÚsplice_horizontallyÚ_identity_classÚ_identity_key_propsÚtuplerf   )r:   r<   r>   r?   rA   rB   r8   r9   r{   ÚstatesÚreturn_resultÚmappers_to_runrx   r`   Úsuper_mapperÚextra_bp_namesÚrecordsr   Úidentity_clsÚidentity_propsrU   rI   )rr   rX   r:   r<   rK   rL   f   s”   ÿ



þ
ûþù
úìø

€ýþT)Úuse_orm_update_stmtÚenable_check_rowcountúMapper[Any]Úupdate_changed_onlyr–   r—   c                C  rG   rH   rI   ©r:   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r•t ¡ S d S )Nc                   s   ‡‡ fdd„ˆ j  ¡ D ƒS )Nc                   s(   i | ]\}}|ˆj v s|ˆ v r||“qS rI   )Úcommitted_state©rT   ÚkÚv)Úsearch_keysrU   rI   rK   Ú
<dictcomp>)  s
    þz7_bulk_update.<locals>._changed_dict.<locals>.<dictcomp>)rR   rƒ   )r:   rU   )r¤   )rU   rK   Ú_changed_dict(  s   þz#_bulk_update.<locals>._changed_dictc                   s   g | ]}ˆ ˆ|ƒ‘qS rI   rI   rS   )r¦   r:   rI   rK   rV   1  rW   z _bulk_update.<locals>.<listcomp>c                 S  rZ   rI   rQ   rS   rI   rI   rK   rV   3  r[   c                 S  r\   rI   rQ   r]   rI   rI   rK   rV   5  rY   zJconnection_callable / per-instance sharding not supported in bulk_update()c                   rc   rd   re   rg   ri   rI   rK   rV   C  rj   rI   c                 3  s0   � | ]}d |ˆˆ ˆj r|ˆj j nd fV  qd S rH   )Ú_version_id_proprf   rt   rq   rI   rK   rs   S  s   € öÿø
ÿz_bulk_update.<locals>.<genexpr>T)rv   r–   rw   F)rx   r–   r—   )r{   Ú_primary_key_propkeysr§   rf   Úunionr�   r|   r}   r~   rr   r…   r‚   rƒ   Úisar_   r   Ú_collect_update_commandsÚ_emit_update_statementsÚ_resultÚnull_result)r:   r<   r>   r?   r™   r–   r—   r{   r’   r`   r‘   r“   rI   )r¦   rr   r:   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   )Ú)_populate_composite_bulk_save_mappings_fnrz   ©Úcomposite_attrsrI   rK   r¥   z  s    ÿÿz&_expand_composites.<locals>.<dictcomp>)Ú
compositesÚsetÚkeysÚintersection)r:   r<   Úcomposite_keysÚ
populatorsru   rf   rI   r°   rK   r�   t  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_Ú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ÚattrrI   rI   rK   Ú_get_orm_crud_kv_pairs‡  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Ï   r:   rƒ   )rT   Ú
value_dict©rÇ   rÐ   rÈ   rI   rK   rV   È  s    ûÿÿÿz8ORMDMLState._get_multi_crud_kv_pairs.<locals>.<listcomp>)Ú_propagate_attrsr:   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Ó   r:   r'   r¿   r€   rÏ   )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Æ   r:   Úis_aliased_classrÖ   Úclass_Ú__name__rÙ   Úlocal_table)rÇ   rÈ   Úext_infor:   Ú_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    ÿ)Ú_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)Ú_adapt_on_namesrI   c                 S  s   g | ]}|d ur|‘qS rH   rI   rè   rI   rI   rK   rV   8  s    z4ORMDMLState._setup_orm_returning.<locals>.<listcomp>Úsupplemental_cols)rˆ   r   r9   Ú_execution_optionsÚoptionsÚ_with_optionsÚselect_statementr   Úcreate_for_statementr¹   Ú!setup_dml_returning_compile_stateÚ	_generateÚprimary_columnsÚextendÚprimary_keyrA   Ú	returning)	ÚselfÚcompilerÚorm_level_statementÚdml_level_statementÚ
dml_mapperrë   ÚfsÚfscÚcols_to_returnrI   rI   rK   Ú_setup_orm_returning  s8   ý
ÿ
ôóüÿz ORMDMLState._setup_orm_returningc              	   C  sV   |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   Ú	instances)rÇ   r|   rÈ   rl   r9   Úbind_argumentsr   Úexecution_contextr  Úload_optionsÚquerycontextrI   rI   rK   Ú_return_orm_returningV  s*   
ÿþÿø
z!ORMDMLState._return_orm_returning)rÜ   Ú
__module__Ú__qualname__Úis_dml_returningr¹   Ú__annotations__ÚclassmethodrÏ   rÔ   r¿   rà   rê   r  r  rI   rI   rI   rK   r¸   ƒ  s"   
 
7



!ù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                   @  s~   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 )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Ú_populate_existing)rÜ   r  r  r  r  r  r  r  r  r  r  r(   Ú_resolved_valuesÚ_eval_conditionÚ_matched_rowsÚ_identity_tokenr  rI   rI   rI   rK   Údefault_update_options{  s   
 r"  F©Úis_multitableÚis_update_fromÚis_delete_usingÚis_executemanyÚdialectr   r:   r˜   r$  r@   r%  r&  r'  rE   c                C  s   t ƒ ‚rH   )r~   )rÇ   r(  r:   r$  r%  r&  r'  rI   rI   rK   Úcan_use_returning‰  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r…t 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>   Ú	autoflushÚdml_strategyÚidentity_tokenr%  r&  Úpopulate_existingÚsynchronize_sessionÚclauserÐ   Fú0statement had 'orm' plugin but no plugin_subjectr:   r  rÕ   r  Ú	core_onlyr  Úormrv   úHCan't use "bulk" ORM insert strategy without passing separate parameters)r  ÚevaluateÚfetchFzSValid strategies for session synchronization are 'auto', 'evaluate', 'fetch', Falser6  zkThe 'fetch' synchronization strategy is not available for 'bulk' ORM updates (i.e. multiple parameter sets)r5  r  )r/  r&  r%  r,  r)  )r  r"  Úfrom_execution_optionsrî   rÓ   ÚKeyErrorr:   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Ç   r|   rÈ   rl   r9   r	  Úis_pre_eventÚupdate_optionsrÐ   ÚsyncrI   rI   rK   Úorm_pre_session_exec–  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*  r3  r5  r6  rv   )r  r  Ú_do_post_synchronize_evaluateÚ_do_post_synchronize_fetchÚ"_do_post_synchronize_bulk_evaluater  )rÇ   r|   rÈ   rl   r9   r	  r   rB  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   NÚadditional_entity_criteriac                 3  s*   � | ]}|j s|jˆ u r| ˆ ¡V  qd S rH   )Úinclude_aliasesrÙ   Ú_resolve_where_criteria)rT   Úae)rÞ   rI   rK   rs   P  s   € û
üûz@BulkUDCompileState._adjust_for_extra_criteria.<locals>.<genexpr>c                 3  s   � | ]}ˆ   |¡V  qd S rH   )Útraverse)rT   Úcrit)ÚadapterrI   rK   rs   \  s   € )rÚ   Ú_adapterr:   r�   Ú_single_table_criterion)rÇ   Úglobal_attributesrÞ   Úreturn_critrI   )rO  rÞ   rK   Ú_adjust_for_extra_criteria;  s"   þýÿ
þz-BulkUDCompileState._adjust_for_extra_criteriac                   sX   z|j |jj ur| |j j¡‰ n| |j¡‰ W n ty"   g  Y S w ‡ fd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                   s   g | ]}ˆ |ƒ‘qS rI   rI   ©rT   Úrow©Úpk_keysrI   rK   rV   �  rY   z@BulkUDCompileState._interpret_returning_rows.<locals>.<listcomp>)rÝ   r{   Ú_tuple_getterr÷   r8  )rÇ   r   r:   ÚrowsrI   rW  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   )r:   rª   ÚexpiredÚobjrR   rS   rb   rI   rK   rV   ˆ  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   Ú_EXPIRED_OBJECTÚappend)
rÇ   rB  rŽ   Úeval_conditionÚraw_datar   r]  rU   rX   Úevaled_conditionrI   )r-  r:   rK   Ú _get_matched_objects_on_criteriaƒ  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ð   Ú_is_criteria_optionÚget_global_criteriarT  Úprocess)rÇ   rB  rÈ   r:   Ú
target_clsÚevaluator_compilerrN  rR  Úoptra  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.

        r5  )r  r  r  r6  )rm  r   ÚUnevaluatableErrorr>  )rÇ   r|   rÈ   rl   r9   r	  rB  ra  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  )rm  r   rn  r9  r:  )	rÇ   r|   rÈ   rl   r9   r	  rB  ra  Ú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   )Ú_multi_valuesÚ_ordered_valuesr€   Ú_valuesrƒ   )rÇ   r:   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   ÚColumnElementÚ_columntopropertyÚorm_excÚUnmappedColumnErrorr`  rf   r9  r:  )rÇ   r:   Ú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'tz‚For synchronize_session='fetch', can't use multiple parameter sets in ORM mode, which this backend does not support with RETURNINGrI   )r|   Úget_bindr	  r)  r(  r  r  r'  r9  r:  r­   r®   )r{  ÚbindÚper_bind_result©r)  rÇ   r:   rB  rI   rK   Úskip_for_returningP  s,   ûÿÿ
ÿzHBulkUDCompileState._do_pre_synchronize_fetch.<locals>.skip_for_returning)r9   r	  Ú
_add_event)r   r  )r{  r/   rE   r   )
r  r    r÷   Úselect_identity_tokenÚselect_fromrï   rð   rf  ÚexecuteÚfetchall)rÇ   r|   rÈ   rl   r9   r	  rB  Úselect_stmtr€  r   Úmatched_rowsrI   r  rK   r>  .  s*   
þÿ!ûþz,BulkUDCompileState._do_pre_synchronize_fetchN©r(  r   r:   r˜   r$  r@   r%  r@   r&  r@   r'  r@   rE   r@   )rÜ   r  r  r$   r"  r  r)  rD  rH  rT  r[  rd  rm  r<  r=  rs  rz  r>  rI   rI   rI   rK   r  z  s<    ø
x
+
$
"
&

/



r  r3  Ú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  r  )
rÜ   r  r  r  r  r‹  rŒ  r  r  r  rI   rI   rI   rK   Údefault_insert_options‚  s   
 r�  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,  rB   r.  r0  rÐ   Fr1  r:   r  r  r  r3  rv   r4  Úrawr,  )rŠ  r�  r7  rî   rÓ   r8  r:   r  r9  r:  r   Ú_orm_load_exec_optionsr©   r  r?  r   r@  )	rÇ   r|   rÈ   rl   r9   r	  rA  Úinsert_optionsrÐ   rI   rI   rK   rD  Œ  sX   üýÿ


ÿÿ

ÿ
ÿ
ÿþz"BulkORMInsert.orm_pre_session_execr|   r0   rÈ   ú
dml.Insertrl   r5   r9   r+   r	  r.   rm   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 )NrŽ  )r�  rv   r3  r  zHValid strategies for ORM insert strategy are 'raw', 'orm', 'bulk', 'autor�  )r9   rv   z`bulk INSERT with a 'post values' clause (typically upsert) not supported for multi-table mapper úIterable[Dict[str, Any]]F)r?   rA   rB   r8   r9   r3  r  r  T)rá   r�  r  r9  r;  r„  r  Ú_post_values_clauseÚ_multiple_persistence_tablesr:  Ú_transactionrL   r   rÂ   rR   rŒ  r‹  ÚAssertionErrorr@   rˆ   r  r   r  r©   r  )rÇ   r|   rÈ   rl   r9   r	  rm   r‘  r   r:   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,  r�  rv   r3  )
r   rŠ  Úsuperrò   ÚstackrÓ   rÆ   rá   Ú_setup_for_bulk_insertÚ_setup_for_orm_insert)rÇ   rÈ   rú   Úkwrù   Útoplevelr:   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¥   B  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   rs   D  s   € 
ÿz;BulkORMInsert._resolved_keys_as_col_keys.<locals>.<genexpr>)rƒ   )rÇ   r:   Ú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ú   r:   rÈ   rû   rI   rI   rK   r�  I  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 )	zÑestablish 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 r||“qS rI   ©r`   ©rT   r¢  Úval©Úemit_insert_tablerI   rK   r¥   i  ó
    
þz8BulkORMInsert._setup_for_bulk_insert.<locals>.<dictcomp>Tr¥  NzˆCan'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Æ   Ú_cloner`   Ú_dict_parametersrƒ   r  r¹   r  r  r9  ÚCompileError)rù   rú   rÈ   rû   ÚanÚemit_insert_mapperrI   r­  rK   rœ  U  s2   þ
þû
	ÿÿ
z$BulkORMInsert._setup_for_bulk_insert)r|   r0   rÈ   r’  rl   r5   r9   r+   r	  r.   rm   r3   rE   r“  )rE   rŠ  )rÜ   r  r  r$   r�  rñ   r  r  rD  r™  rò   r¤  r�  rœ  Ú__classcell__rI   rI   r   rK   rŠ  €  s   
 
CX
rŠ  Ú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,  Úunspecifiedrv   r2  rÕ   )r3  r¸  )	Ú__new__rÆ   rá   r›  Ú_setup_for_bulk_updater`   r'   Ú__init__Ú_setup_for_orm_update)rÇ   rÈ   rú   rž  rù   r,  rŸ  rI   rI   rK   rò   †  s    
ÿ
øýz"BulkORMUpdate.create_for_statementc                 K  sT  |}|j  }|jjd }|j | _}|  ||¡| _| j||||d� |jr+t| jƒ| _| 	¡ }|jjd |u r;|j
|_|jrC| j|_n|jrJ| 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d�}|dkr™|r™d}
|j|jjŽ }|r¥| j|||||
d	�}|| _d S )
NrÕ   ©rŸ  Úprocess_criteria_for_toplevelFr/  r)  r6  )r$  Tr¥  )r›  r`   rÆ   r:   rs  r  Ú_init_global_attributesrr  rR   r°  rÝ   rq  rT  rR  Úwherer'   r»  rá   r)  r(  r$  rA   r÷   r  rÈ   )rù   rÈ   rú   rž  rû   rŸ  rÞ   r:   Únew_stmtÚnew_critrë   r/  r)  rI   rI   rK   r¼  �  sj   ü
ÿ
ÿÿ
ÿþû
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 )zÑestablish 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_mapperzšbulk 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                   r©  rI   rª  r«  ©Úemit_update_tablerI   rK   r¥     r¯  z8BulkORMUpdate._setup_for_bulk_update.<locals>.<dictcomp>N)r   r   ÚUpdaterÆ   r°  r`   r'   r»  rq  r9  r:  r±  rƒ   rÈ   )rù   rÈ   rú   rž  r³  Ú_rI   rÅ  rK   rº  ÿ  s"   þÿ
þ
z$BulkORMUpdate._setup_for_bulk_updater|   r0   rÈ   ú
dml.Updaterl   r5   r9   r+   r	  r.   rm   r3   rE   r“  c              	     s  |  d| j¡}|jr|  dtj¡}|ddi7 }| d|i¡}|jdvr(t d¡‚|jdkrv|j	 }	|j
dks8J ‚|j	rE|j
d	krEt d
¡‚|j}
|
d usNJ ‚|jd usUJ ‚t|
tdt|tƒra|gn|ƒ|jdd||	d�}|  ||||||¡S tƒ  ||||||¡S )Nr*  r  r  T)r3  r  rv   r2  zOValid strategies for ORM UPDATE strategy are 'orm', 'auto', 'bulk', 'core_only'rv   r6  r5  zÑbulk 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"  r  r   r  r©   r  r9  r;  rf  r  r:  r  r—  r›   r   rÂ   rR   rH  rš  r™  )rÇ   r|   rÈ   rl   r9   r	  rm   rB  r  r—   r:   r   r   rI   rK   r™  #  sn   ÿÿÿ
ÿ
ÿ
ÿþöú	úz#BulkORMUpdate.orm_execute_statementFr#  r(  r   r:   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)Úupdate_returningrÝ   Úimplicit_returningÚupdate_executemany_returningÚupdate_returning_multifromr9  r²  rÖ   ©rÇ   r(  r:   r$  r%  r&  r'  Únormal_answerrI   rI   rK   r)  y  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  s   � | ]}ˆ | V  qd S rH   rI   rz   ©ÚparamrI   rK   rs   ¬  s   € zCBulkORMUpdate._do_post_synchronize_bulk_evaluate.<locals>.<genexpr>)r  rŒ   Úidentity_mapÚidentity_key_from_primary_keyr!  Úfast_get_stater³   Ú
differencerR   Ú
unmodifiedrµ   ÚmanagerÚdispatchÚrefreshÚ_commitr€   Ú_expire_attributes)rÇ   r|   rl   r   rB  r:   rX  rÔ  Úidentity_keyrU   Úevaluated_keysrX   Úto_evaluaterf   Ú	to_expirerI   rÒ  rK   rG  ž  s:   þ
€
ÿ€ãz0BulkORMUpdate._do_post_synchronize_bulk_evaluatec              
   C  sF   |   ||j ¡ ¡}|  ||||jjd dd„ |D ƒ| ¡ | ¡ ¡ d S )Nr   c                 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>)rd  rÔ  Ú
all_statesÚ#_apply_update_set_values_to_objectsr   Úcompiled_parametersÚprefetch_colsÚpostfetch_cols)rÇ   r|   rÈ   r   rB  Úmatched_objectsrI   rI   rK   rE  É  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 ƒ}|s6d S |  ˆ ˆ||jjd dd„ |D ƒ| ¡ | ¡ ¡ d S )Nc                   ó   g | ]
}t |ƒˆ jf ‘qS rI   ©r�   r!  rU  ©rB  rI   rK   rV   ç  ó    ÿÿz<BulkORMUpdate._do_post_synchronize_fetch.<locals>.<listcomp>c                   s    g | ]}|ˆ j v rˆ j | ‘qS rI   )rÔ  )rT   rÞ  )r|   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_mapperrB  rI   rK   rV   ð  s    

øþc                 S  s    g | ]}|d d… |d f‘qS )r   éÿÿÿÿrI   rU  rI   rI   rK   rV   õ  s    ÿr   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   rä  rå  ræ  )	rÇ   r|   rÈ   r   rB  rð  Úpk_rowsr‡  ÚobjsrI   )r|   rì  rB  rK   rF  Ü  s<   ÿ
þ
ÿûþ
úòz(BulkORMUpdate._do_post_synchronize_fetchc              	     s”  |j ‰ˆj}t |¡}	|  ˆ|¡}
|  ˆ|
¡}i }|D ]\}}z|	 t t	j
|¡¡}W n
 tjy5   Y qw |||< qt| ¡ ƒ‰dd„ |D ƒ}tƒ }‡ ‡‡fdd„|D ƒ}‡fdd„|D ƒ ˆ¡}‡fdd„|D ƒ}|D ]U\}}}| ‡ fdd„|D ƒ¡ | |j|¡ |j ˆ¡}|D ]}||v r›|| |ƒ||< q�|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>5  rY   zDBulkORMUpdate._apply_update_set_values_to_objects.<locals>.<setcomp>c                   s.   h | ]}|j ˆ v r|ˆjv r|j ˆvr|’qS rI   )rf   ru  rè   ©Úeffective_paramsrß  r:   rI   rK   ró  9  s    


üc                   s"   h | ]}|ˆ j v rˆ j | j’qS rI   ©ru  rf   rè   rb   rI   rK   ró  @  s
    

þc                   s   g | ]}ˆ j | j|jf‘qS rI   rö  rè   rb   rI   rK   rV   F  s    ÿzEBulkORMUpdate._apply_update_set_values_to_objects.<locals>.<listcomp>c                   s   i | ]	\}}|ˆ | “qS rI   rI   )rT   Úcol_to_propÚc_key)rõ  rI   rK   r¥   M  s    ÿÿzEBulkORMUpdate._apply_update_set_values_to_objects.<locals>.<dictcomp>N)r  rÛ   r   re  rs  rz  ri  r   rÀ   r   rÃ   rn  r€   r´   r³   r×  r¶  rÝ  rR   rØ  rµ   rÙ  rÚ  rÛ  rÜ  ÚaddÚ_register_altered)rÇ   r|   rB  rÈ   rõ  rç  rå  ræ  rj  rk  rx  Úresolved_keys_as_propnamesÚvalue_evaluatorsrf   ÚvalueÚ
_evaluatorÚattribrŽ   Úto_prefetchrá  Úprefetch_transferr]  rU   rX   rà  rI   rô  rK   rã    sd   
ÿÿÿ
þ
þü
ÿ
þÿ€z1BulkORMUpdate._apply_update_set_values_to_objects)r|   r0   rÈ   rÉ  rl   r5   r9   r+   r	  r.   rm   r3   rE   r“  rˆ  )rÜ   r  r  r  rò   r¼  rº  r™  r)  rG  rE  rF  rã  rµ  rI   rI   r   rK   r·  „  s*    
b$Uø$
*

5r·  Ú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  sh  |   | ¡}|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d |	u rR|	j
|
_|  |j|	¡}|r`|
j|Ž }
tj||
|fi |¤Ž d}|srd }n|j dd ¡}|j dd ¡}|dur˜|d	ko—|j|j|	|j|j d
d¡d�}|r£d}|
j|
jjŽ }
|r¯|j|||
|	|d�}
|
|_|S )Nr,  r¸  r2  rÕ   r½  Fr/  r)  r6  r&  )r$  r&  Tr¥  )r¹  rÆ   rá   r`   r%   r»  r›  r:   r¿  r°  rÝ   rT  rR  rÀ  r)  r(  r$  rA   r÷   r  rÈ   )rÇ   rÈ   rú   rž  rù   r,  rŸ  rû   rÞ   r:   rÁ  rÂ  rë   r/  r)  rI   rI   rK   rò   m  sz   
ÿüÿ
ÿÿÿüþûz"BulkORMDelete.create_for_statementr|   r0   rÈ   ú
dml.Deleterl   r5   r9   r+   r	  r.   rm   r3   rE   r“  c                   sL   |  d| j¡}|jdkrt d¡‚|jdvrt d¡‚tƒ  ||||||¡S )Nr*  rv   zˆBulk ORM DELETE not supported right now. Statement may be invoked at the Core level using session.connection().execute(stmt, parameters))r3  r  r2  zGValid strategies for ORM DELETE strategy are 'orm', 'auto', 'core_only')rá   r"  r  r9  r:  r;  rš  r™  )rÇ   r|   rÈ   rl   r9   r	  rm   rB  r   rI   rK   r™  É  s   
ÿ
ÿ
ÿÿz#BulkORMDelete.orm_execute_statementFr#  r(  r   r:   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)Údelete_returningrÝ   rÌ  Údelete_returning_multifromr9  r²  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   )rd  rÔ  râ  Ú_expireÚ	_modifiedr`  Ú_remove_newly_deleted)rÇ   r|   rÈ   r   rB  rç  Ú	to_deleterÈ  rU   rX   Úis_partially_expiredrI   rI   rK   rE    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 rD| t 	|j| ¡g¡ qd S )Nc                   rè  rI   ré  rU  rê  rI   rK   rV   3  rë  z<BulkORMDelete._do_post_synchronize_fetch.<locals>.<listcomp>r   rí  r^  )
r  rð  r[  r   rÕ  r€   rÔ  r	  r   rî  )rÇ   r|   rÈ   r   rB  rì  rð  rñ  r‡  rV  r÷   r-  rÞ  rI   rê  rK   rF  &  s4   ÿ
þþ
ÿÿÿ€õz(BulkORMDelete._do_post_synchronize_fetch)r|   r0   rÈ   r  rl   r5   r9   r+   r	  r.   rm   r3   rE   r“  rˆ  )
rÜ   r  r  r  rò   r™  r)  rE  rF  rµ  rI   rI   r   rK   r  k  s    
[ø(
r  )r:   r;   r<   r=   r>   r1   r?   r@   rA   r@   rB   r@   r8   rC   r9   rD   rE   rF   )r:   r;   r<   r=   r>   r1   r?   r@   rA   r@   rB   r@   r8   rN   r9   rD   rE   rO   )r:   r;   r<   r=   r>   r1   r?   r@   rA   r@   rB   r@   r8   rN   r9   rD   rE   rP   )r:   r˜   r<   r=   r>   r1   r?   r@   r™   r@   r–   rC   r—   r@   rE   rF   )r:   r˜   r<   r=   r>   r1   r?   r@   r™   r@   r–   r�   r—   r@   rE   rž   )r:   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   rv  r   r   Úbaser   r   r   r   r   r9  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.   r/   r0   r1   rU   r2   r3   r4   Úengine.interfacesr5   Úobjectr6   rL   r›   r�   r¸   r  Ú
plugin_forrŠ  r·  r  rI   rI   rI   rK   Ú<module>   sÀ   		÷	÷÷ øøø\ x    

  
   
i