o
    [hU                    @   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! 						dKddZ"ej#j$dddG dd  d eZ%ej&ej#j$d!ddG d"d# d#eZ'ej&ej#j$d!d$G d%d& d&e'Z(ej&ej#j$d!d!d'ej#j$d!d(G d)d* d*eZ)G d+d, d,e*Z+G d-d. d.eZ,ej&ej-j$d!d(G d/d0 d0eZ.ej&ej-j$d1d2ej-j$dd2G d3d4 d4e,Z/ej&ej-j$d!d2ej-j$d5d2ej-j$d6d2ej-j$d7d2ej-j$d8d2G d9d: d:e,ej0Z1G d;d< d<e*Z2ej-j$d=d2G d>d? d?e,Z3ej&ej-j$d@d2G dAdB dBe,Z4ej&ej-j$dCd2ej-j$dd2G dDdE dEe,Z5ej&ej-j$dFd2G dGdH dHe,ej0Z6dIdJ Z7dS )LzWsqlalchemy.orm.interfaces.LoaderStrategy
   implementations, and related MapperOptions.    )absolute_importN   )
attributes)exc)
interfaces)loading)
properties)query)
unitofwork)util)_DEFER_FOR_STATE)_SET_DEFERRED_EXPIRED)LoaderStrategy)StrategizedProperty)_state_session)InstanceState)	_none_set)aliased   )event)inspect)log)sql)visitorsFc	                    s6  t tj| jg d}
g }|o| j|r| jr|t | j| j	j
v r5| j	j
| j \|fdd |r=|tj |rQ| j  rQ| jrQ| fdd |jD ]D}| |j| ju r|j| jstj|j| jf| |||
|o|| jp|| jtju ||||| p| j | jd|	}|D ]}|||  qqTd S )N)defaultc                    s   t j| |j fi S N)orm_utilZ_validator_eventskeydescprop)fnopts /home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/sqlalchemy/orm/strategies.py<lambda>B   s
    z%_register_attribute.<locals>.<lambda>c                    s   t |  S r   )r   Zbackref_listenersr   )backrefuselistr#   r$   r%   P   s    )Zparent_tokenr'   compare_function	useobject	extensionZtrackparenttypecallable	callable_active_history
impl_classZsend_modified_eventsdoc)listr   to_listr*   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viewonlyr/   )r    mapperr)   r(   r+   r,   Zproxy_propertyr-   r.   kwZattribute_extZlisten_hooksmr   hookr#   )r&   r!   r"   r'   r$   _register_attribute)   sb   





r>   )
instrumentdeferredc                       s8   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                        t t| || | jj| _d S r   )superrA   __init__parent_propertyrC   selfr4   strategy_key	__class__r#   r$   rF         z#UninstrumentedColumnLoader.__init__Nc           	      K   s(   | j D ]}|r|j | }|| qd S r   )rC   r2   )	rI   contextquery_entitypathloadoptadaptercolumn_collectionkwargscr#   r#   r$   setup_query   s
   


z&UninstrumentedColumnLoader.setup_queryc                 C      d S r   r#   )rI   rN   rP   rQ   r:   resultrR   
populatorsr#   r#   r$   create_row_processor   s   z/UninstrumentedColumnLoader.create_row_processorr   )	__name__
__module____qualname____doc__	__slots__rF   rV   rZ   __classcell__r#   r#   rK   r$   rA      s    
rA   Tc                       s<   e Zd ZdZdZ fddZdd Zdd Zd	d
 Z  Z	S )ColumnLoaderz8Provide loading behavior for a :class:`.ColumnProperty`.)rC   is_compositec                    s.   t t| || | jj| _t| jd| _d S )Ncomposite_class)rE   ra   rF   rG   rC   hasattrrb   rH   rK   r#   r$   rF      s   
zColumnLoader.__init__c                 K   sJ   | j D ]}	|r|j |	 }	||	 q| j d }
|r|j |
 }
|
|| j< d S Nr   )rC   r2   rG   )rI   rN   rO   rP   rQ   rR   rS   memoized_populatorsrT   rU   fetchr#   r#   r$   rV      s   



zColumnLoader.setup_queryc                 C   sP   d| _ | jd j}| jjp| jd jp|jt| jv }t| j|d|j	|d d S )NTr   F)r)   r(   r-   )
is_class_levelrC   typerG   r-   primary_keyZversion_id_colsetr>   compare_values)rI   r:   Zcoltyper-   r#   r#   r$   init_class_attribute   s   

z!ColumnLoader.init_class_attributec           
      C   s\   | j D ]}|r|j | }||d}	|	r!|d | j|	f  d S q|d | jdf d S )NFquickexpireT)rC   _getterr2   r   )
rI   rN   rP   rQ   r:   rX   rR   rY   colgetterr#   r#   r$   rZ      s   

z!ColumnLoader.create_row_processor)
r[   r\   r]   r^   r_   rF   rV   rm   rZ   r`   r#   r#   rK   r$   ra      s    ra   )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  t fdd| jjD | _d S )Nc                 3   s    | ]	}|   V  qd S r   )compare.0rU   nullr#   r$   	<genexpr>   s    
z2ExpressionColumnLoader.__init__.<locals>.<genexpr>)	rE   rs   rF   r   rx   anyrG   rC   _have_default_expressionrH   rK   rw   r$   rF      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 ]}
|r(|j|
 }
||
 q|	d }|r9|j| }||| j< d S )N
expressionr   )
local_optsr{   rG   rC   r2   )rI   rN   rO   rP   rQ   rR   rS   rf   rT   rC   rU   rg   r#   r#   r$   rV      s   

z"ExpressionColumnLoader.setup_queryc                 C   s|   |r:d|j v r<|j d g}|D ]}	|r|j|	 }	||	d}
|
r-|d | j|
f  d S q|d | jdf d S d S d S )Nr|   Frn   ro   T)r}   rC   rp   r2   r   )rI   rN   rP   rQ   r:   rX   rR   rY   rC   rq   rr   r#   r#   r$   rZ     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)rh   r>   rG   rC   ri   rl   rI   r:   r#   r#   r$   rm   "  s   
z+ExpressionColumnLoader.init_class_attribute)r[   r\   r]   rF   rV   rZ   rm   r`   r#   r#   rK   r$   rs      s
    rs   )r@   r?   )Z
