U
    x^S                    @   sv  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	                    s4  t tj| jg d}
g }|o | j|r6| jr6|t | j| j	j
krj| j	j
| j \|fdd |rz|tj |r| j  r| fdd |jD ]}| |j| jkr|j| jstj|j| jf| |||
|o| jp| jtjk||||| p| j | jd|	}|D ]}|||  qqd S )N)defaultc                    s   t j| |j fS N)orm_utilZ_validator_eventskeydescprop)fnopts A/tmp/pip-install-dq5v43_d/SQLAlchemy/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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)   s^    




r>   )
instrumentdeferredc                       s6   e Zd ZdZdZ fddZd
ddZdd	 Z  ZS )UninstrumentedColumnLoaderzRepresent a non-instrumented MapperProperty.

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

    columnsc                    s    t t| || | jj| _d S r   )superrA   __init__parent_propertyrC   selfr4   strategy_key	__class__r#   r$   rE      s    z#UninstrumentedColumnLoader.__init__Nc           	      K   s(   | j D ]}|r|j | }|| qd S r   )rC   r2   )	rH   contextquery_entitypathloadoptadaptercolumn_collectionkwargscr#   r#   r$   setup_query   s    


z&UninstrumentedColumnLoader.setup_queryc                 C   s   d S r   r#   )rH   rL   rN   rO   r:   resultrP   
populatorsr#   r#   r$   create_row_processor   s    z/UninstrumentedColumnLoader.create_row_processor)N)	__name__
__module____qualname____doc__	__slots__rE   rT   rW   __classcell__r#   r#   rJ   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)rD   r^   rE   rF   rC   hasattrr_   rG   rJ   r#   r$   rE      s    
zColumnLoader.__init__c                 K   sJ   | j D ]}	|r|j |	 }	||	 q| j d }
|r<|j |
 }
|
|| j< d S Nr   )rC   r2   rF   )rH   rL   rM   rN   rO   rP   rQ   memoized_populatorsrR   rS   fetchr#   r#   r$   rT      s    



zColumnLoader.setup_queryc                 C   sP   d| _ | jd j}| jjp4| jd jp4|jt| jk}t| j|d|j	|d d S )NTr   F)r)   r(   r-   )
is_class_levelrC   typerF   r-   primary_keyZversion_id_colsetr>   compare_values)rH   r:   Zcoltyper-   r#   r#   r$   init_class_attribute   s    
z!ColumnLoader.init_class_attributec           
      C   sZ   | j D ]:}|r|j | }||d}	|	r|d | j|	f  qVq|d | jdf d S )NFquickexpireT)rC   _getterr2   r   )
rH   rL   rN   rO   r:   rU   rP   rV   colgetterr#   r#   r$   rW      s    

z!ColumnLoader.create_row_processor)
rX   rY   rZ   r[   r\   rE   rT   rj   rW   r]   r#   r#   rJ   r$   r^      s   r^   )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 S r   )rD   rp   rE   rG   rJ   r#   r$   rE      s    zExpressionColumnLoader.__init__c                 K   s`   |r\d|j kr\|j d g}	|	D ]}
|r0|j|
 }
||
 q|	d }|rR|j| }||| j< d S )N
expressionr   )
local_optsrC   r2   rF   )rH   rL   rM   rN   rO   rP   rQ   rc   rR   rC   rS   rd   r#   r#   r$   rT      s    

