a
    c	g                    @  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. d%d
l
mZ/ d%d'l
m0Z0 d%d(l
m1Z1 d%d)l
m2Z2 d%dl
mZ d%dl2mZ3 d%d*l2m4Z4 d%d+l5m6Z6 d%d,l5m7Z7 e	r6dd-lm8Z8 d%d.l9m:Z: dbd0d1Z;ej<j=d/d/d2G d3d4 d4e$Z>e1j?ej<j=d5d/d2G d6d7 d7e$Z@e1j?ej<j=d5d8G d9d: d:e@ZAe1j?ej<j=d5d5d;ej<j=d5d5d5d<ej<j=d5d=G d>d? d?e$ZBG d@dA dAZCG dBdC dCe$ZDe1j?ej8j=d5d=G dDdE dEe$ZEe1j?ej8j=dFdGej8j=ddGG dHdI dIeDZFe1j?ej8j=d5dGej8j=dJdGej8j=dKdGej8j=dLdGej8j=dMdGG dNdO dOeDejGe1jHZIG dPdQ dQZJG dRdS dSeDZKej8j=dTdGG dUdV dVeKZLe1j?ej8j=dWdGG dXdY dYeKZMe1j?ej8j=dZdGej8j=d/dGG d[d\ d\eDZNe1j?ej8j=d]dGG d^d_ d_eKejGZOd`da ZPdS )czWsqlalchemy.orm.interfaces.LoaderStrategy
   implementations, and related MapperOptions.    )annotationsN)Any)Dict)Tuple)TYPE_CHECKING   )
attributes)exc)
interfaces)loading)path_registry)
properties)query)relationships)
unitofwork)util)_DEFER_FOR_STATE)_RAISE_FOR_STATE)_SET_DEFERRED_EXPIRED)ATTR_WAS_SET)LoaderCallableStatus)PASSIVE_OFF)PassiveFlag)_column_descriptions)ORMCompileState)ORMSelectCompileState)QueryContext)LoaderStrategy)StrategizedProperty)_state_session)InstanceState)Load)	_none_set)AliasedClass   )event)inspect)log)sql)visitors)LABEL_STYLE_TABLENAME_PLUS_COL)Select)RelationshipProperty)ColumnElementFc	                   s"  g }
|o| j |r"| jr"|
t | j| jjv rV| jj| j \|
fdd |rf|
tj |r| j	  r| j
r|
 fdd |jD ]}| |j| ju r|j| jstj|j| jf| |||o| jp| jtju ||||| p| j | jd|	}|
D ]}|||  q
qd S )Nc                   s   t j| |j fi S N)orm_utilZ_validator_eventskeydescprop)fnopts \/var/www/html/llm_bihealth/app/venv/lib/python3.9/site-packages/sqlalchemy/orm/strategies.py<lambda>X   s   z%_register_attribute.<locals>.<lambda>c                   s   t |  S r.   )r   Zbackref_listenersr1   )backrefuselistr6   r7   r8   f   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_validatorr0   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viewonlyrA   )r3   mapperr<   r;   r=   r>   Zproxy_propertyr?   r@   kwZlisten_hooksmr2   hookr6   )r9   r4   r5   r:   r7   _register_attributeB   sZ    





rN   )
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  || | jj| _d S r.   )super__init__parent_propertyrS   selfrD   strategy_key	__class__r6   r7   rU      s    z#UninstrumentedColumnLoader.__init__Nc           	      K  s*   | j D ]}|r|j | }||| qd S r.   )rS   _append_dedupe_col_collection)	rX   compile_statequery_entitypathloadoptadaptercolumn_collectionkwargscr6   r6   r7   setup_query   s    


z&UninstrumentedColumnLoader.setup_queryc	           	      C  s   d S r.   r6   	rX   contextr^   r_   r`   rJ   resultra   
populatorsr6   r6   r7   create_row_processor   s    z/UninstrumentedColumnLoader.create_row_processor)N)	__name__
__module____qualname____doc__	__slots__rU   re   rj   __classcell__r6   r6   rZ   r7   rQ      s    
rQ   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`.)rS   is_compositec                   s*   t  || | jj| _t| jd| _d S )Ncomposite_class)rT   rU   rV   rS   hasattrrr   rW   rZ   r6   r7   rU      s    
zColumnLoader.__init__Fc	                 K  sv   | j D ]<}
|r6|r,||
}
|
d u r6 d S n
|j |
 }
||
| q| j d }|rh|j | }|d u rhd S ||| j< d S Nr   )rS   Zadapt_check_presentr\   rV   )rX   r]   r^   r_   r`   ra   rb   memoized_populatorsZcheck_for_adaptrc   rd   fetchr6   r6   r7   re      s    




zColumnLoader.setup_queryc                 C  s`   d| _ | jd j}| jjpD| jd jpD|jd uoD|j|jd | ju }t	| j|d|j
|d d S )NTr   F)r<   r;   r?   )is_class_levelrS   typerV   r?   primary_keyZversion_id_col_columntopropertyrF   rN   compare_values)rX   rJ   Zcoltyper?   r6   r6   r7   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)rS   _getterrB   r0   )rX   rg   r^   r_   r`   rJ   rh   ra   ri   colgetterr6   r6   r7   rj     s    

z!ColumnLoader.create_row_processor)F)
rk   rl   rm   rn   ro   rU   re   r}   rj   rp   r6   r6   rZ   r7   rq      s    
!rq   )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 d  t fdd| jjD | _d S )Nc                 3  s   | ]}|   V  qd S r.   )compare.0rd   nullr6   r7   	<genexpr>%  s   z2ExpressionColumnLoader.__init__.<locals>.<genexpr>)	rT   rU   r(   r   labelanyrV   rS   _have_default_expressionrW   rZ   r   r7   rU     s
    zExpressionColumnLoader.__init__c                 K  s   d }	|r d|j v r |j d g}	n| jr.| jj}	|	d u r:d S |	D ]}
|rP|j|
 }
