U
    ÌZjI ã                   @   sž  d Z ddlmZ ddlmZ ddlZddlmZ ddlmZ ddlmZ	 dd	lm
Z
 dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ d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!„ Z(d"d#„ Z)d\d%d&„Z*d'd(„ Z+d)d*„ Z,d+d,„ Z-d-d.„ Z.d/d0„ Z/d]d1d2„Z0d^d3d4„Z1d5d6„ Z2d7d8„ Z3d_d:d;„Z4d`d<d=„Z5d>d?„ Z6d@dA„ Z7dBdC„ Z8dDdE„ Z9dFdG„ Z:dHdI„ Z;dJdK„ Z<dLdM„ Z=e >¡ Z?G dNdO„ dOeƒZ@G dPdQ„ dQƒZAe BdRdS¡G dTdU„ dUeAe"ƒƒZCe BdRdV¡G dWdX„ dXeAe#e@ƒƒZDe BdRdY¡G dZd[„ d[eAe!e@ƒƒZEdS )azëprivate module containing functions used to emit INSERT, UPDATE
and DELETE statements on behalf of a :class:`_orm.Mapper` and its descending
mappers.

The functions here are called only by the unit of work functions
in unitofwork.py.

é    )Úchain)ÚgroupbyNé   )Ú
attributes)Ú	evaluator)Úexc)Úloading)Úsync)ÚNO_VALUE)Ú	state_stré   )Úfuture)Úsql)Úutil)Úresult)Ú	coercions)Ú
expression)Ú	operators)Úroles)Úselect)Úsqltypes)Ú_entity_namespace_key)ÚCompileState)ÚOptions)ÚDeleteDMLState)ÚInsertDMLState)ÚUpdateDMLState)ÚBooleanClauseList)ÚLABEL_STYLE_TABLENAME_PLUS_COLc              	      s  ˆj }|jjrtdƒ‚|rL|r<dd„ |D ƒ}dd„ |D ƒ}qTdd„ |D ƒ}nt|ƒ}| |¡‰ |j ¡ D ]Z\}}	ˆ |	¡s|qh‡ ‡fdd„t	|‡ ‡fdd„|D ƒd	||d
�D ƒ}
t
|d |	||
|d� qh|�r|�rˆj}dd„ ˆjD ƒ}|D ]$\}‰|t‡fdd„|D ƒƒf|_qêd S )NzJconnection_callable / per-instance sharding not supported in bulk_insert()c                 S   s   g | ]}||j f‘qS © ©Údict©Ú.0Ústater   r   ú]/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/sqlalchemy/orm/persistence.pyÚ
<listcomp>C   s     z _bulk_insert.<locals>.<listcomp>c                 S   s   g | ]\}}|‘qS r   r   )r#   r$   Údict_r   r   r%   r&   D   s     c                 S   s   g | ]
}|j ‘qS r   r    r"   r   r   r%   r&   F   s     c           	   	   3   s2   | ]*\}}}}}}}}d ||ˆˆ |||fV  qd S ©Nr   )	r#   r$   Ú
state_dictÚparamsÚmpÚconnÚvalue_paramsÚhas_all_pksÚhas_all_defaults©Ú
connectionÚmapperr   r%   Ú	<genexpr>O   s$   ïøz_bulk_insert.<locals>.<genexpr>c                 3   s   | ]}d |ˆˆ fV  qd S r(   r   ©r#   Úmappingr0   r   r%   r3   e   s     T)ÚbulkÚreturn_defaultsÚrender_nulls©Úbookkeepingc                 S   s   g | ]
}|j ‘qS r   ©Úkey©r#   Úpr   r   r%   r&   v   s     c                    s   g | ]}ˆ | ‘qS r   r   )r#   r<   )r'   r   r%   r&   z   s     )Úbase_mapperÚsessionÚconnection_callableÚNotImplementedErrorÚlistr1   Ú_sorted_tablesÚitemsÚisaÚ_collect_insert_commandsÚ_emit_insert_statementsZ_identity_classZ_identity_key_propsÚtupler<   )r2   ÚmappingsÚsession_transactionÚisstatesr7   r8   r?   ÚstatesÚtableÚsuper_mapperÚrecordsZidentity_clsZidentity_propsr$   r   )r1   r'   r2   r%   Ú_bulk_insert1   sN    ÿ

ûìú	þrQ   c           	   	      sÖ   ˆj }ˆj‰ˆjr"ˆjjh ˆ¡‰‡fdd„‰ |r\|rL‡ ‡fdd„|D ƒ}qddd„ |D ƒ}nt|ƒ}|jjrttdƒ‚| 	|¡‰|j
 ¡ D ]H\}}ˆ |¡sœqˆtd |‡‡fdd„|D ƒd	d
�}t|d |||dd� qˆd S )Nc                    s   t ‡‡ fdd„ˆ j  ¡ D ƒƒS )Nc                 3   s,   | ]$\}}|ˆj ks|ˆ kr||fV  qd S r(   )Úcommitted_state©r#   ÚkÚv)Úsearch_keysr$   r   r%   r3   ˆ   s   
 þz6_bulk_update.<locals>._changed_dict.<locals>.<genexpr>)r!   rE   )r2   r$   )rV   ©r$   r%   Ú_changed_dict‡   s    þz#_bulk_update.<locals>._changed_dictc                    s   g | ]}ˆ ˆ|ƒ‘qS r   r   r"   )rX   r2   r   r%   r&   �   s     z _bulk_update.<locals>.<listcomp>c                 S   s   g | ]
}|j ‘qS r   r    r"   r   r   r%   r&   ’   s     zJconnection_callable / per-instance sharding not supported in bulk_update()c                 3   s.   | ]&}d |ˆˆ ˆj r |ˆj j nd fV  qd S r(   )Ú_version_id_propr<   r4   r0   r   r%   r3   ¥   s   öÿøz_bulk_update.<locals>.<genexpr>T)r6   Fr9   )r?   Z_primary_key_propkeysrY   r<   ÚunionrC   r@   rA   rB   r1   rD   rE   rF   Ú_collect_update_commandsÚ_emit_update_statements)	r2   rJ   rK   rL   Zupdate_changed_onlyr?   rN   rO   rP   r   )rX   r1   r2   rV   r%   Ú_bulk_update~   sD    ÿ

ôïúr]   Fc                 C   s  |s0| j s0t| |ƒD ]}t| |g|dd� qdS g }g }t| ||ƒD ]B\}}}}	}
}}|
s^|rt| ||||	|f¡ qD| ||||	f¡ qD| j ¡ D ]J\}}||jkr¦q’t||ƒ}t	|||ƒ}t
| ||||ƒ t| ||||ƒ q’t| |tdd„ |D ƒdd„ |D ƒƒƒ dS )a;  Issue ``INSERT`` and/or ``UPDATE`` statements for a list
    of objects.

    This is called within the context of a UOWTransaction during a
    flush operation, given a list of states to be flushed.  The
    base mapper in an inheritance hierarchy handles the inserts/
    updates for all descendant mappers.

    T)ÚsingleNc                 s   s$   | ]\}}}}||||d fV  qdS )FNr   )r#   r$   r)   r2   r1   r   r   r%   r3     s   
