U
    ÌZj›² ã                   @   sÄ  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 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	j)Z*e
 +¡ Z,e
 -d$¡Z.G d%d&„ d&e/ƒZ0e
 +d'd'd(œ¡Z1G d)d*„ d*eƒZ2ejj 3d+d,¡G d-d.„ d.e2ƒƒZ4G d/d0„ d0eƒZ5ejj 3d+d1¡G d2d3„ d3e2e%ƒƒZ6dKd5d6„Z7d7d8„ Z8d9d:„ Z9d;d<„ Z:G d=d>„ d>e/ƒZ;G d?d@„ d@e;ƒZ<G dAdB„ dBe;ƒZ=G dCdD„ dDe;ƒZ>G dEdF„ dFe>ƒZ?G dGdH„ dHe>ƒZ@G dIdJ„ dJe@ƒZAdS )Lé    Né   )Ú
attributes)Ú
interfaces)Úloading)Ú_is_aliased_class)ÚORMColumnsClauseRole)ÚPathRegistry)Ú_entity_corresponds_to)Ú_ORMJoin)Úaliased)ÚBundle)Ú
ORMAdapteré   )Úexc)Úfuture)Úinspect)Úsql)Úutil)ÚClauseElement)Ú	coercions)Ú
expression)Úroles)Úvisitors)Ú_entity_namespace_key)Ú_select_iterables)ÚCacheableOptions)ÚCompileState)ÚOptions)ÚLABEL_STYLE_DISAMBIGUATE_ONLY)ÚLABEL_STYLE_NONE)ÚLABEL_STYLE_TABLENAME_PLUS_COL)ÚSelectState)ÚExtendedInternalTraversal)ÚInternalTraversalÚLABEL_STYLE_LEGACY_ORMc                   @   s*   e Zd ZdZG dd„ deƒZddd„ZdS )ÚQueryContext)Úcompile_stateÚqueryÚparamsÚload_optionsÚbind_argumentsÚexecution_optionsÚsessionÚ	autoflushÚpopulate_existingÚinvoke_all_eagersÚversion_checkÚrefresh_stateÚcreate_eager_joinsÚpropagated_loader_optionsr   ZrunidZpartialsZpost_load_pathsÚidentity_tokenÚ	yield_perÚloaders_require_bufferingÚloaders_require_uniquingc                   @   s4   e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdS )z!QueryContext.default_load_optionsFTN)Ú__name__Ú
__module__Ú__qualname__Z_only_return_tuplesÚ_populate_existingÚ_version_checkÚ_invoke_all_eagersÚ
_autoflushÚ_refresh_identity_tokenÚ
_yield_perÚ_refresh_stateZ_lazy_loaded_fromZ_legacy_uniquing© rB   rB   úY/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/sqlalchemy/orm/context.pyÚdefault_load_optionsM   s   rD   Nc           
         sÔ   |ˆ _ |ptˆ _|ptˆ _|ˆ _|ˆ _|ˆ _dˆ _dˆ _|ˆ _	|j
j}|j}	t‡ fdd„t||	ƒD ƒƒˆ _t|jƒˆ _|jˆ _|jˆ _|jˆ _|jˆ _|jˆ _|jˆ _|jˆ _ˆ jrÐ|jrÐt  !dd "|j¡ ¡‚d S )NFc                 3   s$   | ]\}}|j r| ˆ |¡V  qd S ©N)Zpropagate_to_loadersZ'_adapt_cached_option_to_uncached_option)Ú.0ÚoptZuncached_opt©ÚselfrB   rC   Ú	<genexpr>{   s   þz(QueryContext.__init__.<locals>.<genexpr>z¹The yield_per Query option is currently not compatible with %s eager loading.  Please specify lazyload('*') or query.enable_eagerloads(False) in order to proceed with query.yield_per().z, )#r)   Ú_EMPTY_DICTr+   r*   r&   r'   r,   r6   r7   r(   Úselect_statementÚ_with_optionsÚtupleÚzipr3   Údictr   r>   r-   r;   r.   r=   r/   r<   r0   rA   r1   r@   r5   r?   r4   Ú_no_yield_persÚsa_excÚInvalidRequestErrorÚjoin)
rI   r&   Ú	statementr(   r,   r)   r+   r*   Zcached_optionsZuncached_optionsrB   rH   rC   Ú__init__Y   s8    


þ

ûÿzQueryContext.__init__)NN)r8   r9   r:   Ú	__slots__r   rD   rV   rB   rB   rB   rC   r%   3   s
     ør%   T)Z _result_disable_adapt_to_contextZfuture_resultc                   @   s˜   e Zd ZeZG dd„ deƒZeZdd„ Z	dd„ Z
edd„ ƒZed	d
„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZdd„ Zdd„ Zedd„ ƒZdS )ÚORMCompileStatec                   @   s¬   e Zd Zdejfdejfdejfdejfdejfdejfdejfdejfd	ejfd
ejfdejfdejfdejfgZ	dZ
dZdZdZeZdZdZdZdZdZdZdZdZdS )z'ORMCompileState.default_compile_optionsÚ_use_legacy_query_styleÚ_for_statementÚ_bake_okÚ_with_polymorphic_adapt_mapÚ_current_pathÚ_enable_single_critÚ_enable_eagerloadsÚ_orm_only_from_obj_aliasÚ_only_load_propsÚ_set_base_aliasÚ_for_refresh_stateÚ_render_for_subqueryÚ_is_starFTrB   N)r8   r9   r:   r#   Z
dp_booleanr"   Zdp_has_cache_key_tuplesZdp_has_cache_keyZdp_plain_objZ_cache_key_traversalrY   rZ   r[   r\   Ú_path_registryr]   r^   r_   r`   ra   rb   rc   rd   re   rB   rB   rB   rC   Údefault_compile_options    s:   þðrg   c                 O   s
   t ƒ ‚d S rE   ©ÚNotImplementedError)rI   ÚargÚkwrB   rB   rC   rV   Î   s    zORMCompileState.__init__c                 C   s&   | j }||kr"| |¡ | |¡ d S rE   )Údedupe_columnsÚaddÚappend)rI   ÚobjZcol_collectionZdeduperB   rB   rC   Ú_append_dedupe_col_collectionÑ   s    
z-ORMCompileState._append_dedupe_col_collectionc                 C   s    |rddd„}|S t  |¡S d S )Nc                 S   s   |r|S t | dƒS d S )NÚkey)Úgetattr)ÚcolÚcol_namerB   rB   rC   ÚnameÜ   s    z7ORMCompileState._column_naming_convention.<locals>.name)N)r!   Ú_column_naming_convention)ÚclsÚlabel_styleÚlegacyru   rB   rB   rC   rv   ×   s    
z)ORMCompileState._column_naming_conventionc                 K   s
   t ƒ ‚dS )aÈ  Create a context for a statement given a :class:`.Compiler`.

        This method is always invoked in the context of SQLCompiler.process().

        For a Select object, this would be invoked from
        SQLCompiler.visit_select(). For the special FromStatement object used
        by Query to indicate "Query.from_statement()", this is called by
        FromStatement._compiler_dispatch() that would be called by
        SQLCompiler.process().

        Nrh   )rw   Ústatement_containerÚcompilerrk   rB   rB   rC   Úcreate_for_statementæ   s    z$ORMCompileState.create_for_statementc                 C   s   t |ƒS rE   )Ú_column_descriptions©rw   rU   rB   rB   rC   Úget_column_descriptionsõ   s    z'ORMCompileState.get_column_descriptionsc           	      C   s°   |r||fS t j ddddh||j¡\}}|s4t}n
| t¡}|jrT| d|ji¡}||d< z|jd }W n  tk
rŠ   ds†t	dƒ‚Y nX |rš|j
|d	< |jr¨| ¡  ||fS )
NÚ_sa_orm_load_optionsr.   r-   r5   ÚclauseÚplugin_subjectFz0statement had 'orm' plugin but no plugin_subjectÚmapper)r%   rD   Zfrom_execution_optionsÚ_execution_optionsÚ_orm_load_exec_optionsÚunionr@   Ú_propagate_attrsÚKeyErrorÚAssertionErrorrƒ   r>   )	rw   r,   rU   r(   r+   r*   Zis_reentrant_invoker)   r‚   rB   rB   rC   Úorm_pre_session_execù   s8    
üý
ÿ
z$ORMCompileState.orm_pre_session_execc                 C   sH   |j }|jj}| dtj¡}	|jjr(|S t|||||	||ƒ}
t 	||
¡S )Nr€   )
ÚcontextÚcompiledr&   Úgetr%   rD   Úcompile_optionsre   r   Z	instances)rw   r,   rU   r(   r+   r*   ÚresultZexecution_contextr&   r)   ZquerycontextrB   rB   rC   Úorm_setup_cursor_result<  s$    
 ÿù	z'ORMCompileState.orm_setup_cursor_resultc                 C   s   dd„ | j D ƒS )zºreturn all _MapperEntity objects in the lead entities collection.

        Does **not** include entities that have been replaced by
        with_entities(), with_only_columns()

        c                 S   s   g | ]}t |tƒr|‘qS rB   ©Ú