||
| q>|	d }|r|j| }|d u rd S ||| j< d S )N
expressionr   )
local_optsr   rV   rS   r\   )rX   r]   r^   r_   r`   ra   rb   rv   rc   rS   rd   rw   r6   r6   r7   re   )  s"    

z"ExpressionColumnLoader.setup_queryc	                 C  sr   |rnd|j v rn|j d g}	|	D ]:}
|r0|j|
 }
||
d}|r|d | j|f  qnq|d | jdf d S )Nr   Fr~   r   T)r   rS   r   rB   r0   )rX   rg   r^   r_   r`   rJ   rh   ra   ri   rS   r   r   r6   r6   r7   rj   M  s    
z+ExpressionColumnLoader.create_row_processorc                 C  s(   d| _ t| j|d| jd jjdd d S )NTFr   )r<   r;   Zaccepts_scalar_loader)rx   rN   rV   rS   ry   r|   rX   rJ   r6   r6   r7   r}   g  s    z+ExpressionColumnLoader.init_class_attribute)rk   rl   rm   rU   re   rj   r}   rp   r6   r6   rZ   r7   r     s   $r   )rP   rO   )rP   rO   	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`.)rS   groupr   c                   sJ   t  || t| jdr"td| jdd| _| jj| _| jj	| _	d S )Nrs   z8Deferred loading for composite types not implemented yetr   F)
rT   rU   rt   rV   NotImplementedErrorstrategy_optsrF   r   rS   r   rW   rZ   r6   r7   rU   ~  s    
zDeferredColumnLoader.__init__c	           
   
   C  s   |j rB|jjjrB| j|jjjv rB| jd|||||||| nH| jsv| j	rX| jj
}	n| jj}	|d | j|	f n|d | jdf d S )N)rP   FrO   Tnewr   F)refresh_stater   _compile_options_only_load_propsr0   rV   _get_strategyrj   rx   r   Z_raise_column_loaderZ_deferred_column_loaderrB   )
rX   rg   r^   r_   r`   rJ   rh   ra   ri   Zset_deferred_for_local_stater6   r6   r7   rj     s4    z)DeferredColumnLoader.create_row_processorc                 C  s,   d| _ t| j|d| jd jj| jdd d S )NTFr   )r<   r;   r>   Zload_on_unexpire)rx   rN   rV   rS   ry   r|   _load_for_stater   r6   r6   r7   r}     s    z)DeferredColumnLoader.init_class_attributeNc	           
      K  s   |j jr| jjsT|r(t| j| jjsT|rF| j	rF|j
d| j	 dsT|r|| j|v r|| jdj|||||||fi |	 n.| jrt|| j< n| jst|| j< n
t|| j< d S )Nzundefer_group_%sFr   )compile_optionsZ_render_for_subqueryrV   Z_renders_in_subqueriessetrS   intersectionrD   Z_should_undefer_in_wildcardr   r   rF   r0   r   re   rx   r   r   r   r   )
rX   r]   r^   r_   r`   ra   rb   rv   Zonly_load_propsrK   r6   r6   r7   re     sP    


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 u rtdt j f  jr |d tjt|t tjS )Nc                   s4   g | ],}t |trt |jtr|j jkr|jqS r6   )
isinstancer   strategyr   r   r0   )r   prX   r6   r7   
<listcomp>  s
   
z8DeferredColumnLoader._load_for_state.<locals>.<listcomp>c                   s   g | ]}| j v r|qS r6   )Z
unmodified)r   k)stater6   r7   r         zfParent instance %s is not bound to a Session; deferred load operation of attribute '%s' cannot proceedraise)r0   r   
ATTR_EMPTYr   SQL_OKPASSIVE_NO_RESULTmanagerrJ   r   Ziterate_propertiesr   orm_excDetachedInstanceErrorr/   	state_strr   _invoke_raise_loadr   Zload_scalar_attributesr   r   r   )rX   r   passivelocalparentZtoloadr   sessionr6   )rX   r   r7   r     s0    

z$DeferredColumnLoader._load_for_statec                 C  s   t d| f d S )Nz+'%s' is not available due to raiseload=Truesa_excInvalidRequestErrorrX   r   r   lazyr6   r6   r7   r   "  s    z'DeferredColumnLoader._invoke_raise_load)N)rk   rl   rm   rn   ro   rU   rj   r}   re   r   r   rp   r6   r6   rZ   r7   r   s  s   
3 
3(r   c                   @  s0   e Zd ZdZddddddZejfdd	Zd
S )LoadDeferredColumnsz7serializable loader object used by DeferredColumnLoaderFstrboolr0   r   c                 C  s   || _ || _d S r.   r   )rX   r0   r   r6   r6   r7   rU   +  s    zLoadDeferredColumns.__init__c                 C  s>   | j }|jj}|j| }| jr$d}nd}||}|||S )N)rP   Tr   )r   T)r   r   )r0   r   rJ   rE   r   r   r   )rX   r   r   r0   r   r3   rY   r   r6   r6   r7   __call__/  s    

zLoadDeferredColumns.__call__N)F)rk   rl   rm   rn   rU   r   r   r   r6   r6   r6   r7   r   (  s   r   c                      s,   e Zd ZdZdZ fddZdd Z  ZS )AbstractRelationshipLoaderz0LoaderStratgies which deal with related objects.)rJ   targetr:   entityc                   s:   t  || | jj| _| jj| _| jj| _| jj| _d S r.   )rT   rU   rV   rJ   r   r   r:   rW   rZ   r6   r7   rU   E  s
    


z#AbstractRelationshipLoader.__init__c	           	   
   C  s    | j d||||||||S )N))r   	immediate)rV   r   rj   rf   r6   r6   r7   #_immediateload_create_row_processorL  s    z>AbstractRelationshipLoader._immediateload_create_row_processor)rk   rl   rm   rn   ro   rU   r   rp   r6   r6   rZ   r7   r   @  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)rk   rl   rm   rn   r6   r6   r6   r7   r   e  s   r   Znoload)r   c                   @  s$   e Zd ZdZdZdd Zdd ZdS )NoLoaderzQProvide loading behavior for a :class:`.Relationship`
    with "lazy=None".

    r6   c                 C  s    d| _ t| j|d| jjd d S )NT)r<   r=   )rx   rN   rV   collection_classr   r6   r6   r7   r}   |  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_collectionr0   r   dict_rowr   r6   r7   invoke_no_load  s    z5NoLoader.create_row_processor.<locals>.invoke_no_loadr   )rB   r0   )
rX   rg   r^   r_   r`   rJ   rh   ra   ri   r   r6   r   r7   rj     s    zNoLoader.create_row_processorN)rk   rl   rm   rn   ro   r}   rj   r6   r6   r6   r7   r   q  s   
r   selectr   raise_on_sqlZbaked_selectc                      s   e Zd ZU dZdZded< ded< ded< ded< d	ed
< d	dd fddZdd Zdd Zdd Z	dd Z
ddddejfddZdd Zeddd Zd d! Z  ZS )"
LazyLoaderztProvide loading behavior for a :class:`.Relationship`
    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_sqlzColumnElement[bool]r   zDict[str, ColumnElement[Any]]r   r   r   zRelationshipProperty[Any]rV   zTuple[Any, ...])rD   rY   c                   s8  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r4t| jD ]4}|| jjv 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   elemr6   r6   r7   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)rT   rU   r   r   r   r&   r   r   rV   _join_conditionZcreate_lazy_clauser   r   r   r   r   r   order_byr   to_listr   loggerinfor:   _get_clauser   rJ   _equivalent_columnsr   list)rX   rD   rY   Zjoin_conditionr   rd   rZ   r6   r7   rU     sN    


