U
    cc2                    @   s  d Z ddlmZ ddlZddlZddlmZ ddlmZ ddlm	Z	 ddlm
Z
 dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddl	mZ ddl	mZ 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, dWd%d&Z-ej.j/d$d$d'G d(d) d)eZ0e&j1ej.j/d*d$d'G d+d, d,eZ2e&j1ej.j/d*d-G d.d/ d/e2Z3e&j1ej.j/d*d*d0ej.j/d*d*d*d1ej.j/d*d2G d3d4 d4eZ4G d5d6 d6e5Z6G d7d8 d8eZ7e&j1ej8j/d*d2G d9d: d:eZ9e&j1ej8j/d;d<ej8j/dd<G d=d> d>e7Z:e&j1ej8j/d*d<ej8j/d?d<ej8j/d@d<ej8j/dAd<ej8j/dBd<G dCdD dDe7ej;Z<G dEdF dFe5Z=G dGdH dHe7Z>ej8j/dId<G dJdK dKe>Z?e&j1ej8j/dLd<G dMdN dNe>Z@e&j1ej8j/dOd<ej8j/d$d<G dPdQ dQe7ZAe&j1ej8j/dRd<G dSdT dTe>ej;ZBdUdV ZCdS )XzWsqlalchemy.orm.interfaces.LoaderStrategy
   implementations, and related MapperOptions.    )absolute_importN   )
attributes)exc)
interfaces)loading)path_registry)
properties)query)relationships)
unitofwork)util)_DEFER_FOR_STATE)_RAISE_FOR_STATE)_SET_DEFERRED_EXPIRED)_column_descriptions)ORMCompileState)ORMSelectCompileState)QueryContext)LoaderStrategy)StrategizedProperty)_state_session)InstanceState)	_none_set)aliased   )event)inspect)log)sql)visitors)LABEL_STYLE_TABLENAME_PLUS_COL)SelectFc	                    s"  g }
|o| j |r"| jr"|
t | j| jjkrV| jj| j \|
fdd |rf|
tj |r| j	  r| j
r|
 fdd |jD ]}| |j| jkr|j| jstj|j| jf| |||o| jp| jtjk||||| p| j | jd|	}|
D ]}|||  q
qd S )Nc                    s   t j| |j fS N)orm_utilZ_validator_eventskeydescprop)fnopts =/tmp/pip-unpacked-wheel-8u86ls_i/sqlalchemy/orm/strategies.py<lambda>I   s     z%_register_attribute.<locals>.<lambda>c                    s   t |  S r#   )r   Zbackref_listenersr&   )backrefuselistr+   r,   r-   W   s     )Zparent_tokenr/   compare_function	useobjectZtrackparenttypecallable	callable_active_history
impl_classZsend_modified_eventsdoc)r/   Zsingle_parentappendsingle_parent_validatorr%   parentZ
validatorsr   Ztrack_cascade_eventsZback_populatesZ_effective_sync_backrefZself_and_descendants_propsgetclass_managerZ_attr_has_implr   Zregister_attribute_implclass_	directionr   Z	ONETOMANYZviewonlyr6   )r(   mapperr1   r0   r2   r3   Zproxy_propertyr4   r5   kwZlisten_hooksmr'   hookr+   )r.   r)   r*   r/   r,   _register_attribute2   sZ    





rC   )
instrumentdeferredc                       s6   e Zd ZdZdZ fddZd
ddZdd	 Z  ZS )UninstrumentedColumnLoaderzRepresent a non-instrumented MapperProperty.

    The polymorphic_on argument of mapper() often results in this,
    if the argument is against the with_polymorphic selectable.

    columnsc                    s    t t| || | jj| _d S r#   )superrF   __init__parent_propertyrH   selfr9   strategy_key	__class__r+   r,   rJ      s    z#UninstrumentedColumnLoader.__init__Nc           	      K   s*   | j D ]}|r|j | }||| qd S r#   )rH   _append_dedupe_col_collection)	rM   compile_statequery_entitypathloadoptadaptercolumn_collectionkwargscr+   r+   r,   setup_query   s    


z&UninstrumentedColumnLoader.setup_queryc	           	      C   s   d S r#   r+   	rM   contextrS   rT   rU   r?   resultrV   
populatorsr+   r+   r,   create_row_processor   s    z/UninstrumentedColumnLoader.create_row_processor)N)	__name__
__module____qualname____doc__	__slots__rJ   rZ   r_   __classcell__r+   r+   rO   r,   rF      s    
rF   Tc                       s>   e Zd ZdZdZ fddZdddZdd	 Zd
d Z  Z	S )ColumnLoaderz8Provide loading behavior for a :class:`.ColumnProperty`.)rH   is_compositec                    s.   t t| || | jj| _t| jd| _d S )Ncomposite_class)rI   rf   rJ   rK   rH   hasattrrg   rL   rO   r+   r,   rJ      s    
zColumnLoader.__init__Fc	                 K   sj   | j D ]<}
|r6|r,||
}
|
d kr6 d S n
|j |
 }
||
| q| j d }|r\|j | }||| j< d S Nr   )rH   Zadapt_check_presentrQ   rK   )rM   rR   rS   rT   rU   rV   rW   memoized_populatorsZcheck_for_adaptrX   rY   fetchr+   r+   r,   rZ      s    




zColumnLoader.setup_queryc                 C   s`   d| _ | jd j}| jjpD| jd jpD|jd k	oD|j|jd | jk}t	| j|d|j
|d d S )NTr   F)r1   r0   r4   )is_class_levelrH   typerK   r4   primary_keyZversion_id_col_columntopropertyr;   rC   compare_values)rM   r?   Zcoltyper4   r+   r+   r,   init_class_attribute   s"    


z!ColumnLoader.init_class_attributec	                 C   sZ   | j D ]:}	|r|j |	 }	||	d}
|
r|d | j|
f  qVq|d | jdf d S )NFquickexpireT)rH   _getterr7   r%   )rM   r\   rS   rT   rU   r?   r]   rV   r^   colgetterr+   r+   r,   r_      s    

z!ColumnLoader.create_row_processor)F)
r`   ra   rb   rc   rd   rJ   rZ   rr   r_   re   r+   r+   rO   r,   rf      s    
rf   )Zquery_expressionc                       s4   e Zd Z fddZdd Zdd Zdd Z  ZS )	ExpressionColumnLoaderc                    s@   t t| || t d  t fdd| jjD | _	d S )Nc                 3   s   | ]}|   V  qd S r#   )compare.0rY   nullr+   r,   	<genexpr>  s    z2ExpressionColumnLoader.__init__.<locals>.<genexpr>)
rI   rx   rJ   r   r}   labelanyrK   rH   _have_default_expressionrL   rO   r|   r,   rJ     s
    zExpressionColumnLoader.__init__c                 K   s   d }	|r d|j kr |j d g}	n| jr.| jj}	|	d kr:d S |	D ]}
|rP|j|
 }
||
| q>|	d }|rt|j| }||| j< d S )N
expressionr   )
local_optsr   rK   rH   rQ   )rM   rR   rS   rT   rU   rV   rW   rk   rX   rH   rY   rl   r+   r+   r,   rZ     s    

z"ExpressionColumnLoader.setup_queryc	                 C   sr   |rnd|j krn|j d g}	|	D ]:}
|r0|j|
 }
