B
    .`U                @   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	                sB  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| jr| fdd x|jD ]}| |j| jkr|j| jstj|j| jf| |||
|o| jp| jtjk||||| p| j | jd|	}x|D ]}|||  q&W qW d S )N)defaultc                s   t j| |j fS )N)orm_utilZ_validator_eventskey)descprop)fnopts H/home/dcms/DCMS/lib/python3.7/site-packages/sqlalchemy/orm/strategies.py<lambda>B   s   z%_register_attribute.<locals>.<lambda>c                s   t |  S )N)r   Zbackref_listeners)r   r   )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)   sP    






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 )N)superr?   __init__parent_propertyr@   )selfr2   strategy_key)	__class__r!   r"   rB      s    z#UninstrumentedColumnLoader.__init__Nc       	      K   s,   x&| j D ]}|r|j | }|| qW d S )N)r@   r0   )	rD   contextquery_entitypathloadoptadaptercolumn_collectionkwargscr!   r!   r"   setup_query   s    

z&UninstrumentedColumnLoader.setup_queryc             C   s   d S )Nr!   )rD   rG   rI   rJ   r8   resultrK   
populatorsr!   r!   r"   create_row_processor   s    z/UninstrumentedColumnLoader.create_row_processor)N)	__name__
__module____qualname____doc__	__slots__rB   rO   rR   __classcell__r!   r!   )rF   r"   r?      s
   
r?   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`.)r@   is_compositec                s.   t t| || | jj| _t| jd| _d S )Ncomposite_class)rA   rY   rB   rC   r@   hasattrrZ   )rD   r2   rE   )rF   r!   r"   rB      s    
zColumnLoader.__init__c             K   sN   x&| j D ]}	|r|j |	 }	||	 qW | j d }
|r@|j |
 }
|
|| j< d S )Nr   )r@   r0   rC   )rD   rG   rH   rI   rJ   rK   rL   memoized_populatorsrM   rN   fetchr!   r!   r"   rO      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_levelr@   typerC   r+   primary_keyZversion_id_colsetr<   compare_values)rD   r8   Zcoltyper+   r!   r!   r"   init_class_attribute   s    z!ColumnLoader.init_class_attributec       
      C   s\   xV| j D ]8}|r|j | }||d}	|	r|d | j|	f P qW |d | jdf d S )NFquickexpireT)r@   _getterr0   r   )
rD   rG   rI   rJ   r8   rP   rK   rQ   colgetterr!   r!   r"   rR      s    
z!ColumnLoader.create_row_processor)
rS   rT   rU   rV   rW   rB   rO   rd   rR   rX   r!   r!   )rF   r"   rY      s   rY   )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 )N)compare).0rN   )nullr!   r"   	<genexpr>   s    z2ExpressionColumnLoader.__init__.<locals>.<genexpr>)	rA   rj   rB   r   rm   anyrC   r@   _have_default_expression)rD   r2   rE   )rF   )rm   r"   rB      s    zExpressionColumnLoader.__init__c             K   s   d }	|r d|j kr |j d g}	n| jr.| jj}	|	d kr:d S x$|	D ]}
|rR|j|
 }
||
 q@W |	d }|rv|j| }||| j< d S )N
expressionr   )
local_optsrp   rC   r@   r0   )rD   rG   rH   rI   rJ   rK   rL   r]   rM   r@   rN   r^   r!   r!   r"   rO      s    


