o
    Šåg€ƒ  ã                   @  sø  d dl mZ d dlmZ d dlmZ d dlZd dlmZ d dl	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! e "d¡Z#dZ$dZ%d?d#d$„Z&d@d(d)„Z'G d*d+„ d+eƒZ(G d,d-„ d-e(ƒZ)d.d/„ Z*G d0d1„ d1eƒZ+G d2d3„ d3eƒZ,e,ƒ Z-d4d5„ Z.G d6d7„ d7eƒZ/e/ƒ Z0e 1d8¡d9d:„ ƒZ2G d;d<„ d<eej3ƒZ4G d=d>„ d>e4ƒZ5dS )Aé    )Úannotations)ÚdequeN)Úzip_longest)ÚAny)ÚCallable)ÚDeque)ÚDict)ÚIterable)ÚOptional)ÚSet)ÚTuple)ÚTypeé   )Ú	operators)ÚHasCacheKey)Ú_TraverseInternalsType©Úanon_map)ÚExternallyTraversible)ÚHasTraversalDispatch)ÚHasTraverseInternalsé   )Úutil)Úlanghelpers)ÚSelfÚskip_traverseFTÚobj1r   Úobj2ÚkwÚreturnÚboolc                 K  s.   |  dd¡r
tƒ }ntƒ }|j| |fi |¤ŽS )NÚuse_proxiesF)ÚgetÚColIdentityComparatorStrategyÚTraversalComparatorStrategyÚcompare)r   r   r   Ústrategy© r'   úU/var/www/html/flaskapp/venv/lib/python3.10/site-packages/sqlalchemy/sql/traversals.pyr%   ,   s   r%   Útarget_hierarchyú	Type[Any]ÚNonec                 C  sP   t  | ¡D ] }t|dƒr%t|dƒr%| ¡  t ||jd¡ t ||jd¡ qd S )NÚ_generate_cache_attrsÚ_traverse_internalsÚ#_generated_copy_internals_traversalÚ!_generated_get_children_traversal)r   Úwalk_subclassesÚhasattrr,   Ú_copy_internalsÚgenerate_dispatchr-   Ú_get_children)r)   Úclsr'   r'   r(   Ú_preconfigure_traversals6   s"   ÿýý€ör6   c                   @  sŠ   e Zd ZdZdZejrd'dd„Zd(dd„Zd)dd„Z	e
d*dd„ƒZe
d+dd„ƒZe
d,dd„ƒZd(dd„Zd)dd„Zd'd d!„Zd-d$d%„Zd&S ).ÚHasShallowCopyz”attribute-wide operations that are useful for classes that use
    __slots__ and therefore can't operate on their attributes in a dictionary.


    r'   Úotherr   r   r+   c                 C  ó   d S ©Nr'   )Úselfr8   r'   r'   r(   Ú!_generated_shallow_copy_traversalS   ó    z0HasShallowCopy._generated_shallow_copy_traversalÚdúDict[str, Any]c                 C  r9   r:   r'   )r;   r>   r'   r'   r(   Ú&_generated_shallow_from_dict_traversalU   s   z5HasShallowCopy._generated_shallow_from_dict_traversalc                 C  r9   r:   r'   ©r;   r'   r'   r(   Ú$_generated_shallow_to_dict_traversalY   r=   z3HasShallowCopy._generated_shallow_to_dict_traversalÚinternal_dispatchr   Úmethod_nameÚstrúCallable[[Self, Self], None]c                 C  ó4   d  dd„ |D ƒ¡}d|› d|› d�}t |i |¡S )NÚ
c                 s  ó$   � | ]\}}d |› d|› �V  qdS )z
    other.z = self.Nr'   ©Ú.0ÚattrnameÚ_r'   r'   r(   Ú	<genexpr>a   ó
   € ÿ
ÿz8HasShallowCopy._generate_shallow_copy.<locals>.<genexpr>údef z(self, other):
©Újoinr   Ú_exec_code_in_env©r5   rC   rD   ÚcodeÚ	meth_textr'   r'   r(   Ú_generate_shallow_copy[   ó
   
þz%HasShallowCopy._generate_shallow_copyú Callable[[Self], Dict[str, Any]]c                 C  s4   d  dd„ |D ƒ¡}d|› d|› d�}t |i |¡S )Nz,
c                 s  rI   )z    'z': self.Nr'   rJ   r'   r'   r(   rN   n   rO   z;HasShallowCopy._generate_shallow_to_dict.<locals>.<genexpr>rP   z(self):
    return {z}
rQ   rT   r'   r'   r(   Ú_generate_shallow_to_dicth   rX   z(HasShallowCopy._generate_shallow_to_dictú&Callable[[Self, Dict[str, Any]], None]c                 C  rG   )NrH   c                 s  s&   � | ]\}}d |› d|› d�V  qdS )z	    self.z = d['z']Nr'   rJ   r'   r'   r(   rN   {   s
   € ÿ