z"ExpressionColumnLoader.setup_queryc                 C   sr   |rnd|j krn|j d g}|D ]:}	|r0|j|	 }	||	d}
|
r|d | j|
f  qnq|d | jdf d S )Nrq   Frk   rl   T)rr   rC   rm   r2   r   )rH   rL   rN   rO   r:   rU   rP   rV   rC   rn   ro   r#   r#   r$   rW     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)re   r>   rF   rC   rf   ri   rH   r:   r#   r#   r$   rj     s    z+ExpressionColumnLoader.init_class_attribute)rX   rY   rZ   rE   rT   rW   rj   r]   r#   r#   rJ   r$   rp      s   rp   )r@   r?   )Z
do_nothingc                       sF   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 )Nr`   z8Deferred loading for composite types not implemented yet)rD   rt   rE   ra   rF   NotImplementedErrorrC   ru   rG   rJ   r#   r$   rE   ,  s    
zDeferredColumnLoader.__init__c           	      C   s<   | j s$| jj}|d | j|f n|d | jdf d S )Nnewrl   F)re   rF   Z_deferred_column_loaderr2   r   )	rH   rL   rN   rO   r:   rU   rP   rV   Zset_deferred_for_local_stater#   r#   r$   rW   5  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)re   r>   rF   rC   rf   ri   _load_for_staters   r#   r#   r$   rj   E  s    z)DeferredColumnLoader.init_class_attributeNc	           
      K   s   |r"d|j kr"t| j| jjsN|r@| jr@|j d| j dsN|rr| j|krr| j	
dj|||||||f|	 n| jrt|| j	< n
t|| j	< d S )NZundefer_pkszundefer_group_%sF))r@   F)r?   T)rr   rh   rC   intersectionr4   Z_should_undefer_in_wildcardru   r6   r   rF   _get_strategyrT   re   r   r   )
rH   rL   rM   rN   rO   rP   rQ   rc   only_load_propsr;   r#   r#   r$   rT   Q  sJ    
	
 
z DeferredColumnLoader.setup_queryc                    s   j stjS |tj@ stjS jj} jr@ fdd|jD }n j g}fdd|D }t	}|d krt
dt j f ||}tj|j |dd krt
tjS )Nc                    s4   g | ],}t |trt |jtr|j jkr|jqS r#   )
isinstancer   strategyrt   ru   r   ).0prH   r#   r$   
<listcomp>  s
   
z8DeferredColumnLoader._load_for_state.<locals>.<listcomp>c                    s   g | ]}| j kr|qS r#   )Z
unmodified)r~   kstater#   r$   r     s     
 zfParent instance %s is not bound to a Session; deferred load operation of attribute '%s' cannot proceed)r{   Zrefresh_state)r   r   
ATTR_EMPTYSQL_OKPASSIVE_NO_RESULTmanagerr:   ru   Ziterate_propertiesr   orm_excDetachedInstanceErrorr   	state_strr	   r   Zload_on_identZObjectDeletedErrorZATTR_WAS_SET)rH   r   passivelocalparentZtoloadru   sessionr	   r#   )rH   r   r$   rx     s<    


   
z$DeferredColumnLoader._load_for_state)N)rX   rY   rZ   r[   r\   rE   rW   rj   rT   rx   r]   r#   r#   rJ   r$   rt   $  s   	 
/rt   c                   @   s&   e Zd ZdZdd ZejfddZdS )LoadDeferredColumnsz7serializable loader object used by DeferredColumnLoaderc                 C   s
   || _ d S r   r   )rH   r   r#   r#   r$   rE     s    zLoadDeferredColumns.__init__c                 C   s.   | j }|jj}|j| }|jt }|||S r   )r   r   r:   r5   _strategiesrt   rx   )rH   r   r   r   r   r    r}   r#   r#   r$   __call__  s
    

zLoadDeferredColumns.__call__NrX   rY   rZ   r[   rE   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   )rD   r   rE   rF   r:   r   r   r'   rG   rJ   r#   r$   rE     s
    


z#AbstractRelationshipLoader.__init__)rX   rY   rZ   r[   r\   rE   r]   r#   r#   rJ   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)rX   rY   rZ   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+   )re   r>   rF   collection_classrs   r#   r#   r$   rj     s    zNoLoader.init_class_attributec           	         s$    fdd}|d   j|f d S )Nc                    s,    j r| j j| | n
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_loadrw   r2   r   )	rH   rL   rN   rO   r:   rU   rP   rV   r   r#   r   r$   rW     s    zNoLoader.create_row_processorN)rX   rY   rZ   r[   r\   rj   rW   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 o| j o| jjd j| jd| jjd| _| jr
t| jD ]2}|| jjkr| jj| D ]}| j| | j|< qq| jd	|  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)rD   r   rE   Zstrategy_optsr   r   r   r   r   rF   _join_conditionZcreate_lazy_clauser   r   r   r   r   r   loggerinfor'   _get_clausecomparer:   _equivalent_columnsr   r0   )rH   r4   rI   Zjoin_conditionrn   rS   rJ   r#   r$   rE     sD    


 zLazyLoader.__init__c                 C   sD   d| _ | jjp"| jjtjk	p"| j }t| j|d| j| jj	|d d S )NT)r)   r,   r+   r-   )
re   rF   r-   r9   r   	MANYTOONEr   r>   rx   r   )rH   r:   r-   r#   r#   r$   rj   @  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_bindparam]  s    zFLazyLoader._memoized_attr__simple_lazy_clause.<locals>.visit_bindparamr   c                    sF   | j  kr$| j | j  d f n| jd krB| jd | jf d S r   )Z_identifying_keyr2   r   callablevaluer   Zbind_to_colparamsr#   r$   r   b  s    

)r   r   r   ZtraverseZcloned_traverse)rH   	criterionr   r#   r   r$   "_memoized_attr__simple_lazy_clauseX  s      z-LazyLoader._memoized_attr__simple_lazy_clausec                 C   s   | j \}}|d kr(t|dd |D S | jj}| }t|}|tj@ rV|tjN }i }|D ]J\}	}
}|
d k	r|r|tj	@ r|
|||
|}n||||
|}|||	< q^||fS )Nc                 S   s   g | ]\}}}|qS r#   r#   )r~   r   identr   r#   r#   r$   r   y  s     z4LazyLoader._generate_lazy_clause.<locals>.<listcomp>)r   sql_utilZadapt_criterion_to_nullrF   r4   objr   instance_dictZINIT_OKLOAD_AGAINST_COMMITTED#_get_committed_state_attr_by_column_get_state_attr_by_column)rH   r   r   r   Z
param_keysr:   or   r   r   r   r   r#   r#   r$   _generate_lazy_clauset  s:    
 


      
z LazyLoader._generate_lazy_clausec                 C   s   t d| |f d S )Nz&'%s' is not available due to lazy='%s')sa_excInvalidRequestError)rH   r   r   r   r#   r#   r$   _invoke_raise_load  s    
zLazyLoader._invoke_raise_loadc                 C   sL  |j s | jjs|jr|js tjS |j  }d }|tj@ s<| jrJ|tj	@ sP|rPtj
S | jr~|tj@ s~| jrp|tj@ r~| ||d t|}|s|tj@ rtj
S tdt|| j f | jr<| |||}tj
|krtj
S tj|krtjS t|rd S | j| j|||d}|d k	r|S |tj@ r6|tj@ s<t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   rF   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   _emit_lazyload)rH   r   r   pendingprimary_key_identityr   instancer#   r#   r$   rx     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   rH   r   r#   r$   r     s   z5LazyLoader._get_ident_for_use_get.<locals>.<listcomp>)r   r:   r   r   r   r   dictrg   )rH   r   r   r   instance_mapperr#   r   r$   r     s    
z!LazyLoader._get_ident_for_use_getsqlalchemy.ext.bakedc                 C   s   |j ddS N2   )sizeZbakeryrH   bakedr#   r#   r$   _memoized_attr__bakery  s    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 k	rX|fdd j }|sn|tj@ r||dd  j	rj
j }|j	| jr܈jr|d ||fd	d|j|S jjr|fd
d jjD ]6jtjkrjrtjts|fdd q|\ |rfttj ! r~d S nttj"! r~d S jr|d | fdd fdd}	||fdd|	# }
j$r|
S t%|
}|r|dkrt&dj  |
d S 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%     r   T)fullc                    s   |   j jjS r   )select_fromr:   rF   	secondaryr   r   r#   r$   r%   (  s    c                 S   s
   |  dS r   )Z	autoflushr   r#   r#   r$   r%   1  r   r   c                    s
   |   S r   Z_set_lazyload_fromr   r   r#   r$   r%   C  r   c                    s   | j t jj  S r   )order_byr   r1   rF   r   r   r#   r$   r%   K  s   c                    s"   |  j| j j  jS r   )optionsLoadZfor_existing_path_current_pathr4   Zlazyloadr   r   )revstrategy_optionsr#   r$   r%   Z  s   
c                    s
   |   S r   )filterr   )lazy_clauser#   r$   r%   m  r   c                    s     | j  | _| S r   )update_paramsr   )r   r#   r$   set_default_paramsq  s    z5LazyLoader._emit_lazyload.<locals>.set_default_paramsc                    s
   |   S r   r   r   r   r#   r$   r%   x  r   r   zKMultiple rows returned with uselist=False for lazily-loaded attribute '%s' r   )'r   add_criteriarF   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)rH   r   r   r   r   r   r   r   Zeffective_pathr   rU   lr#   )r   r   r   rH   r   r   r$   r     s    


 




zLazyLoader._emit_lazyloadc           
         sh   | j  | js8t|jt |  }|d | j |f n,|jsD|jrd fdd}	|d | j |	f d S )Nrw   c                    s   |  |  d S r   )Z_resetr   r   r#   r$   reset_for_lazy_callable  s    	z@LazyLoader.create_row_processor.<locals>.reset_for_lazy_callable)	r   re   r   Z"_instance_level_callable_processorr7   LoadLazyAttributer2   populate_existingZalways_refresh)
rH   rL   rN   rO   r:   rU   rP   rV   Zset_lazy_callabler   r#   r   r$   rW     s    
  zLazyLoader.create_row_processor)rX   rY   rZ   r[   r\   rE   rj   r   r   r   rx   r   r   dependenciesr   r   rW   r]   r#   r#   rJ   r$   r     s   1 U

 r   c                   @   s&   e Zd ZdZdd ZejfddZdS )r  z-serializable loader object used by LazyLoaderc                 C   s   || _ |j| _d S r   )r   rI   )rH   r   Zinitiating_strategyr#   r#   r$   rE     s    zLoadLazyAttribute.__init__c                 C   s0   | j }|jj}|j| }|j| j }|||S r   )r   r   r:   r5   r   rI   rx   )rH   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   s   | j d| d S N)r   r   rF   rz   rj   rs   r#   r#   r$   rj     s
    z$ImmediateLoader.init_class_attributeNc           	      K   s   d S r   r#   )	rH   rL   r   rN   rO   rP   rQ   parentmapperrR   r#   r#   r$   rT     s    zImmediateLoader.setup_queryc           	         s$    fdd}|d   j|f d S )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   )	rH   rL   rN   rO   r:   rU   rP   rV   r	  r#   r   r$   rW     s    z$ImmediateLoader.create_row_processor)NN)rX   rY   rZ   r\   rj   rT   rW   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                    s    t t| || | jj| _d S r   )rD   r  rE   rF   r  rG   rJ   r#   r$   rE     s    zSubqueryLoader.__init__c                 C   s   | j d| d S r  r  rs   r#   r#   r$   rj     s
    z#SubqueryLoader.init_class_attributeNc                 K   s  |j jsd S |j jr |j d || j }||jdd }	|	d k	rJ|	j}
n| j}
|jdtj	j
}|| }||jds| jr|j jr|j jjnd|j d | jkrd S n|| jrd S | |\}}}|jdtf|j }| |||||j}|j |
}dtf|d|i|_|d}| ||\}}}|j| }|j| }| |||||
}| ||||
}| |}||jd| d S )	Nr
  path_with_polymorphic)Zsubquery_pathNloaderr   r   
orig_queryF)r	   _enable_eagerloads
_yield_per_no_yield_perrF   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_joinsr   Zadd_columns_apply_joins_setup_options_setup_outermost_orderbyrh   )rH   rL   r   rN   rO   rP   rQ   r  rR   with_poly_infoeffective_entity	subq_pathleftmost_mapperleftmost_attrleftmost_relationshipr  
left_aliasr   to_join
local_attrparent_aliasr#   r#   r$   rT     s    
      
 


    
zSubqueryLoader.setup_queryc                    sp   j td }| j|r>| jd k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   r~   rS   r#  r"  r#   r$   r   ^  s
    
z0SubqueryLoader._get_leftmost.<locals>.<listcomp>)rN   r   Z_class_to_mapperr4   isarF   local_columns)rH   r"  Zsubq_mapperZleftmost_propZleftmost_colsr$  r#   r.  r$   r  O  s    
zSubqueryLoader._get_leftmostc                 C   s   |  d }|js4|ttdd |jD d ||}|| |j	}|dkr^d|_
n:|d krtdd |D D ]}	t||	jsxd|_
 qqx|jdkr|j|_|jd kr|jd krd |_|  }
tj||
dd}|S )Nc                 S   s    g | ]}|d  dk	r|d  qS )r   Nr#   )r~   entr#   r#   r$   r   {  s   z@SubqueryLoader._generate_from_original_query.<locals>.<listcomp>FTc                 s   s   | ]}|j V  qd S r   )tabler-  r#   r#   r$   	<genexpr>  s     z?SubqueryLoader._generate_from_original_query.<locals>.<genexpr>use_mapper_path)Z_cloneZ	correlate	_from_objZ_set_select_fromr0   rh   Zcolumn_descriptionsZ_adapt_col_listZ_set_entitiesdistinct_target_keyZ	_distinctr   rg   Z	_order_byr   Z_limit_offsetZwith_labelsr
  r   AliasedClass)rH   r  r#  r$  r%  Zorig_entityr   Ztarget_colsr7  tZembed_qr&  r#   r#   r$   r  g  sB    
	


  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   Tr4  c                    s    g | ]}t  jj| jqS r#   )r+  r4   r,  r   r-  r)  rH   r#   r$   r     s   z2SubqueryLoader._prep_for_joins.<locals>.<listcomp>)r0   pairs	enumerater:   r/  r2   r   r   r   r   r   r   r9  rF   r0  )rH   r&  r"  r'  r=  ir:   r    Zprev_mapperZ	to_appendr   
local_colsr(  r#   r<  r$   r    s,     zSubqueryLoader._prep_for_joinsc                 C   s4  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 ]}
|j|
d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   r9  r   )r~   itemr#   r#   r$   r     s   z/SubqueryLoader._apply_joins.<locals>.<listcomp>T)Zfrom_joinpoint)r   r+  of_typepopr2   r4   join)rH   r   r'  r&  r)  r!  ZltjZmiddleinnerrA  attrr#   r#   r$   r    sD    

	


zSubqueryLoader._apply_joinsc                 C   s(   | |}|j|j }|jr$|j|_|S r   )Z_with_current_pathZ_conditional_options_with_options_populate_existing)rH   r   r"  r  r!  r#   r#   r$   r    s
    
zSubqueryLoader._setup_optionsc                 C   s6   | j jr2|jd }|jt| j j}|j| }|S rb   )rF   r   r6  _target_adaptercopy_and_processr   r1   )rH   r   	eagerjoineager_order_byr#   r#   r$   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` used to emit the "subquery load",
        provide a load interface that executes the query at the
        first moment a value is needed.

        Nc                 C   s
   || _ d S r   )subq)rH   rM  r#   r#   r$   rE   ,  s    z(SubqueryLoader._SubqCollections.__init__c                 C   s    | j d kr|   | j ||S r   )_data_loadr6   )rH   r   r   r#   r#   r$   r6   /  s    