zLazyLoader.__init__c              	   C  sv   d| _ | jj}| jjr d}d}n4| jjtjus4| jsL|rBd}d}qTd}d}nd }}t| j|d| j	| jj
||d d S )NTF)r<   r>   r=   r?   _deferred_history)rx   rV   _legacy_inactive_history_styler?   rI   r
   	MANYTOONEr   rN   r   r   )rX   rJ   r   r?   r   r6   r6   r7   r}     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	bindparamr6   r6   r7   visit_bindparam&  s    zFLazyLoader._memoized_attr__simple_lazy_clause.<locals>.visit_bindparamr   c                   sF   | j  v r$| j | j  d f n| jd u rB| jd | jf d S r.   )Z_identifying_keyrB   r0   callablevaluer   Zbind_to_colparamsr6   r7   r   +  s    

)r   r   r   r   r)   traverseZcloned_traverse)rX   Z	lazywhere	criterionr   r6   r   r7   "_memoized_attr__simple_lazy_clause  s    

z-LazyLoader._memoized_attr__simple_lazy_clausec                 C  s   | j \}}|d u r(t|dd |D S | jj}| }t|}|tj	@ rV|tj	N }i }|D ]J\}	}
}|
d ur|r|tj
@ r||||
|}n||||
|}|||	< q^||fS )Nc                 S  s   g | ]\}}}|qS r6   r6   )r   r0   identr   r6   r6   r7   r   B  r   z4LazyLoader._generate_lazy_clause.<locals>.<listcomp>)r   r   Zadapt_criterion_to_nullrV   rD   objr   instance_dictr   ZINIT_OKLOAD_AGAINST_COMMITTED#_get_committed_state_attr_by_column_get_state_attr_by_column)rX   r   r   r   Z
param_keysrJ   or   r   r0   r   r   r6   r6   r7   _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   r6   r6   r7   r   ]  s    
zLazyLoader._invoke_raise_loadNr6   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|	v rtjS tj|	v rtjS t|	rd S | j |jv r(|t	j@ s(tjS |j| j|	||d}|d ur\|tj u 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)"r0   rV   Zload_on_pendingZ_load_pendingZ
session_idr   r   r   _extra_criteriar   r   r   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)rX   r   r   r`   extra_criteriaextra_optionsalternate_effective_pathexecution_optionspendingprimary_key_identityr   r   instancer6   r6   r7   r   b  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   rX   r   r6   r7   r     s   z5LazyLoader._get_ident_for_use_get.<locals>.<listcomp>)r   rJ   r   r   r   r   r  rz   )rX   r   r   r   instance_mapperr6   r  r7   r    s    
z!LazyLoader._get_ident_for_use_getzsqlalchemy.orm.strategy_optionsc
                   s  t jj j }
tj|
g|
jtt	j
d}tj}|d|d7 } jjd ur\| j jj}|j }|sr|tj@ rt ddi|_ j}|js|r|jr|d u r|j j }n
| j }|j}|r|jrd}|t j|f7 }||_n$|d u r|jj j }n
| j }|r | j|7  _| jd|i7  _|rn jrZ|t j!@ sZ "||d t#j$|||||	dS  j%r~ j%|_& fdd	}| j'| jff7  _' (||\}}|	rt j)*|	d
|i}	nd
|i}	 j|j+v r|t j,@ st-j.S |rt /tj0|1 r,d S nt /tj2|1 r,d S  jrN|t j!@ sN "||d |f|_3|j4|||	d}|5 6 7 } j8r|S t9|}|r|dkrt :d 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_optionsr
  c                   sR    j jD ]D}|jtju r|jrt|jtsj	
| jj|j ||  qd S r.   )rV   Z_reverse_propertyrI   r
   r   Z_use_getr   r   r   r!   Z_construct_for_existing_pathr   r  rD   ZlazyloadZprocess_compile_state)compile_contextrevrX   strategy_optionsr6   r7   _lazyload_reverse6  s     

z4LazyLoader._emit_lazyload.<locals>._lazyload_reverseZ_sa_orm_load_options)r
  r   zKMultiple rows returned with uselist=False for lazily-loaded attribute '%s' r   );r   Z	preloadedZorm_strategy_optionsr   __clause_element__r+   _create_raw_selectr  r*   r   default_compile_optionsr   Zdefault_load_optionsrV   Z	secondaryselect_fromrJ   r0   r   ZNO_AUTOFLUSHimmutabledict_execution_optionsr   r  r   Z	load_pathr/   LoaderCriteriaOption_with_options_path_registryr   r   r   r  r   r   Zload_on_pk_identityr   _order_by_clausesZ_with_context_optionsr   
EMPTY_DICT
merge_withr  r  r   r   Zhas_intersectionr"   valuesZ
_never_setZ_where_criteriaexecuter   Zscalarsallr:   lenwarn)rX   r   r   r  r   r`   r  r  r	  r
  Zclauseelementstmtr  r  r   effective_pathr5   r  Zlazy_clauser   rh   lr6   r  r7   r    s    