ÿz=HasShallowCopy._generate_shallow_from_dict.<locals>.<genexpr>rP   z(self, d):
rQ   rT   r'   r'   r(   Ú_generate_shallow_from_dictu   rX   z*HasShallowCopy._generate_shallow_from_dictc                 C  óJ   | j }z|jd }W n ty   |  |jd¡}||_Y nw || |ƒ d S )Nr@   )Ú	__class__Ú__dict__ÚKeyErrorr\   r-   r@   )r;   r>   r5   Úshallow_from_dictr'   r'   r(   Ú_shallow_from_dict‚   s   ÿþ
úz!HasShallowCopy._shallow_from_dictc                 C  sH   | j }z
|jd }W || ƒS  ty#   |  |jd¡}||_Y || ƒS w )NrB   )r^   r_   r`   rZ   r-   rB   )r;   r5   Úshallow_to_dictr'   r'   r(   Ú_shallow_to_dict”   s   ÿ	úÿúzHasShallowCopy._shallow_to_dictc                 C  r]   )Nr<   )r^   r_   r`   rW   r-   r<   )r;   r8   r5   Úshallow_copyr'   r'   r(   Ú_shallow_copy_to¥   s   ÿ
ûzHasShallowCopy._shallow_copy_tor   r   c                 K  s   | j  | j ¡}|  |¡ |S )zCreate a shallow copy©r^   Ú__new__rf   )r;   r   Úcr'   r'   r(   Ú_clone³   s   
zHasShallowCopy._cloneN)r8   r   r   r+   )r>   r?   r   r+   )r   r?   )rC   r   rD   rE   r   rF   )rC   r   rD   rE   r   rY   )rC   r   rD   rE   r   r[   )r   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__ÚtypingÚTYPE_CHECKINGr<   r@   rB   ÚclassmethodrW   rZ   r\   rb   rd   rf   rj   r'   r'   r'   r(   r7   H   s"    





r7   c                   @  s   e Zd ZdZdZddd„ZdS )	ÚGenerativeOnTraversalz˜Supplies Generative behavior but making use of traversals to shallow
    copy.

    .. seealso::

        :class:`sqlalchemy.sql.base.Generative`


    r'   r   r   c                 C  s   | j }| |¡}|  |¡ |S r:   rg   )r;   r5   Úsr'   r'   r(   Ú	_generateÇ   s   

zGenerativeOnTraversal._generateN)r   r   )rk   rl   rm   rn   ro   ru   r'   r'   r'   r(   rs   º   s    
rs   c                 K  s   |   ¡ S r:   )rj   )Úelementr   r'   r'   r(   rj   Î   ó   rj   c                   @  s(   e Zd ZdZdd„ Zddœddd„ZdS )ÚHasCopyInternalsr'   c                 K  ó   t ƒ ‚r:   ©ÚNotImplementedError)r;   r   r'   r'   r(   rj   Õ   ó   zHasCopyInternals._clone)Ú
omit_attrsr}   úIterable[str]r   r   r   r+   c                K  sx   z| j }W n
 ty   Y dS w t | |d¡D ]"\}}}||v r!q|dur9||| |fi |¤Ž}|dur9t| ||ƒ qdS )at  Reassign internal elements to be clones of themselves.

        Called during a copy-and-traverse operation on newly
        shallow-copied elements to create a deep copy.

        The given clone function should be used, which may be applying
        additional transformations to the element (i.e. replacement
        traversal, cloned traversal, annotations).

        Nr.   )r-   ÚAttributeErrorr2   Úrun_generated_dispatchÚsetattr)r;   r}   r   Útraverse_internalsrL   ÚobjÚmethÚresultr'   r'   r(   r2   Ø   s    
þÿ€÷z HasCopyInternals._copy_internalsN)r}   r~   r   r   r   r+   )rk   rl   rm   ro   rj   r2   r'   r'   r'   r(   rx   Ò   s
    ÿrx   c                   @  s¨   e Zd ZdZefdd„Zefdd„Zefdd„Zefdd	„Zefd