||
d}|r|d | j|f  qnq|d | jdf d S )Nr   Frs   rt   T)r   rH   ru   r7   r%   )rM   r\   rS   rT   rU   r?   r]   rV   r^   rH   rv   rw   r+   r+   r,   r_   4  s    
z+ExpressionColumnLoader.create_row_processorc                 C   s(   d| _ t| j|d| jd jjdd d S )NTFr   )r1   r0   Zaccepts_scalar_loader)rm   rC   rK   rH   rn   rq   rM   r?   r+   r+   r,   rr   N  s    z+ExpressionColumnLoader.init_class_attribute)r`   ra   rb   rJ   rZ   r_   rr   re   r+   r+   rO   r,   rx     s   rx   )rE   rD   )rE   rD   	raiseload)Z
do_nothingc                       sN   e Zd ZdZdZ fddZdd Zdd Zdd
dZdd Z	dd Z
  ZS )DeferredColumnLoaderzAProvide loading behavior for a deferred :class:`.ColumnProperty`.)rH   groupr   c                    sN   t t| || t| jdr&td| jdd| _| jj	| _	| jj
| _
d S )Nrh   z8Deferred loading for composite types not implemented yetr   F)rI   r   rJ   ri   rK   NotImplementedErrorstrategy_optsr;   r   rH   r   rL   rO   r+   r,   rJ   e  s    
zDeferredColumnLoader.__init__c	           
   
   C   s   |j rB|jjjrB| j|jjjkrB| jd|||||||| nH| jsv| j	rX| jj
}	n| jj}	|d | j|	f n|d | jdf d S )N)rE   FrD   Tnewrt   F)refresh_stater
   _compile_optionsZ_only_load_propsr%   rK   _get_strategyr_   rm   r   Z_raise_column_loaderZ_deferred_column_loaderr7   )
rM   r\   rS   rT   rU   r?   r]   rV   r^   Zset_deferred_for_local_stater+   r+   r,   r_   o  s4    z)DeferredColumnLoader.create_row_processorc                 C   s,   d| _ t| j|d| jd jj| jdd d S )NTFr   )r1   r0   r3   Zload_on_unexpire)rm   rC   rK   rH   rn   rq   _load_for_stater   r+   r+   r,   rr     s    z)DeferredColumnLoader.init_class_attributeNc	           
      K   s   |j jr| jjs^|r2d|jkr2t| j| jj	s^|rP| j
rP|jd| j
 ds^|r| j|kr| jdj|||||||f|	 n.| jrt|| j< n| jst|| j< n
t|| j< d S )NZundefer_pkszundefer_group_%sFr   )compile_optionsZ_render_for_subqueryrK   Z_renders_in_subqueriesr   setrH   intersectionr9   Z_should_undefer_in_wildcardr   r;   r%   r   rZ   rm   r   r   r   r   )
rM   rR   rS   rT   rU   rV   rW   rk   only_load_propsr@   r+   r+   r,   rZ     sV    
 
z DeferredColumnLoader.setup_queryc                    s   j stjS |tj@ stjS jj} jr@ fdd|jD }n j g}fdd|D }t	}|d krt
dt j f  jr |d tj|t|tj |dd krt
tjS )Nc                    s4   g | ],}t |trt |jtr|j jkr|jqS r+   )
isinstancer   strategyr   r   r%   )r{   prM   r+   r,   
<listcomp>  s
   
z8DeferredColumnLoader._load_for_state.<locals>.<listcomp>c                    s   g | ]}| j kr|qS r+   )Z
unmodified)r{   k)stater+   r,   r     s     
 zfParent instance %s is not bound to a Session; deferred load operation of attribute '%s' cannot proceedraise)r   r   )r%   r   
ATTR_EMPTYSQL_OKPASSIVE_NO_RESULTmanagerr?   r   Ziterate_propertiesr   orm_excDetachedInstanceErrorr$   	state_strr   _invoke_raise_loadr   Zload_on_identr   selectset_label_styler!   ZObjectDeletedErrorATTR_WAS_SET)rM   r   passivelocalparentZtoloadr   sessionr+   )rM   r   r,   r     sD    


	
z$DeferredColumnLoader._load_for_statec                 C   s   t d| f d S )Nz+'%s' is not available due to raiseload=Truesa_excInvalidRequestErrorrM   r   r   lazyr+   r+   r,   r     s    z'DeferredColumnLoader._invoke_raise_load)N)r`   ra   rb   rc   rd   rJ   r_   rr   rZ   r   r   re   r+   r+   rO   r,   r   Z  s   
4 
52r   c                   @   s(   e Zd ZdZdddZejfddZdS )	LoadDeferredColumnsz7serializable loader object used by DeferredColumnLoaderFc                 C   s   || _ || _d S r#   )r%   r   )rM   r%   r   r+   r+   r,   rJ     s    zLoadDeferredColumns.__init__c                 C   s>   | j }|jj}|j| }| jr$d}nd}||}|||S )N)rE   Tr   )r   T)r   r   )r%   r   r?   r:   r   r   r   )rM   r   r   r%   r   r(   rN   r   r+   r+   r,   __call__#  s    

zLoadDeferredColumns.__call__N)F)r`   ra   rb   rc   rJ   r   PASSIVE_OFFr   r+   r+   r+   r,   r     s   
r   c                       s$   e Zd ZdZdZ fddZ  ZS )AbstractRelationshipLoaderz0LoaderStratgies which deal with related objects.)r?   targetr/   entityc                    s>   t t| || | jj| _| jj| _| jj| _| jj| _d S r#   )rI   r   rJ   rK   r?   r   r   r/   rL   rO   r+   r,   rJ   9  s
    


z#AbstractRelationshipLoader.__init__)r`   ra   rb   rc   rd   rJ   re   r+   r+   rO   r,   r   4  s   r   c                   @   s   e Zd ZdZdS )DoNothingLoaderzRelationship loader that makes no change to the object's state.

    Compared to NoLoader, this loader does not initialize the
    collection/attribute to empty/none; the usual default LazyLoader will
    take effect.

    N)r`   ra   rb   rc   r+   r+   r+   r,   r   A  s   r   Znoload)r   c                   @   s$   e Zd ZdZdZdd Zdd ZdS )NoLoaderzYProvide loading behavior for a :class:`.RelationshipProperty`
    with "lazy=None".

    r+   c                 C   s    d| _ t| j|d| jjd d S )NT)r1   r2   )rm   rC   rK   collection_classr   r+   r+   r,   rr   X  s    zNoLoader.init_class_attributec	           
         s$    fdd}	|d   j|	f d S )Nc                    s&    j rt| | j n
d | j< d S r#   )r/   r   init_state_collectionr%   r   dict_rowr   r+   r,   invoke_no_loadm  s    z5NoLoader.create_row_processor.<locals>.invoke_no_loadr   )r7   r%   )
rM   r\   rS   rT   rU   r?   r]   rV   r^   r   r+   r   r,   r_   b  s    zNoLoader.create_row_processorN)r`   ra   rb   rc   rd   rr   r_   r+   r+   r+   r,   r   M  s   
r   r   r   raise_on_sqlZbaked_selectc                       sp   e Zd ZdZdZ fddZdd Zdd Zd	d
 Zdd Z	dddZ