isinstanceÚ_MapperEntity©rF   ÚentrB   rB   rC   Ú
<listcomp>g  s    
 z9ORMCompileState._lead_mapper_entities.<locals>.<listcomp>)Ú	_entitiesrH   rB   rB   rC   Ú_lead_mapper_entities_  s    ÿz%ORMCompileState._lead_mapper_entitiesc                 C   s>   |j s:|jj| jkr:|j ¡ D ]}|  |t ||j¡¡ qdS )zagiven MapperEntity or ORMColumnEntity, setup polymorphic loading
        if appropriate

        N)	Úis_aliased_classrƒ   Úpersist_selectableÚ_polymorphic_adaptersÚiterate_to_rootÚ"_mapper_loads_polymorphically_withÚsql_utilÚColumnAdapterÚ_equivalent_columns)rI   Úext_infoÚ
selectableÚmprB   rB   rC   Ú _create_with_polymorphic_adapterk  s    ÿÿþþz0ORMCompileState._create_with_polymorphic_adapterc                 C   s:   |j p
|gD ](}|| j|< | ¡ D ]}|| j|j< q"qd S rE   )Ú_with_polymorphic_mappersr›   rœ   Zlocal_table)rI   rƒ   ÚadapterÚm2ÚmrB   rB   rC   r�   {  s    
z2ORMCompileState._mapper_loads_polymorphically_withc                 C   s   t dƒ‚d S )Nz0this method only works for ORMSelectCompileStaterh   )rw   r'   ry   rB   rB   rC   Ú_create_entities_collection�  s    ÿz+ORMCompileState._create_entities_collectionN)r8   r9   r:   rK   r\   r   rg   rf   Úcurrent_pathrV   rp   Úclassmethodrv   r|   r   rŠ   r�   Úpropertyr˜   r¤   r�   r©   rB   rB   rB   rC   rX   ›   s*   ,



B
"
rX   ZormZorm_from_statementc                   @   sP   e Zd Ze ¡ ZdZdZdZdZ	dZ
dZeZeZedd„ ƒZdd„ Zdd„ ZdS )	ÚORMFromStatementCompileStateNFc                 K   sè  |d k	r|j  }nd}|  | ¡}d |_|jj|_| |_|_|j |_	}|j
rV|j|_g |_i |_tƒ |_|j|_|jr¨t|tjƒr¨|js¨|j
s¨|jtkr¨| t¡|_n||_| |jsÄ|j
sÄ|jnt|j¡|_tj||j|jdd� |jj |_!|�r4|j"�r4dtƒ i|_#|j$|_%|j"D ]}|j&�r| '|¡ �qni |_#|j$|_%|j(�rd|j(D ]\}}	||ƒ �qPg |_)g |_*tƒ |_+g |_,g |_-d |_.t|jtj/tj0fƒ�rÐi |_1|jD ]}
|
 2|¡ �q¬t3|j|j)ƒ|_nt4j5j6|jdd�|_7|S )NT©Úis_current_entitiesÚ_unbound_load_dedupes)Zadapt_on_names)8ÚstackÚ__new__Ú_primary_entityÚ_compile_optionsrY   Úuse_legacy_query_stylerz   rL   ÚelementZrequested_statementZis_dmlÚtableZ	dml_tabler—   r›   ÚsetrQ   rŽ   r’   r   Ú
SelectBaseZ_is_textualÚ_label_styler   Zset_label_styler    rU   rv   Ú_label_conventionÚ_QueryEntityÚto_compile_stateÚ_raw_columnsr]   rª   rM   r   Ú_global_attributesÚglobal_attributesÚ_is_compile_stateÚprocess_compile_stateÚ_with_context_optionsÚprimary_columnsÚsecondary_columnsrl   r2   Ú_fallback_from_clausesÚorder_byZ
TextClauseZ
UpdateBaseÚextra_criteria_entitiesÚsetup_compile_stateÚ_AdHocColumnsStatementr   r   rŸ   Ú_from_obj_alias)rw   rz   r{   rk   ÚtoplevelrI   rU   rG   Úfnrq   ÚentityrB   rB   rC   r|   –  sš    

ÿÿ
þýüûÿÿÿüü

 
ÿ
 ÿ ÿz1ORMFromStatementCompileState.create_for_statementc                 C   s   |S rE   rB   ©rI   ÚcolsÚcurrent_adapterrB   rB   rC   Ú_adapt_col_list  s    z,ORMFromStatementCompileState._adapt_col_listc                 C   s   d S rE   rB   rH   rB   rB   rC   Ú_get_current_adapter
  s    z1ORMFromStatementCompileState._get_current_adapter)r8   r9   r:   r   ÚimmutabledictÚ_aliased_generationsrË   Ú_has_mapper_entitiesÚ_has_orm_entitiesÚmulti_row_eager_loadersÚeager_adding_joinsÚcompound_eager_adapterrK   rÈ   Úeager_joinsr«   r|   rÒ   rÓ   rB   rB   rB   rC   r­   ˆ  s   
pr­   c                   @   s6   e Zd ZdZdZdd„ Zdd„ Zdd„ Zdd
d„ZdS )rÊ   ztinternal object created to somewhat act like a SELECT when we
    are selecting columns from a DML RETURNING.


    Nc                 C   s   || _ dd„ |D ƒ| _d S )Nc                 S   s   g | ]}t  tj|¡‘qS rB   )r   Úexpectr   ZColumnsClauseRole©rF   ÚcrB   rB   rC   r–     s    z3_AdHocColumnsStatement.__init__.<locals>.<listcomp>)r¶   Úcolumn_args)rI   ÚtextÚcolumnsrB   rB   rC   rV     s    ÿz_AdHocColumnsStatement.__init__c                 C   s
   t ƒ ‚d S rE   rh   rH   rB   rB   rC   Ú_generate_cache_key  s    z*_AdHocColumnsStatement._generate_cache_keyc                 C   s
   t ƒ ‚d S rE   rh   )rI   Zanon_mapZ
bindparamsrB   rB   rC   Ú_gen_cache_key   s    z%_AdHocColumnsStatement._gen_cache_keyFc           	      K   s„   |j  }|r|jn|j d }|p>|dkr4| dd¡p>| dd¡}|rtd |_|_d|_| jD ]}|j|d|jd� q\|j| j	f|ŽS )z*provide a fixed _compiler_dispatch method.éÿÿÿÿr   Zneed_result_map_for_compoundFZneed_result_map_for_nestedT)Zwithin_columns_clauseZadd_to_result_map)
r±   Z_default_stack_entryr�   Z_ordered_columnsZ_textual_ordered_columnsZ_loose_column_name_matchingrß   ÚprocessZ_add_to_result_mapr¶   )	rI   r{   Zcompound_indexZasfromrk   rÌ   ÚentryZpopulate_result_maprÞ   rB   rB   rC   Ú_compiler_dispatch#  s*    ÿ
ü
ù
þ
ýz)_AdHocColumnsStatement._compiler_dispatch)NF)	r8   r9   r:   Ú__doc__Z__visit_name__rV   râ   rã   rç   rB   rB   rB   rC   rÊ     s      ÿrÊ   Úselectc                   @   s„  e Zd Ze ZZeZdZdZdZ	dZ
dZdZdZdZdZdZedd„ ƒZdd„ Zedd	„ ƒZed
d„ ƒZedd„ ƒZedd„ ƒZee d¡dd„ ƒƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Z dKd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>„ Z0d?d@„ Z1dAdB„ Z2e3dCdD„ ƒZ4e3dEdF„ ƒZ5dGdH„ Z6dIdJ„ Z7dS )LÚORMSelectCompileStateNFrB   c           
         sv  |   | ¡‰ |dk	r$|j }|jˆ _n
