o
    E6d>                     @  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)SelfZ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   Zstrategy r%   pC:\Users\jesus\OneDrive\Desktop\erpjis_fastapi\backend\jisbackend\Lib\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_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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%   )selfr3   r%   r%   r&   !_generated_shallow_copy_traversalS      z0HasShallowCopy._generated_shallow_copy_traversaldDict[str, Any]c                 C  r4   r5   r%   )r6   r9   r%   r%   r&   &_generated_shallow_from_dict_traversalV      z5HasShallowCopy._generated_shallow_from_dict_traversalc                 C  r4   r5   r%   r6   r%   r%   r&   $_generated_shallow_to_dict_traversal[   r8   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>d   
    
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^   
   
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  rE   )z    'z': self.Nr%   rF   r%   r%   r&   rJ   q   rK   z;HasShallowCopy._generate_shallow_to_dict.<locals>.<genexpr>rL   z(self):
    return {z}
rM   rO   r%   r%   r&   _generate_shallow_to_dictk   rR   z(HasShallowCopy._generate_shallow_to_dict&Callable[[Self, Dict[str, Any]], None]c                 C  rC   )NrD   c                 s  s&    | ]\}}d | d| dV  qdS )z	    self.z = d['z']Nr%   rF   r%   r%   r&   rJ   ~   s
    
z=HasShallowCopy._generate_shallow_from_dict.<locals>.<genexpr>rL   z(self, d):
rM   rO   r%   r%   r&   _generate_shallow_from_dictx   rR   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__KeyErrorrV   r+   r;   )r6   r9   r0   Z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 )Nr>   )rX   rY   rZ   rT   r+   r>   )r6   r0   Zshallow_to_dictr%   r%   r&   _shallow_to_dict   s   	zHasShallowCopy._shallow_to_dictc                 C  rW   )Nr7   )rX   rY   rZ   rQ   r+   r7   )r6   r3   r0   Z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rX   __new__r]   )r6   r   cr%   r%   r&   _clone   s   
zHasShallowCopy._cloneN)r3   r   r   r)   )r9   r:   r   r)   )r   r:   )r?   r   r@   rA   r   rB   )r?   r   r@   rA   r   rS   )r?   r   r@   rA   r   rU   )r   r   r   r   )__name__
__module____qualname____doc__	__slots__typingTYPE_CHECKINGr7   r;   r>   classmethodrQ   rT   rV   r[   r\   r]   ra   r%   r%   r%   r&   r2   H   s"    





r2   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 r5   r^   )r6   r0   sr%   r%   r&   	_generate   s   

zGenerativeOnTraversal._generateN)r   r   )rb   rc   rd   re   rf   rl   r%   r%   r%   r&   rj      s    
rj   c                 K  s   |   S r5   )ra   )elementr   r%   r%   r&   ra         ra   c                   @  s(   e Zd ZdZdd ZdddddZdS )HasCopyInternalsr%   c                 K     t  r5   NotImplementedError)r6   r   r%   r%   r&   ra         zHasCopyInternals._clone)
omit_attrsrt   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+   AttributeErrorr.   Zrun_generated_dispatchsetattr)r6   rt   r   Ztraverse_internalsrH   objmethresultr%   r%   r&   r.      s    
z HasCopyInternals._copy_internalsN)rt   ru   r   r   r   r)   )rb   rc   rd   rf   ra   r.   r%   r%   r%   r&   ro      s
    ro   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 r5   r%   r6   rH   parentrm   cloner   r%   r%   r&   visit_clauseelement      z+_CopyInternalsTraversal.visit_clauseelementc                       fdd|D S )Nc                      g | ]
} |fi qS r%   r%   rG   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 r5   r%   )rG   Ztup_elemr   r%   r&   rJ     s    zP_CopyInternalsTraversal.visit_clauseelement_tuples.<locals>.<listcomp>.<genexpr>r   )rG   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%   rG   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 r5   r%   )rG   targetonclausefrom_flagsr   r%   r&   rJ   (  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 r5   r   )r6   rH   r}   rm   r   r%   r%   r&   visit_memoized_select_entities2  s   z6_CopyInternalsTraversal.visit_memoized_select_entitiesc                   r   )Nc                   s>   g | ]\}}t |d r |fi n| |fi fqS __clause_element__r-   r   r   r%   r&   r   9  s    zD_CopyInternalsTraversal.visit_dml_ordered_values.<locals>.<listcomp>r%   r|   r%   r   r&   visit_dml_ordered_values5  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   D  s
    z<_CopyInternalsTraversal.visit_dml_values.<locals>.<dictcomp>r   r|   r%   r   r&   visit_dml_valuesC  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   )rG   r   r   r%   r&   r   R  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   Y  s    