do_nothingc                       sH   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	  Z
S )DeferredColumnLoaderzAProvide loading behavior for a deferred :class:`.ColumnProperty`.)rC   groupc                    s>   t t| || t| jdrtd| jj| _| jj| _d S )Nrc   z8Deferred loading for composite types not implemented yet)rE   r   rF   rd   rG   NotImplementedErrorrC   r   rH   rK   r#   r$   rF   6  s   
zDeferredColumnLoader.__init__c           	      C   s>   | j s| jj}|d | j|f d S |d | jdf d S )Nnewro   F)rh   rG   Z_deferred_column_loaderr2   r   )	rI   rN   rP   rQ   r:   rX   rR   rY   Zset_deferred_for_local_stater#   r#   r$   rZ   ?  s
   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expire_missing)rh   r>   rG   rC   ri   rl   _load_for_stater~   r#   r#   r$   rm   O  s   
z)DeferredColumnLoader.init_class_attributeNc	           
      K   s   |rd|j v rt| j| jjs'|r | jr |j d| j ds'|r<| j|v r<| j	
dj|||||||fi |	 d S | jrFt|| j	< d S t|| j	< d S )NZundefer_pkszundefer_group_%sF))r@   F)r?   T)r}   rk   rC   intersectionr4   Z_should_undefer_in_wildcardr   r6   r   rG   _get_strategyrV   rh   r   r   )
rI   rN   rO   rP   rQ   rR   rS   rf   only_load_propsr;   r#   r#   r$   rV   [  sF   





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 rBt
dt j f ||}tj|j |dd u rXt
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   )rv   prI   r#   r$   
<listcomp>  s    
z8DeferredColumnLoader._load_for_state.<locals>.<listcomp>c                    s   g | ]	}| j v r|qS r#   )Z
unmodified)rv   kstater#   r$   r     s    zfParent instance %s is not bound to a Session; deferred load operation of attribute '%s' cannot proceed)r   Zrefresh_state)r   r   
ATTR_EMPTYSQL_OKPASSIVE_NO_RESULTmanagerr:   r   Ziterate_propertiesr   orm_excDetachedInstanceErrorr   	state_strr	   r   Zload_on_identZObjectDeletedErrorZATTR_WAS_SET)rI   r   passivelocalparentZtoloadr   sessionr	   r#   )rI   r   r$   r     s4   




z$DeferredColumnLoader._load_for_stater   )r[   r\   r]   r^   r_   rF   rZ   rm   rV   r   r`   r#   r#   rK   r$   r   .  s    	
/r   c                   @   &   e Zd ZdZdd ZejfddZdS )LoadDeferredColumnsz7serializable loader object used by DeferredColumnLoaderc                 C   
   || _ d S r   r   )rI   r   r#   r#   r$   rF        
zLoadDeferredColumns.__init__c                 C   s.   | j }|jj}|j| }|jt }|||S r   )r   r   r:   r5   _strategiesr   r   )rI   r   r   r   r   r    r   r#   r#   r$   __call__  s
   

zLoadDeferredColumns.__call__Nr[   r\   r]   r^   rF   r   Z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   )rE   r   rF   rG   r:   r   r   r'   rH   rK   r#   r$   rF     s
   


z#AbstractRelationshipLoader.__init__)r[   r\   r]   r^   r_   rF   r`   r#   r#   rK   r$   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)r[   r\   r]   r^   r#   r#   r#   r$   r     s    r   Znoload)lazyc                   @   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)r)   r+   )rh   r>   rG   collection_classr~   r#   r#   r$   rm     s   
zNoLoader.init_class_attributec           	         $    fdd}|d   j|f d S )Nc                    s.    j r| j j| | d S d | j< d S r   )r'   r   get_implr   Z
initializer   dict_rowr   r#   r$   invoke_no_load  s   z5NoLoader.create_row_processor.<locals>.invoke_no_loadr   r2   r   )	rI   rN   rP   rQ   r:   rX   rR   rY   r   r#   r   r$   rZ     s   zNoLoader.create_row_processorN)r[   r\   r]   r^   r_   rm   rZ   r#   r#   r#   r$   r     s
    
r   selectraiseraise_on_sqlZbaked_selectc                       s   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 Z
dd Zed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_lazywhereuse_getis_aliased_class_bind_to_col_equated_columns_rev_bind_to_col_rev_equated_columns_simple_lazy_clause_raise_always_raise_on_sql_bakeryc                    s  t t| || | jd dk| _| jd dk| _t| jj| _| j	j
}| \| _| _| _|jdd\| _| _| _| jd| | j | j oY| j oY| jjd j| jd| jjd| _| jrt| jD ]}|| jjv r|| jj| D ]
}| j| | j|< qqqc| jd	|  d S d S )
Nr   r   r   T)Zreverse_directionz%s lazy loading clause %sr   Zuse_proxiesequivalentsz2%s will use query.get() to optimize instance loads)rE   r   rF   Zstrategy_optsr   r   r   r   r   rG   _join_conditionZcreate_lazy_clauser   r   r   r   r   r   loggerinfor'   _get_clausert   r:   _equivalent_columnsr   r0   )rI   r4   rJ   Zjoin_conditionrq   rU   rK   r#   r$   rF     sF   