d}i ˆ _|}| j |j¡|_|jr`| ¡ ˆ _	t
 ¡ ˆ j	_n|ˆ _	|jjˆ _|jjˆ _g ˆ _dˆ _i ˆ _i ˆ _tƒ ˆ _|jjr¸t|jjƒˆ _ˆ  ¡  |jˆ _|sØˆ  jdddœ7  _ˆ j�rˆ j	jtk�rˆ jsütˆ _ntˆ _n
ˆ j	jˆ _|j�r,‡ fdd„|jD ƒˆ _ ˆ  !|jˆ j¡ˆ _"t#j$ˆ |j%ˆ jdd� |jj&ˆ _'dˆ _(|�rê|j)�sz|j�rêd	tƒ iˆ _*|jD ]8}|j)D ]*}|j+�r–| ,ˆ d
d„ ˆ j | D ƒ¡ �q–�qŒˆ j	j)D ]}|j+�rÎ| -ˆ ¡ �qÎni ˆ _*|j.�r|j.D ]\}}	|ˆ ƒ �qþg ˆ _/g ˆ _0tƒ ˆ _1i ˆ _2i ˆ _3g ˆ _4g ˆ _5ˆ  6dd„ |j7D ƒ¡ˆ _8ˆ  9¡  t:j;ˆ ˆ j<|f|Ž ˆ S )z@compiler hook, we arrive here from compiler.visit_select() only.NTF)r_   rd   c              	      s"   i | ]}|t jˆ |jg d d�“qS )Fr®   )r¼   r½   r¾   )rF   Úmemoized_entitiesrH   rB   rC   Ú
<dictcomp>©  s   ú üz>ORMSelectCompileState.create_for_statement.<locals>.<dictcomp>r®   rB   r°   c                 S   s   g | ]}t |tƒr|‘qS rB   r‘   r”   rB   rB   rC   r–   Õ  s   
üz>ORMSelectCompileState.create_for_statement.<locals>.<listcomp>c                 s   s   | ]}|j V  qd S rE   )r¢   )rF   ÚinforB   rB   rC   rJ   ö  s    z=ORMSelectCompileState.create_for_statement.<locals>.<genexpr>)=r²   r±   r¿   rÀ   rg   Ú
safe_merger´   r„   Z_clonerL   r   rÔ   rZ   Úfor_statementrY   rµ   r—   r³   rÕ   r›   r¸   rQ   r\   rP   Ú_setup_with_polymorphicsrŽ   rº   r$   r    rx   r   Ú_memoized_select_entitiesÚ_memoized_entitiesrv   r»   r¼   r½   r¾   r]   rª   Úeager_order_byrM   r   rÁ   Z'process_compile_state_replaced_entitiesrÂ   rÃ   rÄ   rÅ   rl   rÛ   rÈ   r2   rÆ   Ú_normalize_fromsÚ	_from_objÚfrom_clausesÚ_setup_for_generater!   rV   rU   )
rw   rU   r{   rk   rÌ   rL   rë   rG   rÍ   rq   rB   rH   rC   r|   \  sÀ    

ÿ

ÿÿþ

ÿ
þ

ø ÿü
ÿþþ
ÿþþ
ÿ
z*ORMSelectCompileState.create_for_statementc                    s  | j }d | _d| _| jjr"|  ¡  |jD ]8}|jrF|  |j| j	| ¡ |j
r(|  |j
| j	| ¡ q(|jrx|  |j| j¡ |j
rŽ|  |j
| j¡ |  ¡ ‰ |jrÂ|j| _ˆ rÂt‡ fdd„| jD ƒƒ| _ˆ rÞ|jdkrÞ|  |jˆ ¡n|j| _|j�rt‡ fdd„|jD ƒƒ| _ˆ �r.|jdk�r.|  t |j¡ˆ ¡n
|j�p8d | _| j�r^| jd j}| | j¡| _|j�rx|  |jˆ ¡| _nd| _|j| _|j �r¬tt dd„ |j D ƒ¡ƒ| _!n8|j"d k	�rÖtt dd„ |j"D ƒ¡ƒ| _#n|j$�säd	| _!|j%| _%| jj&�rt'| jƒd
k�rt( )d¡‚| jD ]}| *| ¡ �q| j+D ]$}|d }|| f|d
d … žŽ  �q.| jj,�rf|  -¡  | j.�sŽ| jj/�r„t( 0d¡‚n
t( 0d¡‚| j�s¢t1| j2ƒ| _| jdk�r´d | _| j3�rØ| j4�rØ| j5�rØ|  6¡ | _n
|  7¡ | _| j8�r|  9¡ }|d k	�r| j :d|i¡| _d S )NrB   c                 3   s   | ]}ˆ |d ƒV  qdS ©TNrB   ©rF   Úcrit©rÑ   rB   rC   rJ   $  s   ÿz<ORMSelectCompileState._setup_for_generate.<locals>.<genexpr>©NFc                 3   s    | ]}ˆ rˆ |d ƒn|V  qdS rø   rB   rù   rû   rB   rC   rJ   3  s   ÿr   c                 s   s$   | ]}|d k	rt  |¡nd V  qd S rE   ©rž   Zsurface_selectables©rF   ÚsrB   rB   rC   rJ   R  s   ÿc                 s   s$   | ]}|d k	rt  |¡nd V  qd S rE   rý   rþ   rB   rB   rC   rJ   Y  s   ÿrE   r   zsCan't generate ORM query that includes multiple expressions at the same time as '*'; query for '*' alone if presentzyNo column-based properties specified for refresh operation. Use session.expire() to reload collections and related items.z4Query contains no columns with which to SELECT from.FZ
deepentity);rL   rU   Ú_join_entitiesrŽ   rb   Ú_set_select_from_aliasrñ   Ú_setup_joinsÚ_joinrò   Ú_legacy_setup_joinsÚ_legacy_joinr—   rÓ   Ú_where_criteriarN   Ú_order_by_clausesrÒ   rÇ   Ú_having_criteriaÚ_group_by_clausesr   Zflatten_iteratorÚgroup_byró   rö   Z_target_adapterÚcopy_and_processZ_distinct_onÚdistinct_onZ	_distinctÚdistinctZ
_correlateÚ	correlateZ_correlate_exceptÚcorrelate_exceptZ_auto_correlateÚ_for_update_argre   ÚlenrR   ÚCompileErrorrÉ   r2   r^   Ú_adjust_for_extra_criteriarÄ   ra   rS   ÚlistrÆ   rØ   rÙ   Ú_should_nest_selectableÚ_compound_eager_statementÚ_simple_statementrï   Ú_mapper_zeroZ	_annotate)rI   r'   rë   r¦   rÎ   ZrecZstrategyÚezerorB   rû   rC   r÷     sØ    
þþþ

ÿÿýþ
	ýý
 ÿ
û ÿ
þÿ
þÿÿ



ÿÿÿþý

ÿz)ORMSelectCompileState._setup_for_generatec                 C   st   |   | ¡}g |_d|_i |_i |_| j |j¡}|jrJt	|jƒ|_| 
¡  | |j|¡|_tj||j|jdd� |S )a  Creates a partial ORMSelectCompileState that includes
        the full collection of _MapperEntity and other _QueryEntity objects.

        Supports a few remaining use cases that are pre-compilation
        but still need to gather some of the column  / adaption information.

        NTr®   )r²   r—   r³   rÕ   r›   rg   rî   r´   r\   rP   rð   rv   rº   r»   r¼   r½   r¾   )rw   r'   ry   rI   rŽ   rB   rB   rC   r©   ›  s0    	
ÿÿ ÿ   ÿz1ORMSelectCompileState._create_entities_collectionc                 C   s8   |j }|sd S |d \}}}}t|tjƒr0|jS |S d S )Nrä   )r  r’   r   ÚPropComparatorrÎ   )rw   rU   Úsetup_joinsÚtargetÚonclauseÚfrom_ÚflagsrB   rB   rC   Údetermine_last_joined_entityÀ  s    z2ORMSelectCompileState.determine_last_joined_entityc                 c   s|   |j D ]p}|jr`d|jkr`|jd }|jsH|jsHt|gƒD ]
}|V  q:qvt|jƒD ]
}|V  qRqt|gƒD ]
}|V  qjqd S )NZentity_namespace)r¾   Úis_selectableÚ_annotationsÚ	is_mapperr™   r   Z_all_column_expressions)rw   rU   r¶   ZensÚelemrB   rB   rC   Úall_selected_columnsÎ  s    
ÿþ


z*ORMSelectCompileState.all_selected_columnsc                 C   s   |   tj dd„ |jD ƒ¡¡S )Nc                 s   s.   | ]&}d |j kr|jn|j d   ¡ gV  qdS )ÚparententityN)r"  Ú_from_objectsÚ__clause_element__)rF   r¶   rB   rB   rC   rJ   ã  s
   üÿÿzAORMSelectCompileState.get_columns_clause_froms.<locals>.<genexpr>)rô   Ú	itertoolsÚchainÚfrom_iterabler¾   r~   rB   rB   rC   Úget_columns_clause_fromsà  s
    úÿz.ORMSelectCompileState.get_columns_clause_fromszsqlalchemy.orm.queryc                 C   sH   t jj}tjtj||d�}| |j|¡}|j	j
|j|j|j|jd� |S )N)Zapply_propagate_attrs)rM   rÃ   r„   r‡   )r   Z	preloadedZ	orm_queryr   rÜ   r   ZReturnsRowsRoleZFromStatementr¾   Ú__dict__ÚupdaterM   rÃ   r„   r‡   )rw   rU   Úfrom_statementr'   ÚstmtrB   rB   rC   r/  í  s    ýüz$ORMSelectCompileState.from_statementc                 C   s&   | j  ¡ D ]\}}|  ||j¡ q
d S rE   )r\   Úitemsr�   Ú_adapter)rI   r¡   ÚwprB   rB   rC   rð     s    z.ORMSelectCompileState._setup_with_polymorphicsc                 C   sT   | j }| jjst‚t|jƒdks$t‚|  |jd ¡}|rP|  jddi7  _|| _d S )Nr   r   r^   F)rL   rŽ   rb   r‰   r  rõ   Ú_get_select_from_alias_from_objrË   )rI   r'   r¦   rB   rB   rC   r    s    z,ORMSelectCompileState._set_select_from_aliasc                 C   sh   |}d|j kr|j d }t|dƒr<|js4t d¡‚qd|jS n(t|jtjj	ƒr`|  
¡ }t ||¡S d S d S )Nr&  rƒ   zPA selectable (FromClause) instance is expected when the base alias is being set.)r"  Úhasattrr™   rR   ÚArgumentErrorr2  r’   r¢   r   ÚAliasedReturnsRowsÚ_all_equivsrž   rŸ   )rI   Úfrom_objrí   ÚequivsrB   rB   rC   r4    s    


