U
    dE                     @  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ddd d!Z&d"d#d$d%d&Z'G d'd( d(eZ(G d)d* d*e(Z)d+d, Z*G d-d. d.eZ+G d/d0 d0eZ,e, Z-d1d2 Z.G d3d4 d4eZ/e/ Z0e1d5d6d7 Z2G d8d9 d9eej3Z4G d:d; d;e4Z5dS )<    )annotations)dequeN)zip_longest)Any)Callable)Deque)Dict)Iterable)Optional)Set)Tuple)Type   )	operators)HasCacheKey)_TraverseInternalsTypeanon_map)ExternallyTraversible)HasTraversalDispatch)HasTraverseInternals   )util)langhelpers)SelfZskip_traverseFTr   boolobj1obj2kwreturnc                 K  s*   | ddrt }nt }|j| |f|S )Nuse_proxiesF)getColIdentityComparatorStrategyTraversalComparatorStrategycompare)r   r   r   Zstrategy r&   =/tmp/pip-unpacked-wheel-wbr0uges/sqlalchemy/sql/traversals.pyr%   ,   s    r%   z	Type[Any]None)target_hierarchyr    c                 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_traversalZ!_generated_get_children_traversal)r   Zwalk_subclasseshasattrr*   _copy_internalsZgenerate_dispatchr+   _get_children)r)   clsr&   r&   r'   _preconfigure_traversals6   s      r1   c                   @  s   e Zd ZdZdZejrDdddddZddd	d
dZddddZ	e
ddddddZe
ddddddZe
ddddddZddd	ddZddddZddddd Zd!dd"d#d$Zd%S )&HasShallowCopyzattribute-wide operations that are useful for classes that use
    __slots__ and therefore can't operate on their attributes in a dictionary.


    r&   r   r(   )otherr    c                 C  s   d S Nr&   )selfr3   r&   r&   r'   !_generated_shallow_copy_traversalS   s    z0HasShallowCopy._generated_shallow_copy_traversalzDict[str, Any])dr    c                 C  s   d S r4   r&   )r5   r7   r&   r&   r'   &_generated_shallow_from_dict_traversalV   s    z5HasShallowCopy._generated_shallow_from_dict_traversalr    c                 C  s   d S r4   r&   r5   r&   r&   r'   $_generated_shallow_to_dict_traversal[   s    z3HasShallowCopy._generated_shallow_to_dict_traversalr   strzCallable[[Self, Self], None])internal_dispatchmethod_namer    c                 C  s4   d dd |D }d| d| d}t|i |S )N
c                 s  s"   | ]\}}d | d| V  qdS )z
    other.z = self.Nr&   .0attrname_r&   r&   r'   	<genexpr>d   s   z8HasShallowCopy._generate_shallow_copy.<locals>.<genexpr>def z(self, other):
joinr   Z_exec_code_in_envr0   r=   r>   codeZ	meth_textr&   r&   r'   _generate_shallow_copy^   s
    
z%HasShallowCopy._generate_shallow_copyz Callable[[Self], Dict[str, Any]]c                 C  s4   d dd |D }d| d| d}t|i |S )Nz,
c                 s  s"   | ]\}}d | d| V  qdS )z    'z': self.Nr&   r@   r&   r&   r'   rD   q   s   z;HasShallowCopy._generate_shallow_to_dict.<locals>.<genexpr>rE   z(self):
    return {z}
rF   rH   r&   r&   r'   _generate_shallow_to_dictk   s
    
z(HasShallowCopy._generate_shallow_to_dictz&Callable[[Self, Dict[str, Any]], None]c                 C  s4   d dd |D }d| d| d}t|i |S )Nr?   c                 s  s$   | ]\}}d | d| dV  qdS )z	    self.z = d['z']Nr&   r@   r&   r&   r'   rD   ~   s   z=HasShallowCopy._generate_shallow_from_dict.<locals>.<genexpr>rE   z(self, d):
rF   rH   r&   r&   r'   _generate_shallow_from_dictx   s
    
