U
    [h                     @   s  d dl m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 e
dZdZdZe
dZe
dZe
dZe
dZe
dZe
dZdd Zdd ZG dd deZG dd deeZG dd  d ed d!d"gZd#d$ Z G d%d& d&eZ!e! Z"G d'd( d(eZ#G d)d* d*e	Z$e$ Z%d+d, Z&G d-d. d.e	Z'e' Z(e
)d/d0d1 Z*G d2d3 d3e+Z,G d4d5 d5e	e
j-Z.G d6d7 d7e.Z/dS )8    )deque)
namedtupleN   )	operators)ExtendedInternalTraversal)InternalTraversal   )utilinspect)collections_abc)HasMemoized)py37Zskip_traverseFTno_cacheZcache_in_placeZcall_gen_cache_keyZstatic_cache_keyZpropagate_attrsZ	anon_namec                 K   s*   | ddrt }nt }|j| |f|S )Nuse_proxiesF)getColIdentityComparatorStrategyTraversalComparatorStrategycompare)obj1obj2kwZstrategy r   =/tmp/pip-unpacked-wheel-joqu7d3y/sqlalchemy/sql/traversals.pyr      s    r   c                 C   sF   t | D ]6}t|dr
|  t||jd t||jd q
d S )N_traverse_internals#_generated_copy_internals_traversalZ!_generated_get_children_traversal)r	   Zwalk_subclasseshasattr_generate_cache_attrs_copy_internalsgenerate_dispatchr   _get_children)Ztarget_hierarchyclsr   r   r   _preconfigure_traversals#   s    
r"   c                   @   sV   e Zd ZdZeZdZdZdZdZ	e
dd Zeddd	 Zd
d Ze
dd ZdS )HasCacheKeyzMixin for objects which can produce a cache key.

    .. seealso::

        :class:`.CacheKey`

        :ref:`sql_caching`

    TNr   c                 C   s   | j dd}t|}|rft| dd}|dkrXz
| j}W n tk
rV   t| _t Y S X t	| |dS | j dd}|dkr| j dd}|dkrt| _|dkr| j
rtjd| j dd tS t	| |dS dS )	zgenerate cache key dispatcher for a new class.

        This sets the _generated_cache_key_traversal attribute once called
        so should only be called once per class.

        inherit_cacheN_cache_key_traversal_generated_cache_key_traversalr   a  Class %s will not make use of SQL compilation caching as it does not set the 'inherit_cache' attribute to ``True``.  This can have significant performance implications including some performance degradations in comparison to prior SQLAlchemy versions.  Set this attribute to True if this object can make use of the cache key generated by the superclass.  Alternatively, this attribute may be set to False which will disable this warning.Zcprf)code)__dict__r   boolgetattrr   AttributeErrorNO_CACHEr&   _cache_key_traversal_visitorr   _hierarchy_supports_cachingr	   warn__name__)r!   r$   Zinheritr%   r   r   r   r   b   sT    

    	
  z!HasCacheKey._generate_cache_attrssqlalchemy.sql.elementsc                    s  t | }| j}| kr" | |fS t j  |< }  jd7  _z|jd }W n tk
rl   | }Y nX |tkrd t< dS ||f}|| tD ]z\}}	}
|	dk	r|
t	kr|	j
}|tkrd t<  dS |||f7 }q|
tkrtjj}t|	|jr|	 }	|||	f7 }q|
tkr2|||	 f7 }q|	r|
tkrN|||	f7 }q|
tkr|||	d |	d r||	d  ndf7 }q|
tjkr| jr|| j7 }n||  7 }q|
tjks|
tjks|
tjkr||t fdd|	D f7 }q||
||	|  7 }q|S )	aB  return an optional cache key.

        The cache key is a tuple which can contain any series of
        objects that are hashable and also identifies
        this object uniquely within the presence of a larger SQL expression
        or statement, for the purposes of caching the resulting query.

        The cache key should be based on the SQL compiled structure that would
        ultimately be produced.   That is, two structures that are composed in
        exactly the same way should produce the same cache key; any difference
        in the structures that would affect the SQL string or the type handlers
        should result in a different cache key.

        If a structure cannot produce a useful cache key, the NO_CACHE
        symbol should be added to the anon_map and the method should
        return None.

        r   r&   TNZcompile_state_pluginplugin_subjectc                    s   g | ]}|  qS r   _gen_cache_key.0elemanon_map