dd Zeddd Zdd Z  ZS )
LazyLoaderz|Provide loading behavior for a :class:`.RelationshipProperty`
    with "lazy=True", that is loads when first accessed.

    )
_lazywhere_rev_lazywhereZ_lazyload_reverse_option	_order_byuse_getis_aliased_class_bind_to_col_equated_columns_rev_bind_to_col_rev_equated_columns_simple_lazy_clause_raise_always_raise_on_sqlc                    s<  t t| || | jd dk| _| jd dk| _t| jj| _| j	j
}| \| _| _| _|jdd\| _| _| _| j	jrdd t| j	jD | _nd | _| jd| | j | j o| j o| jjd	 j| jdd
| jjd| _| jr8t| jD ]4}|| jjkr| jj| D ]}| j| | j|< qq| jd|  d S )Nr   r   r   T)Zreverse_directionc                 S   s   g | ]}t |d diqS )
_orm_adaptT)sql_util_deep_annotater{   elemr+   r+   r,   r     s   z'LazyLoader.__init__.<locals>.<listcomp>z%s lazy loading clause %sr   FZuse_proxiesZcompare_keysequivalentsz4%s will use Session.get() to optimize instance loads)rI   r   rJ   r   r   r   r   r   r   rK   _join_conditionZcreate_lazy_clauser   r   r   r   r   r   order_byr   to_listr   loggerinfor/   _get_clausery   r?   _equivalent_columnsr   list)rM   r9   rN   Zjoin_conditionrv   rY   rO   r+   r,   rJ     sP    


 zLazyLoader.__init__c              	   C   sv   d| _ | jj}| jjr d}d}n4| jjtjk	s4| jsL|rBd}d}qTd}d}nd }}t| j|d| j	| jj
||d d S )NTF)r1   r3   r2   r4   _deferred_history)rm   rK   _legacy_inactive_history_styler4   r>   r   	MANYTOONEr   rC   r   r   )rM   r?   r   r4   r   r+   r+   r,   rr     s2    zLazyLoader.init_class_attributec                    sd   t | jddi}|| j } g dd }t|i d|i  fdd}t|i d|i}|fS )Nr   Tc                 S   s
   d| _ d S )NF)unique	bindparamr+   r+   r,   visit_bindparam  s    zFLazyLoader._memoized_attr__simple_lazy_clause.<locals>.visit_bindparamr   c                    sF   | j  kr$| j | j  d f n| jd krB| jd | jf d S r#   )Z_identifying_keyr7   r%   callablevaluer   Zbind_to_colparamsr+   r,   r     s    

)r   r   r   r   r    ZtraverseZcloned_traverse)rM   Z	lazywhere	criterionr   r+   r   r,   "_memoized_attr__simple_lazy_clause  s       z-LazyLoader._memoized_attr__simple_lazy_clausec                 C   s   | j \}}|d kr(t|dd |D S | jj}| }t|}|tj@ rV|tjN }i }|D ]J\}	}
}|
d k	r|r|tj	@ r|
|||
|}n||||
|}|||	< q^||fS )Nc                 S   s   g | ]\}}}|qS r+   r+   )r{   r%   identr   r+   r+   r,   r     s     z4LazyLoader._generate_lazy_clause.<locals>.<listcomp>)r   r   Zadapt_criterion_to_nullrK   r9   objr   instance_dictZINIT_OKLOAD_AGAINST_COMMITTED#_get_committed_state_attr_by_column_get_state_attr_by_column)rM   r   r   r   Z
param_keysr?   or   r   r%   r   r   r+   r+   r,   _generate_lazy_clause  s:    
 


      
z LazyLoader._generate_lazy_clausec                 C   s   t d| |f d S )Nz&'%s' is not available due to lazy='%s'r   r   r+   r+   r,   r   /  s    
zLazyLoader._invoke_raise_loadNr+   c           
      C   s  |j s | jjs|jr|js tjS |j  }d }| jo>| p>|j }|tj	@ sN|r\|tj
@ sb|rbtjS | jr|tj@ s|r|tj@ r| ||d t|}|s|tj@ rtjS tdt|| j f |rz| |||}tj|krtjS tj|krtjS t|rd S | j |jkr(|tj@ s(tjS |j| j|||d}	|	d k	r\|	tjkrVd S |	S n|tj	@ rt|tj@ sztjS | ||||||S )Nr   zbParent instance %s is not bound to a Session; lazy load operation of attribute '%s' cannot proceed)r   Zlazy_loaded_from) r%   rK   Zload_on_pendingZ_load_pendingZ
session_idr   r   r   _extra_criteriar   ZNON_PERSISTENT_OKr   r   NO_RAISEZRELATED_OBJECT_OKr   r   r   r   r$   r   _get_ident_for_use_getZ	NEVER_SETr   
issupersetdictDEFERRED_HISTORY_LOADr   Z_identity_lookupr   ZPASSIVE_CLASS_MISMATCH_emit_lazyload)
rM   r   r   rU   extra_criteriapendingprimary_key_identityr   r   instancer+   r+   r,   r   4  s    
  



zLazyLoader._load_for_statec                    sD   j j}tj@ r|jn|jj  fddjjD S )Nc                    s"   g | ]} j | d qS )r   r   r{   pkr   Zget_attrr   rM   r   r+   r,   r     s   z5LazyLoader._get_ident_for_use_get.<locals>.<listcomp>)r   r?   r   r   r   r   r   ro   )rM   r   r   r   instance_mapperr+   r   r,   r     s    
z!LazyLoader._get_ident_for_use_getzsqlalchemy.orm.strategy_optionsc                    sd  t jj j }tj|g|jtt	j
d}tj}	|	d|d7 }	 jjd k	r\| j jj}|j }
|
sr|tj@ rt ddi|_ j}|js|r|jr|j j }t|j}|r|jrd}|t j|f7 }||_n|jj j }| jd|i7  _|r2 j r |tj!@ s  "||d t#j$||||	dS  j%rB j%|_& fdd	}| j'| jff7  _' (||\}}d
|	i} j|j)kr|tj*@ stj+S |
rt ,tj-|. rd S nt ,tj/|. rd S  j r|tj!@ s "||d |f|_0|j1|||d}|2 3 4 } j5r,|S t6|}|r\|dkrTt 7d j  |d S d S d S )N)_raw_columns_propagate_attrs_label_styler   F)Z_invoke_all_eagers_lazy_loaded_fromZ	autoflush_current_pathr   )load_optionsc                    sR    j jD ]D}|jtjkr|jrt|jtsj	
| jj|j ||  qd S r#   )rK   Z_reverse_propertyr>   r   r   Z_use_getr   r   r   LoadZfor_existing_pathr   r  r9   ZlazyloadZprocess_compile_state)compile_contextrevrM   Zstrategy_optionsr+   r,   _lazyload_reverse  s     

z4LazyLoader._emit_lazyload.<locals>._lazyload_reverseZ_sa_orm_load_options)execution_optionsr   zKMultiple rows returned with uselist=False for lazily-loaded attribute '%s' r   )8r   Z	preloadedZorm_strategy_optionsr   __clause_element__r"   _create_raw_selectr  r!   r   default_compile_optionsr   Zdefault_load_optionsrK   Z	secondaryselect_fromr?   r%   r   ZNO_AUTOFLUSHZimmutabledict_execution_optionsr   r  r   Z	load_pathtupler$   LoaderCriteriaOption_with_options_path_registryr   r   r   r   r   Zload_on_pk_identityr   _order_by_clausesZ_with_context_optionsr   r   r   r   Zhas_intersectionr   valuesZ
_never_setZ_where_criteriaexecuter   Zscalarsallr/   lenwarn)rM   r   r   r   r   rU   r   ZclauseelementZstmtr  r   r   effective_pathr*   r  Zlazy_clauser   r  r]   lr+   r  r,   r     s    

 

    
  