z#SubqueryLoader._SubqCollections.getc                 C   s&   t dd t| jdd D | _d S )Nc                 s   s$   | ]\}}|d d |D fV  qdS )c                 S   s   g | ]}|d  qS r*  r#   r~   vvr#   r#   r$   r   6  s     zCSubqueryLoader._SubqCollections._load.<locals>.<genexpr>.<listcomp>Nr#   r~   r   vr#   r#   r$   r3  5  s   z8SubqueryLoader._SubqCollections._load.<locals>.<genexpr>c                 S   s   | dd  S )Nr   r#   xr#   r#   r$   r%   7  r   z7SubqueryLoader._SubqCollections._load.<locals>.<lambda>)r   	itertoolsgroupbyrM  rN  r   r#   r#   r$   rO  4  s    z%SubqueryLoader._SubqCollections._loadc                 C   s   | j d kr|   d S r   )rN  rO  )rH   r   r   r   r#   r#   r$   r  :  s    
z&SubqueryLoader._SubqCollections.loader)	rX   rY   rZ   r[   rN  rE   r6   rO  r  r#   r#   r#   r$   _SubqCollections#  s   rX  c                    s   | j j| j jjs td|  || j }||j	d}|d krDd S |j
|j
ksXtd| jj}	||j	d}
|
d kr| |}
||j	d|
  r fdd|	D }	| jr| ||