bindparamsr   r   
<listcomp>  s   z.HasCacheKey._gen_cache_key.<locals>.<listcomp>)id	__class__strindexr(   KeyErrorr   r,   r-   STATIC_CACHE_KEYZ_static_cache_key	ANON_NAMEr	   	preloadedsql_elements
isinstance_anonymous_label	apply_mapCALL_GEN_CACHE_KEYr4   CACHE_IN_PLACEPROPAGATE_ATTRSr   dp_annotations_keyZ!_gen_static_annotations_cache_key_annotations_cache_keyZ_gen_annotations_cache_keydp_clauseelement_listdp_clauseelement_tupledp_memoized_select_entitiestuple)selfr9   r:   Zidselfr!   id_
dispatcherresultattrnameobjmethZsckelementsr   r8   r   r4      s     





 	
    zHasCacheKey._gen_cache_keyc                 C   s0   g }t  }| ||}t|kr"dS t||S dS )ap  return a cache key.

        The cache key is a tuple which can contain any series of
        objects that are hashable and also identifies
        this object uniquely within the presence of a larger SQL expression
        or statement, for the purposes of caching the resulting query.

        The cache key should be based on the SQL compiled structure that would
        ultimately be produced.   That is, two structures that are composed in
        exactly the same way should produce the same cache key; any difference
        in the structures that would affect the SQL string or the type handlers
        should result in a different cache key.

        The cache key returned by this method is an instance of
        :class:`.CacheKey`, which consists of a tuple representing the
        cache key, as well as a list of :class:`.BindParameter` objects
        which are extracted from the expression.   While two expressions
        that produce identical cache key tuples will themselves generate
        identical SQL strings, the list of :class:`.BindParameter` objects
        indicates the bound values which may have different values in
        each one; these bound parameters must be consulted in order to
        execute the statement with the correct parameters.

        a :class:`_expression.ClauseElement` structure that does not implement
        a :meth:`._gen_cache_key` method and does not implement a
        :attr:`.traverse_internals` attribute will not be cacheable; when
        such an element is embedded into a larger structure, this method
        will return None, indicating no cache key is available.

        Nr9   r4   r,   CacheKey)rQ   r:   	_anon_mapkeyr   r   r   _generate_cache_key  s     zHasCacheKey._generate_cache_keyc                 C   s0   g }t  }|||}t|kr"d S t||S d S NrY   )r!   rV   r:   r[   r\   r   r   r   _generate_cache_key_for_objectA  s    z*HasCacheKey._generate_cache_key_for_object)r0   
__module____qualname____doc__r,   r%   _is_has_cache_keyr.   r$   	__slots__classmethodr   r	   preload_moduler4   r]   r_   r   r   r   r   r#   3   s   
	
<
x)r#   c                   @   s   e Zd Zejdd ZdS )MemoizedHasCacheKeyc                 C   s
   t | S r^   )r#   r]   rQ   r   r   r   r]   N  s    z'MemoizedHasCacheKey._generate_cache_keyN)r0   r`   ra   r   Zmemoized_instancemethodr]   r   r   r   r   rg   M  s   rg   c                   @   s\   e Zd ZdZdd Zdd Zdd Zedd	 Zd
d Z	dd Z
dd Zdd Zdd ZdS )rZ   zThe key used to identify a SQL statement construct in the
    SQL compilation cache.

    .. seealso::

        :ref:`sql_caching`

    c                 C   s   dS )z7CacheKey itself is not hashable - hash the .key portionNr   rh   r   r   r   __hash__]  s    zCacheKey.__hash__c                    sn   | j |krt| || j < }n
|| j  }| jsJt fddt D }nt fdd| jD }t||fS )a  Generate an "offline string" form of this :class:`.CacheKey`

        The "offline string" is basically the string SQL for the
        statement plus a repr of the bound parameter values in series.
        Whereas the :class:`.CacheKey` object is dependent on in-memory
        identities in order to work as a cache key, the "offline" version
        is suitable for a cache that will work for other processes as well.

        The given ``statement_cache`` is a dictionary-like object where the
        string form of the statement itself will be cached.  This dictionary
        should be in a longer lived scope in order to reduce the time spent
        stringifying statements.


        c                 3   s   | ]} | V  qd S r^   r   r6   r\   
parametersr   r   	<genexpr>x  s     z-CacheKey.to_offline_string.<locals>.<genexpr>c                 3   s   | ]}  |j|jV  qd S r^   )r   r\   value)r6   Z	bindparamrk   r   r   rm   z  s   )r\   r>   r:   rP   sortedrepr)rQ   Zstatement_cacheZ	statementrl   Zsql_strZparam_tupler   rk   r   to_offline_stringb  s    

zCacheKey.to_offline_stringc                 C   s   | j |j kS r^   r\   rQ   otherr   r   r   __eq__  s    zCacheKey.__eq__c                 C   s   t |g }t |g }||S r^   )rZ   _diff)r!   leftrightZck1Zck2r   r   r   _diff_tuples  s    

zCacheKey._diff_tuplesc                 c   s   | j }|j }g }d}|| }}|D ]}|| }|| }q"tt||D ]d\}\}	}
||k r^qH|	|
krHt|	trt|
tr||  qqHdddd |D ||	|
f V  qH|d}qqd S )Nr   zkey%s[%d]:  %s != %s c                 s   s   | ]}d | V  qdS )z[%d]Nr   )r6   rR   r   r   r   rm     s     z,CacheKey._whats_different.<locals>.<genexpr>)	r\   	enumerater	   zip_longestrE   rP   appendjoinpop)rQ   rt   Zk1Zk2stackZpickup_indexs1s2idxe1e2r   r   r   _whats_different  s.    