zLazyLoader._emit_lazyloadc	              
      s   | j  | jr|rV|jrVt|jt | ||jr6||nd  }	|d | j |	f n,|j	sb|j
r fdd}
|d | j |
f d S )Nr   c                    s   |  |  d S r#   )Z_resetr   r%   r+   r,   reset_for_lazy_callableT  s    	z@LazyLoader.create_row_processor.<locals>.reset_for_lazy_callable)r%   rm   r   r   Z"_instance_level_callable_processorr<   LoadLazyAttribute_generate_extra_criteriar7   populate_existingZalways_refresh)rM   r\   rS   rT   rU   r?   r]   rV   r^   Zset_lazy_callabler   r+   r  r,   r_   ,  s&    
zLazyLoader.create_row_processor)Nr+   )r`   ra   rb   rc   rd   rJ   rr   r   r   r   r   r   r   Zpreload_moduler   r_   re   r+   r+   rO   r,   r   v  s   :"! 
e
 r   c                   @   s.   e Zd ZdZdd Zdd ZejfddZdS )	r!  a  semi-serializable loader object used by LazyLoader

    Historically, this object would be carried along with instances that
    needed to run lazyloaders, so it had to be serializable to support
    cached instances.

    this is no longer a general requirement, and the case where this object
    is used is exactly the case where we can't really serialize easily,
    which is when extra criteria in the loader option is present.

    We can't reliably serialize that as it refers to mapped entities and
    AliasedClass objects that are local to the current process, which would
    need to be matched up on deserialize e.g. the sqlalchemy.ext.serializer
    approach.

    c                 C   s   || _ |j| _|| _|| _d S r#   r%   rN   rU   r   )rM   r%   Zinitiating_strategyrU   r   r+   r+   r,   rJ   t  s    zLoadLazyAttribute.__init__c                 C   s(   | j d k	rtd | j| j| jddS )NzvCan't reliably serialize a lazyload() option that contains additional criteria; please use eager loading for this caser+   r$  )r   r   r  r%   rN   rU   r   r+   r+   r,   __getstate__z  s    
zLoadLazyAttribute.__getstate__c                 C   s:   | j }|jj}|j| }|j| j }|j||| j| jdS )N)rU   r   )	r%   r   r?   r:   Z_strategiesrN   r   rU   r   )rM   r   r   r%   r  r(   r   r+   r+   r,   r     s    
zLoadLazyAttribute.__call__N)	r`   ra   rb   rc   rJ   r%  r   r   r   r+   r+   r+   r,   r!  b  s   r!  c                   @   s"   e Zd ZdZdddZdd ZdS )
PostLoaderz;A relationship loader that emits a second SELECT statement.Nc                 C   sx   |j jptjj| }tj||| jr*dS || j }|| j }|	|j
dst|rd|jd |krtdS n|| jrtdS dS )NTloaderr   F)rR   current_pathr$   PathRegistryrootr   PostLoadZpath_existsrK   containsr   lengthcontains_mapperr?   )rM   r\   rT   
join_depthr  path_w_propZeffective_path_w_propr+   r+   r,   _check_recursive_postload  s$      

z$PostLoader._check_recursive_postloadc	           	   
   C   s    | j d||||||||S )N))r   	immediate)rK   r   r_   r[   r+   r+   r,   #_immediateload_create_row_processor  s    z.PostLoader._immediateload_create_row_processor)N)r`   ra   rb   rc   r1  r3  r+   r+   r+   r,   r&    s   
r&  r2  c                   @   s    e Zd ZdZdd Zdd ZdS )ImmediateLoaderr+   c                 C   s   | j d| d S N)r   r   rK   r   rr   r   r+   r+   r,   rr     s
    z$ImmediateLoader.init_class_attributec	           
         sL    fdd}	 ||r(tjtjB  ntjtjB  |d j|	f d S )Nc                    s   |  j| |  d S r#   )get_implr%   r;   r   flagsrM   r+   r,   load_immediate  s    z<ImmediateLoader.create_row_processor.<locals>.load_immediateZdelayed)r1  r   ZPASSIVE_NO_FETCH_RELATEDr   r   r7   r%   )
rM   r\   rS   rT   rU   r?   r]   rV   r^   r;  r+   r9  r,   r_     s
    z$ImmediateLoader.create_row_processorN)r`   ra   rb   rd   rr   r_   r+   r+   r+   r,   r4    s   r4  subqueryc                       s   e Zd ZdZ fddZdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd ZG dd deZdd Zdd Zdd Zdd Z  ZS )SubqueryLoader)r/  c                    s    t t| || | jj| _d S r#   )rI   r=  rJ   rK   r/  rL   rO   r+   r,   rJ     s    zSubqueryLoader.__init__c                 C   s   | j d| d S r5  r7  r   r+   r+   r,   rr     s
    z#SubqueryLoader.init_class_attributec                    s   |}|j }t|d }| j|rB| j|d krB| j| j  }n||d   }|r|j| jj| t	|t	 }|rt
j|| d  7 n||j}	 fdd|	D }
 |
|fS )Nr   r   c                    s&   g | ]}t jd  j j| jqS r   )getattrrT   r   rp   r%   rz   leftmost_mapperZnew_subq_pathr+   r,   r      s
   

z0SubqueryLoader._get_leftmost.<locals>.<listcomp>)rT   r$   Z_class_to_mapperr9   isarK   	_entitiesentity_zeror  r  r   r)  Zcoercelocal_columns)rM   orig_query_entity_index	subq_pathZcurrent_compile_stateis_rootZgiven_subq_pathZsubq_mapperZleftmost_prop
additionalZleftmost_colsleftmost_attrr+   r@  r,   _get_leftmost  s4    
zSubqueryLoader._get_leftmostc                 C   s2  |  d }tjtj}|j|j |}|js^d|_|j	j
|fdd t||dD   |dd |D | }	|	|_|j}
|
dkrd|_n:|
d krtdd	 |	D D ]}t|	|jsd|_ qq|jsd
|_|jdkr|jrt|	|j}|r||	|  |t }tj||dd}|S )NFc                 S   s    h | ]}|d  dk	r|d  qS )r   Nr+   )r{   entr+   r+   r,   	<setcomp>L  s   z?SubqueryLoader._generate_from_original_query.<locals>.<setcomp>)rR   c                 S   s   g | ]}t jt jj|qS r+   )r   Z	coercionsexpectZrolesZColumnsClauseRole)r{   r   r+   r+   r,   r   c  s   z@SubqueryLoader._generate_from_original_query.<locals>.<listcomp>Tc                 s   s   | ]}|j V  qd S r#   )tablerz   r+   r+   r,   r~   r  s     z?SubqueryLoader._generate_from_original_query.<locals>.<genexpr>r+   use_mapper_path)Z_cloneZ	correlater
   Query__new____dict__updateZ	_from_objZ_enable_assertionsr  Znon_generativer   Z_adapt_col_listZ_get_current_adapterr  distinct_target_keyZ	_distinctr   r   ro   Z_has_row_limiting_clauser  r   Z expand_column_list_from_order_byZ_set_entitiesr   r!   r<  r$   AliasedClass)rM   orig_compile_state
orig_queryrA  rJ  leftmost_relationshipZorig_entityqZq2Ztarget_colsrV  tZto_addZembed_q
left_aliasr+   r+   r,   _generate_from_original_query*  s^        z,SubqueryLoader._generate_from_original_queryc                    s   g }t | }t|D ]N\}\}}|dkrR||d  d j}||rL|n|}	n|}	||	|jf qt|dk rz| n.t|d d }
|
j	r|
j
 ntj|
j
dd jj} fdd|D }|| fS )	Nr   r   r   TrP  c                    s    g | ]}t  jj| jqS r+   )r?  r9   rp   r%   rz   parent_aliasrM   r+   r,   r     s   z2SubqueryLoader._prep_for_joins.<locals>.<listcomp>)r   pairs	enumerater?   rB  r7   r%   r  r   r   r   r$   rW  rK   rE  )rM   r]  rG  to_joinrb  ir?   r(   Zprev_mapperZ	to_appendr   
local_cols
local_attrr+   r`  r,   _prep_for_joins  s,     zSubqueryLoader._prep_for_joinsc                 C   s0  t |}|dkr,t||d d |g}n|dkrft||d d |t||d d |g}n|dkrdd |dd D }g }|r|d}	t|	d |	d }
|r|
|d d }
n
|
|}
||
 qt||d d |d jg| t||d d |g }|D ]}
