o
    iU                    @   s  d Z ddlmZ ddlZddlZddlmZ ddlmZ ddlm	Z	 ddlm
Z
 dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddl	mZ ddl	mZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ  ddlm!Z! 						dKddZ"ej#j$dddG dd  d eZ%ej&ej#j$d!ddG d"d# d#eZ'ej&ej#j$d!d$G d%d& d&e'Z(ej&ej#j$d!d!d'ej#j$d!d(G d)d* d*eZ)G d+d, d,e*Z+G d-d. d.eZ,ej&ej-j$d!d(G d/d0 d0eZ.ej&ej-j$d1d2ej-j$dd2G d3d4 d4e,Z/ej&ej-j$d!d2ej-j$d5d2ej-j$d6d2ej-j$d7d2ej-j$d8d2G d9d: d:e,ej0Z1G d;d< d<e*Z2ej-j$d=d2G d>d? d?e,Z3ej&ej-j$d@d2G dAdB dBe,Z4ej&ej-j$dCd2ej-j$dd2G dDdE dEe,Z5ej&ej-j$dFd2G dGdH dHe,ej0Z6dIdJ Z7dS )LzWsqlalchemy.orm.interfaces.LoaderStrategy
   implementations, and related MapperOptions.    )absolute_importN   )
attributes)exc)
interfaces)loading)
properties)query)
unitofwork)util)_DEFER_FOR_STATE)_SET_DEFERRED_EXPIRED)LoaderStrategy)StrategizedProperty)_state_session)InstanceState)	_none_set)aliased   )event)inspect)log)sql)visitorsFc	                    s6  t tj| jg d}
g }|o| j|r| jr|t | j| j	j
v r5| j	j
| j \|fdd |r=|tj |rQ| j  rQ| jrQ| fdd |jD ]D}| |j| ju r|j| jstj|j| jf| |||
|o|| jp|| jtju ||||| p| j | jd|	}|D ]}|||  qqTd S )N)defaultc                    s   t j| |j fi S N)orm_util_validator_eventskeydescprop)fnopts T/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/sqlalchemy/orm/strategies.py<lambda>B   s
    z%_register_attribute.<locals>.<lambda>c                    s   t |  S r   )r   backref_listenersr   )backrefuselistr$   r%   r&   P   s    )parent_tokenr)   compare_function	useobject	extensiontrackparenttypecallable	callable_active_history
impl_classsend_modified_eventsdoc)listr   to_listr-   r)   single_parentappendsingle_parent_validatorr   parent
validatorsr
   track_cascade_eventsback_populates_effective_sync_backrefself_and_descendants_propsgetclass_manager_attr_has_implr   register_attribute_implclass_	directionr   	ONETOMANYviewonlyr4   )r!   mapperr,   r+   r/   r0   proxy_propertyr1   r2   kwattribute_extlisten_hooksmr    hookr$   )r(   r"   r#   r)   r%   _register_attribute)   sb   





rP   )
instrumentdeferredc                       s8   e Zd ZdZdZ fddZ	d
ddZdd	 Z  ZS )UninstrumentedColumnLoaderzRepresent a non-instrumented MapperProperty.

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

    columnsc                        t t| || | jj| _d S r   )superrS   __init__parent_propertyrU   selfr:   strategy_key	__class__r$   r%   rX         z#UninstrumentedColumnLoader.__init__Nc           	      K   s(   | j D ]}|r|j | }|| qd S r   )rU   r8   )	r[   contextquery_entitypathloadoptadaptercolumn_collectionkwargscr$   r$   r%   setup_query   s
   


z&UninstrumentedColumnLoader.setup_queryc                 C      d S r   r$   )r[   r`   rb   rc   rI   resultrd   
populatorsr$   r$   r%   create_row_processor   s   z/UninstrumentedColumnLoader.create_row_processorr   )	__name__
__module____qualname____doc__	__slots__rX   rh   rl   __classcell__r$   r$   r]   r%   rS      s    
rS   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`.)rU   is_compositec                    s.   t t| || | jj| _t| jd| _d S )Ncomposite_class)rW   rs   rX   rY   rU   hasattrrt   rZ   r]   r$   r%   rX      s   
zColumnLoader.__init__c                 K   sJ   | j D ]}	|r|j |	 }	||	 q| j d }
|r|j |
 }
|
|| j< d S Nr   )rU   r8   rY   )r[   r`   ra   rb   rc   rd   re   memoized_populatorsrf   rg   fetchr$   r$   r%   rh      s   



zColumnLoader.setup_queryc                 C   sP   d| _ | jd j}| jjp| jd jp|jt| jv }t| j|d|j	|d d S )NTr   F)r,   r+   r1   )
is_class_levelrU   typerY   r1   primary_keyversion_id_colsetrP   compare_values)r[   rI   coltyper1   r$   r$   r%   init_class_attribute   s   

z!ColumnLoader.init_class_attributec           
      C   s\   | j D ]}|r|j | }||d}	|	r!|d | j|	f  d S q|d | jdf d S )NFquickexpireT)rU   _getterr8   r   )
r[   r`   rb   rc   rI   rj   rd   rk   colgetterr$   r$   r%   rl      s   

z!ColumnLoader.create_row_processor)
rm   rn   ro   rp   rq   rX   rh   r   rl   rr   r$   r$   r]   r%   rs      s    rs   )query_expressionc                       s4   e Zd Z fddZdd Zdd Zdd Z  ZS )	ExpressionColumnLoaderc                    s:   t t| || t  t fdd| jjD | _d S )Nc                 3   s    | ]	}|   V  qd S r   )compare.0rg   nullr$   r%   	<genexpr>   s    
z2ExpressionColumnLoader.__init__.<locals>.<genexpr>)	rW   r   rX   r   r   anyrY   rU   _have_default_expressionrZ   r]   r   r%   rX      s
   zExpressionColumnLoader.__init__c                 K   s   d }	|rd|j v r|j d g}	n| jr| jj}	|	d u rd S |	D ]}
|r(|j|
 }
||
 q|	d }|r9|j| }||| j< d S )N