zLazyLoader._emit_lazyloadc	              
     s   | j  |jjr@|jjjr@| j |jjjv r@| ||||||||S | jrP|r|jrt	
|jt | ||jrp||nd  }	|d | j |	f n,|js|jr fdd}
|d | j |
f d S )Nr   c                   s   |  |  d S r.   )Z_resetr   r0   r6   r7   reset_for_lazy_callable  s    	z@LazyLoader.create_row_processor.<locals>.reset_for_lazy_callable)r0   r  Z_is_user_refreshr   r   r   r   rx   r   r    Z"_instance_level_callable_processorrG   LoadLazyAttribute_generate_extra_criteriarB   populate_existingZalways_refresh)rX   rg   r^   r_   r`   rJ   rh   ra   ri   Zset_lazy_callabler4  r6   r3  r7   rj     sF    
zLazyLoader.create_row_processor)rk   rl   rm   rn   ro   __annotations__rU   r}   r   r   r   r   r)  r   r  Zpreload_moduler  rj   rp   r6   r6   rZ   r7   r     s.   
	<"  	
p
 r   c                   @  s.   e Zd ZdZdd Zdd ZejfddZdS )	r5  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.   r0   rY   r`   r  )rX   r0   Zinitiating_strategyr`   r  r6   r6   r7   rU     s    zLoadLazyAttribute.__init__c                 C  s(   | j d u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 caser6   r9  )r  r   r/  r0   rY   r`   r   r6   r6   r7   __getstate__  s    
zLoadLazyAttribute.__getstate__c                 C  s:   | j }|jj}|j| }|j| j }|j||| j| jdS )N)r`   r  )	r0   r   rJ   rE   Z_strategiesrY   r   r`   r  )rX   r   r   r0   r  r3   r   r6   r6   r7   r     s    
zLoadLazyAttribute.__call__N)	rk   rl   rm   rn   rU   r:  r   r   r   r6   r6   r6   r7   r5    s   r5  c                   @  s   e Zd ZdZdZdddZdS )
PostLoaderz;A relationship loader that emits a second SELECT statement.r6   Nc                 C  sN  |j jptjj| }| }td|i}|rF|j	dd }|dk}	nd }d}	|d ur| j
jsrtd| j
 d|j	dt|  |}|	s|dk r|d||fS |	s|dt|  |d	 i}tj||| j
r|d||fS || j
 }
|| j
 }|
|jd
sB|r(|jd |krB|d||fS n|| jrB|d||fS |d||fS )NZsa_top_level_orm_contextrecursion_depthFz'recursion_depth option on relationship z0 not valid for non-self-referential relationshipZ_recursion_depth_r   r   loaderr$   T)r]   current_pathr/   PathRegistryrootZ_get_top_level_contextr   r#  r   rF   rV   Z_is_self_referentialr   r   r
  idunionr   PostLoadZpath_existscontainsr   lengthcontains_mapperrJ   )rX   rg   r_   r`   
join_depthr1  Ztop_level_contextr
  r<  Zunlimited_recursionpath_w_propZeffective_path_w_propr6   r6   r7   _setup_for_recursion  sl    


zPostLoader._setup_for_recursion)N)rk   rl   rm   rn   ro   rJ  r6   r6   r6   r7   r;    s   r;  r   c                      s8   e Zd ZdZ fddZdd Zdd Zdd	 Z  ZS )
ImmediateLoaderrH  c                   s   t  || | jj| _d S r.   rT   rU   rV   rH  rW   rZ   r6   r7   rU   I  s    zImmediateLoader.__init__c                 C  s   | j d| d S N)r   r   rV   r   r}   r   r6   r6   r7   r}   M  s
    z$ImmediateLoader.init_class_attributec	                 C  s^   |  |||| j\}	}
}}|
s,tjtjB }ntjtjB }tj	||	| j
| j| j||||	 d S r.   )rJ  rH  r   ZPASSIVE_NO_FETCH_RELATEDr   r  r   r   rD  callable_for_pathrD   rV   _load_for_path)rX   rg   r^   r_   r`   rJ   rh   ra   ri   r1  
run_loaderr
  r<  flagsr6   r6   r7   rj   R  s(    z$ImmediateLoader.create_row_processorc	                 C  s   |r.t |jj}	|| f|	_| }
|	f}nd }	|}
d}| j}| jd}|D ]P\}}|j	}|sj||vrP|j
||||
|d}|ttjfvrP||||| qPd S )Nr6   rO  )r  r	  r
  )r!   r_   r   Z_recurserg   _truncate_recursiver0   rV   r   r  r   r   r   r   get_implset_committed_value)rX   rg   r_   states	load_onlyr`   rT  r<  r
  Znew_optr	  r  r0   
lazyloaderr   	overwriter   r   r6   r6   r7   rR  x  s:    
zImmediateLoader._load_for_path)	rk   rl   rm   ro   rU   r}   rj   rR  rp   r6   r6   rZ   r7   rK  E  s
   &rK  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Zdd Zdd Zdd Zdd Z  ZS )SubqueryLoaderrL  c                   s   t  || | jj| _d S r.   rM  rW   rZ   r6   r7   rU     s    zSubqueryLoader.__init__c                 C  s   | j d| d S rN  rP  r   r6   r6   r7   r}     s
    z#SubqueryLoader.init_class_attributec                   s   |}|j }t|d }| j|rB| j|d u 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   )getattrr_   r   r{   r0   r   leftmost_mapperZnew_subq_pathr6   r7   r     s
   