||
}q|S )Nr   r   r   r_  c                 S   s:   g | ]2}t |d  js$t|d  n|d  j|d fqS )r   r   )r   r   r$   rW  r   )r{   itemr+   r+   r,   r     s   z/SubqueryLoader._apply_joins.<locals>.<listcomp>)r  r?  of_typepopr7   r9   join)rM   r[  rd  r]  ra  effective_entityZltjZmiddleinnerri  attrr+   r+   r,   _apply_joins  sD    

	


zSubqueryLoader._apply_joinsc           	      C   sB   |j }|r*|jr*|t| j||f7 }||}|j| }|S r#   )r  r   r$   r  r   r"  Z_with_current_pathoptions)	rM   r\   r[  rG  rewritten_pathrY  rm  rU   new_optionsr+   r+   r,   _setup_options  s    
	

zSubqueryLoader._setup_optionsc                    s&    j jr" fdd}|| j }|S )Nc                    s    |  j tt jj7  _ d S r#   eager_order_byr  r   r   rK   r   r	  r   r+   r,   _setup_outermost_orderby  s    zISubqueryLoader._setup_outermost_orderby.<locals>._setup_outermost_orderby)rK   r   _add_context_option)rM   r[  rx  r+   r   r,   rx    s     z'SubqueryLoader._setup_outermost_orderbyc                   @   s4   e Zd ZdZdZdd Zdd Zdd Zd	d
 ZdS )zSubqueryLoader._SubqCollectionszGiven a :class:`_query.Query` used to emit the "subquery load",
        provide a load interface that executes the query at the
        first moment a value is needed.

        r   r  r  r   subq_datac                 C   s4   |j | _ |j| _|j| _|jp i | _|| _d | _d S r#   rz  )rM   r\   r{  r+   r+   r,   rJ   4  s    z(SubqueryLoader._SubqCollections.__init__c                 C   s    | j d kr|   | j ||S r#   )r|  _loadr;   )rM   r%   defaultr+   r+   r,   r;   >  s    
z#SubqueryLoader._SubqCollections.getc                 C   s   t t| _| j}|jd ks t|| j}| jj	r<|
 }t|| j}t|dd D ]"\}}| j| dd |D  q\d S )Nc                 S   s   | dd  S )Nr   r+   xr+   r+   r,   r-   Q      z7SubqueryLoader._SubqCollections._load.<locals>.<lambda>c                 s   s   | ]}|d  V  qdS )r   Nr+   r{   vvr+   r+   r,   r~   R  s     z8SubqueryLoader._SubqCollections._load.<locals>.<genexpr>)collectionsdefaultdictr   r|  r{  r   AssertionErrorZwith_sessionr  Z_populate_existingr#  r   	itertoolsgroupbyextend)rM   r[  Zrowsr   vr+   r+   r,   r}  C  s    z%SubqueryLoader._SubqCollections._loadc                 C   s   | j d kr|   d S r#   )r|  r}  )rM   r   r   r   r+   r+   r,   r'  T  s    
z&SubqueryLoader._SubqCollections.loaderN)	r`   ra   rb   rc   rd   rJ   r;   r}  r'  r+   r+   r+   r,   _SubqCollections$  s   	
r  c              	   C   s  |j }|jjr|jjrd S |j|}d|_|| j }||j	dd }	|	d k	rT|	}
n| j
}
|jjdtjjtjjf\}}|tjjk}|| }|| }||j	ds| jr|jr|jjnd|j d | jkrd S n|| jrd S |jjdtf|j}t|d}|jr2|jjd kr,td	| |f  |j}|j|d
d}|  ||||\}}}}| !||||||}t"|
}|j#dtf|d||fi|_|$d
}| %||\}}}|j&| }| '|||||
}| (||||||
|}| )|}|S )NTpath_with_polymorphic)Zsubquery_pathsNr'  r   r   rY  ormzsubqueryloader for "%s" must invoke lambda callable at %r in order to produce a new query, decreasing the efficiency of caching for this statement.  Consider using selectinload() for more effective full-lambda cachingF)legacy)*rR   r   _enable_eagerloadsZ_for_refresh_staterC  indexZloaders_require_bufferingrK   r;   r   r   r
   r  r$   r)  r*  r,  r/  r(  r-  r.  r?   r=  r   Z_get_plugin_class_for_pluginZ_is_lambda_elementr  r  r   r  Z	_resolvedZ_create_entities_collectionrK  r^  rR  unionZ_set_enable_single_critrh  Zadd_columnsrp  rt  rx  )rM   r\   rS   rT   r   rU   rV   rR   rF  with_poly_entityrm  rG  rr  rH  rY  Zcompile_state_clsrX  rA  rJ  rZ  r]  r[  rd  rg  ra  r+   r+   r,   _setup_query_from_rowprocX  s    	
  
   	

  
 

    	
z(SubqueryLoader._setup_query_from_rowprocc	              
      s\  |j r| |||||| |S | ||| jr2d S t|jtsBd S | jj| j	 j
jsbtd|  t|dkrt|j| jsd S nt|d | jsd S | ||||d | }	|	d krd S |	jd kst|| j }| jj}
||jd}|d kr| ||	}||jd|  r* fdd|
D }
| jrF| ||||
| n| ||||
| d S )NJ'%s' does not support object population - eager loading cannot be applied.r   r_  r  c                    s   g | ]} j | qS r+   rG   rz   rV   r+   r,   r   =  s     z7SubqueryLoader.create_row_processor.<locals>.<listcomp>)r   r3  r1  r/  r   rR   r   r9   r<   r%   implsupports_populationr   r   r  r$   _entity_isarD  r  r   r  rK   rE  r;   r   r  r   r/   _create_collection_loader_create_scalar_loader)rM   r\   rS   rT   rU   r?   r]   rV   r^   r{  rf  r  r+   r  r,   r_     sx    		

        z#SubqueryLoader.create_row_processorc                    sp   | | fddfdd}|d jf |d j|f |jrl|d j jf d S )Nc                    s*     |d}| j| || d S )Nr+   )r;   r8  r%   set_committed_value)r   r   r   
collectionr  rM   tuple_getterr+   r,   load_collection_from_subqM  s      zKSubqueryLoader._create_collection_loader.<locals>.load_collection_from_subqc                    s   j |kr | || d S r#   r  r   )r  rM   r+   r,   &load_collection_from_subq_existing_rowS  s    
zXSubqueryLoader._create_collection_loader.<locals>.load_collection_from_subq_existing_rowr   existingeagerZ_tuple_getterr7   r%   invoke_all_eagersr'  )rM   r\   r]   r  rf  r^   r  r+   )r  r  rM   r  r,   r  H  s    
z(SubqueryLoader._create_collection_loaderc                    sp   | | fddfdd}|d jf |d j|f |jrl|d j jf d S )Nc                    sL     |d}t|dkr*td  |d }| j| || d S )Nr#   r   LMultiple rows returned with uselist=False for eagerly-loaded attribute '%s' r   )r;   r  r   r  r8  r%   r  )r   r   r   r  Zscalarr  r+   r,   load_scalar_from_subqd  s    zCSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subqc                    s   j |kr | || d S r#   r  r   )r  rM   r+   r,   "load_scalar_from_subq_existing_rowo  s    
zPSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subq_existing_rowr   r  r  r  )rM   r\   r]   r  rf  r^   r  r+   )r  r  rM   r  r,   r  _  s    
z$SubqueryLoader._create_scalar_loader)r`   ra   rb   rd   rJ   rr   rK  r^  rh  rp  rt  rx  objectr  r  r_   r  r  re   r+   r+   rO   r,   r=    s   1d/5$4 Wr=  Zjoinedc                       s   e Zd ZdZdZ fddZdd Zdd	d
Zdd Zdd Z	dd Z
dd Zdd Zd ddZdd Zdd Zdd Zdd Z  ZS )!JoinedLoaderzcProvide loading behavior for a :class:`.RelationshipProperty`
    using joined eager loading.

    )r/  _aliased_class_poolc                    s&   t t| || | jj| _g | _d S r#   )rI   r  rJ   rK   r/  r  rL   rO   r+   r,   rJ     s    