expressionr   )
local_optsr   rY   rU   r8   )r[   r`   ra   rb   rc   rd   re   rx   rf   rU   rg   ry   r$   r$   r%   rh      s   

z"ExpressionColumnLoader.setup_queryc                 C   s|   |r:d|j v r<|j d g}|D ]}	|r|j|	 }	||	d}
|
r-|d | j|
f  d S q|d | jdf d S d S d S )Nr   Fr   r   T)r   rU   r   r8   r   )r[   r`   rb   rc   rI   rj   rd   rk   rU   r   r   r$   r$   r%   rl     s   
z+ExpressionColumnLoader.create_row_processorc                 C   s(   d| _ t| j|d| jd jjdd d S )NTFr   )r,   r+   accepts_scalar_loader)rz   rP   rY   rU   r{   r   r[   rI   r$   r$   r%   r   "  s   
z+ExpressionColumnLoader.init_class_attribute)rm   rn   ro   rX   rh   rl   r   rr   r$   r$   r]   r%   r      s
    r   )rR   rQ   )
do_nothingc                       sH   e Zd ZdZdZ fddZdd Zdd Z		dd
dZdd Z	  Z
S )DeferredColumnLoaderzAProvide loading behavior for a deferred :class:`.ColumnProperty`.)rU   groupc                    s>   t t| || t| jdrtd| jj| _| jj| _d S )Nru   z8Deferred loading for composite types not implemented yet)rW   r   rX   rv   rY   NotImplementedErrorrU   r   rZ   r]   r$   r%   rX   6  s   
zDeferredColumnLoader.__init__c           	      C   s>   | j s| jj}|d | j|f d S |d | jdf d S )Nnewr   F)rz   rY   _deferred_column_loaderr8   r   )	r[   r`   rb   rc   rI   rj   rd   rk   set_deferred_for_local_stater$   r$   r%   rl   ?  s
   z)DeferredColumnLoader.create_row_processorc                 C   s,   d| _ t| j|d| jd jj| jdd d S )NTFr   )r,   r+   r0   expire_missing)rz   rP   rY   rU   r{   r   _load_for_stater   r$   r$   r%   r   O  s   
z)DeferredColumnLoader.init_class_attributeNc	           
      K   s   |rd|j v rt| j| jjs'|r | jr |j d| j ds'|r<| j|v r<| j	
dj|||||||fi |	 d S | jrFt|| j	< d S t|| j	< d S )Nundefer_pkszundefer_group_%sF))rR   F)rQ   T)r   r~   rU   intersectionr:   _should_undefer_in_wildcardr   rA   r   rY   _get_strategyrh   rz   r   r   )
r[   r`   ra   rb   rc   rd   re   rx   only_load_propsrK   r$   r$   r%   rh   [  sF   





z DeferredColumnLoader.setup_queryc                    s   j stjS |tj@ stjS jj} jr  fdd|jD }n j g}fdd|D }t	}|d u rBt
dt j f ||}tj|j |dd u rXt
tjS )Nc                    s4   g | ]}t |trt |jtr|j jkr|jqS r$   )
isinstancer   strategyr   r   r   )r   pr[   r$   r%   
<listcomp>  s    
z8DeferredColumnLoader._load_for_state.<locals>.<listcomp>c                    s   g | ]	}| j v r|qS r$   )
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   refresh_state)r   r   
ATTR_EMPTYSQL_OKPASSIVE_NO_RESULTmanagerrI   r   iterate_propertiesr   orm_excDetachedInstanceErrorr   	state_strr	   r   load_on_identObjectDeletedErrorATTR_WAS_SET)r[   r   passivelocalparenttoloadr   sessionr	   r$   )r[   r   r%   r     s4   




z$DeferredColumnLoader._load_for_stater   )rm   rn   ro   rp   rq   rX   rl   r   rh   r   rr   r$   r$   r]   r%   r   .  s    	
/r   c                   @   &   e Zd ZdZdd ZejfddZdS )LoadDeferredColumnsz7serializable loader object used by DeferredColumnLoaderc                 C   
   || _ d S r   r   )r[   r   r$   r$   r%   rX        
zLoadDeferredColumns.__init__c                 C   s.   | j }|jj}|j| }|jt }|||S r   )r   r   rI   r@   _strategiesr   r   )r[   r   r   r   r   r!   r   r$   r$   r%   __call__  s
   

zLoadDeferredColumns.__call__Nrm   rn   ro   rp   rX   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.)rI   targetr)   entityc                    s>   t t| || | jj| _| jj| _| jj| _| jj| _d S r   )rW   r   rX   rY   rI   r   r   r)   rZ   r]   r$   r%   rX     s
   