z0SubqueryLoader._get_leftmost.<locals>.<listcomp>)r_   r/   Z_class_to_mapperrD   isarV   	_entitiesentity_zeror'  r.  r   r@  Zcoercelocal_columns)rX   orig_query_entity_index	subq_pathZcurrent_compile_stateis_rootZgiven_subq_pathZsubq_mapperZleftmost_prop
additionalZleftmost_colsleftmost_attrr6   r`  r7   _get_leftmost  s4    
zSubqueryLoader._get_leftmostc                 C  s0  |  d }tjtj}|j|j |}|js`d|_|j	j
|gdd t||dD R   |dd |D | }	|	|_|j}
|
du rd|_n6|
d u rdd |	D D ]}t|	|jsd|_ qq|jsd	|_|jdu r|jrt|	|j}|r||	|  |t }tj||dd
}|S )NFc                 S  s    h | ]}|d  dur|d  qS )r   Nr6   )r   entr6   r6   r7   	<setcomp>  s   z?SubqueryLoader._generate_from_original_query.<locals>.<setcomp>)r]   c                 S  s   g | ]}t jt jj|qS r6   )r(   Z	coercionsexpectZrolesZColumnsClauseRole)r   r   r6   r6   r7   r     s   z@SubqueryLoader._generate_from_original_query.<locals>.<listcomp>Tc                 S  s   h | ]
}|j qS r6   )tabler   r6   r6   r7   rm  -  r   r6   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  rz   Z_has_row_limiting_clauser(  r   Z expand_column_list_from_order_byZ_set_entitiesZset_label_styler*   r\  r/   r#   )rX   orig_compile_state
orig_queryra  rj  leftmost_relationshipZorig_entityqZq2Ztarget_colsrv  tZto_addZembed_q
left_aliasr6   r6   r7   _generate_from_original_query  sV    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$   r=  Trp  c                   s    g | ]}t  jj| jqS r6   )r_  rD   r{   r0   r   parent_aliasrX   r6   r7   r   r  s   z2SubqueryLoader._prep_for_joins.<locals>.<listcomp>)r   pairs	enumeraterJ   rb  rB   r0   r.  r&   r   r   r/   r#   rV   re  )rX   r|  rg  to_joinr  irJ   r3   Zprev_mapperZ	to_appendr   
local_cols
local_attrr6   r~  r7   _prep_for_joinsI  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/   r#   r   )r   itemr6   r6   r7   r     s   z/SubqueryLoader._apply_joins.<locals>.<listcomp>)r.  r_  of_typepoprB   rD   join)rX   rz  r  r|  r  effective_entityZltjZmiddleinnerr  attrr6   r6   r7   _apply_joinsx  sD    

	


zSubqueryLoader._apply_joinsc           	      C  sB   |j }|r*|jr*|t| j||f7 }||}|j| }|S r.   )r&  r   r/   r%  r   r6  Z_with_current_pathoptions)	rX   rg   rz  rg  rewritten_pathrx  r  r`   new_optionsr6   r6   r7   _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_bytupler   r   rV   r   r  r   r6   r7   _setup_outermost_orderby  s    zISubqueryLoader._setup_outermost_orderby.<locals>._setup_outermost_orderby)rV   r   _add_context_option)rX   rz  r  r6   r   r7   r    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.   r  )rX   rg   r  r6   r6   r7   rU     s    z(SubqueryLoader._SubqCollections.__init__c                 C  s    | j d u r|   | j ||S r.   )r  _loadrF   )rX   r0   defaultr6   r6   r7   rF     s    
z#SubqueryLoader._SubqCollections.getc                 C  s   t t| _| j}|jd u s J || j}| jjr<|	 }t|
| j
}t|dd D ]"\}}| j| dd |D  q\d S )Nc                 S  s   | dd  S )Nr   r6   xr6   r6   r7   r8   	  r   z7SubqueryLoader._SubqCollections._load.<locals>.<lambda>c                 s  s   | ]}|d  V  qdS )r   Nr6   r   vvr6   r6   r7   r   
  r   z8SubqueryLoader._SubqCollections._load.<locals>.<genexpr>)collectionsdefaultdictr   r  r  r   Zwith_sessionr  Z_populate_existingr7  r   	itertoolsgroupbyextend)rX   rz  rowsr   vr6   r6   r7   r    s    z%SubqueryLoader._SubqCollections._loadc                 C  s   | j d u r|   d S r.   )r  r  )rX   r   r   r   r6   r6   r7   r>    s    
z&SubqueryLoader._SubqCollections.loaderN)	rk   rl   rm   rn   ro   rU   rF   r  r>  r6   r6   r6   r7   _SubqCollections  s   	
r  c              	   C  s  |j }|jjr|jjrd S |j|}d|_|| j }||j	dd }	|	d urT|	}
n| j
}
|jjdtjjtjjf\}}|tjju }|| }|| }|jjdtf|j}t|d}|jr|jjd u rtd| |f  |j}|j|dd}| ||||\}}}}| ||||||}t|
}|jj|jdtf|d||fi|_|d}|  ||\}}}|j!| }| "|||||
}| #||||||
|}| $|}|S )	NTpath_with_polymorphic)Zsubquery_pathsNrx  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)%r]   r   _enable_eagerloadsZ_for_refresh_staterc  indexZloaders_require_bufferingrV   rF   r   r   r   r$  r/   r@  rA  r]  r   Z_get_plugin_class_for_pluginZ_is_lambda_elementr  r  r   r/  Z	_resolvedZ_create_entities_collectionrk  r}  rr  r*  r
  Z_set_enable_single_critr  Zadd_columnsr  r  r  )rX   rg   r^   r_   r   r`   ra   r]   rf  with_poly_entityr  rg  r  rh  rx  Zcompile_state_clsrw  ra  rj  ry  r|  rz  r  r  r  r6   r6   r7   _setup_query_from_rowproc  s    	

	





	