|	| n| ||
|	| 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?collectionsc                    s   g | ]} j | qS r#   rB   r-  rP   r#   r$   r   _  s     z7SubqueryLoader.create_row_processor.<locals>.<listcomp>)r4   r7   r   implsupports_populationr   r   rF   r6   r   r   AssertionErrorr0  rX  rh   r'   _create_collection_loader_create_scalar_loader)rH   rL   rN   rO   r:   rU   rP   rV   rM  r@  rZ  r#   r[  r$   rW   >  sB    

      z#SubqueryLoader.create_row_processorc                    sf    fddfdd}|d  jf |d  j|f |jrb|d  j jf d S )Nc                    s8    t fddD d}| j| || d S )Nc                    s   g | ]} | qS r#   r#   r~   rn   r   r#   r$   r   o  s     z_SubqueryLoader._create_collection_loader.<locals>.load_collection_from_subq.<locals>.<listcomp>r#   )r6   tupler   r   set_committed_value)r   r   r   
collectionrZ  r@  rH   rb  r$   load_collection_from_subqm  s       zKSubqueryLoader._create_collection_loader.<locals>.load_collection_from_subqc                    s   j |kr | || d S r   r   r   )rg  rH   r#   r$   &load_collection_from_subq_existing_rowu  s    
zXSubqueryLoader._create_collection_loader.<locals>.load_collection_from_subq_existing_rowrw   existingeagerr2   r   invoke_all_eagersr  )rH   rL   rZ  r@  rV   rh  r#   )rZ  rg  r@  rH   r$   r_  j  s    z(SubqueryLoader._create_collection_loaderc                    sf    fddfdd}|d  jf |d  j|f |jrb|d  j jf d S )Nc                    sZ    t fddD d}t|dkr8td  |d }| j| || d S )Nc                    s   g | ]} | qS r#   r#   ra  rb  r#   r$   r     s     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   rc  r   r   r   r   r   rd  )r   r   r   re  Zscalarrf  rb  r$   load_scalar_from_subq  s     zCSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subqc                    s   j |kr | || d S r   r   r   )rn  rH   r#   r$   "load_scalar_from_subq_existing_row  s    
zPSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subq_existing_rowrw   ri  rj  rk  )rH   rL   rZ  r@  rV   ro  r#   )rZ  rn  r@  rH   r$   r`    s    z$SubqueryLoader._create_scalar_loader)NN)rX   rY   rZ   r\   rE   rj   rT   r  r  r  r  r  r  objectrX  rW   r_  r`  r]   r#   r#   rJ   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   )rD   rq  rE   rF   r  rr  rG   rJ   r#   r$   rE     s    
zJoinedLoader.__init__c                 C   s   | j d| d S r  r  rs   r#   r#   r$   rj     s
    z!JoinedLoader.init_class_attributeNFc	                 K   s:  |j jsdS |j jr&| jr&|j d || j }d}