zCacheKey._whats_differentc                 C   s   d | |S )N, )r   r   rs   r   r   r   rv     s    zCacheKey._diffc                 C   s  | j g}g }t }d}|r|d}||krL|d|d  d  |d8 }qt|tr|sv|d|d d  d  q|d7 }t||g | }|d|d  d  qt|trd	t|j	t
t|f }nt|}|d|d  d
 | d  qdd|f S )Nr{   r    r   z),r   z()(z<%s object at %s>z  r   zCacheKey(key=%s)
)r\   objectr   r~   rE   rP   listr#   typer0   hexr<   rp   r   )rQ   r   outputsentinelindentr7   repr_r   r   r   __str__  s.    




 zCacheKey.__str__c                    s&   ddl m} |   fdd| jD S )zused for testingr   )prefix_anon_mapc                    s   i | ]}|j   |jqS r   )r\   Zeffective_value)r6   br[   r   r   
<dictcomp>  s      z1CacheKey._generate_param_dict.<locals>.<dictcomp>)compilerr   r:   )rQ   r   r   r   r   _generate_param_dict  s    zCacheKey._generate_param_dictc                 C   s"   dd t |j| jD }||S )Nc                 S   s   i | ]\}}|j |jqS r   )r\   rn   )r6   kvr   r   r   r     s    z5CacheKey._apply_params_to_element.<locals>.<dictcomp>)zipr:   params)rQ   Zoriginal_cache_keyZtarget_element	translater   r   r   _apply_params_to_element  s    z!CacheKey._apply_params_to_elementN)r0   r`   ra   rb   ri   rq   ru   re   ry   r   rv   r   r   r   r   r   r   r   rZ   S  s   	
rZ   r\   r:   c                 K   s   |   S r^   )_clone)elementr   r   r   r   r     s    r   c                   @   s  e Zd Ze ZZejZej	Z
ejZejZe Z Z ZZeZeZeZe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,d%d& Z-d'd( Z.d)d* Z/d+d, Z0d-d. Z1d/d0 Z2d1d2 Z3d3S )4	_CacheKeyc                 C   s   t dd |D S )Nc                 s   s   | ]\}}|j |fV  qd S r^   __code__r6   fnZc_keyr   r   r   rm     s     z7_CacheKey.visit_with_context_options.<locals>.<genexpr>rP   rQ   rU   rV   parentr9   r:   r   r   r   visit_with_context_options  s    z$_CacheKey.visit_with_context_optionsc                 C   s   |t |||fS r^   )r   r4   r   r   r   r   visit_inspectable  s    z_CacheKey.visit_inspectablec                 C   s   t |S r^   r   r   r   r   r   visit_string_list  s    z_CacheKey.visit_string_listc                 C   s   |t |tr|||n|fS r^   rE   r#   r4   r   r   r   r   visit_multi  s
    z_CacheKey.visit_multic                    s   |t  fdd|D fS )Nc                 3   s(   | ] }t |tr| n|V  qd S r^   r   r5   r8   r   r   rm   
  s   z-_CacheKey.visit_multi_list.<locals>.<genexpr>r   r   r   r8   r   visit_multi_list  s
    z_CacheKey.visit_multi_listc                    s$   |sdS |t  fdd|D fS )Nr   c                 3   s&   | ]}t  fd d|D V  qdS )c                 3   s   | ]}|  V  qd S r^   r3   r5   r8   r   r   rm     s   zA_CacheKey.visit_has_cache_key_tuples.<locals>.<genexpr>.<genexpr>Nr   r6   Ztup_elemr8   r   r   rm     s   z7_CacheKey.visit_has_cache_key_tuples.<locals>.<genexpr>r   r   r   r8   r   visit_has_cache_key_tuples  s    z$_CacheKey.visit_has_cache_key_tuplesc                    s$   |sdS |t  fdd|D fS )Nr   c                 3   s   | ]}|  V  qd S r^   r3   r5   r8   r   r   rm   )  s     z5_CacheKey.visit_has_cache_key_list.<locals>.<genexpr>r   r   r   r8   r   visit_has_cache_key_list"  s
    z"_CacheKey.visit_has_cache_key_listc                    s$   |sdS |t  fdd|D fS )Nr   c                 3   s    | ]}|j r| V  qd S r^   )rc   r4   r5   r8   r   r   rm   3  s   z5_CacheKey.visit_executable_options.<locals>.<genexpr>r   r   r   r8   r   visit_executable_options,  s    z"_CacheKey.visit_executable_optionsc                 C   s   |  |dd |D |||S )Nc                 S   s   g | ]}t |qS r   r
   )r6   or   r   r   r;   >  s     z4_CacheKey.visit_inspectable_list.<locals>.<listcomp>)r   r   r   r   r   visit_inspectable_list:  s        z _CacheKey.visit_inspectable_listc                 C   s   |  |||||S r^   )r   r   r   r   r   visit_clauseelement_tuplesA  s        z$_CacheKey.visit_clauseelement_tuplesc                    s$   |sdS |t  fdd|D fS )Nr   c                    s   g | ]}|  qS r   r3   r5   r8   r   r   r;   O  s     z:_CacheKey.visit_fromclause_ordered_set.<locals>.<listcomp>r   r   r   r8   r   visit_fromclause_ordered_setH  s
    z&_CacheKey.visit_fromclause_ordered_setc                    s,   |sdS  fdd|D }|t t|fS )Nr   c                    s   g | ]}|  qS r   r3   r5   r8   r   r   r;   W  s    z?_CacheKey.visit_clauseelement_unordered_set.<locals>.<listcomp>rP   ro   )rQ   rU   rV   r   r9   r:   Z