d„Z	efdd„Z
efdd„Zefdd„Zdd„ Zefdd„Zefdd„Zefdd„Zefdd„ZdS )Ú_CopyInternalsTraversalzmGenerate a _copy_internals internal traversal dispatch for classes
    with a _traverse_internals collection.c                 K  s   ||fi |¤ŽS r:   r'   ©r;   rL   Úparentrv   Úcloner   r'   r'   r(   Úvisit_clauseelementü   ó   z+_CopyInternalsTraversal.visit_clauseelementc                   ó   ‡ ‡fdd„|D ƒS )Nc                   ó   g | ]
}ˆ |fi ˆ¤Ž‘qS r'   r'   ©rK   Úclause©r‰   r   r'   r(   Ú
<listcomp>  ó    zD_CopyInternalsTraversal.visit_clauseelement_list.<locals>.<listcomp>r'   r‡   r'   r�   r(   Úvisit_clauseelement_list  ó   z0_CopyInternalsTraversal.visit_clauseelement_listc                   ó   t ‡ ‡fdd„|D ƒƒS )Nc                   r�   r'   r'   rŽ   r�   r'   r(   r‘   	  r’   zE_CopyInternalsTraversal.visit_clauseelement_tuple.<locals>.<listcomp>©Útupler‡   r'   r�   r(   Úvisit_clauseelement_tuple  ó   z1_CopyInternalsTraversal.visit_clauseelement_tuplec                   r•   )Nc                   r�   r'   r'   rŽ   r�   r'   r(   r‘     r’   zD_CopyInternalsTraversal.visit_executable_options.<locals>.<listcomp>r–   r‡   r'   r�   r(   Úvisit_executable_options  r™   z0_CopyInternalsTraversal.visit_executable_optionsc                   rŒ   )Nc                   s   h | ]
}ˆ |fi ˆ¤Ž’qS r'   r'   rŽ   r�   r'   r(   Ú	<setcomp>  r’   zL_CopyInternalsTraversal.visit_clauseelement_unordered_set.<locals>.<setcomp>r'   r‡   r'   r�   r(   Ú!visit_clauseelement_unordered_set  r”   z9_CopyInternalsTraversal.visit_clauseelement_unordered_setc                   rŒ   )Nc                   s$   g | ]}t ‡ ‡fd d„|D ƒƒ‘qS )c                 3  s    � | ]}ˆ |fi ˆ¤ŽV  qd S r:   r'   )rK   Útup_elemr�   r'   r(   rN     s   € zP_CopyInternalsTraversal.visit_clauseelement_tuples.<locals>.<listcomp>.<genexpr>r–   )rK   Úelemr�   r'   r(   r‘     s    ÿÿzF_CopyInternalsTraversal.visit_clauseelement_tuples.<locals>.<listcomp>r'   r‡   r'   r�   r(   Úvisit_clauseelement_tuples  s   þz2_CopyInternalsTraversal.visit_clauseelement_tuplesc                   ó   ‡ ‡fdd„|  ¡ D ƒS )Nc                   s"   i | ]\}}|ˆ |fi ˆ¤Ž“qS r'   r'   ©rK   ÚkeyÚvaluer�   r'   r(   Ú
<dictcomp>   s   " zK_CopyInternalsTraversal.visit_string_clauseelement_dict.<locals>.<dictcomp>©Úitemsr‡   r'   r�   r(   Úvisit_string_clauseelement_dict  r™   z7_CopyInternalsTraversal.visit_string_clauseelement_dictc                   r•   )Nc                 3  sl   � | ]1\}}}}|d urˆ |fi ˆ¤Žnd |d ur!ˆ |fi ˆ¤Žnd |d ur.ˆ |fi ˆ¤Žnd |fV  qd S r:   r'   )rK   ÚtargetÚonclauseÚfrom_Úflagsr�   r'   r(   rN   %  s   € 
ûü
ÿzA_CopyInternalsTraversal.visit_setup_join_tuple.<locals>.<genexpr>r–   r‡   r'   r�   r(   Úvisit_setup_join_tuple"  s   ùz._CopyInternalsTraversal.visit_setup_join_tuplec                 K  s   | j |||fi |¤ŽS r:   ©r˜   )r;   rL   rˆ   rv   r   r'   r'   r(   Úvisit_memoized_select_entities/  s   z6_CopyInternalsTraversal.visit_memoized_select_entitiesc                   rŒ   )Nc                   s>   g | ]\}}t |d ƒrˆ |fi ˆ¤Žn|ˆ |fi ˆ¤Žf‘qS ©Ú__clause_element__©r1   r¡   r�   r'   r(   r‘   6  s    	ûÿúÿzD_CopyInternalsTraversal.visit_dml_ordered_values.<locals>.<listcomp>r'   r‡   r'   r�   r(   Úvisit_dml_ordered_values2  s   	÷z0_CopyInternalsTraversal.visit_dml_ordered_valuesc                   r    )Nc                   s<   i | ]\}}t |d ƒrˆ |fi ˆ¤Žn|ˆ |fi ˆ¤Ž“qS r¯   r±   r¡   r�   r'   r(   r¤   C  s
    þýz<_CopyInternalsTraversal.visit_dml_values.<locals>.<dictcomp>r¥   r‡   r'   r�   r(   Úvisit_dml_valuesB  s   üz(_CopyInternalsTraversal.visit_dml_valuesc                   s    ‡ ‡fdd„‰‡fdd„|D ƒS )Nc                   sH   t | ttfƒr‡ ‡fdd„| D ƒS t | tƒr"‡ ‡fdd„|  ¡ D ƒS J ‚)Nc                   s*   g | ]}t |d ƒrˆ |fi ˆ¤Žn|‘qS r¯   r±   )rK   r£   r�   r'   r(   r‘   Q  s    ýÿüzP_CopyInternalsTraversal.visit_dml_multi_values.<locals>.copy.<locals>.<listcomp>c                   sJ   i | ]!\}}t |d ƒrˆ |fi ˆ¤Žn|t |d ƒr!ˆ |fi ˆ¤Žn|“qS r¯   r±   r¡   r�   r'   r(   r¤   Z  s    