z"ExpressionColumnLoader.setup_queryc             C   st   |rpd|j krp|j d g}xT|D ]8}	|r2|j|	 }	||	d}
|
r |d | j|
f P q W |d | jdf d S )Nrq   Fre   rf   T)rr   r@   rg   r0   r   )rD   rG   rI   rJ   r8   rP   rK   rQ   r@   rh   ri   r!   r!   r"   rR     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)r_   r<   rC   r@   r`   rc   )rD   r8   r!   r!   r"   rd   "  s    z+ExpressionColumnLoader.init_class_attribute)rS   rT   rU   rB   rO   rR   rd   rX   r!   r!   )rF   r"   rj      s   rj   )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`.)r@   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)rA   rs   rB   r\   rC   NotImplementedErrorr@   rt   )rD   r2   rE   )rF   r!   r"   rB   6  s    
zDeferredColumnLoader.__init__c       	      C   s<   | j s$| jj}|d | j|f n|d | jdf d S )Nnewrf   F)r_   rC   Z_deferred_column_loaderr0   r   )	rD   rG   rI   rJ   r8   rP   rK   rQ   Zset_deferred_for_local_stater!   r!   r"   rR   ?  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)r_   r<   rC   r@   r`   rc   _load_for_state)rD   r8   r!   r!   r"   rd   O  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   rb   r@   intersectionr2   Z_should_undefer_in_wildcardrt   r4   r   rC   _get_strategyrO   r_   r   r   )
rD   rG   rH   rI   rJ   rK   rL   r]   only_load_propsr9   r!   r!   r"   rO   [  s,    


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   strategyrs   rt   r   )rl   p)rD   r!   r"   
<listcomp>  s   
z8DeferredColumnLoader._load_for_state.<locals>.<listcomp>c                s   g | ]}| j kr|qS r!   )Z
unmodified)rl   k)stater!   r"   r~     s    zfParent instance %s is not bound to a Session; deferred load operation of attribute '%s' cannot proceed)rz   Zrefresh_state)r   r   
ATTR_EMPTYSQL_OKPASSIVE_NO_RESULTmanagerr8   rt   Ziterate_propertiesr   orm_excDetachedInstanceErrorr   	state_strr	   r   Zload_on_identZObjectDeletedErrorZATTR_WAS_SET)rD   r   passivelocalparentZtoloadrt   sessionr	   r!   )rD   r   r"   rw     s*    



z$DeferredColumnLoader._load_for_state)N)rS   rT   rU   rV   rW   rB   rR   rd   rO   rw   rX   r!   r!   )rF   r"   rs   .  s   	
&rs   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 )N)r   )rD   r   r!   r!   r"   rB     s    zLoadDeferredColumns.__init__c             C   s.   | j }|jj}|j| }|jt }|||S )N)r   r   r8   r3   _strategiesrs   rw   )rD   r   r   r   r   r   r|   r!   r!   r"   __call__  s
    

zLoadDeferredColumns.__call__N)rS   rT   rU   rV   rB   r   PASSIVE_OFFr   r!   r!   r!   r"   r     s   r   c                   s$   e Zd ZdZdZ fddZ  ZS )AbstractRelationshipLoaderz0LoaderStratgies which deal with related objects.)r8   targetr%   entityc                s>   t t| || | jj| _| jj| _| jj| _| jj| _d S )N)rA   r   rB   rC   r8   r   r   r%   )rD   r2   rE   )rF   r!   r"   rB     s
    