ÿzsave_obj.<locals>.<genexpr>c                 s   s&   | ]\}}}}}||||d fV  qdS )TNr   )r#   r$   r)   r2   r1   Úupdate_version_idr   r   r%   r3     s   ú)ÚbatchÚ_sort_statesÚsave_objÚ_organize_states_for_saveÚappendrD   rE   Ú_pks_by_tablerG   r[   r\   rH   Ú _finalize_insert_update_commandsr   )r?   rM   Úuowtransactionr^   r$   Ústates_to_updateÚstates_to_insertr'   r2   r1   Úhas_identityÚ
row_switchr_   rN   ÚinsertÚupdater   r   r%   rb   À   sn    


øÿ

  ÿûûþøûýrb   c                    sh   t t| ||ƒƒ}| j ¡ D ]H\‰‰ ˆˆ jkr.q‡ ‡fdd„|D ƒ}t| |ˆ||ƒ}t| |ˆ ˆ|ƒ qdS )z\Issue UPDATE statements on behalf of a relationship() which
    specifies post_update.

    c              
   3   sH   | ]@\}}}}ˆ|j kr||||ˆ jd k	r:ˆ  ||ˆ j¡nd fV  qd S r(   )re   Úversion_id_colÚ#_get_committed_state_attr_by_column)r#   r$   r)   Z
sub_mapperr1   ©r2   rN   r   r%   r3   !  s   

õý  ÿ÷zpost_update.<locals>.<genexpr>N)rC   Ú _organize_states_for_post_updaterD   rE   re   Ú_collect_post_update_commandsÚ_emit_post_update_statements)r?   rM   rg   Úpost_update_colsrh   rm   r   rp   r%   Úpost_update  s.    
ÿ
ô    ÿûru   c                 C   s–   t t| ||ƒƒ}| j}tt | ¡ ƒƒD ]F}|| }||jkr@q&n|jrN|jrNq&t| |||ƒ}t	| ||||ƒ q&|D ]\}}	}}
}|j
 ||
|¡ qrdS )z‘Issue ``DELETE`` statements for a list of objects.

    This is called within the context of a UOWTransaction during a
    flush operation.

    N)rC   Ú_organize_states_for_deleterD   ÚreversedÚkeysre   ZinheritsZpassive_deletesÚ_collect_delete_commandsÚ_emit_delete_statementsÚdispatchZafter_delete)r?   rM   rg   Ústates_to_deleteZtable_to_mapperrN   r2   Údeleter$   r)   r1   r_   r   r   r%   Ú
delete_obj>  s>    
ÿ
   ÿûúr~   c                 c   sJ  t | ||ƒD �]6\}}}}t|jƒ}|jp2| |¡}d }	}
|sR|j |||¡ n|j |||¡ |jrv| |||¡ |sô||jj	krô|jj	| }t
 |¡}| |¡sô| |¡sÎt dt|ƒ|t|ƒf ¡ n&|  d|t|ƒt|ƒ¡ | |¡ |}	|sþ|	�r0|jdk	�r0| |	�r|	n||	�r&|	jn||j¡}
||||||	|
fV  qdS )aT  Make an initial pass across a set of states for INSERT or
    UPDATE.

    This includes splitting out into distinct lists for
    each, calling before_insert/before_update, obtaining
    key information for each state including its dictionary,
    mapper, the connection to use for the execution per state,
    and the identity flag.

    NzJNew instance %s with identity key %s conflicts with persistent instance %szPdetected row switch for identity %s.  will update %s, remove %s from transaction)Ú_connections_for_statesÚboolr<   Ú_identity_key_from_stater{   Zbefore_insertZbefore_updateZ_validate_polymorphic_identityr@   Úidentity_mapr   Úinstance_stateZwas_already_deletedÚ
is_deletedr   Úwarnr   Z
_log_debugZremove_state_actionsrn   ro   r!   )r?   rM   rg   r$   r'   r2   r1   rj   Zinstance_keyrk   r_   ÚinstanceÚexistingr   r   r%   rc   i  s`      ÿ
ÿ
þ


þÿú

ýùrc   c                 C   s   t | ||ƒS )z÷Make an initial pass across a set of states for UPDATE
    corresponding to post_update.

    This includes obtaining key information for each state
    including its dictionary, mapper, the connection to use for
    the execution per state.

    )r   )r?   rM   rg   r   r   r%   rq   º  s    	rq   c                 c   s^   t | ||ƒD ]L\}}}}|j |||¡ |jdk	rD| |||j¡}nd}|||||fV  qdS )zôMake an initial pass across a set of states for DELETE.

    This includes calling out before_delete and obtaining
    key information for each state including its dictionary,
    mapper, the connection to use for the execution per state.

    N)r   r{   Zbefore_deletern   ro   )r?   rM   rg   r$   r'   r2   r1   r_   r   r   r%   rv   Æ  s      ÿ
  ÿrv   c              	   c   s„  |D �]x\}}}}| |j krqi }	i }
|j|  }|j|  }t|ƒ |¡D ]l}|| }|| }|dkrt||krt|stqHqH|sªt|dƒsŽt|tjƒrªt|dƒr | 	¡ n||
|< qH||	|j
< qH|sè|j|   |	¡ dd„ |
D ƒ¡D ]}d|	|< qÚ|rò|�r$|j|   |	¡}|jj�r|j|   |	¡}nd}nd }}|jdk	�rh|jdk	�rh|j|j|  k�rh| d¡|	|jj
< |||	|||
||fV  qdS )zSIdentify sets of values to use in INSERT statements for a
    list of states.

    NÚ__clause_element__c                 S   s   g | ]
}|j ‘qS r   r;   ©r#   Úcr   r   r%   r&     s     z,_collect_insert_commands.<locals>.<listcomp>TF)re   Ú_propkey_to_colZ_insert_cols_evaluating_noneÚsetÚintersectionÚhasattrÚ
isinstancer   ÚClauseElementrˆ   r<   Z_insert_cols_as_noneÚ
differenceZ_pk_keys_by_tableÚissubsetr?   Úeager_defaultsZ_server_default_colsÚversion_id_generatorrn   Ú_cols_by_table)rN   ri   r6   r7   r8   r$   r)   r2   r1   r*   r-   Úpropkey_to_colZ	eval_noneÚpropkeyÚvalueÚcolZcolkeyr.   r/   r   r   r%   rG   Þ  sp    


ÿ
þÿ
ý
ÿþÿ