ùÿÿøzP_CopyInternalsTraversal.visit_dml_multi_values.<locals>.copy.<locals>.<dictcomp>)Ú
isinstanceÚlistr—   Údictr¦   ©rž   r�   r'   r(   ÚcopyO  s   ú

öz<_CopyInternalsTraversal.visit_dml_multi_values.<locals>.copyc                   s   g | ]}‡ fd d„|D ƒ‘qS )c                   s   g | ]}ˆ |ƒ‘qS r'   r'   )rK   Úsub_element©r¸   r'   r(   r‘   k  s    zM_CopyInternalsTraversal.visit_dml_multi_values.<locals>.<listcomp>.<listcomp>r'   )rK   Úsequencerº   r'   r(   r‘   j  s    ÿÿzB_CopyInternalsTraversal.visit_dml_multi_values.<locals>.<listcomp>r'   r‡   r'   )r‰   r¸   r   r(   Úvisit_dml_multi_valuesJ  s   
þz._CopyInternalsTraversal.visit_dml_multi_valuesc                 K  s   |S r:   r'   r‡   r'   r'   r(   Úvisit_propagate_attrso  ó   z-_CopyInternalsTraversal.visit_propagate_attrsN)rk   rl   rm   rn   rj   rŠ   r“   r˜   rš   rœ   rŸ   r§   r¬   r®   r²   r³   r¼   r½   r'   r'   r'   r(   r†   ø   s4    
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ	
ÿ
ÿ
ÿ	
ÿ&ÿr†   c                 C  s8   t | dƒrt| ddƒs|  ¡ } t | dƒrt| ddƒr| S )Nr°   Úis_clause_elementF)r1   Úgetattrr°   )rv   r'   r'   r(   Ú_flatten_clauseelementx  s   ÿýÿrÁ   c                   @  sˆ   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd S )!Ú_GetChildrenTraversalzqGenerate a _children_traversal internal traversal dispatch for classes
    with a _traverse_internals collection.c                 K  ó   dS ©Nr'   r'   ©r;   rv   r   r'   r'   r(   Úvisit_has_cache_key…  s   z)_GetChildrenTraversal.visit_has_cache_keyc                 K  s   |fS r:   r'   rÅ   r'   r'   r(   rŠ   ‹  r|   z)_GetChildrenTraversal.visit_clauseelementc                 K  ó   |S r:   r'   rÅ   r'   r'   r(   r“   Ž  ó   z._GetChildrenTraversal.visit_clauseelement_listc                 K  rÇ   r:   r'   rÅ   r'   r'   r(   r˜   ‘  rÈ   z/_GetChildrenTraversal.visit_clauseelement_tuplec                 K  s   t j |¡S r:   )Ú	itertoolsÚchainÚfrom_iterablerÅ   r'   r'   r(   rŸ   ”  ó   z0_GetChildrenTraversal.visit_clauseelement_tuplesc                 K  rÃ   rÄ   r'   rÅ   r'   r'   r(   Ú,visit_fromclause_canonical_column_collection—  rÈ   zB_GetChildrenTraversal.visit_fromclause_canonical_column_collectionc                 K  s   |  ¡ S r:   )ÚvaluesrÅ   r'   r'   r(   r§   š  rw   z5_GetChildrenTraversal.visit_string_clauseelement_dictc                 K  rÇ   r:   r'   rÅ   r'   r'   r(   Úvisit_fromclause_ordered_set�  rÈ   z2_GetChildrenTraversal.visit_fromclause_ordered_setc                 K  rÇ   r:   r'   rÅ   r'   r'   r(   rœ      rÈ   z7_GetChildrenTraversal.visit_clauseelement_unordered_setc                 k  sV   � |D ]%\}}}}|d ur|V  t |tƒst|ƒV  |d ur(t |tƒs(t|ƒV  qd S r:   )r´   rE   rÁ   )r;   rv   r   r¨   r©   rª   r«   r'   r'   r(   r¬   £  s   €


€øz,_GetChildrenTraversal.visit_setup_join_tuplec                 K  s   | j |fi |¤ŽS r:   r­   rÅ   r'   r'   r(   r®   ®  s   z4_GetChildrenTraversal.visit_memoized_select_entitiesc                 k  s*   � |D ]\}}t |dƒr|V  |V  qd S )Nr°   r±   )r;   rv   r   ÚkÚvr'   r'   r(   r²   ±  s   €
ýz._GetChildrenTraversal.visit_dml_ordered_valuesc                 k  sP   � dd„ |D ƒ}|  |¡}t|ƒD ]}|| V  q|D ]
}|V  || V  qd S )Nc                 S  s   h | ]	}t |d ƒr|’qS r¯   r±   )rK   rÐ   r'   r'   r(   r›   ¸  s    z9_GetChildrenTraversal.visit_dml_values.<locals>.<setcomp>)Úsymmetric_differenceÚsorted)r;   rv   r   Úexpr_valuesÚ
str_valuesrÐ   r'   r'   r(   r³   ·  s   €
þz&_GetChildrenTraversal.visit_dml_valuesc                 K  rÃ   rÄ   r'   rÅ   r'   r'   r(   r¼   Á  rÈ   z,_GetChildrenTraversal.visit_dml_multi_valuesc                 K  rÃ   rÄ   r'   rÅ   r'   r'   r(   r½   Ä  rÈ   z+_GetChildrenTraversal.visit_propagate_attrsN)rk   rl   rm   rn   rÆ   rŠ   r“   r˜   rŸ   rÍ   r§   rÏ   rœ   r¬   r®   r²   r³   r¼   r½   r'   r'   r'   r(   rÂ   �  s"    
rÂ   zsqlalchemy.sql.elementsc                 K  s   t |tjjjƒr| |¡}|S r:   )r´   r   Ú	preloadedÚsql_elementsÚ_anonymous_labelÚ	apply_map)rv   Únamer   r   r'   r'   r(   Ú_resolve_name_for_compareË  s   
rÛ   c                   @  s‚  e Zd ZdZdd„ Zdd„ Zdfdd„Zdd„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Zd=d>„ Zd?d@„ ZdAdB„ Z dCdD„ Z!dEdF„ Z"dGdH„ Z#dIdJ„ Z$dKdL„ Z%dMdN„ Z&dOdP„ Z'dQdR„ Z(dSdT„ Z)dUdV„ Z*dWdX„ Z+dYdZ„ Z,d[d\„ Z-d]d^„ Z.d_d`„ Z/dadb„ Z0dcdd„ Z1deS )gr$   )ÚstackÚcacher   c                 C  s   t ƒ | _tƒ | _d S r:   )r   rÜ   ÚsetrÝ   rA   r'   r'   r(   Ú__init__Ö  s   ûz$TraversalComparatorStrategy.__init__c                 C  s   t ƒ t ƒ fS r:   r   rA   r'   r'   r(   Ú_memoized_attr_anon_mapß  rÌ   z3TraversalComparatorStrategy._memoized_attr_anon_mapr   r   r   r   r   r   r    c                 K  sâ  | j }| j}| dd¡}| ||f¡ |rï| ¡ \}}||u r q|d u s(|d u r*dS ||f|v r1q| ||f¡ |j}	|	|jkrBdS t| d|	 d ƒ}
|
ra|
||fi |¤Ž}|tu r[dS |t	u r`qnd}t
|j|jdd�D ]€\\}}\}}|s|dks~|dkrql||ks‡||urŠ dS ||v r�ql|d us•J ‚|d us›J ‚|d us¡J ‚|  |¡}|d us¸J | j› d| j| › d	�ƒ‚t |¡|ƒ}t |¡|ƒ}|d u rÒ|d urÑ dS ql|d u rÙ dS ||||||fi |¤Ž}|tu rì dS ql|sd
S )NÚcompare_annotationsFz
compare_%sr'   ©NN©Ú	fillvalueÚ_annotationsz has no dispatch for 'ú'T)rÜ   rÝ   r"   ÚappendÚpopleftÚaddÚ__visit_name__rÀ   ÚCOMPARE_FAILEDÚSKIP_TRAVERSEr   r-   Údispatchr^   Ú_dispatch_lookupÚoperatorÚ
attrgetter)r;   r   r   r   rÜ   rÝ   rá   ÚleftÚrightÚ
visit_namer„   Úattributes_comparedÚleft_attrnameÚleft_visit_symÚright_attrnameÚright_visit_symrí   Ú
left_childÚright_childÚ
comparisonr'   r'   r(   r%   â  sŠ   
ÿýý

ÿÿ
ÿÿÿ´Oz#TraversalComparatorStrategy.comparec                 K  s   |   ¡ }|j||fi |¤ŽS r:   )r^   r%   )r;   r   r   r   Ú
comparatorr'   r'   r(   Úcompare_inner@  s   z)TraversalComparatorStrategy.compare_innerc                 K  s,   |  | jd g ¡|  | jd g ¡krtS d S ©Nr   r   )Ú_gen_cache_keyr   rë   ©r;   rL   Úleft_parentrñ   Úright_parentrò   r   r'   r'   r(   rÆ   D  s
   
ÿýz/TraversalComparatorStrategy.visit_has_cache_keyc                 K  s   |   | dd ¡| dd ¡¡S )NÚplugin_subject)rý   r"   r   r'   r'   r(   r½   L  s   ÿz1TraversalComparatorStrategy.visit_propagate_attrsc           	      K  sr   t ||d d�D ]/\}}|d u r|d urt  S q|d u r t  S | | jd g ¡| | jd g ¡kr6t  S qd S ©Nrã   r   r   )r   rë   rÿ   r   ©	r;   rL   r  rñ   r  rò   r   ÚlÚrr'   r'   r(   Úvisit_has_cache_key_listS  s   
ÿý÷z4TraversalComparatorStrategy.visit_has_cache_key_listc           	      K  s†   t ||d d�D ]9\}}|d u r|d urt  S q|d u r t  S |jr,| | jd g ¡n||jr9| | jd g ¡n|kr@t  S qd S r  )r   rë   Ú_is_has_cache_keyrÿ   r   r  r'   r'   r(   rš   d  s"   ÿÿù	÷÷z4TraversalComparatorStrategy.visit_executable_optionsc                 K  s   | j  ||f¡ d S r:   )rÜ   rç   r   r'   r'   r(   rŠ   {  r”   z/TraversalComparatorStrategy.visit_clauseelementc           	      K  ó,   t ||d d�D ]\}}| j ||f¡ qd S ©Nrã   ©r   rÜ   rç   )	r;   rL   r  rñ   r  rò   r   ÚlcolÚrcolr'   r'   r(   rÍ   €  ó   ÿzHTraversalComparatorStrategy.visit_fromclause_canonical_column_collectionc                 K  r9   r:   r'   r   r'   r'   r(   Ú*visit_fromclause_derived_column_collection†  r¾   zFTraversalComparatorStrategy.visit_fromclause_derived_column_collectionc           	      K  sL   t t|ƒt|ƒd d�D ]\}}||krt  S | j || || f¡ qd S r  )r   rÓ   rë   rÜ   rç   )	r;   rL   r  rñ   r  rò   r   ÚlstrÚrstrr'   r'   r(   r§   ‹  s   ÿûz;TraversalComparatorStrategy.visit_string_clauseelement_dictc                 K  s\   t ||d d�D ]$\}}|d u s|d u rt  S t ||d d�D ]\}	}
| j |	|
f¡ qqd S r  ©r   rë   rÜ   rç   )r;   rL   r  rñ   r  rò   r   ÚltupÚrtupr  r  r'   r'   r(   rŸ   •  s   ÿüz6TraversalComparatorStrategy.visit_clauseelement_tuplesc           	      K  r
  r  r  r  r'   r'   r(   r“   Ÿ  r  z4TraversalComparatorStrategy.visit_clauseelement_listc           	      K  r
  r  r  r  r'   r'   r(   r˜   ¥  r  z5TraversalComparatorStrategy.visit_clauseelement_tuplec                 K  sz   |d u r|d u S t ƒ }|D ]}t |ƒ |¡D ]}| j||fi |¤Žr)| |¡  nqqt|ƒt|ƒ  ko:t|ƒkS   S r:   )rÞ   Ú
differencerý   ré   Úlen)r;   Úseq1Úseq2r   Ú	completedr�   Úother_clauser'   r'   r(   Ú_compare_unordered_sequences«  s   
þ€$z8TraversalComparatorStrategy._compare_unordered_sequencesc                 K  s   | j ||fi |¤ŽS r:   )r  r   r'   r'   r(   rœ   ·  r”   z=TraversalComparatorStrategy.visit_clauseelement_unordered_setc           	      K  r
  r  r  r  r'   r'   r(   rÏ   ¼  r  z8TraversalComparatorStrategy.visit_fromclause_ordered_setc                 K  ó   ||kS r:   r'   r   r'   r'   r(   Úvisit_stringÂ  ó   z(TraversalComparatorStrategy.visit_stringc                 K  r  r:   r'   r   r'   r'   r(   Úvisit_string_listÇ  r  z-TraversalComparatorStrategy.visit_string_listc                 K  s¸   t t| ¡ ƒt| ¡ ƒdd�D ]J\}}||krt  S || || }	}
t|tƒ}t|tƒ}|rI|rI|	 | jd g ¡|
 | jd g ¡krHt  S q||krQt  S |	|
krYt  S qd S )Nrâ   rã   r   r   )r   rÓ   Úkeysrë   r´   r   rÿ   r   )r;   rL   r  rñ   r  rò   r   ÚlkÚrkÚlvÚrvÚlhcÚrhcr'   r'   r(   Úvisit_string_multi_dictÌ  s,   ÿ


ÿþýÿïz3TraversalComparatorStrategy.visit_string_multi_dictc           	      K  s\   t |tƒ}t |tƒ}|r$|r$| | jd g ¡| | jd g ¡kr"tS d S ||kr*tS ||kS rþ   )r´   r   rÿ   r   rë   )	r;   rL   r  rñ   r  rò   r   r&  r'  r'   r'   r(   Úvisit_multiã  s   


ÿþýz'TraversalComparatorStrategy.visit_multic                 K  s4   t ||| jd fi |¤Žt ||| jd fi |¤ŽkS rþ   )rÛ   r   r   r'   r'   r(   Úvisit_anon_nameò  s   ÿÿÿÿþz+TraversalComparatorStrategy.visit_anon_namec                 K  r  r:   r'   r   r'   r'   r(   Úvisit_booleanû  r  z)TraversalComparatorStrategy.visit_booleanc                 K  r  r:   r'   r   r'   r'   r(   Úvisit_operator   r  z*TraversalComparatorStrategy.visit_operatorc                 K  s
   |  |¡S r:   )Ú_compare_type_affinityr   r'   r'   r(   Ú
visit_type  s   
z&TraversalComparatorStrategy.visit_typec                 K  r  r:   r'   r   r'   r'   r(   Úvisit_plain_dict
  r  z,TraversalComparatorStrategy.visit_plain_dictc                 K  r  r:   r'   r   r'   r'   r(   Úvisit_dialect_options  r  z1TraversalComparatorStrategy.visit_dialect_optionsc                 K  s   |r
|r
|j |j kS ||kS r:   )Ú_annotations_cache_keyr   r'   r'   r(   Úvisit_annotations_key  s   ÿÿz1TraversalComparatorStrategy.visit_annotations_keyc                 K  s$   t dd„ |D ƒƒt dd„ |D ƒƒkS )Nc                 s  s   � | ]
\}}|j |fV  qd S r:   )Ú__code__)rK   ÚfnÚc_keyr'   r'   r(   rN   "  s   € zITraversalComparatorStrategy.visit_with_context_options.<locals>.<genexpr>r–   r   r'   r'   r(   Úvisit_with_context_options  s   
ÿz6TraversalComparatorStrategy.visit_with_context_optionsc                 K  r  r:   r'   r   r'   r'   r(   Úvisit_plain_obj&  r  z+TraversalComparatorStrategy.visit_plain_objc                 K  s    |d u r
|d ur
t S |j|jkS r:   )rë   rÚ   r   r'   r'   r(   Úvisit_named_ddl_element+  s   z3TraversalComparatorStrategy.visit_named_ddl_elementc                 K  sD   t ||dd�D ]\\}}\}	}
||
krt  S | j ||	f¡ qd S ©Nrâ   rã   r  )r;   rL   r  rñ   r  rò   r   Úl_clauseÚl_strÚr_clauseÚr_strr'   r'   r(   Úvisit_prefix_sequence4  s   ÿúz1TraversalComparatorStrategy.visit_prefix_sequencec                 K  sl   t ||dd�D ],\\}}}	}
\}}}}|
|krt  S | j ||f¡ | j ||f¡ | j |	|f¡ qd S )N)NNNNrã   r  )r;   rL   r  rñ   r  rò   r   Úl_targetÚ
l_onclauseÚl_fromÚl_flagsÚr_targetÚ
r_onclauseÚr_fromÚr_flagsr'   r'   r(   r¬   ?  s   ý

øz2TraversalComparatorStrategy.visit_setup_join_tuplec                 K  s   | j |||||fi |¤ŽS r:   r­   r   r'   r'   r(   r®   M  s
   
ÿÿz:TraversalComparatorStrategy.visit_memoized_select_entitiesc                 K  s„   t |dd„ d�}t |dd„ d�}t||dd�D ](\\}	}
\}}|
|kr't  S ||	|
f |||f kr7t  S | j |	|f¡ qd S )Nc                 S  ó   | d j | d fS rþ   ©Úfullnamer·   r'   r'   r(   Ú<lambda>W  ó    zCTraversalComparatorStrategy.visit_table_hint_list.<locals>.<lambda>)r¢   c                 S  rG  rþ   rH  r·   r'   r'   r(   rJ  Y  rK  râ   rã   )rÓ   r   rë   rÜ   rç   )r;   rL   r  rñ   r  rò   r   Ú	left_keysÚ
right_keysÚltableÚldialectÚrtableÚrdialectr'   r'   r(   Úvisit_table_hint_listT  s   ÿÿøz1TraversalComparatorStrategy.visit_table_hint_listc                 K  r  r:   r'   r   r'   r'   r(   Úvisit_statement_hint_liste  r  z5TraversalComparatorStrategy.visit_statement_hint_listc                 K  ry   r:   rz   r   r'   r'   r(   Úvisit_unknown_structurej  s   z3TraversalComparatorStrategy.visit_unknown_structurec                 K  s@   t ||dd�D ]\\}}\}	}
| j||	fi |¤Žst  S qd S r9  )r   Ú_compare_dml_values_or_cerë   )r;   rL   r  rñ   r  rò   r   r"  r$  r#  r%  r'   r'   r(   r²   o  s   ÿÿýz4TraversalComparatorStrategy.visit_dml_ordered_valuesc                 K  sh   t |dƒ}t |dƒ}||krdS |r| j||fi |¤ŽsdS |s&||kr&dS | j||fi |¤Žs2dS dS )Nr°   FT)r1   rý   )r;   r$  r%  r   ÚlvceÚrvcer'   r'   r(   rU  z  s   

z5TraversalComparatorStrategy._compare_dml_values_or_cec                 K  sÔ   |d u s|d u st |ƒt |ƒkrtS t|tjƒr2t||ƒD ]\}}| j||fi |¤Žs/t  S qd S t|tjƒr:tS t| ¡ | ¡ ƒD ]$\\}	}\}
}| j|	|
fi |¤ŽsYt  S | j||fi |¤Žsgt  S qCd S r:   )r  rë   r´   Úcollections_abcÚSequenceÚziprU  r¦   )r;   rL   r  rñ   r  rò   r   r$  r%  r"  r#  r'   r'   r(   r³   ˆ  s"    ÿÿ"ÿýz,TraversalComparatorStrategy.visit_dml_valuesc                 K  sv   t ||d d�D ]1\}}|d u s|d u rt  S t ||d d�D ]\}	}
| j|||	||
fi |¤Žtu r7t    S qqd S r  )r   rë   r³   )r;   rL   r  rñ   r  rò   r   ÚlseqÚrseqÚldÚrdr'   r'   r(   r¼   Ÿ  s   
ÿÿýûþüz2TraversalComparatorStrategy.visit_dml_multi_valuesc                 K  sF   |j |j u r!t |j ¡r| j|j|jfi |¤ŽrddgS tS dgS tS )Nrï   Úclauses)rï   r   Úis_associativer  r_  rë   ©r;   rñ   rò   r   r'   r'   r(   Úcompare_expression_clauselist¯  s   ÿÿz9TraversalComparatorStrategy.compare_expression_clauselistc                 K  ó   | j ||fi |¤ŽS r:   )rb  ra  r'   r'   r(   Úcompare_clauselist½  ó   z.TraversalComparatorStrategy.compare_clauselistc                 K  s�   |j |j krFt |j ¡rB| j|j|jfi |¤Žr$| j|j|jfi |¤Žs<| j|j|jfi |¤Žr@| j|j|jfi |¤Žr@g d¢S tS ddgS tS )N)rï   Únegaterñ   rò   rï   rf  )rï   r   Úis_commutativerý   rñ   rò   rë   ra  r'   r'   r(   Úcompare_binaryÀ  s   ÿþüûz*TraversalComparatorStrategy.compare_binaryc                 K  s<   |  dd¡}|  dd¡}|rg }nddg}|s| d¡ |S )NÚcompare_keysTÚcompare_valuesÚcallabler£   r¢   )Úpoprç   )r;   rñ   rò   r   ri  rj  Úomitr'   r'   r(   Úcompare_bindparamÒ  s   
z-TraversalComparatorStrategy.compare_bindparamN)r   r   r   r   r   r   r   r    )2rk   rl   rm   ro   rß   rà   r%   rý   rÆ   r½   r  rš   rŠ   rÍ   r  r§   rŸ   r“   r˜   r  rœ   rÏ   r  r   r(  r)  r*  r+  r,  r.  r/  r0  r2  r6  r7  r8  r>  r¬   r®   rR  rS  rT  r²   rU  r³   r¼   rb  rd  rh  rn  r'   r'   r'   r(   r$   Ó  s`    	
^

		r$   c                   @  s0   e Zd Z	ddd„Zdd„ Zdd„ Zd	d
„ ZdS )r#   Tr'   c                 K  s\   |f}|r||v r||   |¡}|D ]}|r| |¡rt  S t|ƒt|ƒkr+t  S qtS )z…Compare ColumnElements using proxies and equivalent collections.

        This is a comparison strategy specific to the ORM.
        )ÚunionÚshares_lineagerì   Úhashrë   )r;   rñ   rò   r!   Úequivalentsr   Ú