z(SubqueryLoader._setup_query_from_rowprocc	              
     sj  |j r| |||||| |S | |||| j\}	}
}	}	|
s@d S t|jtsPd S | jj| j	 j
jsptd|  t|dkrt|j| jsd S nt|d | jsd S | ||||d | }|d u rd S |jd u sJ || j }| jj}||jd}|d u r | ||}||jd|  r8 fdd|D }| jrT| ||||| n| ||||| d S )NJ'%s' does not support object population - eager loading cannot be applied.r   r=  r  c                   s   g | ]} j | qS r6   rR   r   ra   r6   r7   r     r   z7SubqueryLoader.create_row_processor.<locals>.<listcomp>)r   r   rJ  rH  r   r]   r   rD   rG   r0   implsupports_populationr   r   r.  r/   _entity_isard  r  r   rV   re  rF   r   r  r   r:   _create_collection_loader_create_scalar_loader)rX   rg   r^   r_   r`   rJ   rh   ra   ri   _rS  r  r  r  r6   r  r7   rj     sn    
		



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 )Nr6   )rF   rV  r0   rW  )r   r   r   
collectionr  rX   tuple_getterr6   r7   load_collection_from_subq  s    zKSubqueryLoader._create_collection_loader.<locals>.load_collection_from_subqc                   s   j |vr | || d S r.   r3  r   )r  rX   r6   r7   &load_collection_from_subq_existing_row  s    
zXSubqueryLoader._create_collection_loader.<locals>.load_collection_from_subq_existing_rowr   existingeagerZ_tuple_getterrB   r0   invoke_all_eagersr>  )rX   rg   rh   r  r  ri   r  r6   )r  r  rX   r  r7   r    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   )rF   r.  r   r/  rV  r0   rW  )r   r   r   r  Zscalarr  r6   r7   load_scalar_from_subq  s    zCSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subqc                   s   j |vr | || d S r.   r3  r   )r  rX   r6   r7   "load_scalar_from_subq_existing_row  s    
zPSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subq_existing_rowr   r  r  r  )rX   rg   rh   r  r  ri   r  r6   )r  r  rX   r  r7   r    s    
z$SubqueryLoader._create_scalar_loader)rk   rl   rm   ro   rU   r}   rk  r}  r  r  r  r  r  r  rj   r  r  rp   r6   r6   rZ   r7   r]    s   1d/4"4 	Y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dZdd Zdd Zdd Zdd Z  ZS )JoinedLoaderz[Provide loading behavior for a :class:`.Relationship`
    using joined eager loading.

    rH  c                   s   t  || | jj| _d S r.   rM  rW   rZ   r6   r7   rU   /  s    zJoinedLoader.__init__c                 C  s   | j d| d S rN  rP  r   r6   r6   r7   r}   3  s
    z!JoinedLoader.init_class_attributeNFc	                 K  sR  |j jsdS | jrd|_|| j }d}
|r:| |||jnd}|dur`| |||||\}}}n`||jds| j	r|j
d | j	krdS n|| jrdS | ||||||||\}}}}d|_||jdd}|durt|j}
nd}
|| j }tj|| j|||||
| j|d	 tj|j}|rN|dur<tdnd	d
 |j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().c                 S  s   g | ]}|d ur|qS r.   r6   r   r6   r6   r7   r     s   z,JoinedLoader.setup_query.<locals>.<listcomp>)r   r  r:   multi_row_eager_loadersrV   _init_user_defined_eager_procr   $_setup_query_on_user_defined_adapterrE  rH  rF  rG  rJ   _generate_row_adapterZeager_adding_joinsrF   r&   Zwith_polymorphic_mappersr   r   Z_setup_entity_queryr   ZNONE_SETr   secondary_columnsr   r   )rX   r]   r^   r_   r`   ra   rb   r  r  rc   r  user_defined_adapterclausesadd_to_collectionr  Z	has_nonesr6   r6   r7   re   8  s    


zJoinedLoader.setup_queryc           
      C  s   d|j vrdS |jj}||jdd}|dur2|S |j d }|dd  \}}|d urt|trj|j|}t	j
t	jj|j||jjdd}nF||jdr||jd}	t	j
t	jj|	|jjd}n|j|jd }||d| |S )NZeager_from_aliasF user_defined_eager_row_processor)
selectabler   Zlimit_on_entityr  )r   )r   r_   rD   rF   r   r   r   r   aliasr/   
ORMAdapter_TraceAdaptRoleZJOINEDLOAD_USER_DEFINED_ALIASrJ   r   rE  Z JOINEDLOAD_PATH_WITH_POLYMORPHICZ_polymorphic_adaptersr   )
rX   r`   r]   Ztarget_attributesr_   ra   r  Zroot_mapperr3   r  r6   r6   r7   r    sP    


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)rX   rg   r   r_   ra   r  r  r6   r6   r7   r    s"    

z1JoinedLoader._setup_query_on_user_defined_adapterc	                 C  s  | |jdd }	|	r|	}
nDt| j}|jr2|j}nd }tj| j|d urR|j	ddnd ddd}
t|
}|j
d| ftjtjj|| jjdddd}|jsJ |d ur|j d| jjn| jj}|sd}|j| j||||||||r|jnd	f	 |j}||jd
| ||||fS )Nr  T)flat)r  r  rq  Zjoinedloader_ormadapterF)r   Zadapt_requiredZallow_label_resolveZanonymize_labels	innerjoinr6   eager_row_processor)rF   r   r&   r   r   r  r/   r#   rJ   Z_anonymous_fromclauseZ_memor  r  ZJOINEDLOAD_MEMOIZED_ADAPTERr   r   rV   r  Zcreate_eager_joinsrB   _create_eager_joinr   r  r   )rX   r]   r   r_   r`   ra   rb   r  r  r  Zto_adaptZinspZalt_selectableZto_adapt_inspr  r  r  r6   r6   r7   r  	  sd    
	
z"JoinedLoader._generate_row_adapterc
              	     sX  |d u r|j }
n|}
|jo|j}d }||jvr~|s~|jr~t|j|j}t|dkr^t	
d|r~|j|d  }|d | }}|d u r||j }}|j||}|rt|ddr|j|
 jr|