ÿÿþýÿørG   c                 #   sf  |D �]Z\}‰}}}||j kr q|j | }i }	|j| ‰ |rpt‡ ‡fdd„tˆ ƒ ˆ¡ |j| ¡D ƒƒ}
d}n¤i }
tˆ ƒ |j¡D ]n}ˆ| }ˆ | }t|dƒs®t	|t
jƒrÊt|dƒrÀ| ¡ n||	|< q„|j| j ||j| ¡dk	r„||
|j< q„|jj�r|j|  |
¡}nd}|dk	�rî|j|j| k�rî|�s~|
�s~|	�s~|j ¡ D ].}|j|j j |ˆtj¡}|j�rL �q~�qLq|j}|
 �o�|	 }||
|j< |�s®|j|
k�rÐ|jdk	�rÐ| |¡}||
|j< n|jdk�rü|�rü||
|j< n|
�sü|	�süqd}d}|�r4t‡ ‡fdd„tˆ ƒ |j| ¡D ƒƒ}nÌi }|D ]Â}|j| j}|j| j |ˆtj¡}|j�rÊ|j �r†d||f| jk�rªd}|jd	 ||j< |
 !|jd¡ n|j d	 ||j< ||	k�rÚd}n|j"d	 ||j< ||j dk�r<t# $d
||f ¡‚�q<|
�s|	�r.|
 %|¡ |ˆ|
|||	||fV  q|r|j&| D ]"\}}t' (|||||| |j)¡ �q<qdS )at  Identify sets of values to use in UPDATE statements for a
    list of states.

    This function works intricately with the history system
    to determine exactly what values should be updated
    as well as how the row should be matched within an UPDATE
    statement.  Includes some tricky scenarios where the primary
    key of an object might have been changed.

    c                 3   s    | ]}ˆ | j ˆ| fV  qd S r(   r;   ©r#   r—   ©r–   r)   r   r%   r3   X  s   ÿz+_collect_update_commands.<locals>.<genexpr>Trˆ   NFc                 3   s"   | ]}ˆ | j ˆ |¡fV  qd S r(   )Ú_labelÚgetrš   r›   r   r%   r3   ¬  s   ÿZpk_cascadedr   zCCan't update table %s using NULL for primary key value on column %s)*re   r‹   r!   rŒ   r�   r‘   Z_pk_attr_keys_by_tablerR   rŽ   r�   r   r�   rˆ   ÚmanagerÚimplZis_equalr<   r?   r“   Z_server_onupdate_default_colsr’   rn   r•   Ú_columntopropertyÚvaluesÚget_historyr   ÚPASSIVE_NO_INITIALIZEÚaddedrœ   r”   ÚPASSIVE_OFFZdeletedÚpopZ	unchangedÚorm_excÚ
FlushErrorrm   Ú_table_to_equatedr	   ÚpopulateÚpassive_updates)rg   rN   rh   r6   r$   r2   r1   r_   Úpksr-   r*   r/   r—   r˜   r™   ÚpropÚhistoryZ	no_paramsÚvalr.   Zexpect_pk_cascadedZ	pk_paramsÚmÚequated_pairsr   r›   r%   r[   6  s   ú


ÿþþÿ ÿÿ
ý ÿýÿ
ÿþÿþ  ÿ

ÿÿþ
ÿþ
  ÿÿÿþ
ÿÿ
ø
ùr[   c                 c   s,  |D �] \}}}}}	|j | }
i }d}|j| D ]|}||
krX|j|||tjd�||j< q0||ksj|jdk	r0|j| }|j|j	 j
 ||tj¡}|jr0|jd }|||j	< d}q0|r|	dk	�r|j|j| k�r|j}|	||j< t|j	ƒ�r|j	|k�r|jdk	�r| |	¡}|||j	< |||||fV  qdS )zrIdentify sets of values to use in UPDATE statements for a
    list of states within a post_update operation.

    F)ZpassiveNr   T)re   r•   Z_get_state_attr_by_columnr   r¥   rœ   Zonupdater    rž   r<   rŸ   r¢   r£   r¤   rn   r€   r”   )r?   rg   rN   rh   rt   r$   r)   r2   r1   r_   r¬   r*   Zhasdatar™   r­   r®   r˜   r¯   r   r   r%   rr   ï  sZ    ú
   ÿ
  ÿ

ÿþ
ÿþý

rr   c                 c   s˜   |D ]Ž\}}}}}||j krqi }	|j | D ]6}
| |||
¡ |	|
j< }|dkr,t d||
f ¡‚q,|dk	rˆ|j|j| krˆ||	|jj< |	|fV  qdS )zSIdentify values to use in DELETE statements for a list of
    states to be deleted.NzHCan't delete from table %s using NULL for primary key value on column %s)re   ro   r<   r§   r¨   rn   r•   )r?   rg   rN   r|   r$   r)   r2   r1   r_   r*   r™   r˜   r   r   r%   ry   '  s@    ú
  ÿþÿþÿÿþry   Tc                    s¬  ˆ j dk	oˆ j ˆ jˆ k‰d| ji}‡ ‡‡fdd„}|  dˆf|¡}t|dd„ ƒD �]R\\}	}
}}}}d}t|ƒ}|}d	}|sŒ| ¡ }d
}n8|rª|sªˆ jjrª| ¡ }d
}nˆ j dk	rÄ| ˆ j ¡}d
}|sÐ|	j	j
n|	j	j}|oâ|	j	j}|oìˆ }|�r`|D ]b\}}}‰ }	}}}|	j| |¡||d�}|�rLtˆ |ˆ||||jjd |d
|jƒ
 ||j7 }|}qø�n |�sÌ|}|D ]Z\}}}‰ }	}}}|	j|||d�}|�r¼tˆ |ˆ||||jjd |d
|jƒ
 ||j7 }�qnn”dd„ |D ƒ}|�pð|�oðt|ƒdk}|	j|||d�}||j7 }|D ]N\}}}‰ }	}}}|�rtˆ |ˆ||||jjd |d
|jj�sV|jndƒ
 �q|�r�|t|ƒk�r¦t dˆjt|ƒ|f ¡‚qRˆrRt d|j	j ¡ qRdS )z`Emit UPDATE statements corresponding to value lists collected
    by _collect_update_commands().NÚcompiled_cachec                     st   t  tj¡} ˆ jˆ D ]"}| j |tj|j	|j
