U
    ovg                     @  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-uqd9otp_/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       z0HasShallowCopy._generated_shallow_copy_traversalzDict[str, Any])dr    c                 C  s   d S r4   r&   )r5   r8   r&   r&   r'   &_generated_shallow_from_dict_traversalU   s    z5HasShallowCopy._generated_shallow_from_dict_traversalr    c                 C  s   d S r4   r&   r5   r&   r&   r'   $_generated_shallow_to_dict_traversalY   r7   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>a   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&   rA   r&   r&   r'   rE   n   s   z;HasShallowCopy._generate_shallow_to_dict.<locals>.<genexpr>rF   z(self):
    return {z}
rG   rI   r&   r&   r'   _generate_shallow_to_dicth   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&   rA   r&   r&   r'   rE   {   s   z=HasShallowCopy._generate_shallow_from_dict.<locals>.<genexpr>rF   z(self, d):
rG   rI   r&   r&   r'   _generate_shallow_from_dictu   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 )Nr9   )	__class____dict__KeyErrorrM   r+   r9   )r5   r8   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<   )rN   rO   rP   rL   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   )rN   rO   rP   rK   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rN   __new__rS   )r5   r   cr&   r&   r'   _clone   s    
zHasShallowCopy._cloneN)__name__
__module____qualname____doc__	__slots__typingTYPE_CHECKINGr6   r9   r<   classmethodrK   rL   rM   rQ   rR   rS   rW   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   r:   c                 C  s   | j }||}| | |S r4   rT   )r5   r0   sr&   r&   r'   	_generate   s    

