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'   [/var/www/html/ecg_monitoring/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 ).HasShallowCopyzattribute-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 )	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 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 rql|d usJ |d usJ |d usJ | |}|d usJ | 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 )zCompare 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
    