U
    cc                    @   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   :/tmp/pip-unpacked-wheel-8u86ls_i/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rt !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>zThe 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st	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   )
contextZ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 )zreturn 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rt|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ri |_1|jD ]}
|
2| qt3|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rt|jj _   |j _|s؈  jddd7  _ jr j	jtkr jst _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rd	t i _*|jD ]8}|j)D ]*}|j+r|, d
d  j | D  qq j	j)D ]}|j+r|-  qni  _*|j.r|j.D ]\}}	|  qg  _/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| _ rt 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 rttdd |j D | _!n8|j"d k	rttdd |j"D | _#n|j$sd	| _!|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/rt(0dn
t(0d| jst1| j2| _| jdkrd | _| 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'   Z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   ArgumentErrorr0  r   r   r   AliasedReturnsRows_all_equivsr   r   )rI   from_objr   equivsrB   rB   rC   r2    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 )zReturn 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   r9  )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   r8  r   r   rB   rB   rC   r6  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aliasr6  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innerr8  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 )NzORDER 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 clauser?  )r   rY   r  r  r   r   rC  r   r   warn_deprecated_20rD  r   rN   r   r   r=  r  r  rx   r  rL   rE  rF  r  r  rG  r   rJ  )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  rJ  r  _limit_clause_offset_clause_fetch_clause_fetch_clause_options	_prefixes	_suffixesr  rE  rF  r  r  )rI   Zraw_columnsr7  Zwhere_criteriaZhaving_criteriarx   r   r@  rA  rB  r  r  limit_clauseoffset_clausefetch_clausefetch_clause_optionsr  r  prefixessuffixesr	  rM  rU   rB   rB   rC   rD    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
FromClauser3  r   )rI   r   searchrH  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]  rb  rB   rC   _adapt_clausep  s    zAORMSelectCompileState._get_current_adapter.<locals>._adapt_clause)	r   rn   r   r`   r]  r   r^  r   r[  )rI   rd  rB   rb  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st|dst	dd }	t|tjrt
|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	rtd	|jd||f n|d k	rd }|}nd  }}| |||||d
d
||	 qd S )Nisouterfullr%  r   9Expected mapped entity or selectable/table as join target_of_type0Join 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   r3  rR   r4  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  re  rf  of_typeerrleftrH  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|	rt |tj	r|  }t|}t|d	d|jkrt||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 )zconsumes arguments from join() or outerjoin(), places them into a
        consistent format with which to form the actual JOIN constructs.

        re  r   from_joinpointrf  r\  NrB   r%  r   rg  rh  ri  rj  prev)"r   r   string_typesr   rk  
_joinpointr   r   r   r  r!  r   r3  rR   r4  rr   r   _joinpoint_zerorn  rq   r   r   rl  rm  r   r   r   ro  rp  r   rq  copy_update_joinpointrr  )rI   rs  rt  ru  r  rx  r  	outerjoincreate_aliasesrz  rf  r\  Zprev_aliased_generationrv  Zjp0r   rw  rH  ry  Z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	rt
|| tst || j}n|}| jt	|||||	|dg | _dS )zgiven 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   )re  rf  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   rt  rx  ru  r  ry  r  r\  r  rf  replace_from_obj_indexuse_entity_indexr_infoZextra_criteriaZleft_clauserB   rB   rC   rr    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rqt |}||krqt
|tr|
|f|	|j< qd|f|	|j< qt|	 }t||j|}t|dkr|	||d   \}}n*t|dkr2tdntd|f n
td|||fS )zWhen 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.zDon'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   rt  rx  ru  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|rt|drt	|D ]$\}}t
|trf||rf|} qqf||fS )zWhen 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   r3  r  r   r   corresponds_to)	rI   rt  rx  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rtd|j t|dd|jt|dd  }
}}|
r|r|
|jst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rttj|}d}t|
|}tjd	|
 d
dd n|rtd|
o| o|	}|s |s|r t|dd}d}|s tjd|
 dd |rZ|
stt ||
j!d}|s2| "|
| n&|rd|_#|f| j$%|d | j$|< n>|js|s|
jrt|
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 )ztransform 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'zAn 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flatzAn 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   r3  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_selectabler5  r   r   r  rq   r}  )rI   rx  ru  r  ry  r  r\  r  r  overlapZright_mapperr7  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   rk    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)	rT  rU  r  r  rX  rY  r	  rV  rW  )
rL   rN  rO  r  r  rR  rS  r	  rP  rQ  rH   rB   rB   rC   rG    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 )NrT  rU  r  Fr  rB   r	  )rG  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rqp|jj}| jjrg }n
| |}|dk	r||f7 }|  }|D ]@}|r||}|rt|ddi}||d}|  j|f7  _qqpd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  r`  TF)r   r!  r   r   _single_table_criterionr   r   r   r0  r   r=  r   r   rc   r  r   Ztraverser   Z_deep_annotater  )	rI   Z
fromclauser   rZ  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   r2  r  r:  r;  r<  r6  r  r  rD  r[  r^  r   r   r  r  r~  rr  r  r  r  r  rk  r   rG  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  r9  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   )r9  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|rt
| dd |}	n|}	|	dkrd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   rz  Nr%  r   )r   strr   r  r!  r   r   r  r   r"  $_legacy_determine_last_joined_entityrr   r   )r  r9  ru  r  Zleft_r  rz  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|||| qt	
||j||| q|jddrt|||| q|jrt	
||j||| qt	
||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&   entitiesrt  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   r9  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rt|j| }| jrt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_inspectr9  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   rt  r   r   r   r1  Zmappersr7  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   )r9  rH   rB   rB   rC   r  
  s    z'_MapperEntity.entity_zero_or_selectablec                 C   s   t | j|S rE   )r	   r9  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   r9  r0  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   r9  r   r0  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rt||||| d qzt|trt||||| d qztj||g|d || d qz| j
j| _| jr|jjst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   rq  r   r  r'  r  r  r  ru   r  exprsr  r   _ORMColumnEntityr  Zsingle_entityr  r   rY   r   rL  )rI   r&   r  rt  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   )r9  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   r9  rI   r   r  rB   rB   rC   r9  
  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   r9  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   rt  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   Z_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  rt  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:   r9  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  r9  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  r9  r  r   r   rn   r   r  r  r  r  r  r   r   )rI   r&   r  rt  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   r9  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  r9  r   r  r   r   r0  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 