n j}t|j j j}n ttj j|jdd j j}n j}|jsJ | p8| p8|dkp8|jj}|	}|jd	 j fd
}|rr|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*rT| j+t|j,-t./ 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   FTrp  Zunnestedadditional_entity_criteriar6   c                 3  s    | ]}|j r| jV  qd S r.   )Zpropagate_to_loadersZ_resolve_where_criteriarJ   )r   Zaer   r6   r7   r   	  s   z2JoinedLoader._create_eager_join.<locals>.<genexpr>isouter
_left_memo_right_memor   )0rJ   r  Z_should_nest_selectableZeager_joinsZfrom_clausesr   Z#find_left_clause_that_matches_givenr  r.  r   r   
setdefaultr_  aliased_inspZ_entity_for_mapperrb  rD   r   r0   rV   r/   r#   r   rd  Zrepresents_outer_joinZglobal_attributesrF   r  _ORMJoinr   r(   ZJoin_splice_nested_inner_joinZstop_onZ_find_columnsZprimaryjoinZpersist_selectablerd   Zcontains_columnrS   r\   r  r   r  _target_adapterZcopy_and_processr   r   )rX   r]   r^   r_   ra   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  	eagerjoinr   r6   r   r7   r  N	  s    

	





zJoinedLoader._create_eager_joinc           
   	   C  s>  |du rt |tjs|J nbt |tjjr>| ||j||||S t |tjs||d |rxtj||j	|d||d j
|dS d S | ||j||||j}|d u rd}| ||j||||j}|d u r|dusJ 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  ZFromGroupingr  elementrb  r  rJ   rightr  leftr  r  Z_splice_into_centerr  r  )
rX   r_   Zjoin_objr  r  r  ZsplicingZtarget_joinZright_splicer  r6   r6   r7   r  	  s    
z&JoinedLoader._splice_nested_inner_joinc           	      C  s   |j }|r| |||jnd}|durP|}|jrB|rB||j}qj|jrj|j}n||jd}|d u rjdS | j||r||S dS d S )NFr  )r]   r  r   Zcompound_eager_adapterr  rF   rJ   Z_result_has_identity_key)	rX   rg   rh   ra   r_   r`   r]   r  	decoratorr6   r6   r7   _create_eager_adapterF
  s.    
z"JoinedLoader._create_eager_adapterc	              
   C  s   | j j| j jjs td|  | jr,d|_|| j	 }	| 
||||	|}
|
dur| j}t|| j|||	| j |
}| js| |||| q| |||| n | j	d|||||||| d S )Nr  TFrO  )rD   rG   r0   r  r  r   r   r:   Zloaders_require_uniquingrV   r  r   Z_instance_processorrJ   r   r  r  r   rj   )rX   rg   r^   r_   r`   rJ   rh   ra   ri   Zour_pathZeager_adapterr0   	_instancer6   r6   r7   rj   j
  sN    

	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 urB|| d S NZappend_without_eventr   r   r   ZUniqueAppenderrB   )r   r   r   r  result_listinstr  rg   r0   r6   r7   #load_collection_from_joined_new_row
  s    zSJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_new_rowc                   sd   | fj v rj | f }n(t | |}t|d}|j | f<  |}|d ur`|| d S r  r  )r   r   r   r  r  r  r  r6   r7   (load_collection_from_joined_existing_row
  s    zXJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_existing_rowc                   s    | d S r.   r6   r   r  r6   r7    load_collection_from_joined_exec
  s    zPJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_execr   r  r  rB   r0   r  )rX   rg   r0   r  ri   r  r  r  r6   r  r7   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.   r6   r   )r  r0   r6   r7   load_scalar_from_joined_new_row
  s    zKJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_new_rowc                   s8    |}|v r,|| ur4t d  n||< d S )Nr  )r   r/  )r   r   r   r  r  r0   rX   r6   r7   $load_scalar_from_joined_existing_row
  s    	zPJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_existing_rowc                   s    | d S r.   r6   r   r  r6   r7   load_scalar_from_joined_exec
  s    zHJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_execr   r  r  r  )rX   rg   r0   r  ri   r  r  r  r6   r  r7   r  
  s    z"JoinedLoader._create_scalar_loader)NNF)F)rk   rl   rm   rn   ro   rU   r}   re   r  r  r  r  r  r  rj   r  r  rp   r6   r6   rZ   r7   r  $  s&      
w9M ! 
Y$:/r  Zselectinc                      st   e Zd ZdZedg 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dd Z  ZS )SelectInLoader)rH  	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  || | jj| _| jjtju }| jjd ur>| jj| _n<| jd}|rX|j	| _n"| j
jd j|jdd| j
jd| _| jr|r|  | _|  | _q|  | _n
|  | _d S )NrO  r   TFr   )rT   rU   rV   rH  rI   r
   r   r  r   r   rD   r   r   r   r   _init_for_omit_join_m2or   _init_for_joinr  _init_for_omit_join)rX   rD   rY   Zis_m2orZ  rZ   r6   r7   rU     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 )r6   N)rD   r   rF   )r   r   equivpk_to_fkrX   r6   r7   r   4  s   z5SelectInLoader._init_for_omit_join.<locals>.<genexpr>c                   s   g | ]}| v r | qS r6   r6   r   r   )r  r6   r7   r   :  s   z6SelectInLoader._init_for_omit_join.<locals>.<listcomp>r   Fr   T)r  rV   r   Zlocal_remote_pairsru  r   rD   rz   r.  r(   tuple_
query_info)rX   r  Zfk_colsr  r  r6   r  r7   r
  0  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   TrO  c                   s   g | ]} j | qS r6   r  r  rZ  r6   r7   r   P  r   z:SelectInLoader._init_for_omit_join_m2o.<locals>.<listcomp>)rJ   rz   r.  r(   r  rV   r   r  )rX   r  r  r  Zlookup_colsr6   r  r7   r  F  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 r6   _adapt_elementr  Zpa_inspr6   r7   r   Y  s   z1SelectInLoader._init_for_join.<locals>.<listcomp>r   Fr   T)
r#   rD   rH   r  r&   rz   r.  r(   r  r  )rX   r  r  r  r6   r  r7   r	  V  s    


zSelectInLoader._init_for_joinc                 C  s   | j d| d S rN  rP  r   r6   r6   r7   r}   d  s
    z#SelectInLoader.init_class_attributec	                 C  s   |j r| ||||||||S | j|||| jd\}	}
}}|
sBd S | jj| j jjsbt	
d|  t|dkrt|j| jsd S nt|d | jsd S |	}|| j }||jdd }|d urt|}n| j}tj||| j| j| j||||	 d S )NrL  r  r   r=  r  )r   r   rJ  rH  rD   rG   r0   r  r  r   r   r.  r/   r  rd  rV   rF   r   r&   r   r   rD  rQ  rR  )rX   rg   r^   r_   r`   rJ   rh   ra   ri   r1  rS  r
  r<  Zselectin_pathrI  r  r  r6   r6   r7   rj   i  sf    
	