zLazyLoader.__init__c                 C   sD   d| _ | jjp| jjtjup| j }t| j|d| j| jj	|d d S )NT)r)   r,   r+   r-   )
rh   rG   r-   r9   r   	MANYTOONEr   r>   r   r   )rI   r:   r-   r#   r#   r$   rm   J  s   
zLazyLoader.init_class_attributec                    sT   | j | j} g dd }t|i d|i  fdd}t|i d|i}|fS )Nc                 S   s
   d| _ d S NF)unique	bindparamr#   r#   r$   visit_bindparamg  r   zFLazyLoader._memoized_attr__simple_lazy_clause.<locals>.visit_bindparamr   c                    sL   | j  v r| j | j  d f d S | jd u r$| jd | jf d S d S r   )Z_identifying_keyr2   r   callablevaluer   Zbind_to_colparamsr#   r$   r   l  s   

)r   r   r   traverseZcloned_traverse)rI   	criterionr   r#   r   r$   "_memoized_attr__simple_lazy_clauseb  s   
z-LazyLoader._memoized_attr__simple_lazy_clausec                 C   s   | j \}}|d u rt|dd |D S | jj}| }t|}|tj@ r+|tjN }i }|D ]%\}	}
}|
d urP|rH|tj	@ rH|
|||
|}n||||
|}|||	< q/||fS )Nc                 S   s   g | ]\}}}|qS r#   r#   )rv   r   identr   r#   r#   r$   r         z4LazyLoader._generate_lazy_clause.<locals>.<listcomp>)r   sql_utilZadapt_criterion_to_nullrG   r4   objr   instance_dictZINIT_OKLOAD_AGAINST_COMMITTED#_get_committed_state_attr_by_column_get_state_attr_by_column)rI   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 )Nz&'%s' is not available due to lazy='%s')sa_excInvalidRequestError)rI   r   r   r   r#   r#   r$   _invoke_raise_load  s   
zLazyLoader._invoke_raise_loadc                 C   sR  |j s| jjs
|jr|jstjS |j  }d }|tj@ s| jr%|tj	@ s(|r(tj
S | jr?|tj@ s?| jr8|tj@ r?| ||d t|}|sZ|tj@ rMtj
S tdt|| j f | jr| |||}tj
|v rltj
S tj|v rttjS t|r{d S | j| j|||d}|d ur|tju rd S |S |tj@ r|tj@ st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   rG   Zload_on_pendingZ_load_pendingZ
session_idr   r   r   r   ZNON_PERSISTENT_OKr   r   ZNO_RAISEZRELATED_OBJECT_OKr   r   r   r   r   r   _get_ident_for_use_getZ	NEVER_SETr   
issupersetr	   Z_identity_lookupr   ZPASSIVE_CLASS_MISMATCH_emit_lazyload)rI   r   r   pendingprimary_key_identityr   instancer#   r#   r$   r     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   rv   pkr   Zget_attrr   rI   r   r#   r$   r     s    z5LazyLoader._get_ident_for_use_get.<locals>.<listcomp>)r   r:   r   r   r   r   dictrj   )rI   r   r   r   instance_mapperr#   r   r$   r     s   
z!LazyLoader._get_ident_for_use_getsqlalchemy.ext.bakedc                 C      |j ddS N2   )sizeZbakeryrI   bakedr#   r#   r$   _memoized_attr__bakery
     z!LazyLoader._memoized_attr__bakeryzsqlalchemy.orm.strategy_optionsc                    s   fdd}|dd j jjs|jdd jjd ur,|fdd j }|s7|tj@ r>|dd  j	rNj
j }|j	| jrnjr[|d ||fd	d|j|S jjr{|fd
d jjD ]jtju rjrtjts|fdd q|\ |rttj ! rd S nttj"! rd S jrƈ|d | fdd fdd}	||fdd|	# }
j$r|
S t%|
}|r|dkrt&dj  |
d S d S )Nc                    s   |   jS r   )r	   r   r   r   r#   r$   r%   )      z+LazyLoader._emit_lazyload.<locals>.<lambda>c                 S   s   |   dS r   )Z_adapt_all_clausesZ_with_invoke_all_eagersqr#   r#   r$   r%   ,  s    T)fullc                    s   |   j jjS r   )select_fromr:   rG   	secondaryr   r   r#   r$   r%   5  s    
c                 S   s
   |  dS r   )Z	autoflushr   r#   r#   r$   r%   >     
 r   c                    
   |   S r   Z_set_lazyload_fromr   r   r#   r$   r%   P  r   c                    s   | j t jj  S r   )order_byr   r1   rG   r   r   r#   r$   r%   X  s    c                    s"   |  j| j j  jS r   )optionsLoadZfor_existing_path_current_pathr4   Zlazyloadr   r   )revstrategy_optionsr#   r$   r%   g  s    
c                    r   r   )filterr   )lazy_clauser#   r$   r%   z  r   c                    s     | j  | _| S r   )update_paramsr   )r   r#   r$   set_default_params~  s   z5LazyLoader._emit_lazyload.<locals>.set_default_paramsc                    r   r   r   r   r   r#   r$   r%     r   r   zKMultiple rows returned with uselist=False for lazily-loaded attribute '%s' r   )'r   add_criteriarG   Zbake_queriesZspoilr   r   r   ZNO_AUTOFLUSHZload_optionsZ	load_path_add_lazyload_optionsr   r   r   Zwith_post_criteriaZ_load_on_pk_identityr	   r:   r  Z_reverse_propertyr9   r   r   Z_use_getr   r   r   r   r   Zhas_intersectionr   r   valuesZ
_never_setallr'   lenwarn)rI   r  r   r   r   r   r   r   Zeffective_pathr  rX   lr#   )r  r   r  rI   r   r  r$   r     s   