d�k¡ qˆrb| j ˆ jtjˆ jj	ˆ jj
d�k¡ ˆ ¡  | ¡}|S ©N)Útype_)r   Ú_construct_rawr   Úand_re   Úclausesrd   r   Ú	bindparamrœ   Útypern   rm   Úwhere©r·   r™   Ústmt©r2   Zneeds_version_idrN   r   r%   Úupdate_stmt`  s     ÿþÿÿz,_emit_update_statements.<locals>.update_stmtrm   c                 S   s*   | d t | d ƒt| d ƒ| d | d fS ©Né   r   é   é   é   ©rŒ   r€   ©Úrecr   r   r%   Ú<lambda>{  s    

ûz)_emit_update_statements.<locals>.<lambda>r   FT©Úexecution_optionsc                 S   s   g | ]}|d  ‘qS ©r   r   ©r#   rÆ   r   r   r%   r&   ã  s     z+_emit_update_statements.<locals>.<listcomp>r   úMUPDATE statement on table '%s' expected to update %d row(s); %d were matched.úMDialect %s does not support updated rowcount - versioning cannot be verified.)rn   r•   Ú_compiled_cacheÚ_memor   rC   r7   r?   r“   ÚdialectÚsupports_sane_rowcountÚ supports_sane_rowcount_returningÚsupports_sane_multi_rowcountÚ_execute_20r¡   Ú
_postfetchÚcontextÚcompiled_parametersÚreturned_defaultsÚrowcountÚlenÚexecutemanyr§   ÚStaleDataErrorÚdescriptionr   r…   Údialect_description)r?   rg   r2   rN   rm   r:   rÉ   r¾   Úcached_stmtr1   Z	paramkeysÚhasvaluer/   r.   rP   ÚrowsÚ	statementr7   Úassert_singlerowÚassert_multirowÚallow_multirowr$   r)   r*   r-   rŠ   Úcheck_rowcountÚmultiparamsr   r½   r%   r\   N  s*   
þ
þýÿþý
ÿ
ýþ

÷ý
ö


÷  ÿ
öÿ  ÿ
÷
ÿ
ôþÿþÿr\   c                  C   s\  |   d|f|j¡}d| ji}t|dd„ ƒD �]*\\}}	}
}}}|}|r`|sX| jrX|jjsî|rî|
sît|ƒ}dd„ |D ƒ}|j|||d�}|rìt	||j
jƒD ]R\\}}}}}}}}}|rÞt||||||||d|j
jsÖ|jnd	ƒ
 q˜t|||ƒ q˜q*t|ƒ}|
�s|jj�rt|ƒd
k�rd}nd}|�s6| j�r6| ¡ }n,|jd	k	�rP| |j¡}n|�rb|j|jŽ }|�rTdd„ |D ƒ}|j|||d�}|�rVt ||j
j|j|j�p¦d¡D ]¦\\}}}}}}}}}}}|d	k�rÞt d| ¡‚t	||j| ƒD ]0\}}|j| }| |j¡d	k�rî|||j< �qî|�rBt||||||||d|ƒ
 nt|||ƒ �qªq*|D ]ü\}}}}}}}}|�rŠ|j| |¡||d�}n|j|||d�}|j }|d	k�rºt d|f ¡‚t	||j| ƒD ]:\}}|j| }||k�sø| |j¡d	k�rÊ|||j< �qÊ|�rX|�rFt|||||||j