zJoinedLoader.__init__c                 C   s   | j d| d S r5  r7  r   r+   r+   r,   rr     s
    z!JoinedLoader.init_class_attributeNFc	                 K   s:  |j jsdS | jrd|_|| j }d}
|r:| |||jnd}|dk	r`| |||||\}}}n`||jds| j	r|j
d | j	krdS n|| jrdS | ||||||||\}}}}d|_||jdd}|dk	rt|j}
nd}
|| j }tj|| j|||||
| j|d	 |dk	r6dt|jkr6tddS )	z@Add a left outer join to the statement that's being constructed.NTFr'  r   r  )with_polymorphicparentmapperchained_from_outerjoinzDetected unaliased columns when generating joined load.  Make sure to use aliased=True or flat=True when using joined loading with with_polymorphic().)r   r  r/   multi_row_eager_loadersrK   _init_user_defined_eager_procr   $_setup_query_on_user_defined_adapterr,  r/  r-  r.  r?   _generate_row_adapterZeager_adding_joinsr;   r   Zwith_polymorphic_mappersr   r   Z_setup_entity_queryr   secondary_columnsr   r   )rM   rR   rS   rT   rU   rV   rW   r  r  rX   r  user_defined_adapterclausesadd_to_collectionr  r+   r+   r,   rZ     s    
    
zJoinedLoader.setup_queryc           
      C   s   d|j krdS |jj}||jdd}|dk	r2|S |j d }|dd  \}}|d k	r~t|trj|j|}t	j
||jjd}n@||jdr||jd}	tj|	|jjd}n|j|jd }||d| |S )NZeager_from_aliasF user_defined_eager_row_processor)r   r  )r   rT   r9   r;   r   r   strr   aliasr   ZColumnAdapterr?   r   r,  r$   
ORMAdapterZ_polymorphic_adaptersr   )
rM   rU   rR   Ztarget_attributesrT   rV   r  Zroot_mapperr(   r  r+   r+   r,   r    sR    
  

    z*JoinedLoader._init_user_defined_eager_procc                 C   sV   | |}|r.|r.||}||jd| n|rF|}||jd| |j}|||fS )Nr  )Z_get_entity_clauseswrapr   r   primary_columns)rM   r\   r   rT   rV   r  r  r+   r+   r,   r  8  s"    

z1JoinedLoader._setup_query_on_user_defined_adapterc                 C   s   t | jjrt | jj}nd }d| f}||jkr@d |j|< }n|j| d  |j|< }|t| jkrtj| j	|d k	r|j
ddnd ddd}t |jj | j| | j| S )NZjoinedloader_acr   r   T)flat)r  r  rQ  )r   r   r   
selectabler   r  r  r$   rW  r?   Z_anonymous_fromclauserY   r7   )rM   r\   Zalt_selectabler%   idxto_adaptr+   r+   r,   _gen_pooled_aliased_classR  s&    
z&JoinedLoader._gen_pooled_aliased_classc	                 C   s   | |jdd }	|	r|	}
n
| |}
t|
jd| ftj|
| jjdddd}|j	d k	sXt
|d k	rr|j d| jjn| jj}|sd}|j| j||||||||r|jndf	 |j}||jd| ||||fS )	Nr  Zjoinedloader_ormadapterTF)r   Zadapt_requiredZallow_label_resolveZanonymize_labels	innerjoinr+   eager_row_processor)r;   r   r  r   Z_memor$   r  r?   r   aliased_classr  r   rK   r  Zcreate_eager_joinsr7   _create_eager_joinr   r  r   )rM   rR   r   rT   rU   rV   rW   r  r  r  r  r  r  r  r+   r+   r,   r  t  sN      

z"JoinedLoader._generate_row_adapterc
              	      s`  |d kr|j }
n|}
|jo|j}d }||jkr~|s~|jr~t|j|j}t|dkr^t	
d|r~|j|d  }|d | }}|d kr||j }}|j||}|r
t|dd rt|j|
 jr|
n j}t|j j j}n ttj j|jdd j j}n j}|jd k	s t| p@| p@|dkp@|jj}|	}|jd j fd	}|rz|t fd
d|D 7 }|rtj||j|| p|jjp|ot|tj  j j |d}n !|||||}||j|< |j|_"|s.t# jj$D ]4}|
j%j&'|r|r|j(| }|)||j* q jj+r\| j,t|j-.t/0 jj+7  _,d S )Nr   zCan't identify which query entity in which to joined eager load from.   Please use an exact match when specifying the join path.r   r  TrP  Zunnestedadditional_entity_criteriar+   c                 3   s    | ]}|j r| jV  qd S r#   )Zpropagate_to_loadersZ_resolve_where_criteriar?   )r{   Zaer   r+   r,   r~   	  s   z2JoinedLoader._create_eager_join.<locals>.<genexpr>isouter
_left_memo_right_memor   )1r?   r  Z_should_nest_selectableZeager_joinsZfrom_clausesr   Z#find_left_clause_that_matches_givenr  r  r   r   
setdefaultr?  r   r  Z_entity_for_mapperrB  r9   r   r%   rK   r$   rW  r  rD  Zrepresents_outer_joinZglobal_attributesr;   r  _ORMJoinr   r   ZJoin_splice_nested_inner_joinZstop_onZ_find_columnsZprimaryjoinZpersist_selectablerY   Zcontains_columnrH   rQ   r  r   rv  _target_adapterZcopy_and_processr   r   )rM   rR   rS   rT   rV   r  r  r  r  r   r   Zshould_nest_selectableZquery_entity_keyZindexesZclauseZdefault_towrapZtowrapZefmonclauseZattach_on_outsideZextra_join_criteriar  	eagerjoinrv   r+   r   r,   r    s      

  	 
    

 
zJoinedLoader._create_eager_joinc           
   	   C   s<  |dkrt |tjsztn`t |tjjr>| ||j||||S t |tjsz|d |krvtj||j	|d||d j