zGenerativeOnTraversal._generateN)rX   rY   rZ   r[   r\   rb   r&   r&   r&   r'   r`      s   
r`   c                 K  s   |   S r4   )rW   )elementr   r&   r&   r'   rW      s    rW   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'   rW      s    zHasCopyInternals._clone)
omit_attrszIterable[str]r   r(   )rg   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   rg   r   Ztraverse_internalsrC   objmethresultr&   r&   r'   r.      s    
  z HasCopyInternals._copy_internalsN)rX   rY   rZ   r\   rW   r.   r&   r&   r&   r'   rd      s   rd   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   rC   parentrc   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&   rB   clauserp   r   r&   r'   
<listcomp>  s     zD_CopyInternalsTraversal.visit_clauseelement_list.<locals>.<listcomp>r&   rn   r&   rt   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&   rr   rt   r&   r'   ru   	  s     zE_CopyInternalsTraversal.visit_clauseelement_tuple.<locals>.<listcomp>tuplern   r&   rt   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&   rr   rt   r&   r'   ru     s     zD_CopyInternalsTraversal.visit_executable_options.<locals>.<listcomp>rw   rn   r&   rt   r'   visit_executable_options  s    z0_CopyInternalsTraversal.visit_executable_optionsc                   s    fdd|D S )Nc                   s   h | ]} |fqS r&   r&   rr   rt   r&   r'   	<setcomp>  s     zL_CopyInternalsTraversal.visit_clauseelement_unordered_set.<locals>.<setcomp>r&   rn   r&   rt   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&   )rB   Ztup_elemrt   r&   r'   rE     s     zP_CopyInternalsTraversal.visit_clauseelement_tuples.<locals>.<listcomp>.<genexpr>rw   )rB   elemrt   r&   r'   ru     s   zF_CopyInternalsTraversal.visit_clauseelement_tuples.<locals>.<listcomp>r&   rn   r&   rt   r'   visit_clauseelement_tuples  s    z2_CopyInternalsTraversal.visit_clauseelement_tuplesc                   s    fdd|  D S )Nc                   s   i | ]\}}| |fqS r&   r&   rB   keyvaluert   r&   r'   
<dictcomp>   s      zK_CopyInternalsTraversal.visit_string_clauseelement_dict.<locals>.<dictcomp>itemsrn   r&   rt   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&   )rB   targetonclausefrom_flagsrt   r&   r'   rE   %  s   
zA_CopyInternalsTraversal.visit_setup_join_tuple.<locals>.<genexpr>rw   rn   r&   rt   r'   visit_setup_join_tuple"  s    z._CopyInternalsTraversal.visit_setup_join_tuplec                 K  s   | j |||f|S r4   ry   )r5   rC   ro   rc   r   r&   r&   r'   visit_memoized_select_entities/  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   rt   r&   r'   ru   6  s   	
zD_CopyInternalsTraversal.visit_dml_ordered_values.<locals>.<listcomp>r&   rn   r&   rt   r'   visit_dml_ordered_values2  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   rt   r&   r'   r   C  s   z<_CopyInternalsTraversal.visit_dml_values.<locals>.<dictcomp>r   rn   r&   rt   r'   visit_dml_valuesB  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   )rB   r   rt   r&   r'   ru   Q  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   rt   r&   r'   r   Z  s   
zP_CopyInternalsTraversal.visit_dml_multi_values.<locals>.copy.<locals>.<dictcomp>F)
isinstancelistrx   dictr   AssertionErrorr}   rt   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&   )rB   Zsub_elementr   r&   r'   ru   k  s     zM_CopyInternalsTraversal.visit_dml_multi_values.<locals>.<listcomp>.<listcomp>r&   )rB   sequencer   r&   r'   ru   j  s   zB_CopyInternalsTraversal.visit_dml_multi_values.<locals>.<listcomp>r&   rn   r&   )rp   r   r   r'   visit_dml_multi_valuesJ  s    
z._CopyInternalsTraversal.visit_dml_multi_valuesc                 K  s   |S r4   r&   rn   r&   r&   r'   visit_propagate_attrso  s    z-_CopyInternalsTraversal.visit_propagate_attrsN)rX   rY   rZ   r[   rW   rq   rv   ry   rz   r|   r~   r   r   r   r   r   r   r   r&   r&   r&   r'   rm      s2   





	


	
&rm   c                 C  s$   t | dr t| dds |  } q | S )Nr   Zis_clause_elementF)r-   getattrr   )rc   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  s   dS Nr&   r&   r5   rc   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'   rq     s    z)_GetChildrenTraversal.visit_clauseelementc                 K  s   |S r4   r&   r   r&   r&   r'   rv     s    z._GetChildrenTraversal.visit_clauseelement_listc                 K  s   |S r4   r&   r   r&   r&   r'   ry     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   rc   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   rc   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   )rB   r   r&   r&   r'   r{     s     
 z9_GetChildrenTraversal.visit_dml_values.<locals>.<setcomp>)symmetric_differencesorted)r5   rc   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)rX   rY   rZ   r[   r   rq   rv   ry   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)rc   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 qn|d kr dS ||||||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   dispatchrN   Z_dispatch_lookupoperator
attrgetter)r5   r   r   r   r   r   r   leftrightZ
visit_namerk   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   )rN   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   rC   left_parentr   right_parentr   r   r&   r&   r'   r   D  s
     z/TraversalComparatorStrategy.visit_has_cache_keyc                 K  s   |  |dd |dd S )NZplugin_subject)r   r"   r   r&   r&   r'   r   L  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   rC   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 ]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'   rz   d  s    	z4TraversalComparatorStrategy.visit_executable_optionsc                 K  s   | j ||f d S r4   )r   r   r   r&   r&   r'   rq   {  s    z/TraversalComparatorStrategy.visit_clauseelementc           	      K  s,   t ||d dD ]\}}| j||f qd S Nr   r   r   r   )	r5   rC   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   rC   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   rC   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'   rv     s    z4TraversalComparatorStrategy.visit_clauseelement_listc           	      K  s,   t ||d dD ]\}}| j||f qd S r   r   r   r&   r&   r'   ry     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	completedrs   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   rC   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   rC   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__)rB   fnZc_keyr&   r&   r'   rE   "  s     zITraversalComparatorStrategy.visit_with_context_options.<locals>.<genexpr>rw   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   rC   r   r   r   r   r   Zl_clauseZl_strZr_clauseZr_strr&   r&   r'   visit_prefix_sequence4  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   rC   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   M  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>W  r7   zCTraversalComparatorStrategy.visit_table_hint_list.<locals>.<lambda>)r   c                 S  s   | d j | d fS r   r   r   r&   r&   r'   r   Y  r7   r   r   )r   r   r   r   r   )r5   rC   r   r   r   r   r   Z	left_keysZ
right_keysZltableZldialectZrtableZrdialectr&   r&   r'   visit_table_hint_listT  s       z1TraversalComparatorStrategy.visit_table_hint_listc                 K  s   ||kS r4   r&   r   r&   r&   r'   visit_statement_hint_liste  s    z5TraversalComparatorStrategy.visit_statement_hint_listc                 K  s
   t  d S r4   re   r   r&   r&   r'   visit_unknown_structurej  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   rC   r   r   r   r   r   r   r   r   r   r&   r&   r'   r   o  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   z  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   rC   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   rC   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)2rX   rY   rZ   r\   r   r   r%   r   r   r   r   rz   rq   r   r   r   r~   rv   ry   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&   )rX   rY   rZ   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`   rW   rd   rm   r.   r   r   r/   Zpreload_moduler   ZMemoizedSlotsr$   r#   r&   r&   r&   r'   <module>	   s^   

r&}	G
    