jd |d|j
j�s>|jnd	ƒ
 nt|||ƒ �qXq*d	S )z`Emit INSERT statements corresponding to value lists collected
    by _collect_insert_commands().rl   r²   c                 S   s*   | d t | d ƒt| d ƒ| d | d fS r¿   rÄ   rÅ   r   r   r%   rÇ   -  s    

ûz)_emit_insert_statements.<locals>.<lambda>c                 S   s   g | ]}|d  ‘qS rÊ   r   rË   r   r   r%   r&   G  s     z+_emit_insert_statements.<locals>.<listcomp>rÈ   FNr   Tc                 S   s   g | ]}|d  ‘qS rÊ   r   rË   r   r   r%   r&   ‚  s     r   zÈMulti-row INSERT statement for %s did not produce the correct number of INSERTed rows for RETURNING.  Ensure there are no triggers or special driver issues preventing INSERT from functioning properly.z¾Single-row INSERT statement for %s did not produce a new primary key result being invoked.  Ensure there are no triggers or special driver issues preventing INSERT from functioning properly.r   )!rÏ   rl   rÎ   r   r“   rÐ   Zimplicit_returningrC   rÔ   ÚziprÖ   r×   rÕ   rÛ   rØ   Ú_postfetch_bulk_saveZinsert_executemany_returningrÚ   r7   rn   Úprimary_keyr   Úzip_longestZinserted_primary_key_rowsZreturned_defaults_rowsr§   r¨   re   r    r�   r<   r¡   Úinserted_primary_key) r?   rg   r2   rN   rl   r:   rß   rÉ   r1   Zpkeysrà   r.   r/   rP   râ   rç   rŠ   r$   r)   r*   Ú
mapper_recr,   r-   Zlast_inserted_paramsZdo_executemanyrì   rØ   Úpkr™   r­   r   rê   r   r   r%   rH     sl   
þýÿýüûùø  ÿôÿôÿþ
ý
  ÿ
üò
ûÿ	þ
ö÷ýý
ûÿ ÿ
ÿþ
ÿ
ôrH   c                    s²  d| j i}ˆ jdk	o"ˆ jˆ jˆ k‰‡ ‡‡fdd„}|  dˆf|¡}t|dd„ ƒD �]X\}}	d}
t|	ƒ}	|d }ˆ jdkr‚|jjn|jj}|o”|jj	}ˆ pž|}|sô|}|	D ]D\}}}}}|j
|||d	�}t||ˆ||||jjd ƒ |
|j7 }
q¬nrd
d„ |	D ƒ}|�p|�ot|ƒdk}|j
|||d	�}|
|j7 }
|	D ],\}}}}}t||ˆ||||jjd ƒ �q8|�r–|
t|	ƒk�r¬t dˆjt|	ƒ|
f ¡‚qRˆrRt d|jj ¡ qRdS )zeEmit UPDATE statements corresponding to value lists collected
    by _collect_post_update_commands().r²   Nc                     sŠ   t  tj¡} ˆ jˆ D ]"}| j |tj|j	|j
d�k¡ qˆrb| j ˆ jtjˆ jj	ˆ jj
d�k¡ ˆ ¡  | ¡}ˆ jd k	r†| ˆ j¡}|S r³   )r   rµ   r   r¶   re   r·   rd   r   r¸   rœ   r¹   rn   rm   rº   r7   r»   r½   r   r%   r¾     s$    ÿþÿÿ
z1_emit_post_update_statements.<locals>.update_stmtru   c                 S   s   | d t | d ƒfS )Né   rÀ   )rŒ   rÅ   r   r   r%   rÇ   0  ó    z._emit_post_update_statements.<locals>.<lambda>r   rÈ   c                 S   s   g | ]\}}}}}|‘qS r   r   )r#   r$   r)   rí   r,   r*   r   r   r%   r&   U  s   ÿz0_emit_post_update_statements.<locals>.<listcomp>r   rÌ   rÍ   )rÎ   rn   r•   rÏ   r   rC   rÐ   rÑ   rÒ   rÓ   rÔ   Ú_postfetch_post_updaterÖ   r×   rÙ   rÚ   r§   rÜ   rÝ   r   r…   rÞ   )r?   rg   r2   rN   rm   rÉ   r¾   râ   r<   rP   rá   r1   rã   rä   rå   ræ   r$   r)   rí   r*   rŠ   rç   r   r½   r%   rs     s”    

þþÿ
ýþ
  ÿ
ù	þÿ  ÿ

ù
þÿþÿrs   c                    s`  ˆ j dk	oˆ j ˆ jˆ k‰‡ ‡‡fdd„}|  dˆf|¡}t|dd„ ƒD �]\}}dd„ |D ƒ}	d	| ji}
t|	ƒ}d
}d}ˆrÜ|jjsÜ|jjr¸d}|	D ]}|j	|||
d�}||j
7 }q–qút d|jj ¡ |j	||	|
d� n|j	||	|
d�}ˆsôd}|j
}| jrH|d
krH||krH|jj�s&t|	ƒdkrH|�rDt dˆj||f ¡ qHt dˆj||f ¡‚qHdS )z`Emit DELETE statements corresponding to value lists collected
    by _collect_delete_commands().Nc                     sp   t  tj¡} ˆ jˆ D ]"}| j |tj|j	|j
d�k¡ qˆrb| j ˆ jtjˆ jj	ˆ jj
d�k¡ ˆ ¡  | ¡S r³   )r   rµ   r   r¶   re   r·   rd   r   r¸   r<   r¹   rn   r}   rº   )r·   r™   ©r2   Zneed_version_idrN   r   r%   Údelete_stmt‰  s    ÿ ÿÿÿz,_emit_delete_statements.<locals>.delete_stmtr}   c                 S   s   | d S )Nr   r   rÅ   r   r   r%   rÇ   œ  rð   z)_emit_delete_statements.<locals>.<lambda>c                 S   s   g | ]\}}|‘qS r   r   )r#   r*   r1   r   r   r%   r&   �  s     z+_emit_delete_statements.<locals>.<listcomp>r²   éÿÿÿÿFr   rÈ   zMDialect %s does not support deleted rowcount - versioning cannot be verified.Tr   z­DELETE statement on table '%s' expected to delete %d row(s); %d were matched.  Please set confirm_deleted_rows=False within the mapper configuration to prevent this warning.)rn   r•   rÏ   r   rÎ   rÚ   rÐ   rÓ   rÑ   rÔ   rÙ   r   r…   rÞ   Zconfirm_deleted_rowsrÝ   r§   rÜ   )r?   rg   r2   rN   r}   ró   râ   r1   ZrecsZdel_objectsrÉ   ÚexpectedZrows_matchedZ	only_warnr*   rŠ   r   rò   r%   rz   ~  s~    
þ
ÿþ  ÿþÿ  ÿ  ÿÿþýû
ú
üÿ
üÿrz   c           
         s(  |D �]\‰ }}}}|j rFˆ  ‡ fdd„|j D ƒ¡}|rFˆ  ˆ j|¡ g }| jrd| ˆ j |j¡¡ |j	dk	r–|j
dkr–|jjˆ jkr–| |jjg¡ |rÎ|  ˆ ¡ˆ _t |¡ t¡}	tj|j|	ˆ jˆ |d� |sä|j ||ˆ ¡ n|j ||ˆ ¡ |j
dkr|j	dk	r||jj dkrt d¡‚qdS )zzfinalize state on states that have been inserted or updated,
    including calling after_insert/after_update events.

    c                    sB   g | ]:}|j r |jr8|jˆ jks8|j s|js|jˆ jkr|j‘qS r   )Zexpire_on_flushÚdeferredr<   r!   r=   rW   r   r%   r&   ë  s    ÷z4_finalize_insert_update_commands.<locals>.<listcomp>NF)Zrefresh_stateZonly_load_propsz2Instance does not contain a non-NULL version value)Z_readonly_propsZunmodified_intersectionÚ_expire_attributesr!   r“   ÚextendZ_unloaded_non_objectr�   Z&_server_default_plus_onupdate_propkeysrn   r”   rY   r<   Zunloadedr�   r   r   Zset_label_styler   r   Zload_on_identr@   r{   Zafter_insertZafter_updater§   r¨   )
r?   rg   rM   r)   r2   r1   rj   ÚreadonlyZ
toload_nowr¼   r   rW   r%   rf   â  sZ    
þÿÿÿÿþ
ÿû	ÿþÿrf   c                    sê   |  |¡rd S |jjj}|jjj}ˆ jd k	rLˆ jˆ j| krLt|ƒˆ jg }tˆ j	j
jƒ}	|	rbg }
|D ]D}|j|krf|ˆ jkrf||j |ˆ j| j< |	rf|
 ˆ j| j¡ qf|	rÆ|
rÆˆ j	j
 |||
¡ |ræ| |j‡ fdd„|D ƒ¡ d S )Nc                    s"   g | ]}|ˆ j krˆ j | j‘qS r   ©r    r<   r‰   ©r2   r   r%   r&   M  s   
þz*_postfetch_post_update.<locals>.<listcomp>)r„   rÖ   ÚcompiledÚprefetchÚ	postfetchrn   r•   rC   r€   Úclass_managerr{   Úrefresh_flushr<   r    rd   r÷   r!   )r2   rg   rN   r$   r'   r   r*   Úprefetch_colsÚpostfetch_colsr   Úload_evt_attrsrŠ   r   rû   r%   rñ   ,  s<    


ÿþ  ÿ
þþrñ   c
              
      sœ  |j jj}
|j jj}|j jj‰ˆ jdk	rHˆ jˆ j| krHt|
ƒˆ jg }
tˆ j	j
jƒ}|r^g }ˆr¼|	}|dk	r¼t|ˆƒD ]B\}}|jr�|j jr�qxˆ j |¡}|rx|||j< |rx| |j¡ qx|
D ]D}|j|krÀ|ˆ jkrÀ||j |ˆ j| j< |rÀ| ˆ j| j¡ qÀ|�r$|�r$ˆ j	j
 |||¡ |�rH|�rH| ‡fdd„|D ƒ¡ |�rj| |j‡ fdd„|D ƒ¡ ˆ j| D ]"\}}t ||||||ˆ j¡ �qtdS )z†Expire attributes in need of newly persisted database state,
    after an INSERT or UPDATE statement has proceeded for that
    state.Nc                    s   g | ]}|j r|ˆ kr|‘qS r   )rê   )r#   r™   )Úreturning_colsr   r%   r&   –  s    þz_postfetch.<locals>.<listcomp>c                    s"   g | ]}|ˆ j krˆ j | j‘qS r   rú   r‰   rû   r   r%   r&      s   
þ)rÖ   rü   rý   rþ   Ú	returningrn   r•   rC   r€   rÿ   r{   r   rè   rê   Zisinsertr    r�   r<   rd   rø   r÷   r!   r©   r	   rª   r«   )r2   rg   rN   r$   r'   r   r*   r-   ZisupdaterØ   r  r  r   r  ÚrowZ	row_valuer™   r­   rŠ   r°   r±   r   )r2   r  r%   rÕ   U  sp    


ÿþ
  ÿ
þÿ
þþùrÕ   c                 C   s&   | j | D ]\}}t |||¡ q
d S r(   )r©   r	   Zbulk_populate_inherit_keys)r2   r'   rN   r°   r±   r   r   r%   ré   ¶  s    ré   c                 c   s`   |j jr|j j}n|j | ¡}d}t| |ƒD ].}|rB|| | ¡ ƒ}|jj}||j||fV  q,dS )zßReturn an iterator of (state, state.dict, mapper, connection).

    The states are sorted according to _sort_states, then paired
    with the connection they should be using for the given
    unit of work transaction.

    N)	r@   rA   Ztransactionr1   ra   Úobjrž   r2   r!   )r?   rg   rM   rA   r1   r$   r2   r   r   r%   r   »  s    