z*HasShallowCopy._generate_shallow_from_dictc                 C  sL   | j }z|jd }W n( tk
r<   | |jd}||_Y nX || | d S )Nr8   )	__class____dict__KeyErrorrL   r+   r8   )r5   r7   r0   Zshallow_from_dictr&   r&   r'   _shallow_from_dict   s    z!HasShallowCopy._shallow_from_dictc                 C  sF   | j }z|jd }W n( tk
r<   | |jd}||_Y nX || S )Nr;   )rM   rN   rO   rK   r+   r;   )r5   r0   Zshallow_to_dictr&   r&   r'   _shallow_to_dict   s     zHasShallowCopy._shallow_to_dictc                 C  sL   | j }z|jd }W n( tk
r<   | |jd}||_Y nX || | d S )Nr6   )rM   rN   rO   rJ   r+   r6   )r5   r3   r0   Zshallow_copyr&   r&   r'   _shallow_copy_to   s     zHasShallowCopy._shallow_copy_tor   )r   r    c                 K  s   | j | j }| | |S )zCreate a shallow copyrM   __new__rR   )r5   r   cr&   r&   r'   _clone   s    
zHasShallowCopy._cloneN)__name__
__module____qualname____doc__	__slots__typingTYPE_CHECKINGr6   r8   r;   classmethodrJ   rK   rL   rP   rQ   rR   rV   r&   r&   r&   r'   r2   H   s    r2   c                   @  s"   e Zd ZdZdZddddZdS )GenerativeOnTraversalzSupplies Generative behavior but making use of traversals to shallow
    copy.

    .. seealso::

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


    r&   r   r9   c                 C  s   | j }||}| | |S r4   rS   )r5   r0   sr&   r&   r'   	_generate   s    

zGenerativeOnTraversal._generateN)rW   rX   rY   rZ   r[   ra   r&   r&   r&   r'   r_      s   
r_   c                 K  s   |   S r4   )rV   )elementr   r&   r&   r'   rV      s    rV   c                   @  s0   e Zd ZdZdd Zddddddd	d
ZdS )HasCopyInternalsr&   c                 K  s
   t  d S r4   NotImplementedError)r5   r   r&   r&   r'   rV      s    zHasCopyInternals._clone)
omit_attrszIterable[str]r   r(   )rf   r   r    c                K  sv   z
| j }W n tk
r    Y dS X t| |dD ]@\}}}||krDq0|dk	r0||| |f|}|dk	r0t| || q0d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+   AttributeErrorr.   Zrun_generated_dispatchsetattr)r5   rf   r   Ztraverse_internalsrB   objmethresultr&   r&   r'   r.      s    
  z HasCopyInternals._copy_internalsN)rW   rX   rY   r[   rV   r.   r&   r&   r&   r'   rc      s   rc   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|S r4   r&   r5   rB   parentrb   cloner   r&   r&   r'   visit_clauseelement   s    z+_CopyInternalsTraversal.visit_clauseelementc                   s    fdd|D S )Nc                   s   g | ]} |fqS r&   r&   rA   clausero   r   r&   r'   