ÿz5ORMSelectCompileState._get_select_from_alias_from_objc                 C   s   | j d jS )z8return the Mapper associated with the first QueryEntity.r   )r—   rƒ   rH   rB   rB   rC   r  (  s    z"ORMSelectCompileState._mapper_zeroc                 C   sD   | j D ]}d|jkr|jd   S q| jD ]}|jr*|j  S q*dS )z›Return the 'entity' (mapper or AliasedClass) associated
        with the first QueryEntity, or alternatively the 'select from'
        entity if specified.r&  N)rö   r"  r—   Úentity_zero)rI   r•   ZqentrB   rB   rC   Ú_entity_zero,  s    


z"ORMSelectCompileState._entity_zeroc                 C   s$   | j | jgkrt d| ¡‚| jjS )Nz4%s() can only be used against a single mapped class.)r—   r³   rR   rS   r;  )rI   ZmethnamerB   rB   rC   Ú_only_full_mapper_zero:  s    ÿÿz,ORMSelectCompileState._only_full_mapper_zeroc                 C   s$   t | jƒdkrt |pd¡‚|  ¡ S )Nr   z8This operation requires a Query against a single mapper.)r  r—   rR   rS   r<  )rI   Z	rationalerB   rB   rC   Ú_only_entity_zeroB  s    þz'ORMSelectCompileState._only_entity_zeroc                 C   s^   i }| j  ¡ D ]&}dd„ |D ƒD ]}| |jj¡ q qdd„ | jD ƒD ]}| |jj¡ qF|S )Nc                 S   s   g | ]}t |tƒr|‘qS rB   r‘   r”   rB   rB   rC   r–   O  s   
þz5ORMSelectCompileState._all_equivs.<locals>.<listcomp>c                 S   s   g | ]}t |tƒr|‘qS rB   r‘   r”   rB   rB   rC   r–   V  s    
 )rò   Úvaluesr.  rƒ   r    r—   )rI   r:  rë   r•   rB   rB   rC   r8  K  s    þ
ÿ
z!ORMSelectCompileState._all_equivsc                    sD  ˆ j r&dd„ ˆ j D ƒ}t ˆ j|¡}ng }d }ˆ jˆ j‡ fdd„|D ƒ ˆ jˆ jˆ jˆ jˆ j fˆ j	ˆ j
jˆ j
jˆ jˆ jdœˆ j—Ž}| ¡ }ˆ  ¡ }t ||¡ˆ _tj|gˆ j Ž }ˆ j|_ˆ j	d k	rÚˆ j	jd krÚˆ j	|_	|}ˆ j ¡ D ]}t |||j¡}qè|j ||¡ |�r,|j j|fˆ j |¡žŽ  |j j|fˆ j žŽ  |S )Nc                 S   s$   g | ]}t |tjjƒr|jn|‘qS rB   )r’   r   ÚelementsZ_label_referencer¶   )rF   r$  rB   rB   rC   r–   h  s   þÿzCORMSelectCompileState._compound_eager_statement.<locals>.<listcomp>c                    s   g | ]}|ˆ j kr|‘qS rB   )rl   rÝ   rH   rB   rC   r–   z  s     
 ©Ú
for_updateÚhintsÚstatement_hintsr  r  )!rÇ   rž   Ú expand_column_list_from_order_byrÄ   Ú_select_statementrö   r  r  rx   r  rL   Ú_hintsÚ_statement_hintsr  r  Ú_select_argsÚaliasr8  rŸ   rÚ   r   ré   rÅ   rº   ZofrÛ   r?  Zsplice_joinsZstop_onÚselect_fromÚnon_generativer  ró   )rI   Zunwrapped_order_byZorder_by_col_exprÚinnerr:  rU   Zfrom_clauseZ
eager_joinrB   rH   rC   r  \  st    ü ÿÿùôó
ÿÿ
þ  ÿÿÿþz/ORMSelectCompileState._compound_eager_statementc                 C   sÀ   | j jrF| jrF| jsF| jrFt | j| j¡}|r8t 	d¡ |  j|7  _| j
| j| j t| jƒt| j ¡ ƒ | j| j| j| jf| j| jj| jj| j| jdœ| j—Ž}| jr¼|jj|f| jžŽ  |S )NzÝORDER BY columns added implicitly due to DISTINCT is deprecated and will be removed in SQLAlchemy 2.0.  SELECT statements with DISTINCT should be written to explicitly include the appropriate columns in the columns clauserA  )rŽ   rY   r  r  rÇ   rž   rE  rÄ   r   Úwarn_deprecated_20rF  rÅ   rN   rö   rÛ   r?  r  r  rx   r  rL   rG  rH  r  r  rI  ró   rL  )rI   Zto_addrU   rB   rB   rC   r  ³  sH    ÿþþý ÿÿ
úõôz'ORMSelectCompileState._simple_statementc                 C   sø   t j}|j|||d�}|r ||_|r*||_|r@| jt|ƒ7  _|rX|jj|f|žŽ  n|rh|j |¡ |r~| j	t|ƒ7  _	||_
||_||_||_|r ||_|rª||_||_|rº||_|	rÄ|	|_|
rÚ|jj|f|
žŽ  |d k	rô|jj|f|žŽ  |S )N)r¾   rõ   rº   )r   ÚSelectZ_create_raw_selectr  r  r  rN   r  rL  r	  Ú_limit_clauseÚ_offset_clauseÚ_fetch_clauseÚ_fetch_clause_optionsÚ	_prefixesÚ	_suffixesr  rG  rH  r  r  )rI   Zraw_columnsr9  Zwhere_criteriaZhaving_criteriarx   rÇ   rB  rC  rD  r  r  Úlimit_clauseÚoffset_clauseÚfetch_clauseÚfetch_clause_optionsr  r  ÚprefixesÚsuffixesr
  rO  rU   rB   rB   rC   rF  Ú  sP    ýÿÿz'ORMSelectCompileState._select_statementc                 C   sx   d|j kr0|j d }| j |d ¡}|r0| |¡S t|tjƒrB|}nt|dƒrT|j}nd S | j |d ¡}|rt| |¡S d S )Nr&  r·   )	r"  r›   r�   Zadapt_clauser’   r   Z
FromClauser5  r·   )rI   r¶   ÚsearchrJ  rB   rB   rC   Ú_adapt_polymorphic_element%  s    



z0ORMSelectCompileState._adapt_polymorphic_elementc                 C   sB   d|j kr>| j |j d d¡D ]}| |¡}|d k	r|  S qd S )NÚaliased_generationrB   )r"  rÕ   r�   Úreplace)rI   r¶   r¦   Zreplaced_elemrB   rB   rC   Ú_adapt_aliased_generation7  s    
 ÿ