z#AbstractRelationshipLoader.__init__)rm   rn   ro   rp   rq   rX   rr   r$   r$   r]   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)rm   rn   ro   rp   r$   r$   r$   r%   r     s    r   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/   )rz   rP   rY   collection_classr   r$   r$   r%   r     s   
zNoLoader.init_class_attributec           	         $    fdd}|d   j|f d S )Nc                    s.    j r| j j| | d S d | j< d S r   )r)   r   get_implr   
initializer   dict_rowr   r$   r%   invoke_no_load  s   z5NoLoader.create_row_processor.<locals>.invoke_no_loadr   r8   r   )	r[   r`   rb   rc   rI   rj   rd   rk   r   r$   r   r%   rl     s   zNoLoader.create_row_processorN)rm   rn   ro   rp   rq   r   rl   r$   r$   r$   r%   r     s
    
r   selectraiseraise_on_sqlbaked_selectc                       s   e Zd ZdZdZ fddZdd Zdd Zd	d
 Zdd Z	dd Z
dd Zeddd Zeddd Zdd Z  ZS )
LazyLoaderz|Provide loading behavior for a :class:`.RelationshipProperty`
    with "lazy=True", that is loads when first accessed.

    )
_lazywhere_rev_lazywhereuse_getis_aliased_class_bind_to_col_equated_columns_rev_bind_to_col_rev_equated_columns_simple_lazy_clause_raise_always_raise_on_sql_bakeryc                    s  t t| || | jd dk| _| jd dk| _t| jj| _| j	j
}| \| _| _| _|jdd\| _| _| _| jd| | j | j oY| j oY| jjd j| jd| jjd| _| jrt| jD ]}|| jjv r|| jj| D ]
}| j| | j|< qqqc| jd	|  d S d S )
Nr   r   r   T)reverse_directionz%s lazy loading clause %sr   use_proxiesequivalentsz2%s will use query.get() to optimize instance loads)rW   r   rX   strategy_optsr   r   r   r   r   rY   _join_conditioncreate_lazy_clauser   r   r   r   r   r   loggerinfor)   _get_clauser   rI   _equivalent_columnsr   r5   )r[   r:   r\   join_conditionr   rg   r]   r$   r%   rX     sF   


zLazyLoader.__init__c                 C   sD   d| _ | jjp| jjtjup| j }t| j|d| j| jj	|d d S )NT)r,   r0   r/   r1   )
rz   rY   r1   rF   r   	MANYTOONEr   rP   r   r   )r[   rI   r1   r$   r$   r%   r   J  s   
zLazyLoader.init_class_attributec                    sT   | j | j} g dd }t|i d|i  fdd}t|i d|i}|fS )Nc                 S   s
   d| _ d S NF)unique	bindparamr$   r$   r%   visit_bindparamg  r   zFLazyLoader._memoized_attr__simple_lazy_clause.<locals>.visit_bindparamr   c                    sL   | j  v r| j | j  d f d S | jd u r$| jd | jf d S d S r   )_identifying_keyr8   r   callablevaluer   bind_to_colparamsr$   r%   r   l  s   

)r   r   r   traversecloned_traverse)r[   	criterionr   r$   r   r%   "_memoized_attr__simple_lazy_clauseb  s   
z-LazyLoader._memoized_attr__simple_lazy_clausec                 C   s   | j \}}|d u rt|dd |D S | jj}| }t|}|tj@ r+|tjN }i }|D ]%\}	}
}|
d urP|rH|tj	@ rH|
|||
|}n||||
|}|||	< q/||fS )Nc                 S   s   g | ]\}}}|qS r$   r$   )r   r   identr   r$   r$   r%   r         z4LazyLoader._generate_lazy_clause.<locals>.<listcomp>)r   sql_utiladapt_criterion_to_nullrY   r:   objr   instance_dictINIT_OKLOAD_AGAINST_COMMITTED#_get_committed_state_attr_by_column_get_state_attr_by_column)r[   r   r   r   
param_keysrI   or   r   r   r  r   r$   r$   r%   _generate_lazy_clause~  s,   




z LazyLoader._generate_lazy_clausec                 C   s   t d| |f )Nz&'%s' is not available due to lazy='%s')sa_excInvalidRequestError)r[   r   r   r   r$   r$   r%   _invoke_raise_load  s   
zLazyLoader._invoke_raise_loadc                 C   sR  |j s| jjs
|jr|jstjS |j  }d }|tj@ s| jr%|tj	@ s(|r(tj
S | jr?|tj@ s?| jr8|tj@ r?| ||d t|}|sZ|tj@ rMtj
S tdt|| j f | jr| |||}tj
|v rltj
S tj|v rttjS t|r{d S | j| j|||d}|d ur|tju rd S |S |tj@ r|tj@ stj
S | ||||S )Nr   zbParent instance %s is not bound to a Session; lazy load operation of attribute '%s' cannot proceed)r   lazy_loaded_from)r   rY   load_on_pending_load_pending
session_idr   r   r   r   NON_PERSISTENT_OKr   r   NO_RAISERELATED_OBJECT_OKr  r   r   r   r   r   _get_ident_for_use_get	NEVER_SETr   
issupersetr	   _identity_lookupr   PASSIVE_CLASS_MISMATCH_emit_lazyload)r[   r   r   pendingprimary_key_identityr   instancer$   r$   r%   r     s|   




zLazyLoader._load_for_statec                    sD   j j}tj@ r|jn|jj  fddjjD S )Nc                    s"   g | ]} j | d qS )r   r   r   pkr   get_attrr   r[   r   r$   r%   r     s    z5LazyLoader._get_ident_for_use_get.<locals>.<listcomp>)r   rI   r   r	  r
  r  dictr|   )r[   r   r   r   instance_mapperr$   r&  r%   r    s   
z!LazyLoader._get_ident_for_use_getsqlalchemy.ext.bakedc                 C      |j ddS N2   )sizebakeryr[   bakedr$   r$   r%   _memoized_attr__bakery
     z!LazyLoader._memoized_attr__bakeryzsqlalchemy.orm.strategy_optionsc                    s   fdd}|dd j jjs|jdd jjd ur,|fdd j }|s7|tj@ r>|dd  j	rNj
j }|j	| jrnjr[|d ||fd	d|j|S jjr{|fd
d jjD ]jtju rjrtjts|fdd q|\ |rttj ! rd S nttj"! rd S jrƈ|d | fdd fdd}	||fdd|	# }
j$r|
S t%|
}|r|dkrt&dj  |
d S d S )Nc                    s   |   jS r   )r	   r   r   r   r$   r%   r&   )      z+LazyLoader._emit_lazyload.<locals>.<lambda>c                 S   s   |   dS r   )_adapt_all_clauses_with_invoke_all_eagersqr$   r$   r%   r&   ,  s    T)fullc                    s   |   j jjS r   )select_fromrI   rY   	secondaryr9  r   r$   r%   r&   5  s    
c                 S   s
   |  dS r   )	autoflushr9  r$   r$   r%   r&   >     
 r   c                    
   |   S r   _set_lazyload_fromr9  r   r$   r%   r&   P  r?  c                    s   | j t jj  S r   )order_byr   r6   rY   r9  r   r$   r%   r&   X  s    c                    s"   |  j| j j  jS r   )optionsLoadfor_existing_path_current_pathr:   lazyloadr   r9  )revstrategy_optionsr$   r%   r&   g  s    
c                    r@  r   )filterr9  )lazy_clauser$   r%   r&   z  r?  c                    s     | j  | _| S r   )update_paramsr9  )r   r$   r%   set_default_params~  s   z5LazyLoader._emit_lazyload.<locals>.set_default_paramsc                    r@  r   rA  r9  r   r$   r%   r&     r?  r   zKMultiple rows returned with uselist=False for lazily-loaded attribute '%s' r   )'r   add_criteriarY   bake_queriesspoilr=  r   r   NO_AUTOFLUSHload_options	load_path_add_lazyload_optionsr   r   r  with_post_criteria_load_on_pk_identityr	   rI   rC  _reverse_propertyrF   r   r   _use_getr   r   r   r  r   has_intersectionr   r   values
_never_setallr)   lenwarn)r[   rJ  r   r   r   r   r:  r  effective_pathrO  rj   lr$   )rL  r   rI  r[   r   rJ  r%   r    s   


zLazyLoader._emit_lazyloadc           
         sn   | j  | jst|jt |  }|d | j |f d S |js#|jr5 fdd}	|d | j |	f d S d S )Nr   c                    s   |  |  d S r   )_resetr   r   r$   r%   reset_for_lazy_callable  s   	z@LazyLoader.create_row_processor.<locals>.reset_for_lazy_callable)	r   rz   r   "_instance_level_callable_processorrB   LoadLazyAttributer8   populate_existingalways_refresh)
r[   r`   rb   rc   rI   rj   rd   rk   set_lazy_callablerd  r$   r   r%   rl     s   
zLazyLoader.create_row_processor)rm   rn   ro   rp   rq   rX   r   r  r  r  r   r  r   dependenciesr3  r  rl   rr   r$   r$   r]   r%   r     s     1 X

 r   c                   @   r   )rf  z-serializable loader object used by LazyLoaderc                 C   s   || _ |j| _d S r   )r   r\   )r[   r   initiating_strategyr$   r$   r%   rX     s   zLoadLazyAttribute.__init__c                 C   s0   | j }|jj}|j| }|j| j }|||S r   )r   r   rI   r@   r   r\   r   )r[   r   r   r   r)  r!   r   r$   r$   r%   r     s
   