<listcomp>  s     zD_CopyInternalsTraversal.visit_clauseelement_list.<locals>.<listcomp>r&   rm   r&   rs   r'   visit_clauseelement_list  s    z0_CopyInternalsTraversal.visit_clauseelement_listc                   s   t  fdd|D S )Nc                   s   g | ]} |fqS r&   r&   rq   rs   r&   r'   rt     s     zE_CopyInternalsTraversal.visit_clauseelement_tuple.<locals>.<listcomp>tuplerm   r&   rs   r'   visit_clauseelement_tuple	  s    z1_CopyInternalsTraversal.visit_clauseelement_tuplec                   s   t  fdd|D S )Nc                   s   g | ]} |fqS r&   r&   rq   rs   r&   r'   rt     s     zD_CopyInternalsTraversal.visit_executable_options.<locals>.<listcomp>rv   rm   r&   rs   r'   visit_executable_options  s    z0_CopyInternalsTraversal.visit_executable_optionsc                   s    fdd|D S )Nc                   s   h | ]} |fqS r&   r&   rq   rs   r&   r'   	<setcomp>  s     zL_CopyInternalsTraversal.visit_clauseelement_unordered_set.<locals>.<setcomp>r&   rm   r&   rs   r'   !visit_clauseelement_unordered_set  s    z9_CopyInternalsTraversal.visit_clauseelement_unordered_setc                   s    fdd|D S )Nc                   s$   g | ]}t  fd d|D qS )c                 3  s   | ]} |fV  qd S r4   r&   )rA   Ztup_elemrs   r&   r'   rD     s     zP_CopyInternalsTraversal.visit_clauseelement_tuples.<locals>.<listcomp>.<genexpr>rv   )rA   elemrs   r&   r'   rt     s   zF_CopyInternalsTraversal.visit_clauseelement_tuples.<locals>.<listcomp>r&   rm   r&   rs   r'   visit_clauseelement_tuples  s    z2_CopyInternalsTraversal.visit_clauseelement_tuplesc                   s    fdd|  D S )Nc                   s   i | ]\}}| |fqS r&   r&   rA   keyvaluers   r&   r'   
<dictcomp>#  s      zK_CopyInternalsTraversal.visit_string_clauseelement_dict.<locals>.<dictcomp>itemsrm   r&   rs   r'   visit_string_clauseelement_dict   s    z7_CopyInternalsTraversal.visit_string_clauseelement_dictc                   s   t  fdd|D S )Nc                 3  s^   | ]V\}}}}|d k	r" |fnd |d k	r8 |fnd |d k	rN |fnd |fV  qd S r4   r&   )rA   targetonclausefrom_flagsrs   r&   r'   rD   (  s   
zA_CopyInternalsTraversal.visit_setup_join_tuple.<locals>.<genexpr>rv   rm   r&   rs   r'   visit_setup_join_tuple%  s    z._CopyInternalsTraversal.visit_setup_join_tuplec                 K  s   | j |||f|S r4   rx   )r5   rB   rn   rb   r   r&   r&   r'   visit_memoized_select_entities2  s    z6_CopyInternalsTraversal.visit_memoized_select_entitiesc                   s    fdd|D S )Nc                   s6   g | ].\}}t |d r" |fn| |ffqS __clause_element__r-   r~   rs   r&   r'   rt   9  s   
zD_CopyInternalsTraversal.visit_dml_ordered_values.<locals>.<listcomp>r&   rm   r&   rs   r'   visit_dml_ordered_values5  s    z0_CopyInternalsTraversal.visit_dml_ordered_valuesc                   s    fdd|  D S )Nc                   s4   i | ],\}}t |d r" |fn| |fqS r   r   r~   rs   r&   r'   r   D  s   z<_CopyInternalsTraversal.visit_dml_values.<locals>.<dictcomp>r   rm   r&   rs   r'   visit_dml_valuesC  s    z(_CopyInternalsTraversal.visit_dml_valuesc                   s     fddfdd|D S )Nc                   sP   t | ttfr" fdd| D S t | trD fdd|  D S dsLtd S )Nc                   s&   g | ]}t |d r |fn|qS r   r   )rA   r   rs   r&   r'   rt   R  s   zP_CopyInternalsTraversal.visit_dml_multi_values.<locals>.copy.<locals>.<listcomp>c                   sB   i | ]:\}}t |d r" |fn|t |d r: |fn|qS r   r   r~   rs   r&   r'   r   Y  s   
zP_CopyInternalsTraversal.visit_dml_multi_values.<locals>.copy.<locals>.<dictcomp>F)
isinstancelistrw   dictr   AssertionErrorr|   rs   r&   r'   copyP  s    