r   c              
   C   sˆ   t |ƒ}t dd„ |D ƒƒ}| |¡ zt|| jd�}W n: tk
rp } ztjt d| ¡|d� W 5 d }~X Y nX t|t	 
d¡d�| S )Nc                 s   s   | ]}|j d k	r|V  qd S r(   r;   )r#   Úsr   r   r%   r3   ×  s     
 z_sort_states.<locals>.<genexpr>r;   z^Could not sort objects by primary key; primary key values must be sortable in Python (was: %s))Zreplace_contextZinsert_order)rŒ   Údifference_updateÚsortedZ_persistent_sortkey_fnÚ	TypeErrorr   Úraise_Úsa_excÚInvalidRequestErrorÚoperatorÚ
attrgetter)r2   rM   ÚpendingÚ
persistentZpersistent_sortedÚerrr   r   r%   ra   Õ  s*    
 ÿ
ÿÿûÿÿra   c                   @   sp   e Zd ZG dd„ deƒ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                   @   s0   e Zd ZdZdZdZeZeZeZ	dZ
dZdZdS )z)BulkUDCompileState.default_update_optionsÚevaluateTN)Ú__name__Ú
__module__Ú__qualname__Ú_synchronize_sessionÚ
_autoflushÚ_subject_mapperÚ_EMPTY_DICTÚ_resolved_valuesÚ_resolved_keys_as_propnamesÚ_value_evaluatorsÚ_matched_objectsÚ_matched_rowsÚ_refresh_identity_tokenr   r   r   r%   Údefault_update_optionsð  s   r#  c           
      C   s
  |r||fS t j ddh||j¡\}}|j}|d k	rF|dkrFt d¡‚||d< z|jd }	W n  tk
r|   dsxt	dƒ‚Y nX |	j
|d	< |d
|	j
i7 }|jr¤| ¡  | d|ji¡}|jdkrÔ|  ||||||¡}n|jdkrò|  ||||||¡}|t |¡ d|i¡fS )NÚ_sa_orm_update_optionsÚsynchronize_session)r  ÚfetchFzKValid strategies for session synchronization are 'evaluate', 'fetch', FalseÚclauseÚplugin_subjectFú0statement had 'orm' plugin but no plugin_subjectr2   r  r  r&  )r  r#  Zfrom_execution_optionsZ_execution_optionsr  r  ÚArgumentErrorÚ_propagate_attrsÚKeyErrorÚAssertionErrorr2   r  Z	_annotateÚ_do_pre_synchronize_evaluateÚ_do_pre_synchronize_fetchr   ÚimmutabledictrZ   )
Úclsr@   râ   r*   rÉ   Úbind_argumentsÚis_reentrant_invokeÚupdate_optionsr	   r(  r   r   r%   Úorm_pre_session_execû  sh    
üýÿ
ÿ
ú
ú

ÿþz'BulkUDCompileState.orm_pre_session_execc                 C   s>   |d }|j dkr"|  |||¡ n|j dkr:|  |||¡ |S )Nr$  r  r&  )r  Ú_do_post_synchronize_evaluateÚ_do_post_synchronize_fetch)r1  r@   râ   r*   rÉ   r2  r   r4  r   r   r%   Úorm_setup_cursor_resultL  s    

z*BulkUDCompileState.orm_setup_cursor_resultc                    s~   d}ˆj rˆjnd‰ dˆjf|krF|t‡fdd„|dˆjf D ƒƒ7 }ˆjjdk	r`|ˆjjf7 }ˆ rzt‡ 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.

        r   NZadditional_entity_criteriac                 3   s(   | ] }|j s|jˆ kr| ˆ ¡V  qd S r(   )Zinclude_aliasesÚentityZ_resolve_where_criteria)r#   Zae)Úext_infor   r%   r3   |  s    
üz@BulkUDCompileState._adjust_for_extra_criteria.<locals>.<genexpr>c                 3   s   | ]}ˆ   |¡V  qd S r(   )Útraverse)r#   Úcrit)Úadapterr   r%   r3   ˆ  s     )Úis_aliased_classZ_adapterr2   rI   Z_single_table_criterion)r1  Úglobal_attributesr:  Zreturn_critr   )r=  r:  r%   Ú_adjust_for_extra_criteriag  s"    þýÿþ
z-BulkUDCompileState._adjust_for_extra_criteriac              
      st  ˆj ‰ˆj}t }}	znt |¡}
d}|jr4||j7 }i }|jD ]}|jr>| |¡ q>|rh||  	|ˆ¡7 }|rx|
j
|Ž ‰ ndd„ ‰ W n< tjk
r¾ } ztjt d| ¡|d� W 5 d }~X Y nX |jdkrÒ|j}n|}|jdk�rH|  ˆ|¡}i }|  ˆ|¡}	|	D ]D\}}z|
 
t tj|¡¡}W n tjk
�r:   Y n
X |||< �q‡ ‡‡fdd	„|j ¡ D ƒ}ˆ|||	d
œ S )Nr   c                 S   s   dS )NTr   )r  r   r   r%   Úeval_condition¯  s    zGBulkUDCompileState._do_pre_synchronize_evaluate.<locals>.eval_conditionz{Could not evaluate current criteria in Python: "%s". Specify 'fetch' or False for the synchronize_session execution option.)Zfrom_Úlambda_elementrm   c                    sH   g | ]@}|j  ˆ¡r|jsˆ | ¡ ƒrˆjd ks<|jˆjkr| ¡ ‘qS r(   )r2   rF   Zexpiredr  r"  Úidentity_tokenr"   ©rA  r2   r4  r   r%   r&   ×  s   
ÿözCBulkUDCompileState._do_pre_synchronize_evaluate.<locals>.<listcomp>)r   r  r  )r  Úclass_r  r   ÚEvaluatorCompilerÚ_where_criteriaÚ_with_optionsÚ_is_criteria_optionÚget_global_criteriar@  ÚprocessÚUnevaluatableErrorr   r  r  r  Ú__visit_name__Ú	_resolvedÚ_get_resolved_valuesr  r   Úexpectr   ÚExpressionElementRoler‚   Z
all_states)r1  r@   râ   r*   rÉ   r2  r4  Ú
target_clsÚvalue_evaluatorsÚresolved_keys_as_propnamesÚevaluator_compilerr<  r?  Úoptr  Úeffective_statementÚresolved_valuesr<   r˜   Ú
_evaluatorZmatched_objectsr   rD  r%   r.  Œ  st    



 ÿþÿú	
 ÿ ÿÿþýz/BulkUDCompileState._do_pre_synchronize_evaluatec                 C   s6   |j r
g S |jrt|jƒS |jr.t|j ¡ ƒS g S d S r(   )Z_multi_valuesÚ_ordered_valuesrC   Ú_valuesrE   )r1  r2   râ   r   r   r%   rO  ì  s    
z'BulkUDCompileState._get_resolved_valuesc              	   C   sž   g }|D ]�\}}t |tjƒr0| |j|f¡ qnt|dƒrB| ¡ }|rŠt |tjƒrŠz|j	| }W n t
jk
rv   Y q˜X | |j|f¡ qt d| ¡‚q|S )Nrˆ   zInvalid expression type: %r)r�   r   ZQueryableAttributerd   r<   rŽ   rˆ   r   ZColumnElementr    r§   ZUnmappedColumnErrorr  r  )r1  r2   rX  r¡   rT   rU   Úattrr   r   r%   r  ÷  s"    
ÿz.BulkUDCompileState._resolved_keys_as_propnamesc              	   C   s
  |j }t|j|jf Ž  |¡j|jŽ }|j|_dd„ }	|j|||||	d�}
|
 	¡ }t
}|jdkrh|j}n|}|jdkrö|j}t |¡}|  ||¡}|  ||¡}|  ||¡}i }|D ]@\}}z| t tj|¡¡}W n tjk
rè   Y q²X |||< q²nt
}||||dœ S )Nc                 S   s(   | j jf | jŽ}|jjr t ¡ S d S d S r(   )r@   Zget_bindr2  rÐ   Úfull_returningÚ_resultZnull_result)Zorm_contextÚbindr   r   r%   Úskip_for_full_returning!  s    zMBulkUDCompileState._do_pre_synchronize_fetch.<locals>.skip_for_full_returning)Z
_add_eventrB  rm   )r  r!  r  )r  r   rê   Zselect_identity_tokenÚselect_fromÚoptionsrH  rG  ÚexecuteZfetchallr  rM  rN  rE  r   rF  rO  r  rK  r   rP  r   rQ  rL  )r1  r@   râ   r*   rÉ   r2  r4  r2   Zselect_stmtr`  r   Úmatched_rowsrS  rW  rR  rU  rX  rT  r<   r˜   rY  r   r   r%   r/    sf    
ÿþÿû


 ÿ ÿ ÿÿýz,BulkUDCompileState._do_pre_synchronize_fetchN)r  r  r  r   r#  Úclassmethodr5  r8  r@  r.  rO  r  r/  r   r   r   r%   r  ï  s   