zP_CopyInternalsTraversal.visit_dml_multi_values.<locals>.copy.<locals>.<dictcomp>)
isinstancelistr   dictr   r   r   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%   )rG   Zsub_elementr   r%   r&   r   j  s    zM_CopyInternalsTraversal.visit_dml_multi_values.<locals>.<listcomp>.<listcomp>r%   )rG   sequencer   r%   r&   r   i  s    zB_CopyInternalsTraversal.visit_dml_multi_values.<locals>.<listcomp>r%   r|   r%   )r~   r   r   r&   visit_dml_multi_valuesK  s   
z._CopyInternalsTraversal.visit_dml_multi_valuesc                 K  s   |S r5   r%   r|   r%   r%   r&   visit_propagate_attrsn  r<   z-_CopyInternalsTraversal.visit_propagate_attrsN)rb   rc   rd   re   ra   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   Zis_clause_elementF)r-   getattrr   )rm   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     dS Nr%   r%   r6   rm   r   r%   r%   r&   visit_has_cache_key  s   z)_GetChildrenTraversal.visit_has_cache_keyc                 K  s   |fS r5   r%   r   r%   r%   r&   r     rs   z)_GetChildrenTraversal.visit_clauseelementc                 K     |S r5   r%   r   r%   r%   r&   r     r8   z._GetChildrenTraversal.visit_clauseelement_listc                 K  r   r5   r%   r   r%   r%   r&   r     r8   z/_GetChildrenTraversal.visit_clauseelement_tuplec                 K  s   t j|S r5   )	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  r8   zB_GetChildrenTraversal.visit_fromclause_canonical_column_collectionc                 K  s   |  S r5   )valuesr   r%   r%   r&   r     rn   z5_GetChildrenTraversal.visit_string_clauseelement_dictc                 K  r   r5   r%   r   r%   r%   r&   visit_fromclause_ordered_set  r8   z2_GetChildrenTraversal.visit_fromclause_ordered_setc                 K  r   r5   r%   r   r%   r%   r&   r     r8   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 r5   )r   rA   r   )r6   rm   r   r   r   r   r   r%   r%   r&   r     s   


z,_GetChildrenTraversal.visit_setup_join_tuplec                 K  s   | j |fi |S r5   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   )r6   rm   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   )rG   r   r%   r%   r&   r     s    z9_GetChildrenTraversal.visit_dml_values.<locals>.<setcomp>)symmetric_differencesorted)r6   rm   r   Zexpr_valuesZ
str_valuesr   r%   r%   r&   r     s   
z&_GetChildrenTraversal.visit_dml_valuesc                 K  r   r   r%   r   r%   r%   r&   r     r8   z,_GetChildrenTraversal.visit_dml_multi_valuesc                 K  r   r   r%   r   r%   r%   r&   r     r8   z+_GetChildrenTraversal.visit_propagate_attrsN)rb   rc   rd   re   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 r5   )r   r   Z	preloadedZsql_elementsZ_anonymous_labelZ	apply_map)rm   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 r5   )r   r   setr   r=   r%   r%   r&   __init__  s   z$TraversalComparatorStrategy.__init__c                 C  s   t  t  fS r5   r   r=   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 ]y\\}}\}}|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||||||fi |}|tu r dS ql|s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+   dispatchrX   Z_dispatch_lookupoperator
attrgetter)r6   r   r   r   r   r   r   leftrightZ
visit_namery   Zattributes_comparedZleft_attrnameZleft_visit_symZright_attrnameZright_visit_symr   Z
left_childZright_childZ
comparisonr%   r%   r&   r$     s   