z#AbstractRelationshipLoader.__init__)rS   rT   rU   rV   rW   rB   rX   r!   r!   )rF   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)rS   rT   rU   rV   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)   )r_   r<   rC   collection_class)rD   r8   r!   r!   r"   rd     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 )N)r%   r   get_implr   Z
initialize)r   dict_row)rD   r!   r"   invoke_no_load  s    z5NoLoader.create_row_processor.<locals>.invoke_no_loadrv   )r0   r   )	rD   rG   rI   rJ   r8   rP   rK   rQ   r   r!   )rD   r"   rR     s    zNoLoader.create_row_processorN)rS   rT   rU   rV   rW   rd   rR   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xDt| jD ]6}|| jjkrx$| jj| D ]}| j| | j|< qW qW | jd	|  d S )
Nr   r   r   T)Zreverse_directionz%s lazy loading clause %sr   )use_proxiesequivalentsz2%s will use query.get() to optimize instance loads)rA   r   rB   Zstrategy_optsr   r   r   r   r   rC   _join_conditionZcreate_lazy_clauser   r   r   r   r   r   loggerinfor%   _get_clauserk   r8   _equivalent_columnsr   r.   )rD   r2   rE   Zjoin_conditionrh   rN   )rF   r!   r"   rB     s*    
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+   )
r_   rC   r+   r7   r   	MANYTOONEr   r<   rw   r   )rD   r8   r+   r!   r!   r"   rd   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  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 )N)Z_identifying_keyr0   r   callablevalue)r   )bind_to_colparamsr!   r"   r   l  s    


)r   r   r   ZtraverseZcloned_traverse)rD   	criterionr   r!   )r   r   r"   "_memoized_attr__simple_lazy_clauseb  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 }xR|D ]J\}	}
}|
d k	r|r|tj	@ r|
|||
|}n||||
|}|||	< q`W ||fS )Nc             S   s   g | ]\}}}|qS r!   r!   )rl   r   identr   r!   r!   r"   r~     s    z4LazyLoader._generate_lazy_clause.<locals>.<listcomp>)r   sql_utilZadapt_criterion_to_nullrC   r2   objr   instance_dictZINIT_OKLOAD_AGAINST_COMMITTED#_get_committed_state_attr_by_column_get_state_attr_by_column)rD   r   r   r   Z
param_keysr8   or   r   r   r   r   r!   r!   r"   _generate_lazy_clause~  s&    



z LazyLoader._generate_lazy_clausec             C   s   t d| |f d S )Nz&'%s' is not available due to lazy='%s')sa_excInvalidRequestError)rD   r   r   r   r!   r!   r"   _invoke_raise_load  s    zLazyLoader._invoke_raise_loadc             C   s^  |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rN| |||}tj
|krtj
S tj|krtjS t|rd S | j| j|||d}|d k	r0|tjkr*d S |S n|tj@ rH|tj@ sNt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   rC   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)rD   r   r   pendingprimary_key_identityr   instancer!   r!   r"   rw     sZ    







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   )rl   pk)r   get_attrr   rD   r   r!   r"   r~     s   z5LazyLoader._get_ident_for_use_get.<locals>.<listcomp>)r   r8   r   r   r   r   dictra   )rD   r   r   r   instance_mapperr!   )r   r   r   rD   r   r"   r     s    
z!LazyLoader._get_ident_for_use_getzsqlalchemy.ext.bakedc             C   s   |j ddS )N2   )size)bakery)rD   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 xJjjD ]>jtjkr jr tjts |fdd q W |\ |rrt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rt&dj  |
d S d S d S )Nc                s   |   jS )N)r	   r   )r   )rD   r!   r"   r#   )      z+LazyLoader._emit_lazyload.<locals>.<lambda>c             S   s   |   dS )NF)Z_adapt_all_clausesZ_with_invoke_all_eagers)qr!   r!   r"   r#   ,  r   T)fullc                s   |   j jjS )N)select_fromr8   rC   	secondary)r   )rD   r!   r"   r#   5  s   c             S   s
   |  dS )NF)Z	autoflush)r   r!   r!   r"   r#   >  r   r   c                s
   |   S )N)_set_lazyload_from)r   )r   r!   r"   r#   P  r   c                s   | j t jj  S )N)order_byr   r/   rC   )r   )rD   r!   r"   r#   X  s   c                s"   |  j| j j  jS )N)optionsLoadZfor_existing_path_current_pathr2   Zlazyloadr   )r   )revstrategy_optionsr!   r"   r#   g  s   c                s
   |   S )N)filter)r   )lazy_clauser!   r"   r#   z  r   c                s     | j  | _| S )N)update_params)r   )r   r!   r"   set_default_params~  s    z5LazyLoader._emit_lazyload.<locals>.set_default_paramsc                s
   |   S )N)r   )r   )r   r!   r"   r#     r   r   zKMultiple rows returned with uselist=False for lazily-loaded attribute '%s' r   )'r   add_criteriarC   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	   r8   r   Z_reverse_propertyr7   r   r   Z_use_getr{   r|   r   r   r   Zhas_intersectionr   r   valuesZ
_never_setallr%   lenwarn)rD   r   r   r   r   r   r   r   Zeffective_pathr   rP   lr!   )r   r   r   rD   r   r   r"   r     sj    


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 )Nrv   c                s   |  |  d S )N)Z_reset)r   r   r   )r   r!   r"   reset_for_lazy_callable  s    	z@LazyLoader.create_row_processor.<locals>.reset_for_lazy_callable)	r   r_   r   Z"_instance_level_callable_processorr5   LoadLazyAttributer0   populate_existingZalways_refresh)
rD   rG   rI   rJ   r8   rP   rK   rQ   Zset_lazy_callabler   r!   )r   r"   rR     s    
zLazyLoader.create_row_processor)rS   rT   rU   rV   rW   rB   rd   r   r   r   rw   r   r   dependenciesr   r   rR   rX   r!   r!   )rF   r"   r     s   
1 X 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 )N)r   rE   )rD   r   Zinitiating_strategyr!   r!   r"   rB     s    zLoadLazyAttribute.__init__c             C   s0   | j }|jj}|j| }|j| j }|||S )N)r   r   r8   r3   r   rE   rw   )rD   r   r   r   r   r   r|   r!   r!   r"   r     s
    
zLoadLazyAttribute.__call__N)rS   rT   rU   rV   rB   r   r   r   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   )rC   ry   rd   )rD   r8   r!   r!   r"   rd     s    z$ImmediateLoader.init_class_attributeNc       	      K   s   d S )Nr!   )	rD   rG   r   rI   rJ   rK   rL   parentmapperrM   r!   r!   r"   rO     s    zImmediateLoader.setup_queryc       	         s$    fdd}|d   j|f d S )Nc                s   |   j| | d S )N)r   r   r4   )r   r   r   )rD   r!   r"   load_immediate  s    z<ImmediateLoader.create_row_processor.<locals>.load_immediateZdelayed)r0   r   )	rD   rG   rI   rJ   r8   rP   rK   rQ   r   r!   )rD   r"   rR     s    z$ImmediateLoader.create_row_processor)NN)rS   rT   rU   rW   rd   rO   rR   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 )N)rA   r   rB   rC   r   )rD   r2   rE   )rF   r!   r"   rB     s    zSubqueryLoader.__init__c             C   s   | j d| d S )N))r   r   )rC   ry   rd   )rD   r8   r!   r!   r"   rd     s    z#SubqueryLoader.init_class_attributeNc             K   st  |j jsd S |j jr |j d || j }||jdd }	|	d k	rH|	}
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d| d S )	Nr   path_with_polymorphic)Zsubquery_pathNloaderr   r   
orig_queryF)r	   _enable_eagerloads
_yield_per_no_yield_perrC   r4   r   r   r   PathRegistryrootcontainsr   r   lengthcontains_mapperr8   _get_leftmostr   _generate_from_original_queryentity_zeror   _attributesZ_set_enable_single_crit_prep_for_joinsZadd_columns_apply_joins_setup_options_setup_outermost_orderbyrb   )rD   rG   r   rI   rJ   rK   rL   r   rM   with_poly_entityeffective_entity	subq_pathleftmost_mapperleftmost_attrleftmost_relationshipr   
left_aliasr   to_join
local_attrparent_aliasr!   r!   r"   rO     sV    




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   )rl   rN   )r  r  r!   r"   r~   l  s   z0SubqueryLoader._get_leftmost.<locals>.<listcomp>)rI   r   Z_class_to_mapperr2   isarC   local_columns)rD   r  Zsubq_mapperZleftmost_propZleftmost_colsr  r!   )r  r  r"   r  \  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rx2tdd |D D ]}	t||	jszd|_
P qzW |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!   )rl   entr!   r!   r"   r~     s   z@SubqueryLoader._generate_from_original_query.<locals>.<listcomp>FTc             s   s   | ]}|j V  qd S )N)table)rl   rN   r!   r!   r"   rn     s    z?SubqueryLoader._generate_from_original_query.<locals>.<genexpr>)use_mapper_path)Z_cloneZ	correlate	_from_objZ_set_select_fromr.   rb   Zcolumn_descriptionsZ_adapt_col_listZ_set_entitiesdistinct_target_keyZ	_distinctr   ra   Z	_order_byr   Z_limit_offsetZwith_labelsr   r   AliasedClass)rD   r   r  r  r  Zorig_entityr   Ztarget_colsr  tZembed_qr  r!   r!   r"   r  t  s4    



z,SubqueryLoader._generate_from_original_queryc                s   g }t | }xZt|D ]N\}\}}|dkrT||d  d j}||rN|n|}	n|}	||	|jf qW t|dk r~| n.t|d d }
|
j	r|
j
 ntj|
j
dd jj} fdd|D }|| fS )	Nr   r   r   T)r  c                s    g | ]}t  jj| jqS r!   )r  r2   r  r   )rl   rN   )r  rD   r!   r"   r~     s   z2SubqueryLoader._prep_for_joins.<locals>.<listcomp>)r.   pairs	enumerater8   r  r0   r   r   r   r   r   r   r  rC   r  )rD   r  r  r  r"  ir8   r   Zprev_mapperZ	to_appendr   
local_colsr  r!   )r  rD   r"   r    s&    zSubqueryLoader._prep_for_joinsc             C   s<  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 }xP|r|d}	t|	d |	d }
|r|
|d d }
n
|
|}
||
 qW t||d d |d jg| t||d d |g }x|D ]}
|j|
dd}q W |S )	Nr   r   r   r!  c             S   s:   g | ]2}t |d  js$t|d  n|d  j|d fqS )r   r   )r   r   r   r  r   )rl   itemr!   r!   r"   r~     s   z/SubqueryLoader._apply_joins.<locals>.<listcomp>T)Zfrom_joinpoint)r   r  of_typepopr0   r2   join)rD   r   r  r  r  r  ZltjZmiddleinnerr&  attrr!   r!   r"   r    s0    



"

zSubqueryLoader._apply_joinsc             C   s(   | |}|j|j }|jr$|j|_|S )N)Z_with_current_pathZ_conditional_options_with_options_populate_existing)rD   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 )Nr   )rC   r   r  _target_adaptercopy_and_processr   r/   )rD   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.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 )N)subq)rD   r2  r!   r!   r"   rB   9  s    z(SubqueryLoader._SubqCollections.__init__c             C   s    | j d kr|   | j ||S )N)_data_loadr4   )rD   r   r   r!   r!   r"   r4   <  s    
z#SubqueryLoader._SubqCollections.getc             C   sJ   t t| _x8t| jdd D ]"\}}| j| dd |D  q W d S )Nc             S   s   | dd  S )Nr   r!   )xr!   r!   r"   r#   C  r   z7SubqueryLoader._SubqCollections._load.<locals>.<lambda>c             s   s   | ]}|d  V  qdS )r   Nr!   )rl   vvr!   r!   r"   rn   D  s    z8SubqueryLoader._SubqCollections._load.<locals>.<genexpr>)collectionsdefaultdictr.   r3  	itertoolsgroupbyr2  extend)rD   r   vr!   r!   r"   r4  A  s    z%SubqueryLoader._SubqCollections._loadc             C   s   | j d kr|   d S )N)r3  r4  )rD   r   r   r   r!   r!   r"   r   F  s    
z&SubqueryLoader._SubqCollections.loader)	rS   rT   rU   rV   r3  rB   r4   r4  r   r!   r!   r!   r"   _SubqCollections0  s   r=  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 )NzJ'%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?r7  c                s   g | ]} j | qS r!   )r@   )rl   rN   )rK   r!   r"   r~   k  s    z7SubqueryLoader.create_row_processor.<locals>.<listcomp>)r2   r5   r   implsupports_populationr   r   rC   r4   r   r   AssertionErrorr  r=  rb   r%   _create_collection_loader_create_scalar_loader)rD   rG   rI   rJ   r8   rP   rK   rQ   r2  r%  r7  r!   )rK   r"   rR   J  s,    

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!   )rl   rh   )r   r!   r"   r~   {  s    z_SubqueryLoader._create_collection_loader.<locals>.load_collection_from_subq.<locals>.<listcomp>r!   )r4   tupler   r   set_committed_value)r   r   r   
collection)r7  r%  rD   )r   r"   load_collection_from_subqy  s    zKSubqueryLoader._create_collection_loader.<locals>.load_collection_from_subqc                s   j |kr | || d S )N)r   )r   r   r   )rF  rD   r!   r"   &load_collection_from_subq_existing_row  s    
zXSubqueryLoader._create_collection_loader.<locals>.load_collection_from_subq_existing_rowrv   existingeager)r0   r   invoke_all_eagersr   )rD   rG   r7  r%  rQ   rG  r!   )r7  rF  r%  rD   r"   rA  v  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!   )rl   rh   )r   r!   r"   r~     s    zWSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subq.<locals>.<listcomp>)Nr   zLMultiple rows returned with uselist=False for eagerly-loaded attribute '%s' r   )r4   rC  r   r   r   r   r   rD  )r   r   r   rE  Zscalar)r7  r%  rD   )r   r"   load_scalar_from_subq  s    zCSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subqc                s   j |kr | || d S )N)r   )r   r   r   )rK  rD   r!   r"   "load_scalar_from_subq_existing_row  s    
zPSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subq_existing_rowrv   rH  rI  )r0   r   rJ  r   )rD   rG   r7  r%  rQ   rL  r!   )r7  rK  r%  rD   r"   rB    s    z$SubqueryLoader._create_scalar_loader)NN)rS   rT   rU   rW   rB   rd   rO   r  r  r  r  r	  r
  objectr=  rR   rA  rB  rX   r!   r!   )rF   r"   r     s    
[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 )N)rA   rN  rB   rC   r   rO  )rD   r2   rE   )rF   r!   r"   rB     s    
zJoinedLoader.__init__c             C   s   | j d| d S )N))r   r   )rC   ry   rd   )rD   r8   r!   r!   r"   rd     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	rt|j}
nd}
|| j }tj|| j|||||
| j|d	 |dk	r:dt|jkr:t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   rC   _init_user_defined_eager_proc$_setup_query_on_user_defined_adapterr   r   r   r  r  r8   _generate_row_adapterr4   r   Zwith_polymorphic_mappersr   r   Z_setup_entity_queryrb   secondary_columnsr   r   )rD   rG   rH   rI   rJ   rK   rL   r   rQ  rM   rP  user_defined_adapterclausesadd_to_collectionr  r!   r!   r"   rO     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}nB||jdr||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   )rr   rI   r2   r4   r   r{   strr   aliasr   ZColumnAdapterr8   r   r   r   
ORMAdapterr	   Z_polymorphic_adaptersrb   )	rD   rJ   rG   rI   rK   r\  Zroot_mapperr   r  r!   r!   r"   rR    s2    




z*JoinedLoader._init_user_defined_eager_procc             C   sZ   | |j|}|r2|r2||}||jd| n|rJ|}||jd| |j}|||fS )NrY  )Z_get_entity_clausesr	   wraprb   r   primary_columns)rD   rG   r   rI   rK   rV  rX  r!   r!   r"   rS  M  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`  r  )r   r   r   
selectabler   r   rO  r   r  r8   r\  rN   r0   )rD   rG   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 k	sXt
| jjrfd|_|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)r4   r   rd  r   Z_memor   r]  r8   r   aliased_classr@  rC   r%   multi_row_eager_loadersrr   re  Zcreate_eager_joinsr0   _create_eager_joinrU  rb   )rD   rG   r   rI   rJ   rK   rL   r   rQ  r  rc  rW  re  rX  r!   r!   r"   rT    s@    
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|_ |sxDt!| jj"D ]2}|	j#j$%|r|r|j&| }|j'(| qW | 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   rg  T)r  Zunnested)isouter
_left_memo_right_memo)/r8   rh  r	   Z_should_nest_selectableZeager_joinsZfrom_clauser   Z#find_left_clause_that_matches_givenra  r   r   r   
setdefaultr  r   rg  Z_entity_for_mapperr  r2   r   r   rC   r   r  r@  r  Zrepresents_outer_join_ORMJoinr{   r   ZJoin_splice_nested_inner_joinZstop_onZ_find_columnsZprimaryjoinZpersist_selectablerN   Zcontains_columnr@   r_  r0   r   r1  r.  r/  r   r/   )rD   rG   rH   rI   rK   r   rW  re  rQ  r   Zshould_nest_selectableZquery_entity_keyZindexesZclauseZdefault_towrapZtowrapZefmonclauseZattach_on_outsider0  rh   r!   r!   r"   ri    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 )	NFrZ  r!  )rj  rk  rl  z9assertion failed attempting to produce joined eager loadsT)rj  rk  )rj  rl  )r{   r   rn  r@  r   ra  ZFromGroupingro  elementrg  r8   rightrl  leftrk  rj  Z_splice_into_centerrp  r.  )	rD   rI   Zjoin_objrW  rp  ZsplicingZtarget_joinZright_splicer0  r!   r!   r"   ro  X  sV    

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 )NFrf  )rR  rK   r^  r4   r   r8   Z_result_has_identity_key)rD   rG   rP   rK   rI   rJ   rV  	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 )NzJ'%s' does not support object population - eager loading cannot be applied.F))r   r   )r2   r5   r   r>  r?  r   r   rC   ru  r   Z_instance_processorr8   r   r%   rB  rA  ry   rR   )rD   rG   rI   rJ   r8   rP   rK   rQ   Zour_pathZeager_adapterr   	_instancer!   r!   r"   rR     s,    
z!JoinedLoader.create_row_processorc                sr    fdd} fdd} fdd}|d  | j|f |d  | j|f jrn|d	  | j|f d S )
Nc                sF   t | |}t|d}|j | f<  |}|d k	rB|| d S )Nappend_without_event)r   init_state_collectionr   UniqueAppenderr0   )r   r   r   rE  result_listinst)rv  rG   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 )Nrw  )r   rx  r   ry  r0   )r   r   r   rz  rE  r{  )rv  rG   r   r!   r"   (load_collection_from_joined_existing_row  s    
zXJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_existing_rowc                s    | d S )Nr!   )r   r   r   )rv  r!   r"    load_collection_from_joined_exec  s    zPJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_execrv   rH  rI  )r0   r   rJ  )rD   rG   r   rv  rQ   r|  r}  r~  r!   )rv  rG   r   r"   rA    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 )Nr!   )r   r   r   )rv  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 )NzLMultiple rows returned with uselist=False for eagerly-loaded attribute '%s' )r   r   )r   r   r   rH  )rv  r   rD   r!   r"   $load_scalar_from_joined_existing_row  s    
zPJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_existing_rowc                s    | d S )Nr!   )r   r   r   )rv  r!   r"   load_scalar_from_joined_exec&  s    zHJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_execrv   rH  rI  )r0   r   rJ  )rD   rG   r   rv  rQ   r  r  r  r!   )rv  r   rD   r"   rB    s    z"JoinedLoader._create_scalar_loader)NNF)F)rS   rT   rU   rV   rW   rB   rd   rO   rR  rS  rd  rT  ri  ro  ru  rR   rA  rB  rX   r!   r!   )rF   r"   rN    s$     
W/#? 
E',rN  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 )N))r   r   r   T)r   r   )rA   r  rB   rC   r   r7   r   r   r  ry   r   r2   r   rk   r   r   _init_for_omit_join_m2or  _init_for_joinr  _init_for_omit_join)rD   r2   rE   Zis_m2o
lazyloader)rF   r!   r"   rB   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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)r2   r   r4   )rl   r   equiv)pk_to_fkrD   r!   r"   rn   o  s   z5SelectInLoader._init_for_omit_join.<locals>.<genexpr>c                s   g | ]}| kr | qS r!   r!   )rl   rh   )r  r!   r"   r~   u  s    z6SelectInLoader._init_for_omit_join.<locals>.<listcomp>r   Fr   T)r   rC   r   Zlocal_remote_pairsr   r.   r2   ra   r   r   tuple_
query_info)rD   r  Zfk_colsr  r  r!   )r  rD   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   T))r   r   c                s   g | ]} j | qS r!   )r   )rl   r   )r  r!   r"   r~     s    z:SelectInLoader._init_for_omit_join_m2o.<locals>.<listcomp>)r8   ra   r   r   r  rC   ry   r  )rD   r  r  r  Zlookup_colsr!   )r  r"   r    s    
z&SelectInLoader._init_for_omit_join_m2oc                sj   t | jj| _t| j  fdd| jjD }t|dkrJtj| }d}n|d }d}| 	dd|||d S )Nc                s   g | ]}  |qS r!   )_adapt_element)rl   rh   )pa_inspr!   r"   r~     s    z1SelectInLoader._init_for_join.<locals>.<listcomp>r   Fr   T)
r   r2   r6   r  r   ra   r   r   r  r  )rD   r  r  r  r!   )r  r"   r    s    