cache_keysr   r8   r   !visit_clauseelement_unordered_setR  s    z+_CacheKey.visit_clauseelement_unordered_setc                 C   s
   ||j fS r^   )namer   r   r   r   visit_named_ddl_elementa  s    z!_CacheKey.visit_named_ddl_elementc                    s$   |sdS |t  fdd|D fS )Nr   c                    s    g | ]\}}|  |fqS r   r3   )r6   clausestrvalr8   r   r   r;   o  s   z3_CacheKey.visit_prefix_sequence.<locals>.<listcomp>r   r   r   r8   r   visit_prefix_sequencef  s    z_CacheKey.visit_prefix_sequencec                    s"   d|kt  fdd|D S )Nlegacyc                 3   s   | ]\}}} r t |tr |n
|r<t |tr<|n|d k	rP|nd |d k	rf|nd t fddt D fV  qd S )Nc                    s   g | ]}| | fqS r   r   rj   flagsr   r   r;     s     z>_CacheKey.visit_setup_join_tuple.<locals>.<genexpr>.<listcomp>)rE   r>   r4   rP   ro   )r6   targetonclausefrom_r9   r:   	is_legacyr   r   rm   {  s$   

z3_CacheKey.visit_setup_join_tuple.<locals>.<genexpr>r   r   r   r   r   visit_setup_join_tuplev  s    z _CacheKey.visit_setup_join_tuplec                    s(   |sdS |t  fdd| D fS )Nr   c                    s&   g | ]\\}}}|  ||fqS r   r3   )r6   r   dialect_nametextr8   r   r   r;     s
   

z3_CacheKey.visit_table_hint_list.<locals>.<listcomp>)rP   itemsr   r   r8   r   visit_table_hint_list  s    z_CacheKey.visit_table_hint_listc                    s   |t  fddt D fS )Nc                    s   g | ]}| | fqS r   r   rj   rV   r   r   r;     s     z._CacheKey.visit_plain_dict.<locals>.<listcomp>r   r   r   r   r   visit_plain_dict  s    z_CacheKey.visit_plain_dictc                    s   |t  fddt D fS )Nc                 3   s2   | ]*  t  fd dt  D fV  qdS )c                    s   g | ]}|  | fqS r   r   rj   )r   rV   r   r   r;     s   z=_CacheKey.visit_dialect_options.<locals>.<genexpr>.<listcomp>Nr   )r6   r   )r   r   rm     s   

z2_CacheKey.visit_dialect_options.<locals>.<genexpr>r   r   r   r   r   visit_dialect_options  s
    
z_CacheKey.visit_dialect_optionsc                    s"   |t  fddtD fS )Nc                 3   s"   | ]}||   fV  qd S r^   r3   rj   r9   r:   rV   r   r   rm     s   z<_CacheKey.visit_string_clauseelement_dict.<locals>.<genexpr>r   r   r   r   r   visit_string_clauseelement_dict  s
    z)_CacheKey.visit_string_clauseelement_dictc                    s.   |t  fddfddtD D fS )Nc                 3   s0   | ](\}}|t |tr"| n|fV  qd S r^   r   r6   r\   rn   r8   r   r   rm     s   z4_CacheKey.visit_string_multi_dict.<locals>.<genexpr>c                    s   g | ]}| | fqS r   r   rj   r   r   r   r;     s     z5_CacheKey.visit_string_multi_dict.<locals>.<listcomp>r   r   r   r   r   visit_string_multi_dict  s
    z!_CacheKey.visit_string_multi_dictc                    s   |t  fdd|jD fS )Nc                 3   s   | ]\}}|  V  qd S r^   r3   )r6   r   colr8   r   r   rm     s   zI_CacheKey.visit_fromclause_canonical_column_collection.<locals>.<genexpr>)rP   Z_collectionr   r   r8   r   ,visit_fromclause_canonical_column_collection  s
    z6_CacheKey.visit_fromclause_canonical_column_collectionc                 C   s   d|t < dS NTr   r,   r   r   r   r   visit_unknown_structure  s    z!_CacheKey.visit_unknown_structurec                    s   |t  fdd|D fS )Nc                 3   s8   | ]0\}}t |d r | n|| fV  qdS __clause_element__Nr   r4   r   r8   r   r   rm     s   