Mz#TraversalComparatorStrategy.comparec                 K  s   |   }|j||fi |S r5   )rX   r$   )r6   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   r6   rH   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  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   	r6   rH   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 ]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   Z_is_has_cache_keyr   r   r   r%   r%   r&   r   a  s"   	z4TraversalComparatorStrategy.visit_executable_optionsc                 K  s   | j ||f d S r5   )r   r   r   r%   r%   r&   r   x  r   z/TraversalComparatorStrategy.visit_clauseelementc           	      K  ,   t ||d dD ]\}}| j||f qd S Nr   r   r   r   )	r6   rH   r   r   r   r   r   ZlcolZrcolr%   r%   r&   r   }     zHTraversalComparatorStrategy.visit_fromclause_canonical_column_collectionc                 K  r4   r5   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   )	r6   rH   r   r   r   r   r   ZlstrZ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   )r6   rH   r   r   r   r   r   ZltupZ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 r5   )r   
differencer   r   len)r6   Zseq1Zseq2r   	completedr   Zother_clauser%   r%   r&   _compare_unordered_sequences  s   
$z8TraversalComparatorStrategy._compare_unordered_sequencesc                 K  s   | j ||fi |S r5   )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 r5   r%   r   r%   r%   r&   visit_string     z(TraversalComparatorStrategy.visit_stringc                 K  r   r5   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   )r6   rH   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   )	r6   rH   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   r5   r%   r   r%   r%   r&   visit_boolean  r   z)TraversalComparatorStrategy.visit_booleanc                 K  r   r5   r%   r   r%   r%   r&   visit_operator  r   z*TraversalComparatorStrategy.visit_operatorc                 K  s
   | |S r5   )Z_compare_type_affinityr   r%   r%   r&   
visit_type  s   
z&TraversalComparatorStrategy.visit_typec                 K  r   r5   r%   r   r%   r%   r&   visit_plain_dict  r   z,TraversalComparatorStrategy.visit_plain_dictc                 K  r   r5   r%   r   r%   r%   r&   visit_dialect_options  r   z1TraversalComparatorStrategy.visit_dialect_optionsc                 K  s   |r
|r
|j |j kS ||kS r5   )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 r5   )__code__)rG   fnZc_keyr%   r%   r&   rJ     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   r5   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 r5   )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   )r6   rH   r   r   r   r   r   Zl_clauseZl_strZr_clauseZr_strr%   r%   r&   visit_prefix_sequence1  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   )r6   rH   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i |S r5   r   r   r%   r%   r&   r   J  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>T      zCTraversalComparatorStrategy.visit_table_hint_list.<locals>.<lambda>)r   c                 S  r
  r   r  r   r%   r%   r&   r  V  r  r   r   )r   r   r   r   r   )r6   rH   r   r   r   r   r   Z	left_keysZ
right_keysZltableZldialectZrtableZrdialectr%   r%   r&   visit_table_hint_listQ  s   z1TraversalComparatorStrategy.visit_table_hint_listc                 K  r   r5   r%   r   r%   r%   r&   visit_statement_hint_listb  r   z5TraversalComparatorStrategy.visit_statement_hint_listc                 K  rp   r5   rq   r   r%   r%   r&   visit_unknown_structureg  s   z3TraversalComparatorStrategy.visit_unknown_structurec                 K  s@   t ||ddD ]\\}}\}	}
| j||	fi |st  S qd S r  )r   _compare_dml_values_or_cer   )r6   rH   r   r   r   r   r   r   r   r   r   r%   r%   r&   r   l  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)r-   r   )r6   r   r   r   ZlvceZrvcer%   r%   r&   r  w  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 r5   )r   r   r   collections_abcSequencezipr  r   )r6   rH   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   )r6   rH   r   r   r   r   r   ZlseqZ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   Zis_associativer   r  r   r6   r   r   r   r%   r%   r&   compare_expression_clauselist  s   z9TraversalComparatorStrategy.compare_expression_clauselistc                 K     | j ||fi |S r5   )r  r  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   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}|s|d |S )Ncompare_keysTcompare_valuescallabler   r   )popr   )r6   r   r   r   r   r!  Zomitr%   r%   r&   compare_bindparam  s   
z-TraversalComparatorStrategy.compare_bindparamN)r   r   r   r   r   r   r   r   )2rb   rc   rd   rf   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  r  r  r   r  r   r   r  r  r  r$  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.
        )unionZshares_lineager   hashr   )r6   r   r   r    Zequivalentsr   Z
to_compareZothr%   r%   r&   compare_column_element  s   z4ColIdentityComparatorStrategy.compare_column_elementc                 K  r  r5   r'  r  r%   r%   r&   compare_column  r  z,ColIdentityComparatorStrategy.compare_columnc                 K  r  r5   r(  r  r%   r%   r&   compare_label  r  z+ColIdentityComparatorStrategy.compare_labelc                 K  s   ||u rt S tS r5   )r   r   r  r%   r%   r&   compare_table  r   z+ColIdentityComparatorStrategy.compare_tableN)Tr%   )rb   rc   rd   r'  r)  r*  r+  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abcr  r   r   r   rg   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   rj   ra   ro   r{   r.   r   r   r/   Zpreload_moduler   ZMemoizedSlotsr#   r"   r%   r%   r%   r&   <module>   s`   



u&y	G
    