|rD| ||nd}|dk	rj| |||||\}}}nZ||j	ds| j
r|jd | j
krdS n|| jrdS | ||||||||\}}}}||j	dd}|dk	r|j}
nd}
|| j }tj|| j|||||
| j|d	 |dk	r6dt|jkr6tddS )	z@Add a left outer join to the statement that's being constructed.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  rF   _init_user_defined_eager_proc$_setup_query_on_user_defined_adapterr  r   r  r  r  r:   _generate_row_adapterr6   Zwith_polymorphic_mappersr   r   Z_setup_entity_queryrh   secondary_columnsr   r   )rH   rL   rM   rN   rO   rP   rQ   r  rt  rR   rs  user_defined_adapterclausesadd_to_collectionr   r#   r#   r$   rT     s    
    
  
zJoinedLoader.setup_queryc           	      C   s   d|j krdS |jj}||jdd}|dk	r2|S |j d }|dd  \}}|d k	r~t|trj|j|}t	j
||jjd}nD||jdr||jd}tj|j|jjd}n|jj|jd }||jd| |S )NZeager_from_aliasF user_defined_eager_row_processor)r   r  )rr   rN   r4   r6   r   r|   strr   aliasr   ZColumnAdapterr:   r   r  r   
ORMAdapterr   r	   Z_polymorphic_adaptersrh   )	rH   rO   rL   rN   rP   r  Zroot_mapperr    r   r#   r#   r$   ru    sL    
  

     z*JoinedLoader._init_user_defined_eager_procc                 C   sZ   | |j|}|r2|r2||}||jd| n|rJ|}||jd| |j}|||fS )Nr|  )Z_get_entity_clausesr	   wraprh   r   primary_columns)rH   rL   r   rN   rP   ry  r{  r#   r#   r$   rv  @  s"    
z1JoinedLoader._setup_query_on_user_defined_adapterc                 C   s   t | jjrt | jj}nd }d| f}||jkr@d |j|< }n|j| d  |j|< }|t| jkrtj| j	|d k	r|j
ddnd ddd}t |jj | j| | j| S )NZjoinedloader_acr   r   T)flat)r  r  r5  )r   r   r   
selectabler   r   rr  r   r9  r:   r  rS   r2   )rH   rL   Zalt_selectabler   idxto_adaptr#   r#   r$   _gen_pooled_aliased_classZ  s&    
z&JoinedLoader._gen_pooled_aliased_classc	                 C   s   | |jdd }	|	r|	j}
n
| |}
t|
jd| ftj|
| jj	dddd}|j
d k	sZt| jjrhd|_|d k	r|j d| jjn| jj}|sd}|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  r   Z_memor   r  r:   r   aliased_classr^  rF   r'   multi_row_eager_loadersrr   r  Zcreate_eager_joinsr2   _create_eager_joinrx  rh   )rH   rL   r   rN   rO   rP   rQ   r  rt  r   r  rz  r  r{  r#   r#   r$   rw  }  sR      