zLazyLoader._emit_lazyloadc           
         sn   | j  | jst|jt |  }|d | j |f d S |js#|jr5 fdd}	|d | j |	f d S d S )Nr   c                    s   |  |  d S r   )_resetr   r   r#   r$   reset_for_lazy_callable  s   	z@LazyLoader.create_row_processor.<locals>.reset_for_lazy_callable)	r   rh   r   Z"_instance_level_callable_processorr7   LoadLazyAttributer2   populate_existingZalways_refresh)
rI   rN   rP   rQ   r:   rX   rR   rY   Zset_lazy_callabler  r#   r   r$   rZ     s   
zLazyLoader.create_row_processor)r[   r\   r]   r^   r_   rF   rm   r   r   r   r   r   r   dependenciesr   r   rZ   r`   r#   r#   rK   r$   r     s     1 X

 r   c                   @   r   )r  z-serializable loader object used by LazyLoaderc                 C   s   || _ |j| _d S r   )r   rJ   )rI   r   Zinitiating_strategyr#   r#   r$   rF     s   zLoadLazyAttribute.__init__c                 C   s0   | j }|jj}|j| }|j| j }|||S r   )r   r   r:   r5   r   rJ   r   )rI   r   r   r   r   r    r   r#   r#   r$   r     s
   
zLoadLazyAttribute.__call__Nr   r#   r#   r#   r$   r    s    r  Z	immediatec                   @   s.   e Zd ZdZdd Z		d	ddZdd ZdS )
ImmediateLoaderr#   c                 C      | j d| d S N)r   r   rG   r   rm   r~   r#   r#   r$   rm        z$ImmediateLoader.init_class_attributeNc           	      K   rW   r   r#   )	rI   rN   r   rP   rQ   rR   rS   parentmapperrT   r#   r#   r$   rV     s   zImmediateLoader.setup_queryc           	         r   )Nc                    s   |   j| | d S r   )r   r   r6   r   r   r#   r$   load_immediate  s   z<ImmediateLoader.create_row_processor.<locals>.load_immediateZdelayedr   )	rI   rN   rP   rQ   r:   rX   rR   rY   r  r#   r   r$   rZ     s   z$ImmediateLoader.create_row_processorNN)r[   r\   r]   r_   rm   rV   rZ   r#   r#   r#   r$   r    s    
r  subqueryc                       s   e 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 ZG dd deZdd Zdd Zdd Z  ZS )SubqueryLoader)
join_depthc                    rD   r   )rE   r"  rF   rG   r#  rH   rK   r#   r$   rF     rM   zSubqueryLoader.__init__c                 C   r  r  r  r~   r#   r#   r$   rm     r  z#SubqueryLoader.init_class_attributeNc                 K   st  |j jsd S |j jr|j d || j }||jdd }	|	d ur$|	}
n| j}
|jdtj	j
}|| }||jds\| jrT|j jrG|j jjnd|j d | jkrSd S n|| jr\d S | |\}}}|jdtf|j }| |||||j}|j |
}dtf|d|i|_|d}| ||\}}}|j| }| |||||
}| ||||
}| |}||jd| d S )	Nr!  path_with_polymorphic)Zsubquery_pathNloaderr   r   
orig_queryF)r	   _enable_eagerloads
_yield_per_no_yield_perrG   r6   r   r   r   PathRegistryrootcontainsr#  r  lengthcontains_mapperr:   _get_leftmostr"  _generate_from_original_queryentity_zeror   _attributesZ_set_enable_single_crit_prep_for_joinsZadd_columns_apply_joins_setup_options_setup_outermost_orderbyrk   )rI   rN   r   rP   rQ   rR   rS   r  rT   with_poly_entityeffective_entity	subq_pathleftmost_mapperleftmost_attrleftmost_relationshipr&  
left_aliasr   to_join
local_attrparent_aliasr#   r#   r$   rV     sx   
	





zSubqueryLoader.setup_queryc                    sp   j td }| j|r| jd u r| j| j }n|d  }|j} fdd|D } ||fS )Nr   r   c                    s$   g | ]}t d  j j| jqS r   )getattrr   _columntopropertyr   ru   r:  r9  r#   r$   r   k  s    z0SubqueryLoader._get_leftmost.<locals>.<listcomp>)rP   r   Z_class_to_mapperr4   isarG   local_columns)rI   r9  Zsubq_mapperZleftmost_propZleftmost_colsr;  r#   rD  r$   r/  \  s   

zSubqueryLoader._get_leftmostc                 C   s   |  d }|js|ttdd |jD d ||}|| |j	}|du r/d|_
n|d u rLtdd |D D ]}	t||	jsKd|_
 nq<|jdu rU|j|_|jd u rb|jd u rbd |_|  }
tj||
dd}|S )Nc                 S   s    g | ]}|d  dur|d  qS )r   Nr#   )rv   Zentr#   r#   r$   r     s
    z@SubqueryLoader._generate_from_original_query.<locals>.<listcomp>FTc                 s   s    | ]}|j V  qd S r   )tableru   r#   r#   r$   ry     s    z?SubqueryLoader._generate_from_original_query.<locals>.<genexpr>use_mapper_path)Z_cloneZ	correlate	_from_objZ_set_select_fromr0   rk   Zcolumn_descriptionsZ_adapt_col_listZ_set_entitiesdistinct_target_keyZ	_distinctr   rj   Z	_order_byr  Z_limit_offsetZwith_labelsr!  r   AliasedClass)rI   r&  r:  r;  r<  Zorig_entityr   Ztarget_colsrK  tZembed_qr=  r#   r#   r$   r0  t  s@   
	


z,SubqueryLoader._generate_from_original_queryc                    s   g }t | }t|D ]'\}\}}|dkr)||d  d j}||r&|n|}	n|}	||	|jf qt|dk r=| nt|d d }
|
j	rL|
j
 ntj|
j
dd jj} fdd|D }|| fS )	Nr   r   r   TrH  c                    s    g | ]}t  jj| jqS r#   )rB  r4   rC  r   ru   r@  rI   r#   r$   r     s    z2SubqueryLoader._prep_for_joins.<locals>.<listcomp>)r0   pairs	enumerater:   rE  r2   r   r  r   r   r   r   rM  rG   rF  )rI   r=  r9  r>  rQ  ir:   r    Zprev_mapperZ	to_appendr   
local_colsr?  r#   rP  r$   r3    s*   
zSubqueryLoader._prep_for_joinsc                 C   s2  t |}|dkrt||d d |g}nu|dkr3t||d d |t||d d |g}nX|dkrdd |dd D }g }|rl|d}	t|	d |	d }
|r`|
|d d }
n|
|}
||
 |sFt||d d |d jg| t||d d |g }|D ]	}