zSelectInLoader._init_for_joinc             C   s   | j d| d S )N))r   r   )rC   ry   rd   )rD   r8   r!   r!   r"   rd     s    z#SelectInLoader.init_class_attributezsqlalchemy.ext.bakedc             C   s   |j ddS )Nr   )r   )r   )rD   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|}n| j}|	|jds| jr|
jd | jkrd S n|
| jrd S tj||| j | j| j| d S )NzJ'%s' does not support object population - eager loading cannot be applied.r!  r   r   r   )r2   r5   r   r>  r?  r   r   r	   r   r   r   r   Z_entity_isar   ZPostLoadZpath_existsrC   r4   r   r   r   r   r  r  r8   Zcallable_for_path_load_for_path)rD   rG   rI   rJ   r8   rP   rK   rQ   Zselectin_pathZpath_w_propZselectin_path_w_propr  r  r!   r!   r"   rR     s>    

z#SelectInLoader.create_row_processorc                sF  |rj |krd S j}|jrtt}g }	jxr|D ]j\}
j	t	fdd|j	D }t
j|krtj}P d |kr|| 	|
f q8|		|
f q8W |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rv|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)rl   Zlk)r8   r   
state_dictr!   r"   rn     s   z0SelectInLoader._load_for_path.<locals>.<genexpr>c             S   s$   g | ]\}}|j d  ||j|fqS )r   )r   r   )rl   r   	overwriter!   r!   r"   r~   
	  s   z1SelectInLoader._load_for_path.<locals>.<listcomp>c                s   g | ]}  |qS r!   )r  )rl   rh   )inspr!   r"   r~   	  s    c                s   g | ]}  |qS r!   )r  )rl   rh   )r  r!   r"   r~   	  s    c                s   |  t jd  S )Nr   )r   )r	   ZBundle)r   )r  r  r!   r"   r#   	  s   z/SelectInLoader._load_for_path.<locals>.<lambda>c                s
   |   S )N)r   )r   )r  r!   r"   r#   +	  r   c                s    |  tjj S )N)r   r)  r  rC   r   r'  )r   )r  parD   r!   r"   r#   2	  s   