to_compareÚothr'   r'   r(   Úcompare_column_elementã  s   ÿz4ColIdentityComparatorStrategy.compare_column_elementc                 K  rc  r:   ©ru  ra  r'   r'   r(   Úcompare_column÷  re  z,ColIdentityComparatorStrategy.compare_columnc                 K  rc  r:   rv  ra  r'   r'   r(   Úcompare_labelú  re  z+ColIdentityComparatorStrategy.compare_labelc                 K  s   ||u rt S tS r:   )rì   rë   ra  r'   r'   r(   Úcompare_tableý  r‹   z+ColIdentityComparatorStrategy.compare_tableN)Tr'   )rk   rl   rm   ru  rw  rx  ry  r'   r'   r'   r(   r#   â  s    
ÿr#   )r   r   r   r   r   r   r   r    )r)   r*   r   r+   )6Ú
__future__r   Úcollectionsr   Úcollections.abcÚabcrX  rÉ   r   rï   rp   r   r   r   r   r	   r
   r   r   r   Ú r   Ú	cache_keyr   Úvisitorsr   r   r   r   r   r   r   Úutil.typingr   Úsymbolrì   rë   ÚCOMPARE_SUCCEEDEDr%   r6   r7   rs   rj   rx   r†   r2   rÁ   rÂ   r4   Úpreload_modulerÛ   ÚMemoizedSlotsr$   r#   r'   r'   r'   r(   Ú<module>   s`   



r&}	G
    