z/ORMSelectCompileState._adapt_aliased_generationc                    s   ˆ r‡ fdd„|D ƒS |S d S )Nc                    s   g | ]}ˆ |d ƒ‘qS )TrB   )rF   Úorû   rB   rC   r–   F  s     z9ORMSelectCompileState._adapt_col_list.<locals>.<listcomp>rB   rÏ   rB   rû   rC   rÒ   D  s    z%ORMSelectCompileState._adapt_col_listc                    sl   g ‰ | j r(ˆ  | jjrdnd| j jf¡ | jr>ˆ  d| jf¡ | jrTˆ  d| jf¡ ˆ s\d S ‡ fdd„}|S )NFTc                    s   ‡ fdd„}t  | i |¡S )Nc                    sF   d| j kpd| j k}ˆ D ](\}}|s(|r|| ƒ}|d k	r|  S qd S )NÚ
_orm_adaptr&  )r"  )r$  Zis_orm_adaptZalways_adaptr¦   Úe©ÚadaptersrB   rC   r_  t  s    
þzRORMSelectCompileState._get_current_adapter.<locals>._adapt_clause.<locals>.replace)r   Zreplacement_traverse)r�   Z	as_filterr_  rd  rB   rC   Ú_adapt_clausep  s    zAORMSelectCompileState._get_current_adapter.<locals>._adapt_clause)	rË   rn   rŽ   r`   r_  rÕ   r`  r›   r]  )rI   rf  rB   rd  rC   rÓ   J  s"    
ÿüÿz*ORMSelectCompileState._get_current_adapterc                 C   sð  |D �]ä\}}}}|d }|d }|   ¡  t|ƒ}|d k	rBt|ƒ}|d kr`t|tjƒr`|}d }nd|jkrt|jd }|d kr–|js–t|dƒs–t 	d¡‚d }	t|tjƒ�r´t
|dd ƒ}	|d k�r|	rÈ|	}nN|j}z
|j}W n< tk
�r }
 ztjt 	d| ¡|
d� W 5 d }
~
X Y nX |j}| j |d ¡}t|tƒ�rV|j |¡�rV|j}t
||jƒ}|j}t|tjƒ�sn|}|d k	�rÐ||k	�rÐ|j dd ¡|k	�rÐt d	|j d|¡|f ¡‚n|d k	�rÈd }|}nd  }}|  |||||d
d
||¡	 qd S )NÚisouterÚfullr&  rƒ   ú9Expected mapped entity or selectable/table as join targetÚ_of_typeú0Join target %s does not refer to a mapped entity©Zreplace_contextzMexplicit from clause %s does not match left side of relationship attribute %sF)Ú_reset_joinpointr   r’   r   r  r"  r!  r5  rR   r6  rr   r¬   rÎ   ÚAttributeErrorr   Úraise_Ú_parententityr›   r�   r   rƒ   ÚisaÚaliased_classrq   r   ÚQueryableAttributerS   Ú_join_left_to_right)rI   ÚargsÚentities_collectionÚrightr  r  r  rg  rh  Úof_typeÚerrÚleftrJ  ÚproprB   rB   rC   r  ƒ  s–    
 ÿ

ÿ

ÿÿû
ÿÿþþþÿ
÷zORMSelectCompileState._joinc                 C   sÐ  |D �]Ä\}}}}|d }|d }|d }	|d }
|d }|dk	rVt |tjƒsVt|ƒ}|dk	rrt |tjƒsrt|ƒ}|	s€|  ¡  n0| j dd¡}|s˜|}n|r°| j |d¡| j|< t |tj	tjfƒrÔ|dkrÔ|}d}nd|j
krè|j
d }|dk�r|j�st|d	ƒ�st d
¡‚t |tj	ƒ�r,t|ddƒ}nd}t |tjƒ�rRtt|  ¡ ƒ|ƒ}nD|	�r–t |tj	ƒ�r–|  ¡ }t|ƒ}t|d	dƒ|jk�r–t||jƒ}t |tj	ƒ�r¨|dk�r|�rº|}nN|j}z
|j}W n< tk
�r } ztjt d| ¡|d� W 5 d}~X Y nX |j}| j |d¡}t |tƒ�rH|j |¡�rH|j}t||jƒ}|j}t |tjƒ�s`|}|�s°|||jf}|| jk�r°| j|  ¡ }|| jf|d< |   |¡ qnd }}|  !|||||||||
¡	 qdS )z”consumes arguments from join() or outerjoin(), places them into a
        consistent format with which to form the actual JOIN constructs.

        rg  r   Úfrom_joinpointrh  r^  NrB   r&  rƒ   ri  rj  rk  rl  Úprev)"r’   r   Ústring_typesr   rm  Ú
_joinpointr�   rÕ   r   r  r"  r!  r5  rR   r6  rr   r   Ú_joinpoint_zerorp  rq   r¬   rÎ   rn  ro  r›   r   rƒ   rq  rr  r   rs  ÚcopyÚ_update_joinpointrt  )rI   ru  rv  rw  r  rz  r  Ú	outerjoinÚcreate_aliasesr|  rh  r^  Zprev_aliased_generationrx  Zjp0rí   ry  rJ  r{  ÚedgeÚjprB   rB   rC   r  ÷  sÐ    
 ÿ
 ÿ ÿþÿ 
ÿÿü


ÿ
 ÿ ÿ

ÿÿû
÷z"ORMSelectCompileState._legacy_joinc                 C   s   | j  d|  ¡ ¡S )NÚ_joinpoint_entity)r  r�   r<  rH   rB   rB   rC   r€  –  s    z%ORMSelectCompileState._joinpoint_zeroc
              	   C   s"  |dkr,|dkst ‚|  ||||¡\}}
}n|  ||¡\}
}||krZ|sZt d||f ¡‚|  ||||||¡\}}}|js†|  |¡}nd}|
dk	rÖ| j|
 }| jd|
… t	|||||	|d�g | j|
d d…  | _nH|dk	rüt
|| tƒsðt ‚|| j}n|}| jt	|||||	|d�g | _dS )zÆgiven raw "left", "right", "onclause" parameters consumed from
        a particular key within _join(), add a real ORMJoin object to
        our _from_obj list (or augment an existing one)

        Nz>Can't construct a join from %s to %s, they are the same entityrB   )rg  rh  Z_extra_criteriar   )r‰   Ú"_join_determine_implicit_left_sideÚ_join_place_explicit_left_siderR   rS   Ú _join_check_and_adapt_right_sider!  Ú_get_extra_criteriarö   r
   r’   r“   r¢   )rI   rv  rz  rw  r  r{  r„  r^  rƒ  rh  Úreplace_from_obj_indexÚuse_entity_indexÚr_infoZextra_criteriaZleft_clauserB   rB   rC   rt  ™  s†       ÿüý
ýÿÿ     ÿ

úÿÿõÿ ÿúÿz)ORMSelectCompileState._join_left_to_rightc                 C   sX  t |ƒ}d }}| jrrt | j|j|¡}t|ƒdkrH|d }| j| }n(t|ƒdkr`t d¡‚nt d|f ¡‚nÜ|�rDi }	t|ƒD ]R\}
}|j	}|dkrœq„t |ƒ}||kr®q„t
|tƒrÈ|
|f|	|j< q„d|f|	|j< q„t|	 ¡ ƒ}t ||j|¡}t|ƒdk�r|	||d   \}}n*t|ƒdk�r2t d¡‚nt d|f ¡‚n
t d¡‚|||fS )z­When join conditions don't express the left side explicitly,
        determine if an existing FROM or entity in this query
        can serve as the left hand side.

        Nr   r   a  Can't determine which FROM clause to join from, there are multiple FROMS which can join to this entity. Please use the .select_from() method to establish an explicit left side, as well as providing an explicit ON clause if not present already to help resolve the ambiguity.zÇDon't know how to join to %r. Please use the .select_from() method to establish an explicit left side, as well as providing an explicit ON clause if not present already to help resolve the ambiguity.zgNo entities to join from; please use select_from() to establish the left entity/selectable of this join)r   rö   rž   Zfind_left_clause_to_join_fromr¢   r  rR   rS   Ú	enumerateÚentity_zero_or_selectabler’   r“   r  Úkeys)rI   rv  rz  rw  r  rŽ  rŒ  r�  ÚindexesZ	potentialZentity_indexr•   rÎ   Zent_infoZall_clausesrB   rB   rC   rˆ  þ  sj      ÿÿ	üÿ
  ÿÿ	üÿÿz8ORMSelectCompileState._join_determine_implicit_left_sidec           	      C   s”   d }}t |ƒ}| jrHt | j|j¡}t|ƒdkr<t d¡‚|rH|d }|dkrŒ|rŒt|dƒrŒt	|ƒD ]$\}}t