P

$
_


r  c                   @   s$   e Zd Zedd„ ƒZedd„ ƒZdS )ÚORMDMLStatec                 C   s@   |j jd }|j}|jr |j}n|jj}||j|j|j|jdœS )NÚparententity)Únamer¹   Úexprr9  rN   )	rN   Ú_annotationsr2   r>  rh  rE  r  r9  Úlocal_table)r1  râ   r:  r2   Z_label_namer   r   r%   Ú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 )Nrg  )rj  r�   )rŠ   r   r   r%   Ú_ent_for_colq  s    zCORMDMLState.get_returning_column_descriptions.<locals>._ent_for_colc                 S   s4   |d kr| S | j  dd ¡}|s"| S t|j|| ƒS d S )NÚ	proxy_key)rj  r�   Úgetattrr9  )rŠ   Úentrn  r   r   r%   Ú_attr_for_colt  s    zDORMDMLState.get_returning_column_descriptions.<locals>._attr_for_colc                    s.   g | ]&\}}|j |jˆ ||ƒ|j|jd œ‘qS ))rh  r¹   ri  Úaliasedr9  )r<   r¹   r>  r9  )r#   rŠ   rp  )rq  r   r%   r&   }  s   úûzAORMDMLState.get_returning_column_descriptions.<locals>.<listcomp>c                    s   g | ]}|ˆ |ƒf‘qS r   r   r‰   )rm  r   r%   r&   …  s    )Z_all_selected_columns)r1  râ   r   )rq  rm  r%   Ú!get_returning_column_descriptionso  s    	

ÿøz-ORMDMLState.get_returning_column_descriptionsN)r  r  r  re  rl  rs  r   r   r   r%   rf  ]  s   
rf  Zormrl   c                   @   s$   e Zd Zedd„ ƒZedd„ ƒZdS )Ú	ORMInsertc                 C   sP   ||d< z|j d }W n  tk
r6   ds2tdƒ‚Y nX |j|d< |t |¡fS )Nr'  r(  Fr)  r2   )r+  r,  r-  r2   r   r0  )r1  r@   râ   r*   rÉ   r2  r3  r(  r   r   r%   r5  �  s    

þzORMInsert.orm_pre_session_execc                 C   s   |S r(   r   )r1  r@   râ   r*   rÉ   r2  r   r   r   r%   r8  ¤  s    
z!ORMInsert.orm_setup_cursor_resultN)r  r  r  re  r5  r8  r   r   r   r%   rt  ‹  s   
rt  rm   c                   @   s<   e Zd Zedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZd	S )
ÚBulkORMUpdatec                 K   s  |   | ¡}|jjd }|j |_}i |_|  ||¡|_i }|jD ]}|jr@| 	|¡ q@|j
sn|jrnt|jƒ|_tj  tj¡}	|	j |j¡ |j|	_|jr¢|j|	_n|jr°|j|	_|  ||¡}
|
rÊ|	j|
Ž }	|j dd ¡dk�r|jj�r|	jrøt d¡‚|	j|jŽ }	tj||	|f|Ž |S )Nrg  r%  r&  z?Can't use synchronize_session='fetch' with explicit returning())Ú__new__rN   rj  r2   Úextra_criteria_entitiesrO  r  rH  rI  rJ  Z_preserve_parameter_orderr[  r!   r   ZUpdateÚ__dict__rm   rk  rZ  r@  rº   r�   rÐ   r]  Z
_returningr  r  r  rê   r   Ú__init__)r1  râ   ÚcompilerÚkwÚselfr:  r2   Úextra_criteria_attributesrV  Znew_stmtÚnew_critr   r   r%   Úcreate_for_statement³  sF    


 ÿ
ÿþÿz"BulkORMUpdate.create_for_statementc              
   C   s  |j d }tj}|r|js$|||ƒS |j}g }|D ]Ð\}}t tj|¡}t|t	j