c                s   |   tjdddS )Nprimary_keysT)	expanding)r   in_r   r   )r   )r  r!   r"   r#   ;	  s   c                s   |   tjdddS )Nr  T)r  )r   r  r   r   )r   )r  r!   r"   r#   A	  s   c             S   s   |   S )N)r   )r   r!   r!   r"   r#   M	  r   c                s   g | ]}  |qS r!   )r  )rl   elem)r  r!   r"   r~   T	  s    c                s
   | j   S )N)r   )r   )r1  r!   r"   r#   V	  r   c                s&   | j d }| j|jt jj S )Nr   )r  r   r.  r/  r   r/   rC   )r   r0  )rD   r!   r"   r
  Y	  s    
z?SelectInLoader._load_for_path.<locals>._setup_outermost_orderby)r   r  r  r7  r8  r.   r2   r   rC  r  r   r   r  r0   r  r  r  r   r   r  r   r   r  r	   r   r,  rC   r-  r   _load_via_child_load_via_parent)rD   r   rG   rI   Zstates	load_onlyr  r  
our_statesnone_statesr  Zrelated_identr   r   r
  r!   )
r1  r  r  r  r8   r  r  rD   r   r  r"   r    sx    




zSelectInLoader._load_for_pathc                s   | j }t|}x|r|d| j }|| jd  }dd ||jj fdd|D dD }	x`|D ]X}
|	|
d }xF||
 D ]:\}}}|s| j|krqz|| j|||s|n|g qzW q`W qW x8|D ]0\}}}|s| j|krq|| j||d  qW d S )Nr   c             S   s   i | ]\}}||qS r!   r!   )rl   r   r<  r!   r!   r"   