z"JoinedLoader._generate_row_adapterc	                 C   s   |d kr|j }	n|}	|jo |jj}
d }||jkr|
s|jrt|j|j}t	|dkr`t
d|r|j|d  }|d | }}|d kr||j }}|j||}|rt|dd rt|j|	| jr|	n| j}t|j| j| j}n ttj| j|jdd| j| j}n| j}|jd k	s"t| pB| pB|dkpB|jj}|rtj||j|| px|jjpx|oxt|tj| j| j d}n| ||||}||j|< |j|_ |st!| jj"D ]2}|	j#j$%|r|r|j&| }|j'(| q| jj)r| j*|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  Tr4  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   
setdefaultr+  r   r  Z_entity_for_mapperr/  r4   r   r   rF   r   r9  r^  r  Zrepresents_outer_join_ORMJoinr|   r   ZJoin_splice_nested_inner_joinZstop_onZ_find_columnsZprimaryjoinZpersist_selectablerS   Zcontains_columnrC   r  r2   r   rL  rI  rJ  r   r1   )rH   rL   rM   rN   rP   r  rz  r  rt  r   Zshould_nest_selectableZquery_entity_keyZindexesZclauseZdefault_towrapZtowrapZefmonclauseZattach_on_outsiderK  rn   r#   r#   r$   r    s      

  	   


zJoinedLoader._create_eager_joinc           	      C   s4  |dkrt |tjsvtn\t |tjjr<| ||j|||S t |tjsv|d |krrtj||j	|d||d j
dS d S | ||j|||j}|d krd}| ||j|||j}|d kr|dk	stdd S nd}|r|js|js||}ntj|j||j|j|jd}ntj||j|j|j|jd}|j|_|S )	NFr}  r;  r  z9assertion failed attempting to produce joined eager loadsT)r  r  )r  r  )r|   r   r  r^  r   r  ZFromGroupingr  elementr  r:   rightr  leftr  r  Z_splice_into_centerr  rI  )	rH   rN   Zjoin_objrz  r  ZsplicingZtarget_joinZright_splicerK  r#   r#   r$   r  L  s~        
        z&JoinedLoader._splice_nested_inner_joinc                 C   sz   |r|  ||nd}|dk	rF|}|jr8|r8||j}q`|jr`|j}n||jd}|d kr`dS | j||rr|S dS d S )NFr  )ru  rP   r  r6   r   r:   Z_result_has_identity_key)rH   rL   rU   rP   rN   rO   ry  Z	decoratorr#   r#   r$   _create_eager_adapter  s     
z"JoinedLoader._create_eager_adapterc              	   C   s   | j j| j jjs td|  || j }| |||||}	|	dk	r| j}
t	
| j|||| j |	}| js|| ||
|| q| ||
|| n| jd||||||| d S )NrY  Fr  )r4   r7   r   r\  r]  r   r   rF   r  r   Z_instance_processorr:   r   r'   r`  r_  rz   rW   )rH   rL   rN   rO   r:   rU   rP   rV   Zour_pathZeager_adapterr   	_instancer#   r#   r$   rW     sT    
             z!JoinedLoader.create_row_processorc                    sr    fdd} fdd} fdd}|d  | j|f |d  | j|f jrn|d	  | j|f d S )