z<_CopyInternalsTraversal.visit_dml_multi_values.<locals>.copyc                   s   g | ]} fd d|D qS )c                   s   g | ]} |qS r&   r&   )rA   Zsub_elementr   r&   r'   rt   j  s     zM_CopyInternalsTraversal.visit_dml_multi_values.<locals>.<listcomp>.<listcomp>r&   )rA   sequencer   r&   r'   rt   i  s   zB_CopyInternalsTraversal.visit_dml_multi_values.<locals>.<listcomp>r&   rm   r&   )ro   r   r   r'   visit_dml_multi_valuesK  s    
z._CopyInternalsTraversal.visit_dml_multi_valuesc                 K  s   |S r4   r&   rm   r&   r&   r'   visit_propagate_attrsn  s    z-_CopyInternalsTraversal.visit_propagate_attrsN)rW   rX   rY   rZ   rV   rp   ru   rx   ry   r{   r}   r   r   r   r   r   r   r   r&   r&   r&   r'   rl      s2   





	


	
$rl   c                 C  s$   t | dr t| dds |  } q | S )Nr   Zis_clause_elementF)r-   getattrr   )rb   r&   r&   r'   _flatten_clauseelementw  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  s   dS Nr&   r&   r5   rb   r   r&   r&   r'   visit_has_cache_key  s    z)_GetChildrenTraversal.visit_has_cache_keyc                 K  s   |fS r4   r&   r   r&   r&   r'   rp     s    z)_GetChildrenTraversal.visit_clauseelementc                 K  s   |S r4   r&   r   r&   r&   r'   ru     s    z._GetChildrenTraversal.visit_clauseelement_listc                 K  s   |S r4   r&   r   r&   r&   r'   rx     s    z/_GetChildrenTraversal.visit_clauseelement_tuplec                 K  s   t j|S r4   )	itertoolschainfrom_iterabler   r&   r&   r'   r}     s    z0_GetChildrenTraversal.visit_clauseelement_tuplesc                 K  s   dS r   r&   r   r&   r&   r'   ,visit_fromclause_canonical_column_collection  s    zB_GetChildrenTraversal.visit_fromclause_canonical_column_collectionc                 K  s   |  S r4   )valuesr   r&   r&   r'   r     s    z5_GetChildrenTraversal.visit_string_clauseelement_dictc                 K  s   |S r4   r&   r   r&   r&   r'   visit_fromclause_ordered_set  s    z2_GetChildrenTraversal.visit_fromclause_ordered_setc                 K  s   |S r4   r&   r   r&   r&   r'   r{     s    z7_GetChildrenTraversal.visit_clauseelement_unordered_setc                 k  sT   |D ]J\}}}}|d k	r|V  t |ts2t|V  |d k	rt |tst|V  qd S r4   )r   r<   r   )r5   rb   r   r   r   r   r   r&   r&   r'   r     s    

z,_GetChildrenTraversal.visit_setup_join_tuplec                 K  s   | j |f|S r4   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   )r5   rb   r   kvr&   r&   r'   r     s    
z._GetChildrenTraversal.visit_dml_ordered_valuesc                 k  sN   dd |D }| |}t|D ]}|| V  q |D ]}|V  || V  q4d S )Nc                 S  s   h | ]}t |d r|qS r   r   )rA   r   r&   r&   r'   rz     s     
 z9_GetChildrenTraversal.visit_dml_values.<locals>.<setcomp>)symmetric_differencesorted)r5   rb   r   Zexpr_valuesZ
str_valuesr   r&   r&   r'   r     s    
z&_GetChildrenTraversal.visit_dml_valuesc                 K  s   dS r   r&   r   r&   r&   r'   r     s    z,_GetChildrenTraversal.visit_dml_multi_valuesc                 K  s   dS r   r&   r   r&   r&   r'   r     s    z+_GetChildrenTraversal.visit_propagate_attrsN)rW   rX   rY   rZ   r   rp   ru   rx   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 r4   )r   r   Z	preloadedZsql_elementsZ_anonymous_labelZ	apply_map)rb   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ddddd	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*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Zd>d? Z d@dA Z!dBdC Z"dDdE Z#dFdG Z$dHdI Z%dJdK Z&dLdM Z'dNdO Z(dPdQ Z)dRdS Z*dTdU Z+dVdW Z,dXdY Z-dZd[ Z.d\d] Z/d^d_ Z0d`da Z1dbS )cr$   )stackcacher   c                 C  s   t  | _t | _d S r4   )r   r   setr   r:   r&   r&   r'   __init__  s    z$TraversalComparatorStrategy.__init__c                 C  s   t  t  fS r4   r   r:   r&   r&   r'   _memoized_attr_anon_map  s    z3TraversalComparatorStrategy._memoized_attr_anon_mapr   r   r   r   c                 K  s  | j }| j}|dd}|||f |r| \}}||krDq&n"|d ksT|d krXdS ||f|krfq&|||f |j}	|	|jkrdS t| d|	 d }
|
r|
||f|}|tkrdS |t	krq&nd}t
|j|jddD ]\\}}\}}|s|dks|dkrq||ks||k	r dS ||kr*q|d k	s8t|d k	sFt|d k	sTt| |}|d k	st| j d| j|  d	t||}t||}|d kr|d k	r dS q||||||f|}|tkr dS qq&d
S )Ncompare_annotationsFz
compare_%sr&   NN	fillvalueZ_annotationsz has no dispatch for ''T)r   r   r"   appendpopleftaddZ__visit_name__r   COMPARE_FAILEDSKIP_TRAVERSEr   r+   r   dispatchrM   Z_dispatch_lookupoperator
attrgetter)r5   r   r   r   r   r   r   leftrightZ
visit_namerj   Zattributes_comparedZleft_attrnameZleft_visit_symZright_attrnameZright_visit_symr   Z
left_childZright_childZ
comparisonr&   r&   r'   r%     s    



    
z#TraversalComparatorStrategy.comparec                 K  s   |   }|j||f|S r4   )rM   r%   )r5   r   r   r   Z
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   r5   rB   left_parentr   right_parentr   r   r&   r&   r'   r   A  s
     z/TraversalComparatorStrategy.visit_has_cache_keyc                 K  s   |  |dd |dd S )NZplugin_subject)r   r"   r   r&   r&   r'   r   I  s    
 