|j|
dd}q|S )	Nr   r   r   rO  c                 S   s:   g | ]}t |d  jst|d  n|d  j|d fqS )r   r   )r   r   r   rM  r   )rv   itemr#   r#   r$   r     s    z/SubqueryLoader._apply_joins.<locals>.<listcomp>T)Zfrom_joinpoint)r  rB  of_typepopr2   r4   join)rI   r   r>  r=  r@  r8  ZltjmiddleinnerrU  attrr#   r#   r$   r4    sF   
	



zSubqueryLoader._apply_joinsc                 C   s(   | |}|j|j }|jr|j|_|S r   )Z_with_current_pathZ_conditional_options_with_options_populate_existing)rI   r   r9  r&  r8  r#   r#   r$   r5    s
   
zSubqueryLoader._setup_optionsc                 C   s6   | j jr|jd }|jt| j j}|j| }|S re   )rG   r  rJ  _target_adaptercopy_and_processr   r1   )rI   r   	eagerjoineager_order_byr#   r#   r$   r6  "  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.

        Nc                 C   r   r   )subq)rI   rb  r#   r#   r$   rF   9  r   z(SubqueryLoader._SubqCollections.__init__c                 C   s    | j d u r	|   | j ||S r   )_data_loadr6   )rI   r   r   r#   r#   r$   r6   <  s   
z#SubqueryLoader._SubqCollections.getc                 C   sF   t t| _t| jdd D ]\}}| j| dd |D  qd S )Nc                 S   s   | dd  S )Nr   r#   xr#   r#   r$   r%   C  r   z7SubqueryLoader._SubqCollections._load.<locals>.<lambda>c                 s       | ]}|d  V  qdS )r   Nr#   rv   Zvvr#   r#   r$   ry   D      z8SubqueryLoader._SubqCollections._load.<locals>.<genexpr>)collectionsdefaultdictr0   rc  	itertoolsgroupbyrb  extend)rI   r   vr#   r#   r$   rd  A  s   z%SubqueryLoader._SubqCollections._loadc                 C   s   | j d u r|   d S d S r   )rc  rd  )rI   r   r   r   r#   r#   r$   r%  F  s   
z&SubqueryLoader._SubqCollections.loader)	r[   r\   r]   r^   rc  rF   r6   rd  r%  r#   r#   r#   r$   _SubqCollections0  s    rp  c                    s   | j j| j jjstd|  || j }||j	d}|d u r"d S |j
|j
u s,J d| jj}	||j	d}
|
d u rH| |}
||j	d|
  rS fdd|	D }	| jr`| ||
|	| d S | ||
|	| d S )NJ'%s' does not support object population - eager loading cannot be applied.r!  zlSubquery session doesn't refer to that of our context.  Are there broken context caching schemes being used?rj  c                       g | ]} j | qS r#   rB   ru   rR   r#   r$   r   k  r   z7SubqueryLoader.create_row_processor.<locals>.<listcomp>)r4   r7   r   implsupports_populationr   r   rG   r6   r   r   rF  rp  rk   r'   _create_collection_loader_create_scalar_loader)rI   rN   rP   rQ   r:   rX   rR   rY   rb  rT  rj  r#   rs  r$   rZ   J  s6   

z#SubqueryLoader.create_row_processorc                    j    fddfdd}|d  jf |d  j|f |jr3|d  j jf d S d S )Nc                    s8    t fddD d}| j| || d S )Nc                       g | ]} | qS r#   r#   rv   rq   r   r#   r$   r   {      z_SubqueryLoader._create_collection_loader.<locals>.load_collection_from_subq.<locals>.<listcomp>r#   )r6   tupler   r   set_committed_value)r   r   r   
collectionrj  rT  rI   r{  r$   load_collection_from_subqy  s   zKSubqueryLoader._create_collection_loader.<locals>.load_collection_from_subqc                       j |vr | || d S d S r   r   r   )r  rI   r#   r$   &load_collection_from_subq_existing_row     
zXSubqueryLoader._create_collection_loader.<locals>.load_collection_from_subq_existing_rowr   existingeagerr2   r   invoke_all_eagersr%  )rI   rN   rj  rT  rY   r  r#   )rj  r  rT  rI   r$   rv  v  s   z(SubqueryLoader._create_collection_loaderc                    rx  )Nc                    sZ    t fddD d}t|dkrtd  |d }| j| || d S )Nc                    ry  r#   r#   rz  r{  r#   r$   r     r|  zWSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subq.<locals>.<listcomp>r   r   LMultiple rows returned with uselist=False for eagerly-loaded attribute '%s' r   )r6   r}  r  r   r  r   r   r~  )r   r   r   r  Zscalarr  r{  r$   load_scalar_from_subq  s   zCSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subqc                    r  r   r   r   )r  rI   r#   r$   "load_scalar_from_subq_existing_row  r  zPSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subq_existing_rowr   r  r  r  )rI   rN   rj  rT  rY   r  r#   )rj  r  rT  rI   r$   rw    s   z$SubqueryLoader._create_scalar_loaderr   )r[   r\   r]   r_   rF   rm   rV   r/  r0  r3  r4  r5  r6  objectrp  rZ   rv  rw  r`   r#   r#   rK   r$   r"    s"    
cA/4
,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   )rE   r  rF   rG   r#  r  rH   rK   r#   r$   rF     s   