z5_CacheKey.visit_dml_ordered_values.<locals>.<genexpr>r   r   r   r8   r   visit_dml_ordered_values  s
    z"_CacheKey.visit_dml_ordered_valuesc                    sp   t r"|t fddD fS dd D }|r@d t< dS |}|t fddt|D fS d S )Nc                 3   s8   | ]0}t |d r| n||  fV  qdS r   r   r6   r   r   r   r   rm     s   z-_CacheKey.visit_dml_values.<locals>.<genexpr>c                 S   s   h | ]}t |d r|qS r   r   r   r   r   r   	<setcomp>  s     
 z-_CacheKey.visit_dml_values.<locals>.<setcomp>Tr   c                 3   s"   | ]}||   fV  qd S r^   r3   r   r   r   r   rm     s   )r   rP   r,   symmetric_differencero   )rQ   rU   rV   r   r9   r:   expr_values
str_valuesr   r   r   visit_dml_values  s     
z_CacheKey.visit_dml_valuesc                 C   s   d|t < dS r   r   r   r   r   r   visit_dml_multi_values  s    z _CacheKey.visit_dml_multi_valuesN)4r0   r`   ra   rH   visit_has_cache_keyvisit_clauseelementr   rM   visit_clauseelement_listrK   visit_annotations_keyrN   visit_clauseelement_tuplerO   visit_memoized_select_entitiesrI   visit_stringvisit_booleanvisit_operatorvisit_plain_objvisit_statement_hint_listrA   
visit_typerB   visit_anon_namerJ   visit_propagate_attrsr   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     sR    

"r   c                   @   s   e Zd Zdd ZdddZdS )HasCopyInternalsc                 K   s
   t  d S r^   NotImplementedError)rQ   r   r   r   r   r   "  s    zHasCopyInternals._cloner   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   r+   r   Zrun_generated_dispatchsetattr)rQ   Z
omit_attrsr   Ztraverse_internalsrU   rV   rW   rT   r   r   r   r   %  s    
  z HasCopyInternals._copy_internalsN)r   )r0   r`   ra   r   r   r   r   r   r   r   !  s   r   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 )_CopyInternalszmGenerate a _copy_internals internal traversal dispatch for classes
    with a _traverse_internals collection.c                 K   s   ||f|S r^   r   rQ   rU   r   r   cloner   r   r   r   r   G  s    z"_CopyInternals.visit_clauseelementc                    s    fdd|D S )Nc                    s   g | ]} |fqS r   r   r6   r   r   r   r   r   r;   O  s     z;_CopyInternals.visit_clauseelement_list.<locals>.<listcomp>r   r   r   r   r   r   L  s    z'_CopyInternals.visit_clauseelement_listc                    s   t  fdd|D S )Nc                    s   g | ]} |fqS r   r   r   r   r   r   r;   T  s     z<_CopyInternals.visit_clauseelement_tuple.<locals>.<listcomp>r   r   r   r   r   r   Q  s    z(_CopyInternals.visit_clauseelement_tuplec                    s   t  fdd|D S )Nc                    s   g | ]} |fqS r   r   r   r   r   r   r;   Y  s     z;_CopyInternals.visit_executable_options.<locals>.<listcomp>r   r   r   r   r   r   V  s    z'_CopyInternals.visit_executable_optionsc                    s    fdd|D S )Nc                    s   h | ]} |fqS r   r   r   r   r   r   r   ^  s     zC_CopyInternals.visit_clauseelement_unordered_set.<locals>.<setcomp>r   r   r   r   r   r   [  s    z0_CopyInternals.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 r^   r   r   r   r   r   rm   d  s     zG_CopyInternals.visit_clauseelement_tuples.<locals>.<listcomp>.<genexpr>r   r5   r   r   r   r;   c  s   z=_CopyInternals.visit_clauseelement_tuples.<locals>.<listcomp>r   r   r   r   r   r   `  s    z)_CopyInternals.visit_clauseelement_tuplesc                    s   t  fdd| D S )Nc                 3   s"   | ]\}}| |ffV  qd S r^   r   r   r   r   r   rm   k  s    zA_CopyInternals.visit_string_clauseelement_dict.<locals>.<genexpr>)dictr   r   r   r   r   r   h  s    z._CopyInternals.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 r^   r   )r6   r   r   r   r   r   r   r   rm   r  s   