z1TraversalComparatorStrategy.visit_propagate_attrsc           	      K  st   t ||d dD ]`\}}|d kr2|d k	rt  S qn|d krBt  S || jd g || jd g krt  S qd S Nr   r   r   )r   r   r   r   	r5   rB   r   r   r   r   r   lrr&   r&   r'   visit_has_cache_key_listP  s     z4TraversalComparatorStrategy.visit_has_cache_key_listc           	      K  s   t ||d dD ]t\}}|d kr2|d k	rt  S qn|d krBt  S |jrZ|| jd g n||jrt|| jd g n|krt  S qd S r   )r   r   Z_is_has_cache_keyr   r   r   r&   r&   r'   ry   a  s    	z4TraversalComparatorStrategy.visit_executable_optionsc                 K  s   | j ||f d S r4   )r   r   r   r&   r&   r'   rp   x  s    z/TraversalComparatorStrategy.visit_clauseelementc           	      K  s,   t ||d dD ]\}}| j||f qd S Nr   r   r   r   )	r5   rB   r   r   r   r   r   ZlcolZrcolr&   r&   r'   r   }  s    zHTraversalComparatorStrategy.visit_fromclause_canonical_column_collectionc                 K  s   d S r4   r&   r   r&   r&   r'   *visit_fromclause_derived_column_collection  s    zFTraversalComparatorStrategy.visit_fromclause_derived_column_collectionc           	      K  sL   t t|t|d dD ]0\}}||kr.t  S | j|| || f qd S r   )r   r   r   r   r   )	r5   rB   r   r   r   r   r   ZlstrZrstrr&   r&   r'   r     s      z;TraversalComparatorStrategy.visit_string_clauseelement_dictc                 K  s\   t ||d dD ]H\}}|d ks&|d kr.t  S t ||d dD ]\}	}
| j|	|
f q<qd S r   r   r   r   r   )r5   rB   r   r   r   r   r   ZltupZrtupr   r   r&   r&   r'   r}     s
    z6TraversalComparatorStrategy.visit_clauseelement_tuplesc           	      K  s,   t ||d dD ]\}}| j||f qd S r   r   r   r&   r&   r'   ru     s    z4TraversalComparatorStrategy.visit_clauseelement_listc           	      K  s,   t ||d dD ]\}}| j||f qd S r   r   r   r&   r&   r'   rx     s    z5TraversalComparatorStrategy.visit_clauseelement_tuplec                 K  sv   |d kr|d kS t  }|D ]6}t ||D ]"}| j||f|r,||  qq,qt|t|  kopt|kS   S r4   )r   
differencer   r   len)r5   Zseq1Zseq2r   Z	completedrr   Zother_clauser&   r&   r'   _compare_unordered_sequences  s    
z8TraversalComparatorStrategy._compare_unordered_sequencesc                 K  s   | j ||f|S r4   )r   r   r&   r&   r'   r{     s    z=TraversalComparatorStrategy.visit_clauseelement_unordered_setc           	      K  s,   t ||d dD ]\}}| j||f qd S r   r   r   r&   r&   r'   r     s    z8TraversalComparatorStrategy.visit_fromclause_ordered_setc                 K  s   ||kS r4   r&   r   r&   r&   r'   visit_string  s    z(TraversalComparatorStrategy.visit_stringc                 K  s   ||kS r4   r&   r   r&   r&   r'   visit_string_list  s    z-TraversalComparatorStrategy.visit_string_listc                 K  s   t t| t| ddD ]\}}||kr6t  S || ||  }	}
t|t}t|t}|r|r|	| jd g |
| jd g krt  S q||krt  S |	|
krt  S qd S )Nr   r   r   r   )r   r   keysr   r   r   r   r   )r5   rB   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}|rF|rF|| jd g || jd g krZtS n||krRtS ||kS d S r   )r   r   r   r   r   )	r5   rB   r   r   r   r   r   r   r   r&   r&   r'   visit_multi  s    

 z'TraversalComparatorStrategy.visit_multic                 K  s,   t ||| jd f|t ||| jd f|kS r   )r   r   r   r&   r&   r'   visit_anon_name  s        z+TraversalComparatorStrategy.visit_anon_namec                 K  s   ||kS r4   r&   r   r&   r&   r'   visit_boolean  s    z)TraversalComparatorStrategy.visit_booleanc                 K  s   ||kS r4   r&   r   r&   r&   r'   visit_operator  s    z*TraversalComparatorStrategy.visit_operatorc                 K  s
   | |S r4   )Z_compare_type_affinityr   r&   r&   r'   
visit_type  s    z&TraversalComparatorStrategy.visit_typec                 K  s   ||kS r4   r&   r   r&   r&   r'   visit_plain_dict	  s    z,TraversalComparatorStrategy.visit_plain_dictc                 K  s   ||kS r4   r&   r   r&   r&   r'   visit_dialect_options  s    z1TraversalComparatorStrategy.visit_dialect_optionsc                 K  s    |r|r|j |j kS ||kS d S r4   )Z_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 r4   )__code__)rA   fnZc_keyr&   r&   r'   rD   !  s     zITraversalComparatorStrategy.visit_with_context_options.<locals>.<genexpr>rv   r   r&   r&   r'   visit_with_context_options  s    z6TraversalComparatorStrategy.visit_with_context_optionsc                 K  s   ||kS r4   r&   r   r&   r&   r'   visit_plain_obj%  s    z+TraversalComparatorStrategy.visit_plain_objc                 K  s    |d kr|d k	rt S |j|jkS r4   )r   r   r   r&   r&   r'   visit_named_ddl_element*  s    z3TraversalComparatorStrategy.visit_named_ddl_elementc                 K  sD   t ||ddD ]0\\}}\}	}
||
kr.t  S | j||	f qd S Nr   r   r   )r5   rB   r   r   r   r   r   Zl_clauseZl_strZr_clauseZr_strr&   r&   r'   visit_prefix_sequence3  s      z1TraversalComparatorStrategy.visit_prefix_sequencec                 K  sl   t ||ddD ]X\\}}}	}
\}}}}|
|kr6t  S | j||f | j||f | j|	|f qd S )N)NNNNr   r   )r5   rB   r   r   r   r   r   Zl_targetZ
l_onclauseZl_fromZl_flagsZr_targetZ
r_onclauseZr_fromZr_flagsr&   r&   r'   r   >  s    

z2TraversalComparatorStrategy.visit_setup_join_tuplec                 K  s   | j |||||f|S r4   r   r   r&   r&   r'   r   L  s        z:TraversalComparatorStrategy.visit_memoized_select_entitiesc                 K  s   t |dd d}t |dd d}t||ddD ]P\\}	}
\}}|
|krNt  S ||	|
f |||f krnt  S | j|	|f q.d S )Nc                 S  s   | d j | d fS r   fullnamer   r&   r&   r'   <lambda>V      zCTraversalComparatorStrategy.visit_table_hint_list.<locals>.<lambda>)r   c                 S  s   | d j | d fS r   r   r   r&   r&   r'   r   X  r   r   r   )r   r   r   r   r   )r5   rB   r   r   r   r   r   Z	left_keysZ
right_keysZltableZldialectZrtableZrdialectr&   r&   r'   visit_table_hint_listS  s       z1TraversalComparatorStrategy.visit_table_hint_listc                 K  s   ||kS r4   r&   r   r&   r&   r'   visit_statement_hint_listd  s    z5TraversalComparatorStrategy.visit_statement_hint_listc                 K  s
   t  d S r4   rd   r   r&   r&   r'   visit_unknown_structurei  s    z3TraversalComparatorStrategy.visit_unknown_structurec                 K  s<   t ||ddD ](\\}}\}	}
| j||	f|st  S qd S r   )r   _compare_dml_values_or_cer   )r5   rB   r   r   r   r   r   r   r   r   r   r&   r&   r'   r   n  s      z4TraversalComparatorStrategy.visit_dml_ordered_valuesc                 K  s`   t |d}t |d}||kr dS |r8| j||f|s8dS |sH||krHdS | j||f|s\dS dS )Nr   FT)r-   r   )r5   r   r   r   ZlvceZrvcer&   r&   r'   r   y  s    