zLoadLazyAttribute.__call__Nr   r$   r$   r$   r%   rf    s    rf  	immediatec                   @   s.   e Zd ZdZdd Z		d	ddZdd ZdS )
ImmediateLoaderr$   c                 C      | j d| d S N)r   r   rY   r   r   r   r$   r$   r%   r        z$ImmediateLoader.init_class_attributeNc           	      K   ri   r   r$   )	r[   r`   r   rb   rc   rd   re   parentmapperrf   r$   r$   r%   rh     s   zImmediateLoader.setup_queryc           	         r   )Nc                    s   |   j| | d S r   )r   r   rA   r   r   r$   r%   load_immediate  s   z<ImmediateLoader.create_row_processor.<locals>.load_immediatedelayedr   )	r[   r`   rb   rc   rI   rj   rd   rk   rt  r$   r   r%   rl     s   z$ImmediateLoader.create_row_processorNN)rm   rn   ro   rq   r   rh   rl   r$   r$   r$   r%   rm    s    
rm  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                    rV   r   )rW   rx  rX   rY   ry  rZ   r]   r$   r%   rX     r_   zSubqueryLoader.__init__c                 C   rn  ro  rq  r   r$   r$   r%   r     rr  z#SubqueryLoader.init_class_attributeNc                 K   st  |j jsd S |j jr|j d || j }||jdd }	|	d ur$|	}
n| j}
|jdtj	j
}|| }||jds\| jrT|j jrG|j jjnd|j d | jkrSd S n|| jr\d S | |\}}}|jdtf|j }| |||||j}|j |
}dtf|d|i|_|d}| ||\}}}|j| }| |||||
}| ||||
}| |}||jd| d S )	Nrw  path_with_polymorphic)subquery_pathNloaderr   r   
orig_queryF)r	   _enable_eagerloads
_yield_per_no_yield_perrY   rA   r   r   r   PathRegistryrootcontainsry  rG  lengthcontains_mapperrI   _get_leftmostrx  _generate_from_original_queryentity_zeror   _attributes_set_enable_single_crit_prep_for_joinsadd_columns_apply_joins_setup_options_setup_outermost_orderbyr~   )r[   r`   r   rb   rc   rd   re   rs  rf   with_poly_entityeffective_entity	subq_pathleftmost_mapperleftmost_attrleftmost_relationshipr}  
left_aliasr:  to_join
local_attrparent_aliasr$   r$   r%   rh     sx   
	





zSubqueryLoader.setup_queryc                    sp   j td }| j|r| jd u r| j| j }n|d  }|j} fdd|D } ||fS )Nr   r   c                    s$   g | ]}t d  j j| jqS r   )getattrr   _columntopropertyr   r   r  r  r$   r%   r   k  s    z0SubqueryLoader._get_leftmost.<locals>.<listcomp>)rb   r   _class_to_mapperr:   isarY   local_columns)r[   r  subq_mapperleftmost_propleftmost_colsr  r$   r  r%   r  \  s   

zSubqueryLoader._get_leftmostc                 C   s   |  d }|js|ttdd |jD d ||}|| |j	}|du r/d|_
n|d u rLtdd |D D ]}	t||	jsKd|_
 nq<|jdu rU|j|_|jd u rb|jd u rbd |_|  }
tj||
dd}|S )Nc                 S   s    g | ]}|d  dur|d  qS )r   Nr$   )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%   r     s    z?SubqueryLoader._generate_from_original_query.<locals>.<genexpr>use_mapper_path)_clone	correlate	_from_obj_set_select_fromr5   r~   column_descriptions_adapt_col_list_set_entitiesdistinct_target_key	_distinctr  r|   	_order_byrC  _limit_offsetwith_labelsrw  r   AliasedClass)r[   r}  r  r  r  orig_entityr:  target_colsr  tembed_qr  r$   r$   r%   r  t  s@   
	


z,SubqueryLoader._generate_from_original_queryc                    s   g }t | }t|D ]'\}\}}|dkr)||d  d j}||r&|n|}	n|}	||	|jf qt|dk r=| nt|d d }
|
j	rL|
j
 ntj|
j
dd jj} fdd|D }|| fS )	Nr   r   r   Tr  c                    s    g | ]}t  jj| jqS r$   )r  r:   r  r   r   r  r[   r$   r%   r     s    z2SubqueryLoader._prep_for_joins.<locals>.<listcomp>)r5   pairs	enumeraterI   r  r8   r   r_  r   r   r   r   r  rY   r  )r[   r  r  r  r  irI   r!   prev_mapper	to_appendr   
local_colsr  r$   r  r%   r    s*   
zSubqueryLoader._prep_for_joinsc                 C   s2  t |}|dkrt||d d |g}nu|dkr3t||d d |t||d d |g}nX|dkrdd |dd D }g }|rl|d}	t|	d |	d }
|r`|
|d d }
n|
|}
||
 |sFt||d d |d jg| t||d d |g }|D ]	}