z8_CopyInternals.visit_setup_join_tuple.<locals>.<genexpr>r   r   r   r   r   r   o  s    z%_CopyInternals.visit_setup_join_tuplec                 K   s   | j |||f|S r^   r   )rQ   rU   r   r   r   r   r   r   r   |  s    z-_CopyInternals.visit_memoized_select_entitiesc                    s    fdd|D S )Nc                    s6   g | ].\}}t |d r" |fn| |ffqS r   r   r   r   r   r   r;     s   
z;_CopyInternals.visit_dml_ordered_values.<locals>.<listcomp>r   r   r   r   r   r     s    z'_CopyInternals.visit_dml_ordered_valuesc                    s    fdd|  D S )Nc                    s4   i | ],\}}t |d r" |fn| |fqS r   r   r   r   r   r   r     s   z3_CopyInternals.visit_dml_values.<locals>.<dictcomp>)r   r   r   r   r   r     s    z_CopyInternals.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   )r6   rn   r   r   r   r;     s   zG_CopyInternals.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   r   r   r   r     s   
zG_CopyInternals.visit_dml_multi_values.<locals>.copy.<locals>.<dictcomp>F)rE   r   rP   r   r   AssertionErrorr7   r   r   r   copy  s    

z3_CopyInternals.visit_dml_multi_values.<locals>.copyc                    s   g | ]} fd d|D qS )c                    s   g | ]} |qS r   r   )r6   Zsub_elementr  r   r   r;     s     zD_CopyInternals.visit_dml_multi_values.<locals>.<listcomp>.<listcomp>r   )r6   sequencer  r   r   r;     s   z9_CopyInternals.visit_dml_multi_values.<locals>.<listcomp>r   r   r   )r   r  r   r   r     s    
z%_CopyInternals.visit_dml_multi_valuesc                 K   s   |S r^   r   r   r   r   r   r     s    z$_CopyInternals.visit_propagate_attrsN)r0   r`   ra   rb   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   C  s2   





	


	
$r   c                 C   s$   t | dr t| dds |  } q | S )Nr   Zis_clause_elementF)r   r*   r   )r   r   r   r   _flatten_clauseelement  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 )!_GetChildrenzqGenerate a _children_traversal internal traversal dispatch for classes
    with a _traverse_internals collection.c                 K   s   dS Nr   r   rQ   r   r   r   r   r   r     s    z _GetChildren.visit_has_cache_keyc                 K   s   |fS r^   r   r  r   r   r   r     s    z _GetChildren.visit_clauseelementc                 K   s   |S r^   r   r  r   r   r   r     s    z%_GetChildren.visit_clauseelement_listc                 K   s   |S r^   r   r  r   r   r   r     s    z&_GetChildren.visit_clauseelement_tuplec                 K   s   t j|S r^   )	itertoolschainfrom_iterabler  r   r   r   r     s    z'_GetChildren.visit_clauseelement_tuplesc                 K   s   dS r  r   r  r   r   r   r     s    z9_GetChildren.visit_fromclause_canonical_column_collectionc                 K   s   |  S r^   )valuesr  r   r   r   r     s    z,_GetChildren.visit_string_clauseelement_dictc                 K   s   |S r^   r   r  r   r   r   r     s    z)_GetChildren.visit_fromclause_ordered_setc                 K   s   |S r^   r   r  r   r   r   r     s    z._GetChildren.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 r^   )rE   r>   r  )rQ   r   r   r   r   r   r   r   r   r   r     s    

z#_GetChildren.visit_setup_join_tuplec                 K   s   | j |f|S r^   r   r  r   r   r   r     s    z+_GetChildren.visit_memoized_select_entitiesc                 k   s(   |D ]\}}t |dr|V  |V  qd S )Nr   r   )rQ   r   r   r   r   r   r   r   r     s    
z%_GetChildren.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   r   r   r   r   r     s     
 z0_GetChildren.visit_dml_values.<locals>.<setcomp>)r   ro   )rQ   r   r   r   r   r   r   r   r   r      s    
z_GetChildren.visit_dml_valuesc                 K   s   dS r  r   r  r   r   r   r   
  s    z#_GetChildren.visit_dml_multi_valuesc                 K   s   dS r  r   r  r   r   r   r     s    z"_GetChildren.visit_propagate_attrsN)r0   r`   ra   rb   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    s    