Nc                    sF   t | |}t|d}|j | f<  |}|d k	rB|| d S NZappend_without_eventr   Zinit_state_collectionr   ZUniqueAppenderr2   )r   r   r   re  result_listinstr  rL   r   r#   r$   #load_collection_from_joined_new_row  s     zSJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_new_rowc                    sd   | fj krj | f }n(t | |}t|d}|j | f<  |}|d k	r`|| d S r  r  )r   r   r   r  re  r  r  r#   r$   (load_collection_from_joined_existing_row  s       zXJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_existing_rowc                    s    | d S r   r#   r   r  r#   r$    load_collection_from_joined_exec  s    zPJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_execrw   ri  rj  r2   r   rl  )rH   rL   r   r  rV   r  r  r  r#   r  r$   r_    s    
z&JoinedLoader._create_collection_loaderc                    sp    fdd} fdd} fdd}|d  j|f |d  j|f |jrl|d	  j|f d S )
Nc                    s    ||< d S r   r#   r   )r  r   r#   r$   load_scalar_from_joined_new_row  s    zKJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_new_rowc                    s8    |}|kr,|| k	r4t d  n||< d S )Nrm  )r   r   )r   r   r   ri  r  r   rH   r#   r$   $load_scalar_from_joined_existing_row  s    	zPJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_existing_rowc                    s    | d S r   r#   r   r  r#   r$   load_scalar_from_joined_exec  s    zHJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_execrw   ri  rj  r  )rH   rL   r   r  rV   r  r  r  r#   r  r$   r`    s    z"JoinedLoader._create_scalar_loader)NNF)F)rX   rY   rZ   r[   r\   rE   rj   rT   ru  rv  r  rw  r  r  r  rW   r_  r`  r]   r#   r#   rJ   r$   rq    s(      
^0#@  
F',rq  Zselectinc                	       s   e Zd ZdZedddddddgZd	Z fd
dZdd Z	dd Z
dd Zdd Z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k}| jjd k	rB| jj| _n:| j	d}|r\|j
| _n | jjd j|jd| jjd| _| jr|r|  | _|  | _q|  | _n
|  | _d S )Nr  r   Tr   )rD   r  rE   rF   r  r9   r   r   r  rz   r   r4   r   r   r   r   _init_for_omit_join_m2or  _init_for_joinr  _init_for_omit_join)rH   r4   rI   Zis_m2o
lazyloaderrJ   r#   r$   rE   A  s*    


zSelectInLoader.__init__c                    s   t jjj   fddt D   fddjjD  }}t|dkrbt	j
| }d}n|d }d}dd|||d S )	Nc                 3   s0   | ](}j j|d D ]}| | fV  qqdS )r#   N)r4   r   r6   )r~   r   equivpk_to_fkrH   r#   r$   r3  b  s    z5SelectInLoader._init_for_omit_join.<locals>.<genexpr>c                    s   g | ]}| kr | qS r#   r#   ra  )r  r#   r$   r   h  s     z6SelectInLoader._init_for_omit_join.<locals>.<listcomp>r   Fr   T)r   rF   r   Zlocal_remote_pairsr   r0   r4   rg   r   r   tuple_
query_info)rH   r  Zfk_colsr  r  r#   r  r$   r  ^  s    


z"SelectInLoader._init_for_omit_joinc                    sb   | j j}t|dkr$tj| }d}n|d }d}| jd  fdd|D }| dd||||S )Nr   Fr   Tr  c                    s   g | ]} j | qS r#   r   r   r  r#   r$   r   ~  s     z:SelectInLoader._init_for_omit_join_m2o.<locals>.<listcomp>)r:   rg   r   r   r  rF   rz   r  )rH   r  r  r  Zlookup_colsr#   r  r$   r  t  s     
     z&SelectInLoader._init_for_omit_join_m2oc                    sj   t | jj| _t| j  fdd| jjD }t|dkrJtj| }d}n|d }d}| 	dd|||d S )Nc                    s   g | ]}  |qS r#   _adapt_elementra  Zpa_inspr#   r$   r     s    z1SelectInLoader._init_for_join.<locals>.<listcomp>r   Fr   T)
r   r4   r8   r  r   rg   r   r   r  r  )rH   r  r  r  r#   r  r$   r    s    


zSelectInLoader._init_for_joinc                 C   s   | j d| d S r  r  rs   r#   r#   r$   rj     s
    z#SelectInLoader.init_class_attributer   c                 C   s   |j ddS r   r   r   r#   r#   r$   r     s    z%SelectInLoader._memoized_attr__bakeryc                 C   s   | j j| j jjs td|  |jjp.t	j