|tƒrf| |¡rf|} qŒqf||fS )zøWhen join conditions express a left side explicitly, determine
        where in our existing list of FROM clauses we should join towards,
        or if we need to make a new join, and if so is it from one of our
        existing entities.

        Nr   zrCan't identify which entity in which to assign the left side of this join.   Please use a more specific ON clause.r   rƒ   )r   rö   rž   Z#find_left_clause_that_matches_givenr¢   r  rR   rS   r5  r�  r’   r“   Úcorresponds_to)	rI   rv  rz  rŒ  r�  Úl_infor’  Úidxr•   rB   rB   rC   r‰  h  s0     ÿÿ
ÿþýz4ORMSelectCompileState._join_place_explicit_left_sidec                 C   s  t |ƒ}t |ƒ}d}	|stt|ddƒ}
|
rt|
js<t|
jtjƒrt| jpH|jgD ](}t	 
|j|¡rJt	 
||j¡rJd}	 qtqJ|	s||s˜|j|jkr˜t d|j ¡‚t|ddƒ|jt|ddƒ  }
}}|
rà|rà|
 |j¡sàt d||f ¡‚t|dƒrú|  j|f7  _d}|j�r´|�r|j}
|j�r8|  ¡ }|dk	�r´||dƒ}n||�r¤| |
j¡�sdt d|j|
jjf ¡‚t|tjƒ�r„t tj|¡}d}t|
|ƒ}tjd	|
 d
dd� n|�r´t d¡‚|
�oÄ| �oÄ|	}|�s |�sØ|�r t|dd�}d}|�s tjd|
 dd� |�rZ|
�st‚t ||
j!d�}|�s2|  "|
|¡ n&|�r˜d|_#|f| j$ %|d¡ | j$|< n>|j�s˜|�s˜|
j�r˜t|
j&tj'ƒ�r˜|  "|
t	 (|
j|
j!¡¡ t|tj)ƒ�r¾|  ¡ }|�r¾||dƒ}|�sì|�rì|  *||||j+f| j,f|dœ¡ n||dœ| _,t |ƒ||fS )zútransform the "right" side of the join as well as the onclause
        according to polymorphic mapping translations, aliasing on the query
        or on the join, special cases where the right and left side have
        overlapping tables.

        Frƒ   NTz*Can't join table/selectable '%s' to itselfr™   zIJoin target %s does not correspond to the right side of join condition %sz(Selectable '%s' is not derived from '%s'zÕAn alias is being generated automatically against joined entity %s for raw clauseelement, which is deprecated and will be removed in a later release. Use the aliased() construct explicitly, see the linked example.z1.4Zxaj1)ÚcodezpThe aliased=True parameter on query.join() only works with an ORM entity, not a plain selectable, as the target.)Zflatz÷An alias is being generated automatically against joined entity %s due to overlapping tables.  This is a legacy pattern which may be deprecated in a later release.  Use the aliased(<entity>, flat=True) construct explicitly, see the linked example.Zxaj2)ZequivalentsrB   )r‡  r}  r^  )r‡  r^  )-r   rr   Úwith_polymorphicr’   rš   r   ZJoinrö   r¢   rž   Zselectables_overlaprR   rS   Úcommon_parentrƒ   r5  r   Úis_clause_elementZ_is_lateralrÓ   Zis_derived_fromÚdescriptionr¹   r   rÜ   r   ZFromClauseRoler   r   Zwarn_deprecatedÚwarnr‰   r   r    r�   Ú_debugrÕ   r�   Z_with_polymorphic_selectabler7  rŸ   r   r‚  rq   r  )rI   rz  rw  r  r{  r„  r^  r”  rŽ  ZoverlapZright_mapperr9  Zright_selectableZright_is_aliasedZneed_adapterrÑ   Zaliased_entityr¦   rB   rB   rC   rŠ  ª  s"   
ÿþ ÿ ÿþÿÿ
þÿÿ

ý
ÿþ
ýÿÿ

ÿþÿÿ
 ÿ
ûøÿ	úø
 ÿÿþÿþýþüþþ	
ýÿ	þz6ORMSelectCompileState._join_check_and_adapt_right_sidec                 C   sJ   || _ d|kr@|d \}}t|ƒ}| ¡ ||< ||f|d< |}q|| _d S )Nr}  )r  rP   r�  Ú	_joinpath)rI   r†  Úfr}  rB   rB   rC   r‚  †  s    z'ORMSelectCompileState._update_joinpointc                 C   s   | j | _d S rE   )r�  r  rH   rB   rB   rC   rm  ’  s    z&ORMSelectCompileState._reset_joinpointc              
   C   s:   | j j| j j| j| j| j j| j j| jp(d | j j| j j	dœ	S )N)	rV  rW  r  r  rZ  r[  r
  rX  rY  )
rL   rP  rQ  r  r  rT  rU  r
  rR  rS  rH   rB   rB   rC   rI  •  s    öz"ORMSelectCompileState._select_argsc                 C   sF   | j }| d¡d k	pD| d¡d k	pD| dd¡pD| dd¡pD| dd¡S )NrV  rW  r  Fr  rB   r
  )rI  r�   )rI   ÚkwargsrB   rB   rC   r  ¥  s    ÿ
þ
ý
ûz-ORMSelectCompileState._should_nest_selectablec                    s<   dˆ j fˆjkr4t‡ ‡fdd„ˆjdˆ j f D ƒƒS dS d S )NÚadditional_entity_criteriac                 3   s2   | ]*}|j s|jˆ kr| ˆ¡r| ˆ ¡V  qd S rE   )Zinclude_aliasesrÎ   Z_should_includeZ_resolve_where_criteria)rF   Zae©r¡   rI   rB   rC   rJ   µ  s
    

ûz<ORMSelectCompileState._get_extra_criteria.<locals>.<genexpr>rB   )rƒ   rÀ   rN   )rI   r¡   rB   r¡  rC   r‹  °  s    þýÿþ	z)ORMSelectCompileState._get_extra_criteriac           	      C   s
  | j D ]V}|j dd¡}|r|jjdk	s8d|jf| jkr|| jkr||jrP|jndf| j|< qt	| j 
¡ ƒ}|D ]”\}}|| jkr„qp|jj}| jjršg }n
|  |¡}|dk	r¶||f7 }|  ¡ }|D ]@}|rÔ| |¡}|ròt |ddi¡}||dƒ}|  j|f7  _qÂqpdS )aà  Apply extra criteria filtering.

        For all distinct single-table-inheritance mappers represented in
        the columns clause of this query, as well as the "select from entity",
        add criterion to the WHERE
        clause of the given QueryContext such that only the appropriate
        subtypes are selected from the total results.

        Additionally, add WHERE criteria originating from LoaderCriteriaOptions
        associated with the global context.

        r&  Nr   rb  TF)rö   r"  r�   rƒ   Ú_single_table_criterionrÀ   rÈ   r™   r2  r¸   r?  r   rŽ   rc   r‹  rÓ   Útraverserž   Z_deep_annotater  )	rI   Z
fromclauser¡   r\  r¦   Zsingle_critr   rÑ   rú   rB   rB   rC   r  À  sB    
ÿ
ýÿüùþ