r  r1   c                 K   s   t |tjjjr||}|S r^   )rE   r	   rC   rD   rF   rG   )r   r   r9   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S )r9   aU  A map that creates new keys for missing key access.

    Produces an incrementing sequence given a series of unique keys.

    This is similar to the compiler prefix_anon_map class although simpler.

    Inlines the approach taken by :class:`sqlalchemy.util.PopulateDict` which
    is otherwise usually used for this type of operation.

    c                 C   s
   d| _ d S )Nr   )r?   rh   r   r   r   __init__(  s    zanon_map.__init__c                 C   s$   t | j | |< }|  jd7  _|S )Nr   )r>   r?   )rQ   r\   valr   r   r   __missing__+  s    zanon_map.__missing__N)r0   r`   ra   rb   r  r  r   r   r   r   r9     s   r9   c                   @   sh  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 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.dXS )Yr   )r   cacher9   c                 C   s   t  | _t | _d S r^   )r   r   setr  rh   r   r   r   r  4  s    z$TraversalComparatorStrategy.__init__c                 C   s   t  t  fS r^   )r9   rh   r   r   r   _memoized_attr_anon_map8  s    z3TraversalComparatorStrategy._memoized_attr_anon_mapc                 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|jddD ]\\}}\}}|s|dks|dkrq||ks||k	r dS ||kr*q| |}t||}t||}|d krj|d k	r dS q||||||f|}|tkr dS qq&dS )	Ncompare_annotationsFz
compare_%sr   NN	fillvalueZ_annotationsT)r   r  r   r~   popleftaddZ__visit_name__r*   COMPARE_FAILEDSKIP_TRAVERSEr	   r}   r   dispatchoperator
attrgetter)rQ   r   r   r   r   r  r  rw   rx   Z
visit_namerW   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 r^   )r=   r   )rQ   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   )r4   r9   r  rQ   rU   left_parentrw   right_parentrx   r   r   r   r   r     s
     z/TraversalComparatorStrategy.visit_has_cache_keyc                 K   s   |  |dd |dd S )Nr2   )r  r   r   r   r   r   r     s    
 
z1TraversalComparatorStrategy.visit_propagate_attrsc           	      K   sJ   t j||d dD ]4\}}|| jd g || jd g krt  S qd S Nr  r   r   )r	   r}   r4   r9   r  	rQ   rU   r!  rw   r"  rx   r   lrr   r   r   r     s     z4TraversalComparatorStrategy.visit_has_cache_key_listc           	      K   s^   t j||d dD ]H\}}|jr0|| jd g n||jrJ|| jd g n|krt  S qd S r#  )r	   r}   rc   r4   r9   r  r$  r   r   r   r     s    	z4TraversalComparatorStrategy.visit_executable_optionsc                 K   s   | j ||f d S r^   )r   r~   r   r   r   r   r     s    z/TraversalComparatorStrategy.visit_clauseelementc           	      K   s.   t j||d dD ]\}}| j||f qd S Nr  r	   r}   r   r~   )	rQ   rU   r!  rw   r"  rx   r   ZlcolZrcolr   r   r   r     s    zHTraversalComparatorStrategy.visit_fromclause_canonical_column_collectionc                 K   s   d S r^   r   r   r   r   r   *visit_fromclause_derived_column_collection  s    zFTraversalComparatorStrategy.visit_fromclause_derived_column_collectionc           	      K   sN   t jt|t|d dD ]0\}}||kr0t  S | j|| || f qd S r'  )r	   r}   ro   r  r   r~   )	rQ   rU   r!  rw   r"  rx   r   ZlstrZrstrr   r   r   r     s      z;TraversalComparatorStrategy.visit_string_clauseelement_dictc                 K   s`   t j||d dD ]J\}}|d ks(|d kr0t  S t j||d dD ]\}	}
| j|	|
f q@qd S r'  r	   r}   r  r   r~   )rQ   rU   r!  rw   r"  rx   r   ZltupZrtupr%  r&  r   r   r   r     s
    z6TraversalComparatorStrategy.visit_clauseelement_tuplesc           	      K   s.   t j||d dD ]\}}| j||f qd S r'  r(  r$  r   r   r   r     s    z4TraversalComparatorStrategy.visit_clauseelement_listc           	      K   s.   t j||d dD ]\}}| j||f qd S r'  r(  r$  r   r   r   r     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 r^   )r  
differencer  r  len)rQ   Zseq1Zseq2r   Z	completedr   Zother_clauser   r   r   _compare_unordered_sequences  s    
z8TraversalComparatorStrategy._compare_unordered_sequencesc                 K   s   | j ||f|S r^   )r-  r   r   r   r   r     s    z=TraversalComparatorStrategy.visit_clauseelement_unordered_setc           	      K   s.   t j||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 r^   r   r   r   r   r   r     s    z(TraversalComparatorStrategy.visit_stringc                 K   s   ||kS r^   r   r   r   r   r   r     s    z-TraversalComparatorStrategy.visit_string_listc                 K   s,   t ||| jd f|t ||| jd f|kS r  )r  r9   r   r   r   r   r     s        z+TraversalComparatorStrategy.visit_anon_namec                 K   s   ||kS r^   r   r   r   r   r   r     s    z)TraversalComparatorStrategy.visit_booleanc                 K   s   ||kS r^   r   r   r   r   r   r     s    z*TraversalComparatorStrategy.visit_operatorc                 K   s
   | |S r^   )Z_compare_type_affinityr   r   r   r   r     s    z&TraversalComparatorStrategy.visit_typec                 K   s   ||kS r^   r   r   r   r   r   r     s    z,TraversalComparatorStrategy.visit_plain_dictc                 K   s   ||kS r^   r   r   r   r   r   r   #  s    z1TraversalComparatorStrategy.visit_dialect_optionsc                 K   s    |r|r|j |j kS ||kS d S r^   )rL   r   r   r   r   r   (  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^   r   r   r   r   r   rm   6  s     zITraversalComparatorStrategy.visit_with_context_options.<locals>.<genexpr>r   r   r   r   r   r   3  s    z6TraversalComparatorStrategy.visit_with_context_optionsc                 K   s   ||kS r^   r   r   r   r   r   r   :  s    z+TraversalComparatorStrategy.visit_plain_objc                 K   s    |d kr|d k	rt S |j|jkS r^   )r  r   r   r   r   r   r   ?  s    z3TraversalComparatorStrategy.visit_named_ddl_elementc                 K   sF   t j||ddD ]0\\}}\}	}