j| }t	|d | j sJd S tj||| jr`d S || j }	|| j }
|	|jdd }|d k	r|j}n| j}|	|jds| jr|
jd | jkrd S n|
| jrd S tj||| j | j| j| d S )NrY  r;  r  r  r   )r4   r7   r   r\  r]  r   r   r	   r   r   r  r  Z_entity_isar   ZPostLoadZpath_existsrF   r6   r   r   r  r  r  r  r:   Zcallable_for_path_load_for_path)rH   rL   rN   rO   r:   rU   rP   rV   Zselectin_pathZpath_w_propZselectin_path_w_propr   r!  r#   r#   r$   rW     sJ    

  z#SelectInLoader.create_row_processorc                    sF  |rj |krd S j}|jrtt}g }	j|D ]l\}
j	t	fdd|j	D }t
j|krtj} qd |kr|| 	|
f q6|		|
f q6|jsdd |D }|j|j|js
tjr
fddD fddD fdd}|js<|fd	d nj|fd
d |jrt|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r2||	||| n|||| d S )Nc                 3   s"   | ]} j |tjd V  qdS )r   N)r   r   ZPASSIVE_NO_FETCH)r~   Zlk)r:   r   
state_dictr#   r$   r3    s   z0SelectInLoader._load_for_path.<locals>.<genexpr>c                 S   s$   g | ]\}}|j d  ||j|fqS r   )r   r   )r~   r   	overwriter#   r#   r$   r     s   z1SelectInLoader._load_for_path.<locals>.<listcomp>c                    s   g | ]}  |qS r#   r  ra  inspr#   r$   r   	  s     c                    s   g | ]}  |qS r#   r  ra  r  r#   r$   r   	  s     c                    s   |  t jd  S )Nr   )r   )r	   ZBundler   )r!  r  r#   r$   r%   	  s    z/SelectInLoader._load_for_path.<locals>.<lambda>c                    s
   |   S r   )r   r   )r!  r#   r$   r%   	  r   c                    s    |  tjj S r   )r   rD  r+  rF   r   rB  r   )r!  parH   r#   r$   r%   $	  s   
c                    s   |   tjdddS Nprimary_keysT)Z	expanding)r   in_r   r   r   )r  r#   r$   r%   -	  s   c                    s    |   tjdddj S r  )r   r  r   r   r   r   )r  r  r#   r$   r%   3	  s   c                 S   s   |   S r   )r  r   r#   r#   r$   r%   ?	  r   c                    s   g | ]}  |qS r#   r  )r~   elemr  r#   r$   r   E	  s    c                    s
   | j   S r   )r   r   )rL  r#   r$   r%   H	  r   c                    s&   | j d }| j|jt jj S rb   )r6  r   rI  rJ  r   r1   rF   )r   rK  r   r#   r$   r  K	  s    
z?SelectInLoader._load_for_path.<locals>._setup_outermost_orderby)r   r  r  rZ  defaultdictr0   r4   r   rc  r  r   r   r  r2   r  r  r  r   r   r  r   r   r  r	   r   rG  rF   rH  r   _load_via_child_load_via_parent)rH   r   rL   rN   Zstates	load_onlyr!  r  
our_statesnone_statesr  Zrelated_identr   r  r  r#   )
rL  r!  r  r  r:   r  r  rH   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 ]T}
|	|
d }||
 D ]:\}}}|s| j|krqt|| j|||s|n|g qtq\q|D ]0\}}}|s| j|krq|| j||d  qd S )Nr   c                 S   s   i | ]\}}||qS r#   r#   rR  r#   r#   r$   
<dictcomp>g	  s    z2SelectInLoader._load_via_child.<locals>.<dictcomp>c                    s   g | ]} j r|d  n|qS r*  r  )r~   r   r  r#   r$   r   j	  s    z2SelectInLoader._load_via_child.<locals>.<listcomp>r  )	r'   sorted
_chunksizer   r   r6   r   r   rd  )rH   r  r  r  r   rL   r'   Zour_keyschunkdatar   Zrelated_objr   r   r  r#   r  r$   r  _	  s4    

	
zSelectInLoader._load_via_childc                    s   | j }|rdnd }|r|d| j }|| jd  } fdd|D }dd t||jj|ddd	 D }	|D ]|\}
}}}|s| j|krqp|	|
|}|s|rt|d
krt	
d|   || j|||d  qp|| j||| qpqd S )Nr#   r   c                    s&   g | ]\}}}} j r|d  n|qS r*  r  )r~   r   r   r  r  r  r#   r$   r   	  s   
z3SelectInLoader._load_via_parent.<locals>.<listcomp>c                 S   s    i | ]\}}|d d |D qS )c                 S   s   g | ]}|d  qS r  r#   rP  r#   r#   r$   r   	  s     z>SelectInLoader._load_via_parent.<locals>.<dictcomp>.<listcomp>r#   rR  r#   r#   r$   r  	  s    z3SelectInLoader._load_via_parent.<locals>.<dictcomp>r  c                 S   s   | d S rb   r#   rT  r#   r#   r$   r%   	  r   z1SelectInLoader._load_via_parent.<locals>.<lambda>r   rm  )r'   r  rV  rW  r   r   r   r6   r   r   r   r   rd  )rH   r  r  r   rL   r'   Z_empty_resultr  r  r  r   r   r  r  re  r#   r  r$   r  	  sF    
    zSelectInLoader._load_via_parent)rX   rY   rZ   r\   rZ  
namedtupler  r  rE   r  r  r  rj   r   r  r   rW   r  r  r  r]   r#   r#   rJ   r$   r  '  s2   	
1
 *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                    sP   |d k	rL|j  j krL|t|}|rL||k	rLtdt|| j f |S )NzsInstance %s is already associated with an instance of %s via its %s attribute, and is only allowed a single parent.)	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   	  s    z'single_parent_validator.<locals>.appendc                    s    | |||S r   r#   )r   r   r  r  r  r#   r$   set_	  s    z%single_parent_validator.<locals>.set_r2   T)rawretvalr-   rh   )r   listen)r   r    r2   r  r#   )r  r    r$   r3   	  s         r3   )NNNNFN)8r[   
__future__r   rZ  rV   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_loggerr^   rp   rt   rp  r   r   ZRelationshipPropertyr   r   ZMemoizedSlotsr   r  r  r  rq  r  r3   r#   r#   r#   r$   <module>   s         
V#B; 
    8   @        