|j|
dd}q|S )	Nr   r   r   r  c                 S   s:   g | ]}t |d  jst|d  n|d  j|d fqS )r   r   )r   r   r   r  r   )r   itemr$   r$   r%   r     s    z/SubqueryLoader._apply_joins.<locals>.<listcomp>T)from_joinpoint)r_  r  of_typepopr8   r:   join)r[   r:  r  r  r  r  ltjmiddleinnerr  attrr$   r$   r%   r    sF   
	



zSubqueryLoader._apply_joinsc                 C   s(   | |}|j|j }|jr|j|_|S r   )_with_current_path_conditional_options_with_options_populate_existing)r[   r:  r  r}  r  r$   r$   r%   r    s
   
zSubqueryLoader._setup_optionsc                 C   s6   | j jr|jd }|jt| j j}|j| }|S rw   )rY   rC  r  _target_adaptercopy_and_processr   r6   )r[   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   r   r   )subq)r[   r  r$   r$   r%   rX   9  r   z(SubqueryLoader._SubqCollections.__init__c                 C   s    | j d u r	|   | j ||S r   )_data_loadrA   )r[   r   r   r$   r$   r%   rA   <  s   
z#SubqueryLoader._SubqCollections.getc                 C   sF   t t| _t| jdd D ]\}}| j| dd |D  qd S )Nc                 S   s   | dd  S )Nr   r$   xr$   r$   r%   r&   C  r6  z7SubqueryLoader._SubqCollections._load.<locals>.<lambda>c                 s       | ]}|d  V  qdS )r   Nr$   r   vvr$   r$   r%   r   D      z8SubqueryLoader._SubqCollections._load.<locals>.<genexpr>)collectionsdefaultdictr5   r  	itertoolsgroupbyr  extend)r[   r   vr$   r$   r%   r  A  s   z%SubqueryLoader._SubqCollections._loadc                 C   s   | j d u r|   d S d S r   )r  r  )r[   r   r   r   r$   r$   r%   r|  F  s   
z&SubqueryLoader._SubqCollections.loader)	rm   rn   ro   rp   r  rX   rA   r  r|  r$   r$   r$   r%   _SubqCollections0  s    r  c                    s   | j j| j jjstd|  || j }||j	d}|d u r"d S |j
|j
u s,J d| jj}	||j	d}
|
d u rH| |}
||j	d|
  rS fdd|	D }	| jr`| ||
|	| d S | ||
|	| d S )NJ'%s' does not support object population - eager loading cannot be applied.rw  zlSubquery session doesn't refer to that of our context.  Are there broken context caching schemes being used?r  c                       g | ]} j | qS r$   rT   r   rd   r$   r%   r   k  r  z7SubqueryLoader.create_row_processor.<locals>.<listcomp>)r:   rB   r   implsupports_populationr  r  rY   rA   r   r   r  r  r~   r)   _create_collection_loader_create_scalar_loader)r[   r`   rb   rc   rI   rj   rd   rk   r  r  r  r$   r  r%   rl   J  s6   

z#SubqueryLoader.create_row_processorc                    j    fddfdd}|d  jf |d  j|f |jr3|d  j jf d S d S )Nc                    s8    t fddD d}| j| || d S )Nc                       g | ]} | qS r$   r$   r   r   r   r$   r%   r   {      z_SubqueryLoader._create_collection_loader.<locals>.load_collection_from_subq.<locals>.<listcomp>r$   )rA   tupler   r   set_committed_value)r   r   r   
collectionr  r  r[   r  r%   load_collection_from_subqy  s   zKSubqueryLoader._create_collection_loader.<locals>.load_collection_from_subqc                       j |vr | || d S d S r   r   r   )r  r[   r$   r%   &load_collection_from_subq_existing_row     
zXSubqueryLoader._create_collection_loader.<locals>.load_collection_from_subq_existing_rowr   existingeagerr8   r   invoke_all_eagersr|  )r[   r`   r  r  rk   r  r$   )r  r  r  r[   r%   r  v  s   z(SubqueryLoader._create_collection_loaderc                    r  )Nc                    sZ    t fddD d}t|dkrtd  |d }| j| || d S )Nc                    r  r$   r$   r  r  r$   r%   r     r  zWSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subq.<locals>.<listcomp>r   r   LMultiple rows returned with uselist=False for eagerly-loaded attribute '%s' r   )rA   r  r_  r   r`  r   r   r  )r   r   r   r  scalarr  r  r%   load_scalar_from_subq  s   zCSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subqc                    r  r   r   r   )r  r[   r$   r%   "load_scalar_from_subq_existing_row  r  zPSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subq_existing_rowr   r  r  r  )r[   r`   r  r  rk   r  r$   )r  r  r  r[   r%   r    s   z$SubqueryLoader._create_scalar_loaderrv  )rm   rn   ro   rq   rX   r   rh   r  r  r  r  r  r  objectr  rl   r  r  rr   r$   r$   r]   r%   rx    s"    
cA/4
,rx  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.

    )ry  _aliased_class_poolc                    s&   t t| || | jj| _g | _d S r   )rW   r  rX   rY   ry  r  rZ   r]   r$   r%   rX     s   