zJoinedLoader.__init__c                 C   r  r  r  r~   r#   r#   r$   rm     r  z!JoinedLoader.init_class_attributeNFc	                 K   s>  |j jsdS |j jr| jr|j d || j }d}
|r"| ||nd}|dur5| |||||\}}}n-||j	dsR| j
rJ|jd | j
krIdS n|| jrRdS | ||||||||\}}}}||j	dd}|durtt|j}
nd}
|| j }tj|| j|||||
| j|d	 |durdt|jv rtddS dS )	z@Add a left outer join to the statement that's being constructed.Nzjoined collectionFr%  r   r$  )with_polymorphicr  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(  r'   r)  rG   _init_user_defined_eager_proc$_setup_query_on_user_defined_adapterr,  r   r#  r-  r.  r:   _generate_row_adapterr6   r   Zwith_polymorphic_mappersr   r   Z_setup_entity_queryrk   secondary_columnsr   r   )rI   rN   rO   rP   rQ   rR   rS   r  r  rT   r  user_defined_adapterclausesadd_to_collectionr7  r#   r#   r$   rV     s   


zJoinedLoader.setup_queryc           	      C   s   d|j vrdS |jj}||jdd}|dur|S |j d }|dd  \}}|d ur?t|tr5|j|}t	j
||jjd}n!||jdrW||jd}tj||jjd}n	|jj|jd }||jd| |S )NZeager_from_aliasF user_defined_eager_row_processor)r   r$  )r}   rP   r4   r6   r   r   strr   aliasr   ZColumnAdapterr:   r   r,  r   
ORMAdapterr	   Z_polymorphic_adaptersrk   )	rI   rQ   rN   rP   rR   r  Zroot_mapperr    r7  r#   r#   r$   r    s>   


z*JoinedLoader._init_user_defined_eager_procc                 C   sZ   | |j|}|r|r||}||jd| n|r%|}||jd| |j}|||fS )Nr  )Z_get_entity_clausesr	   wraprk   r   primary_columns)rI   rN   r   rP   rR   r  r  r#   r#   r$   r  M  s"   

z1JoinedLoader._setup_query_on_user_defined_adapterc                 C   s   t | jjrt | jj}nd }d| f}||jvr d |j|< }n|j| d  |j|< }|t| jkrStj| j	|d urA|j
ddnd ddd}t |jj | j| | j| S )NZjoinedloader_acr   r   T)flat)r  r  rI  )r   r   r   
selectabler   r  r  r   rM  r:   r  rU   r2   )rI   rN   Zalt_selectabler   idxto_adaptr#   r#   r$   _gen_pooled_aliased_classg  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 us,J | j
jr3d|_|d ur@|j d| j
jn| j
j}|sHd}|j| j|||||||f |j}||jd| ||||fS )Nr$  Zjoinedloader_ormadapterTF)r   Zadapt_requiredZallow_label_resolveZanonymize_labels	innerjoineager_row_processor)r6   r   r  r   Z_memor   r  r:   r   aliased_classrG   r'   multi_row_eager_loadersr}   r  Zcreate_eager_joinsr2   _create_eager_joinr  rk   )rI   rN   r   rP   rQ   rR   rS   r  r  r7  r  r  r  r  r#   r#   r$   r    sL   

z"JoinedLoader._generate_row_adapterc	                 C   s
  |d u r|j }	n|}	|jo|jj}
d }||jvr@|
s@|jr@t|j|j}t	|dkr0t
d|r@|j|d  }|d |}}|d u rJ||j}}|j||}|rt|dd rtt|j|	| jrf|	n| j}t|j| j| j}nttj| j|jdd| j| j}n| j}|jd usJ | p| p|dkp|jj}|rtj||j|| p|jjp|ot|tj| j| j d}n| ||||}||j|< |j|_|st | jj!D ]}|	j"j#$|r|r|j%| }|j&'| q| jj(r| j)|j*+t,-| jj(7  _)d S 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  TrH  Zunnestedisouter
_left_memo_right_memo).r:   r  r	   Z_should_nest_selectableZeager_joinsZfrom_clauser   Z#find_left_clause_that_matches_givenr  r  r   r   
setdefaultrB  r   r  Z_entity_for_mapperrE  r4   r   r   rG   r   rM  r1  Zrepresents_outer_join_ORMJoinr   r   ZJoin_splice_nested_inner_joinZstop_onZ_find_columnsZprimaryjoinZpersist_selectablerU   Zcontains_columnrC   r  r2   r  ra  r^  r_  r   r1   )rI   rN   rO   rP   rR   r  r  r  r  r   Zshould_nest_selectableZquery_entity_keyZindexesZclauseZdefault_towrapZtowrapZefmonclauseZattach_on_outsider`  rq   r#   r#   r$   r    s   



	



zJoinedLoader._create_eager_joinc           	      C   s2  |du rt |tjsJ n.t |tjjr| ||j|||S t |tjs;|d |u r9tj||j|d||d j	dS d S | ||j
|||j}|d u rfd}| ||j|||j}|d u re|duscJ dd S nd}|r|jsv|jsv||}ntj|j||j|j|jd}ntj||j
|j|j|jd}|j|_|S )	NFr  rO  r  z9assertion failed attempting to produce joined eager loadsT)r  r  )r  r  )r   r   r  r   r  ZFromGroupingr  elementr  r:   rightr  leftr  r  Z_splice_into_centerr  r^  )	rI   rP   Zjoin_objr  r  ZsplicingZtarget_joinZright_splicer`  r#   r#   r$   r  X  sf   