z0ORMSelectCompileState._adjust_for_extra_criteria)N)8r8   r9   r:   rK   r�  r  rò   rË   rÖ   r×   rØ   rÙ   rÚ   r  r  r  r  r«   r|   r÷   r©   r   r%  r,  r   Zpreload_moduler/  rð   r  r4  r  r<  r=  r>  r8  r  r  rF  r]  r`  rÒ   rÓ   r  r  r€  rt  rˆ  r‰  rŠ  r‚  rm  r¬   rI  r  r‹  r  rB   rB   rB   rC   rê   I  sx   
 ' 
$



	W'K9t  ejB ]


rê   Fc                 C   s4   |d krt j| |d�}|}dd„ dd„ |jD ƒD ƒS )N)ry   c              
   S   sJ   g | ]B\}}|j |jt|d dƒ|j|jdk	r>|js>t|ddƒnddœ‘qS )r™   FNrÎ   )ru   Útyper   ÚexprrÎ   )Ú_label_namer¤  rr   r¥  r;  r™  )rF   r•   Zinsp_entrB   rB   rC   r–   	  s   
ø
ÿÿùz(_column_descriptions.<locals>.<listcomp>c                 S   s(   g | ] }||j d k	rt|j ƒnd f‘qS rE   )r;  r   )rF   Z_entrB   rB   rC   r–   	  s   	ùÿû)rê   r©   r—   )Zquery_or_select_stmtr&   ry   ÚctxrB   rB   rC   r}   ú  s     ÿ
	÷ör}   c                 C   sJ   | }|j r|j}|d k	r|S |jrBd|jd jkrB|jd jd S t|ƒS )Nr&  r   )r  Ú_last_joined_entityrõ   r"  Ú_entity_from_pre_ent_zero)Úquery_or_augmented_selectrI   r¨  rB   rB   rC   Ú_legacy_filter_by_entity_zero	  s    r«  c                 C   sX   | }|j sd S |j d }d|jkr,|jd S t|tƒr<|jS d|jkrP|jd S |S d S )Nr   r&  Úbundle)r¾   r"  r’   r   rÎ   )rª  rI   r•   rB   rB   rC   r©  '	  s    





r©  c                 C   sú   | s|S | d \}}}}|d }|dkr@t |ttjfƒr@|}d}|dk	r^d|jkr^|jd j}|dk	rˆ|}t|ƒ}|js„|js„|j	rˆ|S |}t |tjƒrž|jS t |tƒrö|rÀt
| dd… |ƒ}	n|}	|	dkrÐdS t|	ƒ}	t|	j|dƒ}
|
dk	rö|
jjS dS )a  given the legacy_setup_joins collection at a point in time,
    figure out what the "filter by entity" would be in terms
    of those joins.

    in 2.0 this logic should hopefully be much simpler as there will
    be far fewer ways to specify joins with the ORM

    rä   r|  Nr&  r   )r’   Ústrr   r  r"  rÎ   r   r™  r™   r#  Ú$_legacy_determine_last_joined_entityrr   r¬   )r  r;  rw  r  Zleft_r  r|  Zlast_entityZinspr}  ÚattrrB   rB   rC   r®  8	  sD    

 ÿ

 ÿr®  c                   @   s,   e Zd ZdZdZdZdZdZedd„ ƒZ	dS )r¼   z:represent an entity column returned within a Query result.rB   Fc                 C   sÜ   t |ƒD ]Î\}}|jr8|jr2|  ||j||¡ qn|j}|jrÄ|jrtd|jkr^t||||ƒ qÂt	 
||j|||¡ qÖ|j dd¡r’t||||ƒ qÖ|jr®t	 
||j|||¡ qÖt	 
||g|||¡ q|jrt|||ƒ q|S )Nr&  r¬  F)r�  Z_is_lambda_elementZ_is_sequencer½   Z	_resolvedr™  r!  r"  r“   Ú_ColumnEntityÚ_for_columnsZ_select_iterabler�   Ú_BundleEntityZ_is_clause_listZ	is_bundle)rw   r&   Úentitiesrv  r¯   r•  rÎ   rB   rB   rC   r½   „	  sh    ü
üûüûûz_QueryEntity.to_compile_stateN)
r8   r9   r:   rè   rW   Ú_non_hashable_valueÚ_null_column_typeÚuse_id_for_hashr«   r½   rB   rB   rB   rC   r¼   {	  s   r¼   c                   @   s`   e Zd ZdZdZdd„ ZdZdZdZe	dd„ ƒZ
e	dd	„ ƒZd
d„ Zdd„ Zdd„ Zdd„ ZdS )r“   z mapper/class/AliasedClass entity)
r¥  rƒ   r;  r™   ÚpathÚ_extra_entitiesr¦  r¥   r¢   Ú_polymorphic_discriminatorc           
      C   s  |  | ¡ |r*|jd kr| |_d|_d|_|jd }|j | }| _|j}|| _|j	 | _	}| jf| _
|jrv|j| _n
|jj| _|j| _|j| _||jkràt|j| ƒ}| jr¶tdƒ‚| |j|j¡\}}	|| _|	| _|j| _n.|j| _|j| _|j| _|j�r| || j¡ d S )NTr&  z6Can't use with_polymorphic() against an Aliased object)rn   r³   rÖ   r×   r"  Ú_post_inspectr;  rÎ   r¥  rƒ   r¸  r™   ru   r¦  Úclass_r8   rf   r·  r\   r   ri   Z_with_polymorphic_argsZwith_polymorphic_mappersr¢   r¥   Zpolymorphic_onr¹  Ú _should_select_with_poly_adapterr¤   )
rI   r&   rÎ   rv  r¯   r¡   rƒ   r3  Zmappersr9  rB   rB   rC   rV   ×	  sN    







ÿ ÿ
 ÿz_MapperEntity.__init__Tc                 C   s   | j jS rE   )rƒ   r»  rH   rB   rB   rC   r¤  
  s    z_MapperEntity.typec                 C   s   | j S rE   )r;  rH   rB   rB   rC   r�  
  s    z'_MapperEntity.entity_zero_or_selectablec                 C   s   t | j|ƒS rE   )r	   r;  ©rI   rÎ   rB   rB   rC   r“  
  s    z_MapperEntity.corresponds_toc                 C   sR   d }| j s"|jr*|j | jd ¡}n| jj}|rH|jrB| |j¡}qN|}n|j}|S rE   )r™   r›   r�   rƒ   r;  r2  rË   Úwrap)rI   r&   r¦   ÚretrB   rB   rC   Ú_get_entity_clauses!
  s     ÿz!_MapperEntity._get_entity_clausesc                 C   s„   |j }|  |¡}|jr(|r(| |j¡}n
|s2|j}|j| krL|jj}|j}nd  }}tj	| | j
||| j|||| jd�	}|| j| jfS )N)Úonly_load_propsr1   Úpolymorphic_discriminator)r&   rÀ  rÚ   r¾  r³   rŽ   ra   r1   r   Z_instance_processorrƒ   r·  r¹  r¦  r¸  )rI   r‹   r�   r&   r¦   rÁ  r1   Z	_instancerB   rB   rC   Úrow_processor7
  s,    


÷z_MapperEntity.row_processorc                 C   s†   |   |¡}| jj}|d k	s*d| jf|jkrJ| j}||jr>|jnd f|j|< tj	|| j| | j
||j| j|jj| jd�	 |j | j¡ d S )Nr   )r—  rÁ  rÂ  )rÀ  rƒ   r¢  rÀ   r;  r™   r2  rÈ   r   Z_setup_entity_queryr·  rÄ   r¥   rŽ   ra   r¹  rÆ   rn   r¢   )rI   r&   r¦   Úsingle_table_critr¡   rB   rB   rC   rÉ   T
  s0    
ÿÿþþ
÷z!_MapperEntity.setup_compile_stateN)r8   r9   r:   rè   rW   rV   Úsupports_single_entityr´  r¶  r¬   r¤  r�  r“  rÀ  rÃ  rÉ   rB   rB   rB   rC   r“   Ç	  s   :

r“   c                   @   sZ   e Zd ZdZdZddd„Zedd„ ƒZed	d
„ ƒZdd„ Z	edd„ ƒZ
dd„ Zdd„ ZdS )r²  rB   )r¬  r¥  r¤  r¦  r—   rÅ  TNc              	   C   sú   d|_ |jd }|r"|j | ¡ n
| | ¡ t|tjtjfƒrH| 	¡ }n|}| | _
| _t|ƒ| _|j| _g | _|rÔ|jD ]X}d|jkrœt||||| d� qzt|tƒrºt||||| d� qztj||g|d || d� qz| j
j| _| jrö|jjsöt d¡ d S )NTr¬  ©Úparent_bundlezKThe Bundle.single_entity flag has no effect when using 2.0 style execution.)r×   r"  r—   rn   r’   r   rs  r   r  r(  r¬  r¥  r¤  ru   r¦  Zexprsr²  r   Ú_ORMColumnEntityr±  Zsingle_entityrÅ  rŽ   rY   r   rN  )rI   r&   r¥  rv  r¯   Zsetup_entitiesrÇ  r¬  rB   rB   rC   rV   €
  sb    	

 
ÿ



û
ûú	
ÿþÿz_BundleEntity.__init__c                 C   s   | j }|d k	r|jS d S d S rE   )r;  rƒ   )rI   r  rB   rB   rC   rƒ   Ã
  s    z_BundleEntity.mapperc                 C   s&   | j D ]}|j}|d k	r|  S qd S rE   )r—   r;  ©rI   r•   r  rB   rB   rC   r;  Ë
  s
    