<dictcomp>u	  s   z2SelectInLoader._load_via_child.<locals>.<dictcomp>c                s   g | ]} j r|d  n|qS )r   )r  )rl   r   )r  r!   r"   r~   y	  s    z2SelectInLoader._load_via_child.<locals>.<listcomp>)r  )	r%   sorted
_chunksizer   r   r4   r   r   rD  )rD   r  r  r  r   rG   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 }x|r$|d| j }|| jd  } fdd|D }tt}	xBt||jj|ddd D ] \}
}|	|
 	dd	 |D  qtW x|D ]\}}}}|s| j
|krq|	||}|s|rt|d
krtd|   || j
|||d  q|| j
||| qW qW d S )Nr!   r   c                s&   g | ]\}}}} j r|d  n|qS )r   )r  )rl   r   r   r  r  )r  r!   r"   r~   	  s   z3SelectInLoader._load_via_parent.<locals>.<listcomp>)r  c             S   s   | d S )Nr   r!   )r5  r!   r!   r"   r#   	  r   z1SelectInLoader._load_via_parent.<locals>.<lambda>c             s   s   | ]}|d  V  qdS )r   Nr!   )rl   r6  r!   r!   r"   rn   	  s    z2SelectInLoader._load_via_parent.<locals>.<genexpr>r   zLMultiple rows returned with uselist=False for eagerly-loaded attribute '%s' )r%   r  r7  r8  r.   r9  r:  r   r   r;  r   r4   r   r   r   r   rD  )rD   r  r  r   rG   r%   Z_empty_resultr  r  r  r   r<  r   r   r  r  rE  r!   )r  r"   r  	  s2    