zJoinedLoader.__init__c                 C   rn  ro  rq  r   r$   r$   r%   r     rr  z!JoinedLoader.init_class_attributeNFc	                 K   s>  |j jsdS |j jr| jr|j d || j }d}
|r"| ||nd}|dur5| |||||\}}}n-||j	dsR| j
rJ|jd | j
krIdS n|| jrRdS | ||||||||\}}}}||j	dd}|durtt|j}
nd}
|| j }tj|| j|||||
| j|d	 |durdt|jv rtddS dS )	z@Add a left outer join to the statement that's being constructed.Nzjoined collectionFr|  r   rz  )with_polymorphicrs  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  rY   _init_user_defined_eager_proc$_setup_query_on_user_defined_adapterr  r   ry  r  r  rI   _generate_row_adapterrA   r   with_polymorphic_mappersr   r   _setup_entity_queryr~   secondary_columnsr  r  )r[   r`   ra   rb   rc   rd   re   rs  r  rf   r  user_defined_adapterclausesadd_to_collectionr  r$   r$   r%   rh     s   


zJoinedLoader.setup_queryc           	      C   s   d|j vrdS |jj}||jdd}|dur|S |j d }|dd  \}}|d ur?t|tr5|j|}t	j
||jjd}n!||jdrW||jd}tj||jjd}n	|jj|jd }||jd| |S )Neager_from_aliasF user_defined_eager_row_processor)r   rz  )r   rb   r:   rA   r   r   strr   aliasr  ColumnAdapterrI   r   r  r   
ORMAdapterr	   _polymorphic_adaptersr~   )	r[   rc   r`   rb   rd   r  root_mapperr!   r  r$   r$   r%   r    s>   


z*JoinedLoader._init_user_defined_eager_procc                 C   sZ   | |j|}|r|r||}||jd| n|r%|}||jd| |j}|||fS )Nr  )_get_entity_clausesr	   wrapr~   r   primary_columns)r[   r`   r   rb   rd   r  r  r$   r$   r%   r  M  s"   

z1JoinedLoader._setup_query_on_user_defined_adapterc                 C   s   t | jjrt | jj}nd }d| f}||jvr d |j|< }n|j| d  |j|< }|t| jkrStj| j	|d urA|j
ddnd ddd}t |jj | j| | j| S )Njoinedloader_acr   r   T)flat)r  r  r  )r   r   r   
selectabler   r_  r  r   r  rI   r  rg   r8   )r[   r`   alt_selectabler   idxto_adaptr$   r$   r%   _gen_pooled_aliased_classg  s&   

z&JoinedLoader._gen_pooled_aliased_classc	              
   C   s   | |jdd }	|	r|	}
n| |}
t|
jd| ftj|
| jjdddd}|j	d us,J | j
jr3d|_|d ur@|j d| j
jn| j
j}|sHd}|j| j|||||||f |j}||jd| ||||fS )Nrz  joinedloader_ormadapterTF)r   adapt_requiredallow_label_resolveanonymize_labels	innerjoineager_row_processor)rA   r   r   r   _memor   r  rI   r   aliased_classrY   r)   multi_row_eager_loadersr   r%  create_eager_joinsr8   _create_eager_joinr
  r~   )r[   r`   r   rb   rc   rd   re   rs  r  r  r  r  r%  r  r$   r$   r%   r    sL   

z"JoinedLoader._generate_row_adapterc	                 C   s
  |d u r|j }	n|}	|jo|jj}