|dS d S | ||j||||j}|d krd}| ||j||||j}|d kr|dk	stdd S nd}|r|js|js||}	ntj|j||j|j|jd}	ntj||j|j|j|jd}	|j|	_|	S )	NFr  r_  r  z9assertion failed attempting to produce joined eager loadsT)r  r  )r  r  )r   r$   r  r  r   r  ZFromGroupingr  elementr  r?   rightr  leftr  r  Z_splice_into_centerr  r  )
rM   rT   Zjoin_objr  r  r   ZsplicingZtarget_joinZright_splicer  r+   r+   r,   r  Q	  s    z&JoinedLoader._splice_nested_inner_joinc           	      C   s   |j }|r| |||jnd}|dk	rP|}|jrB|rB||j}qj|jrj|j}n||jd}|d krjdS | j||r||S dS d S )NFr  )rR   r  r   Zcompound_eager_adapterr  r;   r?   Z_result_has_identity_key)	rM   r\   r]   rV   rT   rU   rR   r  	decoratorr+   r+   r,   _create_eager_adapter	  s4      
 z"JoinedLoader._create_eager_adapterc	              
   C   s   | j j| j jjs td|  | jr,d|_|| j	 }	| 
||||	|}
|
dk	r| j}t|| j|||	| j |
}| js| |||| q| |||| n | j	d|||||||| d S )Nr  TFr6  )r9   r<   r%   r  r  r   r   r/   Zloaders_require_uniquingrK   r  r   Z_instance_processorr?   r   r  r  r   r_   )rM   r\   rS   rT   rU   r?   r]   rV   r^   Zour_pathZeager_adapterr%   	_instancer+   r+   r,   r_   	  s\    
    	   z!JoinedLoader.create_row_processorc                    sr    fdd} fdd} fdd}|d  | j|f |d  | j|f jrn|d	  | j|f d S )
Nc                    sF   t | |}t|d}|j | f<  |}|d k	rB|| d S NZappend_without_eventr   r   r   ZUniqueAppenderr7   )r   r   r   r  result_listinstr  r\   r%   r+   r,   #load_collection_from_joined_new_row
  s     zSJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_new_rowc                    sd   | fj krj | f }n(t | |}t|d}|j | f<  |}|d k	r`|| d S r  r  )r   r   r   r  r  r  r  r+   r,   (load_collection_from_joined_existing_row
  s       zXJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_existing_rowc                    s    | d S r#   r+   r   r  r+   r,    load_collection_from_joined_exec&
  s    zPJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_execr   r  r  r7   r%   r  )rM   r\   r%   r  r^   r  r  r  r+   r  r,   r  
  s    z&JoinedLoader._create_collection_loaderc                    sp    fdd} fdd} fdd}|d  j|f |d  j|f |jrl|d	  j|f d S )
Nc                    s    ||< d S r#   r+   r   )r  r%   r+   r,   load_scalar_from_joined_new_row5
  s    zKJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_new_rowc                    s8    |}|kr,|| k	r4t d  n||< d S )Nr  )r   r  )r   r   r   r  r  r%   rM   r+   r,   $load_scalar_from_joined_existing_row:
  s    	zPJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_existing_rowc                    s    | d S r#   r+   r   r  r+   r,   load_scalar_from_joined_execM
  s    zHJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_execr   r  r  r  )rM   r\   r%   r  r^   r  r  r  r+   r  r,   r  4
  s    z"JoinedLoader._create_scalar_loader)NNF)F)r`   ra   rb   rc   rd   rJ   rr   rZ   r  r  r  r  r  r  r  r_   r  r  re   r+   r+   rO   r,   r  {  s(      
s5"= " 
V$:/r  Zselectinc                	       s|   e Zd ZdZedddddddgZd	Z fd
dZdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Z  ZS )SelectInLoader)r/  	omit_join_parent_alias_query_info_fallback_query_infoZ	queryinfoload_only_childload_with_joinin_exprpk_colszero_idxchild_lookup_colsi  c                    s   t t| || | jj| _| jjtjk}| jjd k	rB| jj| _n<| j	d}|r\|j
| _n"| jjd j|jdd| jjd| _| jr|r|  | _|  | _q|  | _n
|  | _d S )Nr6  r   TFr   )rI   r  rJ   rK   r/  r>   r   r   r  r   r   r9   r   ry   r   r   _init_for_omit_join_m2or  _init_for_joinr  _init_for_omit_join)rM   r9   rN   Zis_m2o
lazyloaderrO   r+   r,   rJ   s
  s,    


zSelectInLoader.__init__c                    s   t jjj   fddt D   fddjjD  }}t|dkrbt	j
| }d}n|d }d}dd|||d S )	Nc                 3   s0   | ](}j j|d D ]}| | fV  qqdS )r+   N)r9   r   r;   )r{   r   equivpk_to_fkrM   r+   r,   r~   
  s    z5SelectInLoader._init_for_omit_join.<locals>.<genexpr>c                    s   g | ]}| kr | qS r+   r+   r{   rv   )r  r+   r,   r   
  s     z6SelectInLoader._init_for_omit_join.<locals>.<listcomp>r   Fr   T)r   rK   r   Zlocal_remote_pairsrU  r   r9   ro   r  r   tuple_
query_info)rM   r  Zfk_colsr  r  r+   r  r,   r  
  s    


z"SelectInLoader._init_for_omit_joinc                    sb   | j j}t|dkr$tj| }d}n|d }d}| jd  fdd|D }| dd||||S )Nr   Fr   Tr6  c                    s   g | ]} j | qS r+   r   r   r  r+   r,   r   
  s     z:SelectInLoader._init_for_omit_join_m2o.<locals>.<listcomp>)r?   ro   r  r   r  rK   r   r  )rM   r  r  r  Zlookup_colsr+   r  r,   r  
  s     
     z&SelectInLoader._init_for_omit_join_m2oc                    sj   t | jj| _t| j  fdd| jjD }t|dkrJtj| }d}n|d }d}| 	dd|||d S )Nc                    s   g | ]}  |qS r+   _adapt_elementr  Zpa_inspr+   r,   r   
  s    z1SelectInLoader._init_for_join.<locals>.<listcomp>r   Fr   T)