z5TraversalComparatorStrategy._compare_dml_values_or_cec                 K  s   |d ks |d ks t |t |kr$tS t|tjr^t||D ] \}}| j||f|s:t  S q:ndt|tjrntS t| | D ]@\\}	}\}
}| j|	|
f|st  S | j||f|st  S qd S r4   )r   r   r   collections_abcSequencezipr   r   )r5   rB   r   r   r   r   r   r   r   r   r   r&   r&   r'   r     s     "z,TraversalComparatorStrategy.visit_dml_valuesc                 K  sr   t ||d dD ]^\}}|d ks&|d kr.t  S t ||d dD ].\}	}
| j|||	||
f|tkr<t    S q<qd S r   )r   r   r   )r5   rB   r   r   r   r   r   ZlseqZrseqZldrdr&   r&   r'   r     s"        z2TraversalComparatorStrategy.visit_dml_multi_valuesc                 K  sJ   |j |j krBt|j r:| j|j|jf|r4ddgS tS qFdgS ntS d S )Nr   clauses)r   r   Zis_associativer   r   r   r5   r   r   r   r&   r&   r'   compare_expression_clauselist  s     z9TraversalComparatorStrategy.compare_expression_clauselistc                 K  s   | j ||f|S r4   )r   r   r&   r&   r'   compare_clauselist  s    z.TraversalComparatorStrategy.compare_clauselistc                 K  s   |j |j krt|j rz| j|j|jf|r@| j|j|jf|sh| j|j|jf|rt| j|j|jf|rtddddgS tS qddgS ntS d S )Nr   negater   r   )r   r   Zis_commutativer   r   r   r   r   r&   r&   r'   compare_binary  s    
z*TraversalComparatorStrategy.compare_binaryc                 K  s<   | dd}| dd}|r"g }nddg}|s8|d |S )Ncompare_keysTcompare_valuescallabler   r   )popr   )r5   r   r   r   r   r   Zomitr&   r&   r'   compare_bindparam  s    
z-TraversalComparatorStrategy.compare_bindparamN)2rW   rX   rY   r[   r   r   r%   r   r   r   r   ry   rp   r   r   r   r}   ru   rx   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   r   r   r   r  r&   r&   r&   r'   r$     s^   	\

		r$   c                   @  s.   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 ||kr ||  |}|D ]2}|r>||r>t  S t|t|kr$t  S q$tS )zCompare ColumnElements using proxies and equivalent collections.

        This is a comparison strategy specific to the ORM.
        N)unionZshares_lineager   hashr   )r5   r   r   r!   Zequivalentsr   Z
to_compareZothr&   r&   r'   compare_column_element  s    
z4ColIdentityComparatorStrategy.compare_column_elementc                 K  s   | j ||f|S r4   r  r   r&   r&   r'   compare_column  s    z,ColIdentityComparatorStrategy.compare_columnc                 K  s   | j ||f|S r4   r  r   r&   r&   r'   compare_label  s    z+ColIdentityComparatorStrategy.compare_labelc                 K  s   ||krt S tS r4   )r   r   r   r&   r&   r'   compare_table  s    z+ColIdentityComparatorStrategy.compare_tableN)Tr&   )rW   rX   rY   r  r  r  r	  r&   r&   r&   r'   r#     s      
r#   )6
__future__r   collectionsr   collections.abcabcr   r   r   r   r\   r   r   r   r   r	   r
   r   r   r    r   	cache_keyr   Zvisitorsr   r   r   r   r   r   r   Zutil.typingr   symbolr   r   ZCOMPARE_SUCCEEDEDr%   r1   r2   r_   rV   rc   rl   r.   r   r   r/   Zpreload_moduler   ZMemoizedSlotsr$   r#   r&   r&   r&   r'   <module>	   s^   

u&y	G
    