ƒr¦t||td�}	|	tkrŽ| |tjtj|t ¡ dd�f¡ n| |||	 |¡ƒ¡ q2d|jkrà|j}
t|
d |
d ƒ}| ||| |¡ƒ¡ q2| |tjtj|t ¡ dd�f¡ q2|S )Nr(  )ÚdefaultT)r´   Zis_crudZentity_namespacern  )r+  r   Ú_get_crud_kv_pairsr2   r   rP  r   ZDMLColumnRoler�   r   Ústring_typesr   r
   rd   rQ  r   ZNullTyperø   Z_bulk_update_tuplesrj  )r1  râ   Zkv_iteratorr(  Zcore_get_crud_kv_pairsr2   r¡   rT   rU   ÚdescZk_annor\  r   r   r%   r�  î  sd    


üþÿ ÿÿ
 ÿ ÿÿüþÿz BulkORMUpdate._get_crud_kv_pairsc                 C   sð   t ƒ }t|j ¡ ƒ}|j}t dd„ |D ƒƒ}|jD ]®}t |¡t |¡ }	}
|j	d k	rd|	j
|j	krdq2|	j |¡}|D ]}||
krt|j| |ƒ|
|< qt|	jj |	d |¡ |	 |
t|ƒ¡ | |
¡ |¡}|rÖ|	 |
|¡ | |	¡ q2| |¡ d S )Nc                 s   s   | ]\}}|V  qd S r(   r   rS   r   r   r%   r3   0	  s     z>BulkORMUpdate._do_post_synchronize_evaluate.<locals>.<genexpr>)rŒ   rC   r  rx   r  r   r   rƒ   Úinstance_dictr"  rC  Ú
unmodifiedr�   rž   r{   ÚrefreshÚ_commitr‘   r÷   ÚaddÚ_register_altered)r1  r@   r   r4  rM   Úevaluated_keysr¡   Úattribr  r$   r'   Úto_evaluater<   Ú	to_expirer   r   r%   r6  *	  s4    
þ	ÿÿþz+BulkORMUpdate._do_post_synchronize_evaluatec                    s.  ˆj ‰tƒ }tˆj ¡ ƒ}|jr8‡fdd„| ¡ D ƒ}nˆj}‡ fdd„‡‡fdd„dd„ |D ƒD ƒD ƒ}ˆj}tdd„ |D ƒƒ}	|D ]˜}
t	 
|
¡t	 |
¡ }}|j |¡}|D ]}||kr°ˆj| |
ƒ||< q°|jj |d |¡ | |t|ƒ¡ |	 |¡ |¡}|�r| ||¡ | |¡ q†ˆ  |¡ d S )Nc                    s   g | ]}t |ƒˆ jf ‘qS r   ©rI   r"  ©r#   r  ©r4  r   r%   r&   [	  s   ÿz<BulkORMUpdate._do_post_synchronize_fetch.<locals>.<listcomp>c                    s    g | ]}|ˆ j krˆ j | ‘qS r   )r‚   )r#   Úidentity_key)r@   r   r%   r&   b	  s   
ôc                    s6   g | ].\}}ˆj d ks |ˆj krˆ jt|ƒ|d�‘qS )N©rC  )r"  Úidentity_key_from_primary_keyrC   )r#   rê   rC  )Útarget_mapperr4  r   r%   r&   d	  s   

øþc                 S   s    g | ]}|d d… |d f‘qS )r   rô   r   r�  r   r   r%   r&   i	  s    c                 s   s   | ]\}}|V  qd S r(   r   rS   r   r   r%   r3   s	  s     z;BulkORMUpdate._do_post_synchronize_fetch.<locals>.<genexpr>)r  rŒ   rC   r  rx   Úreturns_rowsÚallr!  r  r   rƒ   r„  r…  r�   rž   r{   r†  r‡  r‘   r÷   rˆ  r‰  )r1  r@   r   r4  rM   rŠ  rd  Zobjsr¡   r‹  r  r$   r'   rŒ  r<   r�  r   )r@   r”  r4  r%   r7  S	  s@    
þ
ÿûþþz(BulkORMUpdate._do_post_synchronize_fetchN)r  r  r  re  r  r�  r6  r7  r   r   r   r%   ru  ±  s   
:
;
(ru  r}   c                   @   s0   e Zd Zedd„ ƒZedd„ ƒZedd„ ƒZdS )ÚBulkORMDeletec           
      K   s¢   |   | ¡}|jjd }|j |_}i |_i }|jD ]}|jr2| |¡ q2|  ||¡}	|	rb|j	|	Ž }|rŒ|j 
dd ¡dkrŒ|jjrŒ|j|jŽ }tj|||f|Ž |S )Nrg  r%  r&  )rv  rN   rj  r2   rw  rH  rI  rJ  r@  rº   r�   rÐ   r]  r  rê   r   ry  )
r1  râ   rz  r{  r|  r:  r2   r}  rV  r~  r   r   r%   r  �	  s2    

 ÿ
ÿÿþüz"BulkORMDelete.create_for_statementc                 C   s   |  dd„ |jD ƒ¡ d S )Nc                 S   s   g | ]}t  |¡‘qS r   )r   rƒ   )r#   r  r   r   r%   r&   ²	  s   ÿz?BulkORMDelete._do_post_synchronize_evaluate.<locals>.<listcomp>)Ú_remove_newly_deletedr   )r1  r@   r   r4  r   r   r%   r6  ®	  s
    þÿz+BulkORMDelete._do_post_synchronize_evaluatec           
         s€   ˆ j }|jr$‡ fdd„| ¡ D ƒ}nˆ j}|D ]L}|dd… }|d }|jt|ƒ|d�}	|	|jkr.| t 	|j|	 ¡g¡ q.d S )Nc                    s   g | ]}t |ƒˆ jf ‘qS r   rŽ  r�  r�  r   r%   r&   ½	  s   ÿz<BulkORMDelete._do_post_synchronize_fetch.<locals>.<listcomp>r   rô   r’  )
r  r•  r–  r!  r“  rC   r‚   r˜  r   rƒ   )
r1  r@   r   r4  r”  rd  r  rê   rC  r‘  r   r�  r%   r7  ¸	  s(    
þþ
ÿÿÿz(BulkORMDelete._do_post_synchronize_fetchN)r  r  r  re  r  r6  r7  r   r   r   r%   r—  ‹	  s   
 
	r—  )F)FFF)F)T)T)FÚ__doc__Ú	itertoolsr   r   r  Ú r   r   r   r§   r   r	   Úbaser
   r   r  r   r   r   Zenginer   r^  r   r   r   r   r   r   Zsql.baser   r   r   Zsql.dmlr   r   r   Zsql.elementsr   Zsql.selectabler   rQ   r]   rb   ru   r~   rc   rq   rv   rG   r[   rr   ry   r\   rH   rs   rz   rf   rñ   rÕ   ré   r   ra   r0  r  r  rf  Z
plugin_forrt  ru  r—  r   r   r   r%   Ú<module>   s�   	MB
S++Q   û
Y ÿ
 :8- ú
 R ú
 k{dJ)a  p.
%
 Z