z&JoinedLoader._splice_nested_inner_joinc                 C   sv   |r|  ||nd}|dur#|}|jr|r||j}n|jr"|j}n||jd}|d u r0dS | j||r9|S dS )NFr  )r  rR   r  r6   r   r:   Z_result_has_identity_key)rI   rN   rX   rR   rP   rQ   r  	decoratorr#   r#   r$   _create_eager_adapter  s"   
z"JoinedLoader._create_eager_adapterc              	   C   s   | j j| j jjstd|  || j }| |||||}	|	durI| j}
t	
| j|||| j |	}| js?| ||
|| d S | ||
|| d S | jd||||||| d S )Nrq  Fr  )r4   r7   r   rt  ru  r   r   rG   r  r   Z_instance_processorr:   r   r'   rw  rv  r   rZ   )rI   rN   rP   rQ   r:   rX   rR   rY   Zour_pathZeager_adapterr   	_instancer#   r#   r$   rZ     s<   

z!JoinedLoader.create_row_processorc                    sv    fdd} fdd} fdd}|d  | j|f |d  | j|f jr9|d	  | j|f d S d S )
Nc                    sJ   t | |}t|d}|j | f<  |}|d ur#|| d S d S NZappend_without_eventr   Zinit_state_collectionr   ZUniqueAppenderr2   )r   r   r   r  result_listinstr  rN   r   r#   r$   #load_collection_from_joined_new_row  s   zSJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_new_rowc                    sh   | fj v rj | f }nt | |}t|d}|j | f<  |}|d ur2|| d S 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                        | d S r   r#   r   r  r#   r$    load_collection_from_joined_exec     zPJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_execr   r  r  r2   r   r  )rI   rN   r   r  rY   r  r  r  r#   r  r$   rv    s   
z&JoinedLoader._create_collection_loaderc                    st    fdd} fdd} fdd}|d  j|f |d  j|f |jr8|d	  j|f d S d S )
Nc                    s    ||< d S r   r#   r   )r  r   r#   r$   load_scalar_from_joined_new_row  s   zKJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_new_rowc                    s>    |}|v r|| urt d  d S d S ||< d S )Nr  )r   r  )r   r   r   r  r  r   rI   r#   r$   $load_scalar_from_joined_existing_row  s   
zPJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_existing_rowc                    r  r   r#   r   r  r#   r$   load_scalar_from_joined_exec&  r  zHJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_execr   r  r  r  )rI   rN   r   r  rY   r  r  r  r#   r  r$   rw    s   z"JoinedLoader._create_scalar_loader)NNF)F)r[   r\   r]   r^   r_   rF   rm   rV   r  r  r  r  r  r  r  rZ   rv  rw  r`   r#   r#   rK   r$   r    s*    
`/#? 
F',r  Zselectinc                       s   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eddd Zdd Zeddd Zdd Zdd Z  ZS )SelectInLoader)r#  	omit_join_parent_alias_query_info_fallback_query_infor   Z	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u }| jjd ur!| jj| _n| j	d}|r.|j
| _n| jjd j|jd| jjd| _| jrV|rO|  | _|  | _d S |  | _d S |  | _d S )Nr  r   Tr   )rE   r  rF   rG   r#  r9   r   r   r  r   r   r4   r   rt   r   r   _init_for_omit_join_m2or  _init_for_joinr  _init_for_omit_join)rI   r4   rJ   Zis_m2o
lazyloaderrK   r#   r$   rF   M  s*   


zSelectInLoader.__init__c                    s   t jjj   fddt D   fddjjD  }}t|dkr1t	j
| }d}n|d }d}dd|||d S )	Nc                 3   s2    | ]}j j|d D ]	}| | fV  qqdS )r#   N)r4   r   r6   )rv   r   equivpk_to_fkrI   r#   r$   ry   n  s    
z5SelectInLoader._init_for_omit_join.<locals>.<genexpr>c                    s   g | ]
}| v r | qS r#   r#   rz  )r  r#   r$   r   t  s    z6SelectInLoader._init_for_omit_join.<locals>.<listcomp>r   Fr   T)r   rG   r   Zlocal_remote_pairsr	  r0   r4   rj   r  r   tuple_
query_info)rI   r  Zfk_colsr  r  r#   r  r$   r  j  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   Tr  c                    rr  r#   r   r   r  r#   r$   r     r   z:SelectInLoader._init_for_omit_join_m2o.<locals>.<listcomp>)r:   rj   r  r   r  rG   r   r  )rI   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r%tj| }d}n|d }d}| 	dd|||d S )Nc                       g | ]}  |qS r#   _adapt_elementrz  Zpa_inspr#   r$   r         
z1SelectInLoader._init_for_join.<locals>.<listcomp>r   Fr   T)
r   r4   r8   r  r   rj   r  r   r  r  )rI   r  r  r  r#   r  r$   r    s   


zSelectInLoader._init_for_joinc                 C   r  r  r  r~   r#   r#   r$   rm     r  z#SelectInLoader.init_class_attributer   c                 C   r   r   r   r   r#   r#   r$   r     r   z%SelectInLoader._memoized_attr__bakeryc                 C   s   | j j| j jjstd|  |jjpt	j
j| }t	|d | j s%d S tj||| jr0d S || j }	|| j }
|	|jdd }|d urI|}n| j}|	|jdsi| jra|
jd | jkr`d S n|
| jrid S tj||| j | j| j| d S )Nrq  rO  r$  r%  r   )r4   r7   r   rt  ru  r   r   r	   r  r   r*  r+  Z_entity_isar   ZPostLoadZpath_existsrG   r6   r   r   r,  r#  r-  r.  r:   Zcallable_for_path_load_for_path)rI   rN   rP   rQ   r:   rX   rR   rY   Zselectin_pathZpath_w_propZselectin_path_w_propr7  r8  r#   r#   r$   rZ     sL   