d }||jvr@|
s@|jr@t|j|j}t	|dkr0t
d|r@|j|d  }|d |}}|d u rJ||j}}|j||}|rt|dd rtt|j|	| jrf|	n| j}t|j| j| j}nttj| j|jdd| j| j}n| j}|jd usJ | p| p|dkp|jj}|rtj||j|| p|jjp|ot|tj| j| j d}n| ||||}||j|< |j|_|st | jj!D ]}|	j"j#$|r|r|j%| }|j&'| q| jj(r| j)|j*+t,-| jj(7  _)d S d S )	Nr   zCan't identify which query entity in which to joined eager load from.   Please use an exact match when specifying the join path.r   r(  Tr  unnestedisouter
_left_memo_right_memo).rI   r)  r	   _should_nest_selectableeager_joinsfrom_clauser  #find_left_clause_that_matches_givenr  r_  r  r  
setdefaultr  r   r(  _entity_for_mapperr  r:   r   r   rY   r   r  r  represents_outer_join_ORMJoinr   r   Join_splice_nested_inner_joinstop_on_find_columnsprimaryjoinpersist_selectablerg   contains_columnrU   r  r8   rC  r  r  r  r   r6   )r[   r`   ra   rb   rd   rs  r  r%  r  r   should_nest_selectablequery_entity_keyindexesclausedefault_towraptowrapefmonclauseattach_on_outsider  r   r$   r$   r%   r+    s   



	



zJoinedLoader._create_eager_joinc           	      C   s2  |du rt |tjsJ n.t |tjjr| ||j|||S t |tjs;|d |u r9tj||j|d||d j	dS d S | ||j
|||j}|d u rfd}| ||j|||j}|d u re|duscJ dd S nd}|r|jsv|jsv||}ntj|j||j|j|jd}ntj||j
|j|j|jd}|j|_|S )	NFr  r  r-  z9assertion failed attempting to produce joined eager loadsT)r.  r/  )r.  r0  )r   r   r8  r   r  FromGroupingr:  elementr(  rI   rightr0  leftr/  r.  _splice_into_centerrG  r  )	r[   rb   join_objr  rG  splicingtarget_joinright_splicer  r$   r$   r%   r:  X  sf   

z&JoinedLoader._splice_nested_inner_joinc                 C   sv   |r|  ||nd}|dur#|}|jr|r||j}n|jr"|j}n||jd}|d u r0dS | j||r9|S dS )NFr&  )r  rd   r  rA   r   rI   _result_has_identity_key)r[   r`   rj   rd   rb   rc   r  	decoratorr$   r$   r%   _create_eager_adapter  s"   
z"JoinedLoader._create_eager_adapterc              	   C   s   | j j| j jjstd|  || j }| |||||}	|	durI| j}
t	
| j|||| j |	}| js?| ||
|| d S | ||
|| d S | jd||||||| d S )Nr  Frp  )r:   rB   r   r  r  r  r  rY   rT  r   _instance_processorrI   r   r)   r  r  r   rl   )r[   r`   rb   rc   rI   rj   rd   rk   our_patheager_adapterr   	_instancer$   r$   r%   rl     s<   

z!JoinedLoader.create_row_processorc                    sv    fdd} fdd} fdd}|d  | j|f |d  | j|f jr9|d	  | j|f d S d S )
Nc                    sJ   t | |}t|d}|j | f<  |}|d ur#|| d S d S Nappend_without_eventr   init_state_collectionr   UniqueAppenderr8   )r   r   r   r  result_listinstrX  r`   r   r$   r%   #load_collection_from_joined_new_row  s   zSJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_new_rowc                    sh   | fj v rj | f }nt | |}t|d}|j | f<  |}|d ur2|| d S d S rY  r[  )r   r   r   r^  r  r_  r`  r$   r%   (load_collection_from_joined_existing_row  s   zXJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_existing_rowc                        | d S r   r$   r   rX  r$   r%    load_collection_from_joined_exec     zPJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_execr   r  r  r8   r   r  )r[   r`   r   rX  rk   ra  rb  re  r$   r`  r%   r    s   
z&JoinedLoader._create_collection_loaderc                    st    fdd} fdd} fdd}|d  j|f |d  j|f |jr8|d	  j|f d S d S )
Nc                    s    ||< d S r   r$   r   )rX  r   r$   r%   load_scalar_from_joined_new_row  s   zKJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_new_rowc                    s>    |}|v r|| urt d  d S d S ||< d S )Nr  )r   r`  )r   r   r   r  rX  r   r[   r$   r%   $load_scalar_from_joined_existing_row  s   
zPJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_existing_rowc                    rc  r   r$   r   rd  r$   r%   load_scalar_from_joined_exec&  rf  zHJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_execr   r  r  rg  )r[   r`   r   rX  rk   rh  rj  rk  r$   ri  r%   r    s   z"JoinedLoader._create_scalar_loader)NNF)F)rm   rn   ro   rp   rq   rX   r   rh   r  r  r   r  r+  r:  rT  rl   r  r  rr   r$   r$   r]   r%   r    s*    
`/#? 
F',r  selectinc                       s   e Zd ZdZedg dZdZ fddZdd Z	d	d
 Z
dd Zdd Zeddd Zdd Zeddd Zdd Zdd Z  ZS )SelectInLoader)ry  	omit_join_parent_alias_query_info_fallback_query_infor   	queryinfo)load_only_childload_with_joinin_exprpk_colszero_idxchild_lookup_colsi  c                    s   t t| || | jj| _| jjtju }| jjd ur!| jj| _n| j	d}|r.|j
| _n| jjd j|jd| jjd| _| jrV|rO|  | _|  | _d S |  | _d S |  | _d S )Nrp  r   Tr   )rW   rm  rX   rY   ry  rF   r   r   rn  r   r   r:   r   r   r   r   _init_for_omit_join_m2orp  _init_for_joinrq  _init_for_omit_join)r[   r:   r\   is_m2o
lazyloaderr]   r$   r%   rX   M  s*   


zSelectInLoader.__init__c                    s   t jjj   fddt D   fddjjD  }}t|dkr1t	j
| }d}n|d }d}dd|||d S )	Nc                 3   s2    | ]}j j|d D ]	}| | fV  qqdS )r$   N)r:   r   rA   )r   r   equivpk_to_fkr[   r$   r%   r   n  s    
z5SelectInLoader._init_for_omit_join.<locals>.<genexpr>c                    s   g | ]
}| v r | qS r$   r$   r  )r  r$   r%   r   t  s    z6SelectInLoader._init_for_omit_join.<locals>.<listcomp>r   Fr   T)r(  rY   r   local_remote_pairsrM  r5   r:   r|   r_  r   tuple_
query_info)r[   rv  fk_colsru  rw  r$   r  r%   r{  j  s   


z"SelectInLoader._init_for_omit_joinc                    sb   | j j}t|dkrtj| }d}n|d }d}| jd  fdd|D }| dd||||S )Nr   Fr   Trp  c                    r  r$   r#  r$  r}  r$   r%   r     r  z:SelectInLoader._init_for_omit_join_m2o.<locals>.<listcomp>)rI   r|   r_  r   r  rY   r   r  )r[   rv  ru  rw  lookup_colsr$   r  r%   ry    s   
z&SelectInLoader._init_for_omit_join_m2oc                    sj   t | jj| _t| j  fdd| jjD }t|dkr%tj| }d}n|d }d}| 	dd|||d S )Nc                       g | ]}  |qS r$   _adapt_elementr  pa_inspr$   r%   r         
z1SelectInLoader._init_for_join.<locals>.<listcomp>r   Fr   T)
r   r:   rE   ro  r   r|   r_  r   r  r  )r[   rv  ru  rw  r$   r  r%   rz    s   


zSelectInLoader._init_for_joinc                 C   rn  ro  rq  r   r$   r$   r%   r     rr  z#SelectInLoader.init_class_attributer*  c                 C   r+  r,  r/  r1  r$   r$   r%   r3    r4  z%SelectInLoader._memoized_attr__bakeryc                 C   s   | j j| j jjstd|  |jjpt	j
j| }t	|d | j s%d S tj||| jr0d S || j }	|| j }
|	|jdd }|d urI|}n| j}|	|jdsi| jra|
jd | jkr`d S n|
| jrid S tj||| j | j| j| d S )Nr  r  rz  r|  r   )r:   rB   r   r  r  r  r  r	   rG  r   r  r  _entity_isar   PostLoadpath_existsrY   rA   r   r   r  ry  r  r  rI   callable_for_path_load_for_path)r[   r`   rb   rc   rI   rj   rd   rk   selectin_pathpath_w_propselectin_path_w_propr  r  r$   r$   r%   rl     sL   

z#SelectInLoader.create_row_processorc                    s8  |r	j |vr	d S j}|jrRtt}g }	j|D ]6\}
j	t	fdd|j	D }t
j|v r:j} nd |vrI|| 	|
f q|		|
f q|js\dd |D }|j|j|jstjrfddD fddD fdd}|js|fd	d nj|fd
d |jr|fdd n	|fdd |j}||j|j  |jr|dd  jjr|jsjj jrfdd D  | fdd nfdd}|| |jr||	||| d S |||| d S )Nc                 3   s$    | ]} j |tjd V  qdS )r"  N)r  r   PASSIVE_NO_FETCH)r   lk)rI   r   
state_dictr$   r%   r     s    
z0SelectInLoader._load_for_path.<locals>.<genexpr>c                 S   s$   g | ]\}}|j d  ||j|fqS )r   )r   r(  )r   r   	overwriter$   r$   r%   r   		  s    z1SelectInLoader._load_for_path.<locals>.<listcomp>c                    r  r$   r  r  inspr$   r%   r   	  r  c                    r  r$   r  r  r  r$   r%   r   	  r  c                    s   |  t jdgR   S )Nr%  )r	   Bundler5  )r  rv  r$   r%   r&   	      z/SelectInLoader._load_for_path.<locals>.<lambda>c                    r@  r   )r<  r9  )r  r$   r%   r&   +	  r?  c                    s    |  tjj S r   )r<  r  r  rY   r   r  r9  )r  par[   r$   r%   r&   2	  s
   
 c                       |   tjdddS Nprimary_keysT)	expandingrK  in_r   r   r9  ru  r$   r%   r&   ;	  r  c                    r  r  r  r9  r  r$   r%   r&   A	  r  c                 S   s   |   S r   )rg  r9  r$   r$   r%   r&   M	      c                    r  r$   r  )r   elemr  r$   r%   r   S	  r  c                    s
   | j   S r   )rC  r9  )r  r$   r%   r&   V	  r?  c                    s&   | j d }| j|jt jj S rw   )r  rC  r  r  r   r6   rY   )r:  r  r   r$   r%   r  Y	  s   
z?SelectInLoader._load_for_path.<locals>._setup_outermost_orderby)r   rp  rs  r  r  r5   r:   r(  r  rx  r   r   rq  r8   rv  ru  rt  r   r   r  r   rP  ro  r	   rV  r  rY   r  rC  _load_via_child_load_via_parent)r[   r2  r`   rb   states	load_onlyr  r  
our_statesnone_statesr  related_identr:  r}  r  r$   )
r  r  ru  r  rI   r  rv  r[   r   r  r%   r    s   








zSelectInLoader._load_for_pathc                    s   | j }t|}|r[|d| j }|| jd  }dd ||jj fdd|D dD }	|D ]*}
|	|
d }||
 D ]\}}}|sG| j|v rGq:|| j|||sS|n|g q:q.|s	|D ]\}}}|sj| j|v rjq]|| j||d  q]d S )Nr   c                 S   s   i | ]\}}||qS r$   r$   )r   r   r  r$   r$   r%   