r   r9   r=   r  r   ro   r  r   r  r  )rM   r  r  r  r+   r  r,   r  
  s    


zSelectInLoader._init_for_joinc                 C   s   | j d| d S r5  r7  r   r+   r+   r,   rr   
  s
    z#SelectInLoader.init_class_attributec	              
   C   s   |j r| ||||||||S | ||| jr2d S | jj| j jjsRt	
d|  t|dkrtt|j| jsd S nt|d | jsd S |jjptjj| }	|| j }
|
|jdd }|d k	rt|}n| j}tj||	| j| j| j|| d S )Nr  r   r_  r  )r   r3  r1  r/  r9   r<   r%   r  r  r   r   r  r$   r  rD  rR   r(  r)  r*  rK   r;   r   r   r   r   r+  Zcallable_for_path_load_for_path)rM   r\   rS   rT   rU   r?   r]   rV   r^   Zselectin_pathr0  r  rm  r+   r+   r,   r_   
  sZ    
	
  
z#SelectInLoader.create_row_processorc                    s  |rj |krd S j}|jrtt}g }	j|D ]l\}
jtfdd|j	D }t
j|krtj} qd |kr|| |
f q6|	|
f q6|jsdd |D }|j}|j}|jsjrfdd|D }|}tjd| }| } }tj||gttjddd	}|js<|}n$|jtjjj  }|!|"t#$d
} j%j&}|j }| j'kr|j(}n&|j(} j'j(} fddt)||D }|r|j*r|t+|, f7 }|j-| }|.d|i} j/r|j0dd}jj1rn|jsTjj1}jrHfdd|D }|j1| }nfdd}|2|j}|jr3||	||  n4|||  d S )Nc                 3   s"   | ]} j |tjd V  qdS )r   N)r   r   ZPASSIVE_NO_FETCH)r{   Zlk)r?   r   
state_dictr+   r,   r~     s   z0SelectInLoader._load_for_path.<locals>.<genexpr>c                 S   s$   g | ]\}}|j d  ||j|fqS )r   )r%   r   )r{   r   	overwriter+   r+   r,   r   ;  s   z1SelectInLoader._load_for_path.<locals>.<listcomp>c                    s   g | ]}  |qS r+   r  r  rm  r+   r,   r   K  s    r   r  )Zcompile_state_pluginZplugin_subject)r  r  r   r  primary_keysc                    s   g | ]\}}|  |qS r+   )Z'_adapt_cached_option_to_uncached_option)r{   Zorig_optZuncached_opt)r\   r+   r,   r     s
    r  T)r#  c                    s   g | ]}  |qS r+   r  r   r  r+   r,   r     s   c                    s    |  j tt jj7  _ d S r#   ru  rw  r   r+   r,   rx    s    z?SelectInLoader._load_for_path.<locals>._setup_outermost_orderby)r   )5r%   r  r  r  r  r   r9   r   r  r  r   r   r  r7   r  r  r  r   r  r$   ZBundler  r"   r  r!   r   r  r  r  rl  r?  rK   rj  filterZin_r   r   rR   Zselect_statementr
   r  zipr   r  r"  rq  Z_update_compile_optionsr#  r  r   ry  _load_via_child_load_via_parent)rM   r\   rT   Zstates	load_onlyrm  rU   r  
our_statesnone_statesr   Zrelated_identr  r  Z
bundle_entZ
bundle_sqlZ
entity_sqlr[  rY  r  rs  Zcached_optionsZuncached_optionsrv  rx  r+   )r\   rm  r?   rM   r   r  r,   r    s    






 	


     zSelectInLoader._load_for_pathc                    s   | j }t|}|r|d| j }|| jd  }dd |jj|d fdd|D id D }	|D ]T}
|	|
d }||
 D ]:\}}}|s| j|krqz|| j	|||s|n|g qzqbq|D ]0\}}}|s| j|krq|| j	||d  qd S )Nr   c                 S   s   i | ]\}}||qS r+   r+   )r{   r   r  r+   r+   r,   
<dictcomp>  s    z2SelectInLoader._load_via_child.<locals>.<dictcomp>r  c                    s   g | ]} j r|d  n|qS r>  r  )r{   r%   r  r+   r,   r     s   z2SelectInLoader._load_via_child.<locals>.<listcomp>r   )
r/   sorted
_chunksizer   r  r   r;   r%   r8  r  )rM   r  r	  r  r[  r\   r/   Zour_keyschunkdatar%   Zrelated_objr   r   r   r+   r  r,   r    s:     

zSelectInLoader._load_via_childc                    s"  | j }|rdnd }|r|d| j }|| jd  } fdd|D }tt}	t|jj|d|id	 dd D ] \}
}|	|
 
d	d
 |D  qt|D ]\}}}}|s| j|krq|	||}|s|rt|dkrtd|   || j|||d  q|| j||| qqd S )Nr+   r   c                    s&   g | ]\}}}} j r|d  n|qS r>  r  )r{   r%   r   r  r   r  r+   r,   r     s   
z3SelectInLoader._load_via_parent.<locals>.<listcomp>r  r  c                 S   s   | d S rj   r+   r  r+   r+   r,   r-     r  z1SelectInLoader._load_via_parent.<locals>.<lambda>c                 s   s   | ]}|d  V  qdS )r   Nr+   r  r+   r+   r,   r~     s     z2SelectInLoader._load_via_parent.<locals>.<genexpr>r   r  )r/   r  r  r  r   r  r  r   r  r   r  r%   r;   r  r   r  r8  r  )rM   r  r  r[  r\   r/   Z_empty_resultr  r  r  r   r  r%   r   r  r   r  r+   r  r,   r    sL    

     zSelectInLoader._load_via_parent)r`   ra   rb   rd   r  
namedtupler  r  rJ   r  r  r  rr   r_   r  r  r  re   r+   r+   rO   r,   r  Z
  s,   D B.r  c                    sT   fdd  fdd} fdd}t j| d|dddd	 t j| d
|dddd	 d S )Nc                    sT   |d k	rP|j  j krP|t|}|rP||k	rPtjdt|| j f dd|S )NzsInstance %s is already associated with an instance of %s via its %s attribute, and is only allowed a single parent.Zbbf1)code)	r%   	hasparentr   Zinstance_stater   r   r$   Zinstance_strr=   )r   r   oldvalue	initiatorr  )r(   r+   r,   	_do_check-  s    z*single_parent_validator.<locals>._do_checkc                    s    | |d |S r#   r+   )r   r   r  r  r+   r,   r7   :  s    z'single_parent_validator.<locals>.appendc                    s    | |||S r#   r+   )r   r   r  r  r  r+   r,   set_=  s    z%single_parent_validator.<locals>.set_r7   T)rawretvalr4   r   )r   listen)r'   r(   r7   r  r+   )r  r(   r,   r8   ,  s         r8   )NNNNFN)Drc   
__future__r   r  r   r   r   r   r   r   r   r	   r
   r   r   r   r$   baser   r   r   r\   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    Zsql.selectabler!   r"   rC   ZColumnPropertyZstrategy_forrF   Zclass_loggerrf   rx   r   r  r   r   ZRelationshipPropertyr   r   ZMemoizedSlotsr   r!  r&  r4  r=  r  r  r8   r+   r+   r+   r,   <module>   s         
S+UP   =
&    i42"          a   S