z#SelectInLoader.create_row_processorc                    s8  |r	j |vr	d S j}|jrRtt}g }	j|D ]6\}
j	t	fdd|j	D }t
j|v r:j} nd |vrI|| 	|
f q|		|
f q|js\dd |D }|j|j|jstjrfddD fddD fdd}|js|fd	d nj|fd
d |jr|fdd n	|fdd |j}||j|j  |jr|dd  jjr|jsjj jrfdd D  | fdd nfdd}|| |jr||	||| d S |||| d S )Nc                 3   s$    | ]} j |tjd V  qdS )r   N)r   r   ZPASSIVE_NO_FETCH)rv   Zlk)r:   r   
state_dictr#   r$   ry     s    
z0SelectInLoader._load_for_path.<locals>.<genexpr>c                 S   s$   g | ]\}}|j d  ||j|fqS )r   )r   r   )rv   r   	overwriter#   r#   r$   r   		  s    z1SelectInLoader._load_for_path.<locals>.<listcomp>c                    r  r#   r  rz  inspr#   r$   r   	  r   c                    r  r#   r  rz  r  r#   r$   r   	  r   c                    s   |  t jdgR   S )Nr   )r	   ZBundler   )r8  r  r#   r$   r%   	      z/SelectInLoader._load_for_path.<locals>.<lambda>c                    r   r   )r   r   )r8  r#   r$   r%   +	  r   c                    s    |  tjj S r   )r   rX  rB  rG   r   rV  r   )r8  parI   r#   r$   r%   2	  s
   
 c                       |   tjdddS Nprimary_keysT)Z	expandingr  in_r   r   r   r  r#   r$   r%   ;	  r  c                    r  r  r  r   r  r#   r$   r%   A	  r  c                 S   s   |   S r   )r  r   r#   r#   r$   r%   M	      c                    r  r#   r  )rv   elemr  r#   r$   r   S	  r  c                    s
   | j   S r   )r  r   )ra  r#   r$   r%   V	  r   c                    s&   | j d }| j|jt jj S re   )rJ  r  r^  r_  r   r1   rG   )r   r`  r   r#   r$   r6  Y	  s   
z?SelectInLoader._load_for_path.<locals>._setup_outermost_orderby)r   r  r  rj  rk  r0   r4   r   r}  r  r   r   r  r2   r  r  r  r   r   r  r   r  r  r	   r  r\  rG   r]  r  _load_via_child_load_via_parent)rI   r   rN   rP   Zstates	load_onlyr8  r  
our_statesnone_statesr  Zrelated_identr   r&  r6  r#   )
ra  r8  r  r  r:   r  r  rI   r   r  r$   r    s   








zSelectInLoader._load_for_pathc                    s   | j }t|}|r[|d| j }|| jd  }dd ||jj fdd|D dD }	|D ]*}
|	|
d }||
 D ]\}}}|sG| j|v rGq:|| j|||sS|n|g q:q.|s	|D ]\}}}|sj| j|v rjq]|| j||d  q]d S )Nr   c                 S   s   i | ]\}}||qS r#   r#   )rv   r   ro  r#   r#   r$   
<dictcomp>u	  s    z2SelectInLoader._load_via_child.<locals>.<dictcomp>c                    s   g | ]} j r|d  n|qS rA  r  )rv   r   r  r#   r$   r   x	  s    z2SelectInLoader._load_via_child.<locals>.<listcomp>r  )	r'   sorted
_chunksizer   r   r6   r   r   r~  )rI   r  r  r  r   rN   r'   Zour_keyschunkdatar   Zrelated_objr   r   r  r#   r  r$   r  m	  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dd D ]\}
}|	|
 	dd	 |D  q6|D ]>\}}}}|sW| j
|v rWqI|	||}|s||r|t|d
krntd|   || j
|||d  qI|| j
||| qI|sd S d S )Nr#   r   c                    s&   g | ]\}}}} j r|d  n|qS rA  r  )rv   r   r   r  r  r  r#   r$   r   	  s    
z3SelectInLoader._load_via_parent.<locals>.<listcomp>r  c                 S   s   | d S re   r#   re  r#   r#   r$   r%   	  r  z1SelectInLoader._load_via_parent.<locals>.<lambda>c                 s   rg  )r   Nr#   rh  r#   r#   r$   ry   	  ri  z2SelectInLoader._load_via_parent.<locals>.<genexpr>r   r  )r'   r  rj  rk  r0   rl  rm  r   r   rn  r   r6   r  r   r  r   r~  )rI   r  r  r   rN   r'   Z_empty_resultr  r  r  r   ro  r   r   r  r  r  r#   r  r$   r  	  s@   


zSelectInLoader._load_via_parent)r[   r\   r]   r_   rj  
namedtupler  r  rF   r  r  r  rm   r   r  r   rZ   r  r  r  r`   r#   r#   rK   r$   r  3  s(    	
3
 *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 ur(|j  j kr(|t|}|r(||ur(t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_strr8   )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$   r2   	     z'single_parent_validator.<locals>.appendc                    s    | |||S r   r#   )r   r   r   r  r  r#   r$   set_	  r  z%single_parent_validator.<locals>.set_r2   T)rawretvalr-   rk   )r   listen)r   r    r2   r  r#   )r  r    r$   r3   	  s   r3   )NNNNFN)8r^   
__future__r   rj  rl   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>   ZColumnPropertyZstrategy_forrA   Zclass_loggerra   rs   r   r  r   r   ZRelationshipPropertyr   r   ZMemoizedSlotsr   r  r  r"  r  r  r3   r#   r#   r#   r$   <module>   s   
V#BE 
    ;   ?        