<dictcomp>u	  s    z2SelectInLoader._load_via_child.<locals>.<dictcomp>c                    s   g | ]} j r|d  n|qS r  rw  )r   r   r  r$   r%   r   x	  s    z2SelectInLoader._load_via_child.<locals>.<listcomp>r  )	r)   sorted
_chunksizer   r   rA   r   r   r  )r[   r  r  r  r:  r`   r)   our_keyschunkdatar   related_objr   r   r  r$   r  r%   r  m	  s:   

	zSelectInLoader._load_via_childc                    s  | j }|rdnd }|r|d| j }|| jd  } fdd|D }tt}	t||jj|ddd D ]\}
}|	|
 	dd	 |D  q6|D ]>\}}}}|sW| j
|v rWqI|	||}|s||r|t|d
krntd|   || j
|||d  qI|| j
||| qI|sd S d S )Nr$   r   c                    s&   g | ]\}}}} j r|d  n|qS r  r  )r   r   r   r  r  r  r$   r%   r   	  s    
z3SelectInLoader._load_via_parent.<locals>.<listcomp>r  c                 S   s   | d S rw   r$   r  r$   r$   r%   r&   	  r  z1SelectInLoader._load_via_parent.<locals>.<lambda>c                 s   r  )r   Nr$   r  r$   r$   r%   r   	  r  z2SelectInLoader._load_via_parent.<locals>.<genexpr>r   r  )r)   r  r  r  r5   r  r  r   r   r  r   rA   r_  r   r`  r   r  )r[   r  r  r:  r`   r)   _empty_resultr  r  r  r   r  r   r   r  r  r  r$   r  r%   r  	  s@   


zSelectInLoader._load_via_parent)rm   rn   ro   rq   r  
namedtupler  r  rX   r{  ry  rz  r   r   rj  r3  rl   r  r  r  rr   r$   r$   r]   r%   rm  3  s(    	
3
 *rm  c                    sT   fdd  fdd} fdd}t j| d|dddd	 t j| d
|dddd	 d S )Nc                    sT   |d ur(|j  j kr(|t|}|r(||ur(tjdt|| j f dd|S )NzsInstance %s is already associated with an instance of %s via its %s attribute, and is only allowed a single parent.bbf1)code)	r   	hasparentr   instance_stater  r  r   instance_strrE   )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%   r8   	     z'single_parent_validator.<locals>.appendc                    s    | |||S r   r$   )r   r   r  r  r  r$   r%   set_	  r  z%single_parent_validator.<locals>.set_r8   T)rawretvalr1   r~   )r   listen)r    r!   r8   r  r$   )r  r!   r%   r9   	  s   r9   )NNNNFN)8rp   
__future__r   r  r   r   r   r   r   r   r   r	   r
   r   r   baser   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r  r   rP   ColumnPropertystrategy_forrS   class_loggerrs   r   r   r  r   r   RelationshipPropertyr   r   MemoizedSlotsr   rf  rm  rx  r  rm  r9   r$   r$   r$   r%   <module>   s   
V#BE 
    ;   ?        