z#SelectInLoader.create_row_processorc	                   s  |rj |vrd S j}	|	jrtt}
g }j|D ]l\}jtfdd|	j	D }t
j|v rtj}	 qd |vr|
| |f q6||f q6|	jsdd |D }
|	j}|	j}|	jsjrfdd|D }|}tjdg|R  }| } }tj||gttjddd	}|	js@|}n$|jtjjj  }|!|"t#$d
} j%j&}|j }| j'u r|j(}n&|j(} j'j(} fddt)||D }|r|j*r|t+|, f7 }|d ur|- }|j.| }|/d|i} j0r*|j1dd}jj2r|	jsjjj2}jr^fdd|D }|j2| }nfdd}|3|j}|	jr4|
||	| | n5|
|	| | d S )Nc                 3  s"   | ]} j |tjd V  qdS )r  N)r   r   ZPASSIVE_NO_FETCH)r   Zlk)rJ   r   
state_dictr6   r7   r     s   z0SelectInLoader._load_for_path.<locals>.<genexpr>c                 S  s$   g | ]\}}|j d  ||j|fqS )r   )r0   r  )r   r   r[  r6   r6   r7   r     s   z1SelectInLoader._load_for_path.<locals>.<listcomp>c                   s   g | ]}  |qS r6   r  r  r  r6   r7   r     s   r  r  )Zcompile_state_pluginZplugin_subject)r  r  r   r  primary_keysc                   s   g | ]\}}|  |qS r6   )Z'_adapt_cached_option_to_uncached_option)r   Zorig_optZuncached_opt)rg   r6   r7   r   M  s   r  T)r7  c                   s   g | ]}  |qS r6   r  r   r  r6   r7   r   k  s   c                   s    |  j tt jj7  _ d S r.   r  r  r   r6   r7   r  r  s    z?SelectInLoader._load_for_path.<locals>._setup_outermost_orderby)6r0   r   r  r  r  r   rD   r  r  r  r   r   r  rB   r  r  r  r   r  r/   ZBundler  r+   r   r*   r   r!  r"  r  r  r_  rV   r  filterZin_r(   r   r]   Zselect_statementr   r&  zipr   r%  r6  rU  r  Z_update_compile_optionsr7  r
  r   r  _load_via_child_load_via_parent)rX   rg   r_   rX  rY  r  r`   r<  r
  r  
our_statesnone_statesr[  Zrelated_identr  r  Z
bundle_entZ
bundle_sqlZ
entity_sqlrz  rx  r1  r  Zcached_optionsZuncached_optionsr  r  r6   )rg   r  rJ   rX   r   r  r7   rR    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|v rq||| j	|||s|n|g q|qdq|D ]0\}}}|s| j|v rq|| j	||d  qd S )Nr   c                 S  s   i | ]\}}||qS r6   r6   )r   r   r  r6   r6   r7   
<dictcomp>  s   z2SelectInLoader._load_via_child.<locals>.<dictcomp>r  c                   s   g | ]} j r|d  n|qS r^  r  )r   r0   r  r6   r7   r     s   z2SelectInLoader._load_via_child.<locals>.<listcomp>r   r
  )
r:   sorted
_chunksizer   r,  r   rF   r0   rV  rW  )rX   r  r  r  rz  rg   r
  r:   Zour_keyschunkdatar0   Zrelated_objr   r   r[  r6   r   r7   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  qv|D ]\}}}}|s| j|v rq|
||}|s|rt|dkrtd|   || j|||d  q|| j||| qqd S )Nr6   r   c                   s&   g | ]\}}}} j r|d  n|qS r^  r  )r   r0   r   r  r[  r   r6   r7   r     s   
z3SelectInLoader._load_via_parent.<locals>.<listcomp>r  r!  c                 S  s   | d S ru   r6   r  r6   r6   r7   r8     r   z1SelectInLoader._load_via_parent.<locals>.<lambda>c                 s  s   | ]}|d  V  qdS )r   Nr6   r  r6   r6   r7   r     r   z2SelectInLoader._load_via_parent.<locals>.<genexpr>r   r  )r:   r#  r  r  r   r  r  r   r,  r   r  r0   rF   r.  r   r/  rV  rW  )rX   r  r  rz  rg   r
  r:   Z_empty_resultr$  r  r%  r   r  r0   r   r  r[  r  r6   r   r7   r    sF    


zSelectInLoader._load_via_parent)rk   rl   rm   ro   r  
namedtupler  r#  rU   r
  r  r	  r}   rj   rR  r  r  rp   r6   r6   rZ   r7   r  
  s    M T7r  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 urP|j  j krP|t|}|rP||u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)	r0   	hasparentr   Zinstance_stater   r   r/   Zinstance_strrH   )r   r   oldvalue	initiatorr(  )r3   r6   r7   	_do_check  s    z*single_parent_validator.<locals>._do_checkc                   s    | |d |S r.   r6   )r   r   r*  r+  r6   r7   rB      s    z'single_parent_validator.<locals>.appendc                   s    | |||S r.   r6   )r   r   r)  r*  r,  r6   r7   set_  s    z%single_parent_validator.<locals>.set_rB   T)rawretvalr?   r   )r%   listen)r2   r3   rB   r-  r6   )r+  r3   r7   rC     s    rC   )NNNNFN)Qrn   
__future__r   r  r  typingr   r   r   r    r   r	   r   r
   r   r   r   r   r   r   r   r/   baser   r   r   r   r   r   r   rg   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+   r,   Zsql.elementsr-   rN   ZColumnPropertyZstrategy_forrQ   Zclass_loggerrq   r   r   r   r   r   r   ZMemoizedSlotsZ
Identifiedr   r5  r;  rK  r]  r  r  rC   r6   r6   r6   r7   <module>
   s         
Q+ZV 0%
&

    )4L`          W   z