||
kr0t  S | j||	f qd S Nr  r  r*  )rQ   rU   r!  rw   r"  rx   r   Zl_clauseZl_strZr_clauseZr_strr   r   r   r   H  s      z1TraversalComparatorStrategy.visit_prefix_sequencec                 K   sn   t j||ddD ]X\\}}}	}
\}}}}|
|kr8t  S | j||f | j||f | j|	|f qd S )N)NNNNr  r*  )rQ   rU   r!  rw   r"  rx   r   Zl_targetZ
l_onclauseZl_fromZl_flagsZr_targetZ
r_onclauseZr_fromZr_flagsr   r   r   r   S  s    

z2TraversalComparatorStrategy.visit_setup_join_tuplec                 K   s   | j |||||f|S r^   r   r   r   r   r   r   a  s        z:TraversalComparatorStrategy.visit_memoized_select_entitiesc                 K   s   t |dd d}t |dd d}tj||ddD ]P\\}	}
\}}|
|krPt  S ||	|
f |||f krpt  S | j|	|f q0d S )Nc                 S   s   | d j | d fS r  fullnamer   r   r   r   <lambda>k      zCTraversalComparatorStrategy.visit_table_hint_list.<locals>.<lambda>rr   c                 S   s   | d j | d fS r  r/  r   r   r   r   r1  m  r2  r  r  )ro   r	   r}   r  r   r~   )rQ   rU   r!  rw   r"  rx   r   Z	left_keysZ
right_keysZltableZldialectZrtableZrdialectr   r   r   r   h  s       z1TraversalComparatorStrategy.visit_table_hint_listc                 K   s   ||kS r^   r   r   r   r   r   r   y  s    z5TraversalComparatorStrategy.visit_statement_hint_listc                 K   s
   t  d S r^   r   r   r   r   r   r   ~  s    z3TraversalComparatorStrategy.visit_unknown_structurec                 K   s>   t j||ddD ](\\}}\}	}
| j||	f|st  S qd S r.  )r	   r}   _compare_dml_values_or_cer  )rQ   rU   r!  rw   r"  rx   r   lklvrkrvr   r   r   r     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  )rQ   r5  r7  r   ZlvceZrvcer   r   r   r3    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:nt|tjrntS trt| | D ]@\\}	}\}
}| j|	|
f|st  S | j||f|st  S qnB|D ]<}	||	 }|	|krt  S ||	 }| j||f|st  S qd S r^   )	r,  r  rE   r   Sequencer   r3  r   r   )rQ   rU   r!  rw   r"  rx   r   r5  r7  r4  r6  r   r   r   r     s*     "z,TraversalComparatorStrategy.visit_dml_valuesc                 K   sv   t j||d dD ]`\}}|d ks(|d kr0t  S t j||d dD ].\}	}
| j|||	||
f|tkr@t    S q@qd S r'  )r	   r}   r  r   )rQ   rU   r!  rw   r"  rx   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  rQ   rw   rx   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  negaterw   rx   )r  r   Zis_commutativer  rw   rx   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callablern   r\   )r   r~   )rQ   rw   rx   r   r?  r@  Zomitr   r   r   compare_bindparam  s    
z-TraversalComparatorStrategy.compare_bindparamN)/r0   r`   ra   rd   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   r3  r   r   r<  r>  rB  r   r   r   r   r   1  sX   O	

		!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  )rQ   rw   rx   r   Zequivalentsr   Z
to_compareZothr   r   r   compare_column_element  s    
z4ColIdentityComparatorStrategy.compare_column_elementc                 K   s   | j ||f|S r^   rE  r;  r   r   r   compare_column  s    z,ColIdentityComparatorStrategy.compare_columnc                 K   s   | j ||f|S r^   rF  r;  r   r   r   compare_label  s    z+ColIdentityComparatorStrategy.compare_labelc                 K   s   ||krt S tS r^   )r  r  r;  r   r   r   compare_table  s    z+ColIdentityComparatorStrategy.compare_tableN)Tr   )r0   r`   ra   rE  rG  rH  rI  r   r   r   r   r     s      
r   )0collectionsr   r   r  r  rz   r   Zvisitorsr   r   r	   Z
inspectionr   r   r   r   symbolr  r  ZCOMPARE_SUCCEEDEDr,   rI   rH   rA   rJ   rB   r   r"   r   r#   rg   rZ   r   r   r-   r   r   r   r  r  r    rf   r  r   r9   ZMemoizedSlotsr   r   r   r   r   r   <module>   s^   






	   	  A"{	G
   O