z_BundleEntity.entity_zeroc                 C   s   dS rü   rB   r½  rB   rB   rC   r“  Ô
  s    z_BundleEntity.corresponds_toc                 C   s&   | j D ]}|j}|d k	r|  S qd S rE   )r—   r�  rÉ  rB   rB   rC   r�  Ù
  s
    

z'_BundleEntity.entity_zero_or_selectablec                 C   s   | j D ]}| |¡ qd S rE   )r—   rÉ   )rI   r&   r•   rB   rB   rC   rÉ   â
  s    
z!_BundleEntity.setup_compile_statec                    s@   t ‡ ‡fdd„| jD ƒŽ \}}}| j ˆ j||¡}|| j| jfS )Nc                    s   g | ]}|  ˆ ˆ¡‘qS rB   )rÃ  r”   ©r‹   r�   rB   rC   r–   è
  s     z/_BundleEntity.row_processor.<locals>.<listcomp>)rO   r—   r¬  Zcreate_row_processorr'   r¦  r¸  )rI   r‹   r�   ZprocsÚlabelsÚextraÚprocrB   rÊ  rC   rÃ  æ
  s
    ÿ
z_BundleEntity.row_processor)TN)r8   r9   r:   r¸  rW   rV   r¬   rƒ   r;  r“  r�  rÉ   rÃ  rB   rB   rB   rC   r²  s
  s     ù
C


r²  c                   @   sJ   e Zd ZdZeddd„ƒZedd„ ƒZedd„ ƒZed	d
„ ƒZ	dd„ Z
dS )r°  )Ú_fetch_columnÚ_row_processorÚraw_column_indexÚtranslate_raw_columnNc           
   
   C   s„   |D ]z}|j }d|kr |d }	nt |d¡}	|	rjd|j krRt||||	|||d� q~t||||	|||d� qt||||||d� qd S )Nr&  r4   rÆ  )r"  rž   Zextract_first_column_annotationÚ_IdentityTokenEntityrÈ  Ú_RawColumnEntity)
rw   r&   rá   rv  rÐ  r¯   rÇ  ÚcolumnÚannotationsÚ_entityrB   rB   rC   r±  ø
  sH    

 ÿ
ù
ù
úz_ColumnEntity._for_columnsc                 C   s   | j jS rE   )rÔ  r¤  rH   rB   rB   rC   r¤  *  s    z_ColumnEntity.typec                 C   s   | j jj S rE   )rÔ  r¤  ZhashablerH   rB   rB   rC   r´  .  s    z!_ColumnEntity._non_hashable_valuec                 C   s
   | j jjS rE   )rÔ  r¤  Z_isnullrH   rB   rB   rC   rµ  2  s    z_ColumnEntity._null_column_typec           	      C   sÜ   |j }| jd k	rB| j\}}}| jr8||jjj| j f7 }|||fS | jd k	rT| j}n&| j}|j	rl|j	j
| }|jrz| ¡ }|jrŒ|jj
| }| |¡}|| j| jf}|| _| jrÔ| j|jjj| j f }|| j|fS |S d S rE   )r&   rÏ  rÑ  r‹   Zinvoked_statementr¾   rÐ  rÎ  rÔ  rË   rá   r"  Ú_deannotaterÚ   Ú_getterr¦  r¸  )	rI   r‹   r�   r&   ÚgetterZ
label_nameZextra_entitiesrÔ  r¿  rB   rB   rC   rÃ  6  s<    
ÿÿ


ÿÿz_ColumnEntity.row_processor)N)r8   r9   r:   rW   r«   r±  r¬   r¤  r´  rµ  rÃ  rB   rB   rB   rC   r°  ð
  s    ù1


r°  c                   @   s6   e Zd ZdZdZdZdZd
dd„Zdd„ Zdd	„ Z	dS )rÓ  NF)r¥  rÔ  r¦  r�  r¸  c                 C   s¦   || _ || _|d k	| _|jr.| jddi7  _|r8|jr@d | _n| |¡| _|r^|j 	| ¡ n
| 	| ¡ || _
| j
jr‚| j
jd nd | _| j | j
f| _d  | _| _d S )Nre   Tr   )r¥  rÐ  rÑ  re   rŽ   Z_is_text_clauser¦  r»   r—   rn   rÔ  r'  r�  r¸  rÎ  rÏ  )rI   r&   rÔ  rv  rÐ  r¯   rÇ  rB   rB   rC   rV   {  s     	


ÿz_RawColumnEntity.__init__c                 C   s   dS rü   rB   r½  rB   rB   rC   r“  œ  s    z_RawColumnEntity.corresponds_toc                 C   sP   |  ¡ }|r|| jdƒ}n| j}|jr.| ¡ }|j |¡ |j |¡ || _d S rü   )	rÓ   rÔ  r"  r×  rl   rm   rÄ   rn   rÎ  )rI   r&   rÑ   rÔ  rB   rB   rC   rÉ   Ÿ  s    z$_RawColumnEntity.setup_compile_state)N)
r8   r9   r:   r;  rƒ   rÅ  rW   rV   r“  rÉ   rB   rB   rB   rC   rÓ  n  s    ù
!rÓ  c                   @   s2   e Zd ZdZdZdZddd„Zdd„ Zd	d
„ ZdS )rÈ  zColumn/expression based entity.F)r¥  rƒ   rÔ  r¦  r�  r;  r¸  Nc                 C   sê   |j }|}	| dd ¡}
| d|	¡}|
r<t|j|
ƒ| _d| _n|| _|d k	| _|| _|rh|j||
d�| _nd | _|	j	 |	 | _
 | _}|	j | _}|r¢|j | ¡ n
| | ¡ d|_|| _d  | _| _| j| jf| _|jræ| ||j¡ d S )NÚ	proxy_keyÚproxy_ownerF)rt   T)r"  r�   rr   rÎ   r¥  rÑ  rÐ  r»   r¦  rº  r;  r�  rƒ   r—   rn   r×   rÔ  rÎ  rÏ  r¸  r¼  r¤   r¢   )rI   r&   rÔ  rv  r&  rÐ  r¯   rÇ  rÕ  rÖ  Zorm_keyrÛ  r  rƒ   rB   rB   rC   rV   ¿  s>    

 ÿ

 ÿz_ORMColumnEntity.__init__c                 C   s.   t |ƒr|| jkS t | jƒ o(| | j¡S d S rE   )r   r;  r˜  r½  rB   rB   rC   r“  ÿ  s    
ÿ
þz_ORMColumnEntity.corresponds_toc                 C   sº   |  ¡ }|r|| jdƒ}n| j}| j}| jj}|d k	sFd| jf|jkr`||jrT|jnd f|j|< |j	rt|j
st| ¡ }t| jjƒ |jj¡r˜|j |j¡ |j |¡ |j |¡ || _d S )NFr   )rÓ   rÔ  r;  rƒ   r¢  rÀ   r™   r2  rÈ   r"  Z_expression_labelr×  r¸   r'  Úintersectionr¢   rÆ   rn   rl   rm   rÄ   rÎ  )rI   r&   rÑ   rÔ  r  rÄ  rB   rB   rC   rÉ     s0    ÿÿþþ
ÿz$_ORMColumnEntity.setup_compile_state)N)	r8   r9   r:   rè   rÅ  rW   rV   r“  rÉ   rB   rB   rB   rC   rÈ  °  s    ø
@	rÈ  c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )rÒ  Fc                 C   s   d S rE   rB   )rI   r&   rB   rB   rC   rÉ   4  s    z(_IdentityTokenEntity.setup_compile_statec                    s   ‡ fdd„}|| j | jfS )Nc                    s   ˆ j jS rE   )r)   r?   )Úrow©r‹   rB   rC   rÙ  8  s    z2_IdentityTokenEntity.row_processor.<locals>.getter)r¦  r¸  )rI   r‹   r�   rÙ  rB   rÞ  rC   rÃ  7  s    z"_IdentityTokenEntity.row_processorN)r8   r9   r:   rÑ  rÉ   rÃ  rB   rB   rB   rC   rÒ  1  s   rÒ  )NF)Br)  Ú r   r   r   Úbaser   r   Zpath_registryr   r   r	   r
   r   r   r   r   rR   r   r   r   r   r   r   r   rž   r   Zsql.baser   r   r   r   r   Zsql.selectabler   r   r    r!   Zsql.visitorsr"   r#   Úrootrf   rÔ   rK   Úsymbolr$   Úobjectr%   r…   rX   Z
plugin_forr­   rÊ   rê   r}   r«  r©  r®  r¼   r“   r²  r°  rÓ  rÈ  rÒ  rB   rB   rB   rC   Ú<module>   s˜   
cÿ n ;             >   ÿ
 CL -}~B 