zSelectInLoader._load_via_parent)rS   rT   rU   rW   r7  
namedtupler  r  rB   r  r  r  rd   r   r   r   rR   r  r  r  rX   r!   r!   )rF   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 k	rP|j  j krP|t|}|rP||k	rPtjdt|| j f dd|S )NzsInstance %s is already associated with an instance of %s via its %s attribute, and is only allowed a single parent.Zbbf1)code)	r   	hasparentr   Zinstance_stater   r   r   Zinstance_strr6   )r   r   oldvalue	initiatorr  )r   r!   r"   	_do_check	  s    z*single_parent_validator.<locals>._do_checkc                s    | |d |S )Nr!   )r   r   r  )r  r!   r"   r0   	  s    z'single_parent_validator.<locals>.appendc                s    | |||S )Nr!   )r   r   r  r  )r  r!   r"   set_	  s    z%single_parent_validator.<locals>.set_r0   T)rawretvalr+   rb   )r   listen)r   r   r0   r  r!   )r  r   r"   r1   	  s    r1   )NNNNFN)8rV   
__future__r   r7  r9   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_forr?   Zclass_loggerrY   rj   rs   rM  r   r   ZRelationshipPropertyr   r   ZMemoizedSlotsr   r   r   r   rN  r  r1   r!   r!   r!   r"   <module>	   s        
M#
B
E 

   ;
   ?        