o
    y¬´\™) ã                   @   sn  d 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 						dJd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.d/„ d/eƒƒƒZ+ej#ej*j!d0d1�ej*j!dd1�G d2d3„ d3e)ƒƒƒƒZ,ej#ej*j!d d1�ej*j!d4d1�ej*j!d5d1�ej*j!d6d1�ej*j!d7d1�G d8d9„ d9e)ej-ƒƒƒƒƒƒƒZ.G d:d;„ d;e'ƒZ/ej*j!d<d1�G d=d>„ d>e)ƒƒZ0ej#ej*j!d?d1�G d@dA„ dAe)ƒƒƒZ1ej#ej*j!dBd1�ej*j!dd1�G dCdD„ dDe)ƒƒƒƒZ2ej#ej*j!dEd1�G dFdG„ dGe)ej-ƒƒƒZ3dHdI„ Z4dS )KzWsqlalchemy.orm.interfaces.LoaderStrategy
   implementations, and related MapperOptions.é    Né   )Ú
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	                    s0  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¡ |rN| j‰ ˆ rN| ‡ ‡fdd„¡ |jD ]D}| |j | j¡u r•|j | j¡s•tj|j| jf| ˆ|||
|oy| jpy| jtju ||||| pƒ| j | jdœ|	¤Ž}|D ]}||| ƒ q�qQd S )N)Údefaultc                    s   t j| |jˆ fi ˆ¤ŽS ©N)Úorm_utilÚ_validator_eventsÚkey©ÚdescÚprop)ÚfnÚopts© úK/var/www/html/env/lib/python3.10/site-packages/sqlalchemy/orm/strategies.pyÚ<lambda>@   s
    ÿÿz%_register_attribute.<locals>.<lambda>c                    s   t  | ˆ ˆ¡S r   )r   Úbackref_listenersr   )ÚbackrefÚuselistr#   r$   r%   N   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Úself_and_descendantsÚ_propsÚgetÚclass_managerÚ_attr_has_implr   Úregister_attribute_implÚclass_Ú	directionr   Ú	ONETOMANYÚviewonlyr3   )r    Úmapperr+   r*   r.   r/   Úproxy_propertyr0   r1   ÚkwÚattribute_extÚlisten_hooksÚmr   Úhookr#   )r'   r!   r"   r(   r$   Ú_register_attribute'   sb   


ÿÿ
ÿþþ
îí€ärN   )Ú
instrumentÚdeferredc                       s8   e Zd ZdZdZ‡ fdd„Z	d
dd„Zdd	„ Z‡  ZS )ÚUninstrumentedColumnLoaderz¶Represent 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   )ÚsuperrQ   Ú__init__Úparent_propertyrS   ©Úselfr9   Ústrategy_key©Ú	__class__r#   r$   rV   ˆ   ó   z#UninstrumentedColumnLoader.__init__Nc           	      K   s(   | j D ]}|r|j | }| |¡ qd S r   )rS   r7   )	rY   ÚcontextÚentityÚpathÚloadoptÚadapterÚcolumn_collectionÚkwargsÚcr#   r#   r$   Úsetup_queryŒ   s
   


ýz&UninstrumentedColumnLoader.setup_queryc                 C   ó   d S r   r#   )rY   r^   r`   ra   rG   Úresultrb   Ú
populatorsr#   r#   r$   Úcreate_row_processor›   s   z/UninstrumentedColumnLoader.create_row_processorr   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__rV   rf   rj   Ú__classcell__r#   r#   r[   r$   rQ   }   s    
ùrQ   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`.)rS   Úis_compositec                    s.   t t| ƒ ||¡ | jj| _t| jdƒ| _d S )NÚcomposite_class)rU   rq   rV   rW   rS   Úhasattrrr   rX   r[   r#   r$   rV   ¨   s   
zColumnLoader.__init__c                 K   sJ   | j D ]}	|r|j |	 }	| |	¡ q| j d }
|r|j |
 }
|
|| j< d S ©Nr   )rS   r7   rW   )rY   r^   r_   r`   ra   rb   rc   Úmemoized_populatorsrd   re   Úfetchr#   r#   r$   rf   ­   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*   r0   )
Úis_class_levelrS   ÚtyperW   r0   Úprimary_keyÚversion_id_colÚsetrN   Úcompare_values)rY   rG   Úcoltyper0   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)rS   Ú_getterr7   r   )
rY   r^   r`   ra   rG   rh   rb   ri   ÚcolÚgetterr#   r#   r$   rj   Õ   s   

þz!ColumnLoader.create_row_processor)
rk   rl   rm   rn   ro   rV   rf   r   rj   rp   r#   r#   r[   r$   rq   ¡   s    rq   )Úquery_expressionc                       s4   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Z‡  ZS )	ÚExpressionColumnLoaderc                    s   t t| ƒ ||¡ d S r   )rU   r†   rV   rX   r[   r#   r$   rV   è   s   zExpressionColumnLoader.__init__c                 K   sh   |r0d|j v r2|j d g}	|	D ]}
|r|j|
 }
| |
¡ q|	d }|r)|j| }||| j< d S d S d S )NÚ
expressionr   )Ú
local_optsrS   r7   rW   )rY   r^   r_   r`   ra   rb   rc   rv   rd   rS   re   rw   r#   r#   r$   rf   ë   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ˆ   rS   r‚   r7   r   )rY   r^   r`   ra   rG   rh   rb   ri   rS   rƒ   r„   r#   r#   r$   rj     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)rx   rN   rW   rS   ry   r}   ©rY   rG   r#   r#   r$   r     s   
ûz+ExpressionColumnLoader.init_class_attribute)rk   rl   rm   rV   rf   rj   r   rp   r#   r#   r[   r$   r†   å   s
    r†   )rP   rO   )Ú
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`.)rS   Úgroupc                    s>   t t| ƒ ||¡ t| jdƒrtdƒ‚| jj| _| jj| _d S )Nrs   z8Deferred loading for composite types not implemented yet)rU   rŒ   rV   rt   rW   ÚNotImplementedErrorrS   r�   rX   r[   r#   r$   rV   *  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)rx   rW   Ú_deferred_column_loaderr7   r   )	rY   r^   r`   ra   rG   rh   rb   ri   Úset_deferred_for_local_stater#   r#   r$   rj   3  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/   Úexpire_missing)rx   rN   rW   rS   ry   r}   Ú_load_for_staterŠ   r#   r#   r$   r   C  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))rP   F)rO   T)rˆ   r|   rS   Úintersectionr9   Ú_should_undefer_in_wildcardr�   r?   r   rW   Ú_get_strategyrf   rx   r   r   )
rY   r^   r_   r`   ra   rb   rc   rv   Úonly_load_propsrI   r#   r#   r$   rf   O  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   )Ú.0Úp©rY   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ÚmanagerrG   r�   Úiterate_propertiesr   Úorm_excÚDetachedInstanceErrorr   Ú	state_strr   r   Úload_on_identÚObjectDeletedErrorÚATTR_WAS_SET)rY   r¢   ÚpassiveÚlocalparentÚtoloadr�   Úsessionr   r#   )rY   r¢   r$   r“   ~  s4   

þþÿ

ÿý
z$DeferredColumnLoader._load_for_stater   )rk   rl   rm   rn   ro   rV   rj   r   rf   r“   rp   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   )rY   r   r#   r#   r$   rV   ¬  ó   
zLoadDeferredColumns.__init__c                 C   s.   | j }|jj}|j| }|jt }| ||¡S r   )r   r§   rG   r>   Ú_strategiesrŒ   r“   )rY   r¢   r¯   r   r°   r    rš   r#   r#   r$   Ú__call__¯  s
   

zLoadDeferredColumns.__call__N©rk   rl   rm   rn   rV   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.)rG   Útargetr(   c                    s4   t t| ƒ ||¡ | jj| _| jj| _| jj| _d S r   )rU   r¼   rV   rW   rG   r½   r(   rX   r[   r#   r$   rV   ½  s   

z#AbstractRelationshipLoader.__init__)rk   rl   rm   rn   ro   rV   rp   r#   r#   r[   r$   r¼   ¸  s    r¼   c                   @   s   e Zd ZdZdS )ÚDoNothingLoaderzßRelationship loader that makes no change to the object's state.

    Compared to NoLoader, this loader does not initialize the
    collection/attribute to empty/none; the usual default LazyLoader will
    take effect.

    N)rk   rl   rm   rn   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.   )rx   rN   rW   Ú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�   ©r7   r   )	rY   r^   r`   ra   rG   rh   rb   ri   rÉ   r#   r�   r$   rj   å  s   zNoLoader.create_row_processorN)rk   rl   rm   rn   ro   r   rj   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Ú_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| _| jj}| ¡ \| _	| _
| _|jdd�\| _| _| _| j d| | j	¡ | j oN| jjd j| j	d| jjd�| _| jr{t| jƒD ]}|| jjv rq| jj| D ]
}| j| | j|< qfqX| 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)rU   rÏ   rV   Ústrategy_optsrØ   rÙ   rW   Ú_join_conditionÚcreate_lazy_clauserÐ   rÓ   rÔ   rÑ   rÕ   rÖ   ÚloggerÚinfor(   rG   Ú_get_clauseÚcompareÚ_equivalent_columnsrÒ   r4   )rY   r9   rZ   Újoin_conditionrƒ   re   r[   r#   r$   rV     s6   ÿ
üý€ÿúzLazyLoader.__init__c                 C   sD   d| _ | jjp| jjtjup| j }t| j|d| j| jj	|d� d S )NT)r+   r/   r.   r0   )
rx   rW   r0   rD   r   Ú	MANYTOONErÒ   rN   r“   rÂ   )rY   rG   r0   r#   r#   r$   r   /  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_bindparamL  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_keyr7   r   ÚcallableÚvaluerê   ©Úbind_to_colÚparamsr#   r$   rì   P  s   
ýÿ
ÿ)rÐ   rÓ   r   ÚtraverseÚcloned_traverse)rY   Ú	criterionrì   r#   rð   r$   Ú"_memoized_attr__simple_lazy_clauseG  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ž   g  ó    z4LazyLoader._generate_lazy_clause.<locals>.<listcomp>)r×   Úsql_utilÚadapt_criterion_to_nullrW   r9   Úobjr   Úinstance_dictÚINIT_OKÚLOAD_AGAINST_COMMITTEDÚ#_get_committed_state_attr_by_columnÚ_get_state_attr_by_column)rY   r¢   r¯   rõ   Ú
param_keysrG   ÚorÇ   rò   r   r÷   rï   r#   r#   r$   Ú_generate_lazy_clauseb  s,   
ÿ


ÿÿ
z LazyLoader._generate_lazy_clausec                 C   s   t  d| |f ¡‚)Nz&'%s' is not available due to lazy='%s')Úsa_excÚInvalidRequestError)rY   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r%|tj	@ s(|r(tj
S | jr2|  ||d¡ t|ƒ}|sEt dt |¡| j f ¡‚| jr…|  |||¡}tj
|v rWtj
S tj|v r_tjS t |¡rfd S | ¡ j| j|||d�}|d urx|S |tj@ r‚|tj@ s…tj
S |  ||||¡S )NrÌ   zbParent instance %s is not bound to a Session; lazy load operation of attribute '%s' cannot proceed)r¯   Úlazy_loaded_from)r   rW   Úload_on_pendingÚ_load_pendingÚ
session_idr   r¤   r¥   rÒ   ÚNON_PERSISTENT_OKr¦   rØ   r  r   r©   rª   r   r«   Ú_get_ident_for_use_getÚ	NEVER_SETr   Ú
issupersetr   Ú_identity_lookuprG   ÚRELATED_OBJECT_OKÚ_emit_lazyload)rY   r¢   r¯   ÚpendingÚprimary_key_identityr²   Úinstancer#   r#   r$   r“   ‡  sf   þýûÿÿþÿÿ


üÿþÿ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¯   rY   r¢   r#   r$   rž   Ô  s    ÿÿz5LazyLoader._get_ident_for_use_get.<locals>.<listcomp>)r§   rG   r   rþ   rÿ   r   Údictrz   )rY   r²   r¢   r¯   Úinstance_mapperr#   r  r$   r  Ê  s   
þz!LazyLoader._get_ident_for_use_getúsqlalchemy.ext.bakedc                 C   ó   |j dd�S ©Né2   )Úsize©Úbakery©rY   Ú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rštˆjtƒsš| ‡‡fdd„¡ qˆ ˆ|¡\‰ ‰|r±t tj ˆ !¡ ¡r°d S nt tj"ˆ !¡ ¡r¼d S ˆjrÆˆ ˆ|d¡ | ‡ fdd„¡ ‡fdd„}	||ƒ ‡fdd„¡ |	¡ #¡ }
ˆj$rê|
S t%|
ƒ}|�r|dkrýt &dˆj ¡ |
d S d S )Nc                    s   |   ˆ j¡S r   )r   rG   ©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_fromrG   rW   Ú	secondaryr)  r�   r#   r$   r%     s    
ÿc                 S   s
   |   d¡S rè   )Ú	autoflushr)  r#   r#   r$   r%     ó   
 rÍ   c                    ó
   |   ˆ ¡S r   ©Ú_set_lazyload_fromr)  r¡   r#   r$   r%     r/  c                    s   | j t ˆ jj ¡Ž S r   )Úorder_byr
   r5   rW   r)  r�   r#   r$   r%   '  s    ÿc                    s"   |   ˆj | jˆ j ¡ ˆ j¡¡S r   )ÚoptionsÚLoadÚfor_existing_pathÚ_current_pathr9   Úlazyloadr   r)  )ÚrevÚstrategy_optionsr#   r$   r%   6  s    
ÿýc                    r0  r   )Úfilterr)  )Úlazy_clauser#   r$   r%   I  r/  c                    s   ˆ   | j¡ ˆ | _| S r   )ÚupdateÚ_paramsr)  )rò   r#   r$   Úset_default_paramsM  s   z5LazyLoader._emit_lazyload.<locals>.set_default_paramsc                    r0  r   r1  r)  r¡   r#   r$   r%   T  r/  r   zKMultiple rows returned with uselist=False for lazily-loaded attribute '%s' r   )'rÚ   Úadd_criteriarW   Úbake_queriesÚspoilr-  r   r   ÚNO_AUTOFLUSHÚload_optionsÚ	load_pathÚ_add_lazyload_optionsrÒ   rÙ   r  Úwith_post_criteriaÚ_load_on_pk_identityr   rG   r3  Ú_reverse_propertyrD   r   rç   Ú_use_getr™   rš   rÏ   r  r
   Úhas_intersectionr   r   ÚvaluesÚ
_never_setÚallr(   ÚlenÚwarn)rY   r:  r²   r¢   r  r¯   r*  r  Úeffective_pathr?  rh   Úlr#   )r<  rò   r9  rY   r¢   r:  r$   r  Ý  sˆ   þ
ÿÿý
ÿÿ
þÿ€ÿüþÿzLazyLoader._emit_lazyloadc           
         sn   | j ‰ | jst |jtˆ | ƒˆ ¡}|d  | j |f¡ d S |js#|jr5‡ fdd„}	|d  | j |	f¡ d S d S )Nr�   c                    s   |   |ˆ ¡ d S r   )Ú_resetrÆ   r¶   r#   r$   Úreset_for_lazy_callable}  s   	z@LazyLoader.create_row_processor.<locals>.reset_for_lazy_callable)	r   rx   r   Ú"_instance_level_callable_processorr@   ÚLoadLazyAttributer7   Úpopulate_existingÚalways_refresh)
rY   r^   r`   ra   rG   rh   rb   ri   Úset_lazy_callablerT  r#   r¶   r$   rj   h  s   
ÿÿózLazyLoader.create_row_processor)rk   rl   rm   rn   ro   rV   r   rö   r  r  r“   r  r
   Údependenciesr#  r  rj   rp   r#   r#   r[   r$   rÏ   ñ  s     $ C

 rÏ   c                   @   r³   )rV  z-serializable loader object used by LazyLoaderc                 C   s   || _ |j| _d S r   )r   rZ   )rY   r   Úinitiating_strategyr#   r#   r$   rV   Ž  s   zLoadLazyAttribute.__init__c                 C   s0   | j }|jj}|j| }|j| j }| ||¡S r   )r   r§   rG   r>   r¸   rZ   r“   )rY   r¢   r¯   r   r  r    rš   r#   r#   r$   r¹   ’  s
   
zLoadLazyAttribute.__call__Nrº   r#   r#   r#   r$   rV  ‹  s    rV  Ú	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Ë   ©rW   r—   r   rŠ   r#   r#   r$   r   Ÿ  ó   ÿz$ImmediateLoader.init_class_attributeNc           	      K   rg   r   r#   )	rY   r^   r_   r`   ra   rb   rc   Úparentmapperrd   r#   r#   r$   rf   ¤  s   zImmediateLoader.setup_queryc           	         rÃ   )Nc                    s   |   ˆ j¡ | |¡ d S r   )rÄ   r   r?   rÆ   r�   r#   r$   Úload_immediate´  s   z<ImmediateLoader.create_row_processor.<locals>.load_immediateÚdelayedrÊ   )	rY   r^   r`   ra   rG   rh   rb   ri   rd  r#   r�   r$   rj   ±  s   z$ImmediateLoader.create_row_processor©NN)rk   rl   rm   ro   r   rf   rj   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                    rT   r   )rU   rh  rV   rW   ri  rX   r[   r#   r$   rV   ¿  r]   zSubqueryLoader.__init__c                 C   r^  r_  ra  rŠ   r#   r#   r$   r   Ã  rb  z#SubqueryLoader.init_class_attributeNc                 K   s€  |j jsd S |j jr|j  d¡ || j }| |jdd ¡}	|	d ur%|	j}
n| j}
|j dt	j
j¡}|| }| |jd¡s]| jrU|j jrH|j jjnd|j d | jkrTd S n| | j¡r]d S |  |¡\}}}|j dtf|j ¡}|  |||||j¡}|j  |
¡}dtf|d|i|_| d¡}|  ||¡\}}}|j|Ž }|j|Ž }|  |||||
¡}|  ||||
¡}|  |¡}| |jd|¡ d S )	Nrg  Úpath_with_polymorphic)Úsubquery_pathNÚloaderr   r   Ú
orig_queryF)r   Ú_enable_eagerloadsÚ
_yield_perÚ_no_yield_perrW   r?   r   r_   rG   r   ÚPathRegistryÚrootÚcontainsri  r7  ÚlengthÚcontains_mapperÚ_get_leftmostrh  Ú_generate_from_original_queryÚentity_zeror²   Ú_attributesÚ_set_enable_single_critÚ_prep_for_joinsr3  Úadd_columnsÚ_apply_joinsÚ_setup_optionsÚ_setup_outermost_orderbyr|   )rY   r^   r_   r`   ra   rb   rc   rc  rd   Úwith_poly_infoÚeffective_entityÚ	subq_pathÚleftmost_mapperÚleftmost_attrÚleftmost_relationshiprm  Ú
left_aliasr*  Úto_joinÚ
local_attrÚparent_aliasr#   r#   r$   rf   È  sz   
ÿÿÿûùùø	ü
ÿûþ

ÿ


ÿ
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›   re   ©rƒ  r‚  r#   r$   rž   :  s    ýÿÿz0SubqueryLoader._get_leftmost.<locals>.<listcomp>)r`   r   Ú_class_to_mapperr9   ÚisarW   Úlocal_columns)rY   r‚  Úsubq_mapperÚleftmost_propÚleftmost_colsr„  r#   rŽ  r$   rv  +  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ž   W  s
    þz@SubqueryLoader._generate_from_original_query.<locals>.<listcomp>FTc                 s   s   � | ]}|j V  qd S r   )Útabler�  r#   r#   r$   Ú	<genexpr>o  s   € z?SubqueryLoader._generate_from_original_query.<locals>.<genexpr>©Úuse_mapper_path)Ú_cloneÚ	correlateÚ	_from_objÚ_set_select_fromr4   r|   Úcolumn_descriptionsÚ_adapt_col_listÚ_set_entitiesÚdistinct_target_keyÚ	_distinctr  rz   Ú	_order_byr3  Ú_limitÚ_offsetÚwith_labelsrg  r   ÚAliasedClass)rY   rm  rƒ  r„  r…  Úorig_entityr*  Útarget_colsr¡  ÚtÚembed_qr†  r#   r#   r$   rw  C  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‹  r9   rŒ  r   r�  ©r‰  rY   r#   r$   rž   ­  s    ÿÿz2SubqueryLoader._prep_for_joins.<locals>.<listcomp>)r4   ÚpairsÚ	enumeraterG   r�  r7   r   rO  r   Úis_aliased_classr_   r   r§  rW   r‘  )rY   r†  r‚  r‡  r®  ÚirG   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r‹d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)rO  r‹  Úof_typeÚpopr7   r9   Újoin)rY   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)rY   r*  r‚  rm  r�  r#   r#   r$   r~  ç  s
   
zSubqueryLoader._setup_optionsc                 C   s6   | j jr|jd }|j t | j j¡¡}|j|Ž }|S ru   )rW   r3  rœ  Ú_target_adapterÚcopy_and_processr
   r5   )rY   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._SubqCollectionsz«Given a :class:`.Query` used to emit the "subquery load",
        provide a load interface that executes the query at the
        first moment a value is needed.

        Nc                 C   rµ   r   )Úsubq)rY   rÆ  r#   r#   r$   rV     r·   z(SubqueryLoader._SubqCollections.__init__c                 C   s    | j d u r	|  ¡  | j  ||¡S r   )Ú_dataÚ_loadr?   )rY   r   r   r#   r#   r$   r?     s   
z#SubqueryLoader._SubqCollections.getc                 C   s&   t dd„ t | jdd„ ¡D ƒƒ| _d S )Nc                 s   s&   � | ]\}}|d d„ |D ƒfV  qdS )c                 S   ó   g | ]}|d  ‘qS rŠ  r#   ©r›   Úvvr#   r#   r$   rž     ó    zCSubqueryLoader._SubqCollections._load.<locals>.<genexpr>.<listcomp>Nr#   ©r›   r    Úvr#   r#   r$   r—    s
   € ÿ
ÿz8SubqueryLoader._SubqCollections._load.<locals>.<genexpr>c                 S   s   | dd … S )Nr   r#   ©Úxr#   r#   r$   r%     r&  z7SubqueryLoader._SubqCollections._load.<locals>.<lambda>)r  Ú	itertoolsÚgroupbyrÆ  rÇ  r�   r#   r#   r$   rÈ    s   þz%SubqueryLoader._SubqCollections._loadc                 C   s   | j d u r|  ¡  d S d S r   )rÇ  rÈ  )rY   r¢   rÇ   rÈ   r#   r#   r$   rl    s   
ÿz&SubqueryLoader._SubqCollections.loader)	rk   rl   rm   rn   rÇ  rV   r?   rÈ  rl  r#   r#   r#   r$   Ú_SubqCollectionsÿ  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 )NúJ'%s' does not support object population - eager loading cannot be applied.rg  zlSubquery session doesn't refer to that of our context.  Are there broken context caching schemes being used?Úcollectionsc                    s   g | ]}ˆ j | ‘qS r#   rR   r�  ©rb   r#   r$   rž   ;  rø   z7SubqueryLoader.create_row_processor.<locals>.<listcomp>)r9   r@   r   ÚimplÚsupports_populationr  r  rW   r?   r   r²   r‘  rÓ  r|   r(   Ú_create_collection_loaderÚ_create_scalar_loader)rY   r^   r`   ra   rG   rh   rb   ri   rÆ  r´  rÕ  r#   rÖ  r$   rj     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ž   K  rÌ  z_SubqueryLoader._create_collection_loader.<locals>.load_collection_from_subq.<locals>.<listcomp>r#   )r?   ÚtuplerÄ   r   Úset_committed_value)r¢   rÇ   rÈ   Ú
collection©rÕ  r´  rY   rÞ  r$   Úload_collection_from_subqI  s   ÿÿzKSubqueryLoader._create_collection_loader.<locals>.load_collection_from_subqc                    ó   ˆj |vrˆ | ||ƒ d S d S r   r¶   rÆ   )rã  rY   r#   r$   Ú&load_collection_from_subq_existing_rowQ  ó   
ÿzXSubqueryLoader._create_collection_loader.<locals>.load_collection_from_subq_existing_rowr�   ÚexistingÚeager©r7   r   Úinvoke_all_eagersrl  )rY   r^   rÕ  r´  ri   rå  r#   )rÕ  rã  r´  rY   r$   rÙ  F  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ž   b  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   )r?   rß  rO  r
   rP  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í  rY   r#   r$   Ú"load_scalar_from_subq_existing_rowm  ræ  zPSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subq_existing_rowr�   rç  rè  ré  )rY   r^   rÕ  r´  ri   rî  r#   )rÕ  rí  r´  rY   r$   rÚ  ]  s   ÿÿz$SubqueryLoader._create_scalar_loaderrf  )rk   rl   rm   ro   rV   r   rf   rv  rw  r{  r}  r~  r  ÚobjectrÓ  rj   rÙ  rÚ  rp   r#   r#   r[   r$   rh  º  s"    
øcA/4
,rh  Ú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.

    )ri  Ú_aliased_class_poolc                    s&   t t| ƒ ||¡ | jj| _g | _d S r   )rU   rñ  rV   rW   ri  rò  rX   r[   r#   r$   rV   „  s   

zJoinedLoader.__init__c                 C   r^  r_  ra  rŠ   r#   r#   r$   r   ‰  rb  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rr|j}
nd}
|| j }tj|| j|||||
| j|d�	 |dur™dt|jƒv r›t d¡‚dS dS )	z@Add a left outer join to the statement that's being constructed.Nzjoined collectionFrl  r   rj  )Úwith_polymorphicrc  Úchained_from_outerjoinz–Detected unaliased columns when generating joined load.  Make sure to use aliased=True or flat=True when using joined loading with with_polymorphic().)r   rn  ro  r(   rp  rW   Ú_init_user_defined_eager_procÚ$_setup_query_on_user_defined_adapterrs  r   ri  rt  ru  rG   Ú_generate_row_adapterr?   Úwith_polymorphic_mappersr   Ú_setup_entity_queryr|   Úsecondary_columnsr  r  )rY   r^   r_   r`   ra   rb   rc   rc  rô  rd   ró  Úuser_defined_adapterÚclausesÚadd_to_collectionr€  r#   r#   r$   rf   Ž  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¡rX| |jd¡}tj|j|jjd�}n	|jj |jd ¡}| |jd|¡ |S )NÚeager_from_aliasFÚ user_defined_eager_row_processoréþÿÿÿ)rÝ   rj  )rˆ   r`   r9   r?   r   r™   Ústrr½   Úaliasrù   ÚColumnAdapterrG   rå   rs  r   Ú
ORMAdapterr_   r   Ú_polymorphic_adaptersr|   )	rY   ra   r^   r`   rb   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)rY   r^   r_   r`   rb   rû  rý  r#   r#   r$   rö  !  s"   
ýý
z1JoinedLoader._setup_query_on_user_defined_adapterc                 C   s|   d| f}||j vrd |j |< }n|j | d  |j |< }|t| jƒkr9tj| jddd�}t|ƒjj | j 	|¡ | j| S )NÚjoinedloader_acr   r   T)Úflatr™  )
r   rO  rò  r   r§  rG   r   Ú
selectablere   r7   )rY   r^   r   ÚidxÚto_adaptr#   r#   r$   Ú_gen_pooled_aliased_class;  s   
ÿ
z&JoinedLoader._gen_pooled_aliased_classc	                 C   sÔ   |  |jdd ¡}	|	r|	j}
n|  |¡}
t|
ƒjd| ftj|
| jj	dddd�}|j
d us-J ‚| jjr4d|_|d urA|j  d| jj¡n| jj}|sId}|j | j||||||||f	¡ |j}| |jd|¡ ||||fS )Nrj  Újoinedloader_ormadapterTF)rÝ   Úadapt_requiredÚallow_label_resolveÚanonymize_labelsÚ	innerjoinÚeager_row_processor)r?   r   r_   r  r   Ú_memor   r  rG   rå   Úaliased_classrW   r(   Úmulti_row_eager_loadersrˆ   r  Úcreate_eager_joinsr7   Ú_create_eager_joinrú  r|   )rY   r^   r_   r`   ra   rb   rc   rc  rô  r€  r  rü  r  rý  r#   r#   r$   r÷  S  sN   ÿ
ù
ÿý÷ÿz"JoinedLoader._generate_row_adapterc	                 C   sè  |d u r|j }	n|}	|jo|jj}
d }||jvr0|
s0|jr0t |j|j¡\}}|d ur0||}}|d u r:||j}}|j 	||¡}|rut
|dd ƒrdt|jƒ |	 | j¡rV|	n| j¡}t
|j| j| jƒ}nt
tj| j|jdd�| j| jƒ}n| j}|jd usJ ‚| pŒ| pŒ|dkpŒ|jj}|r«tj||j|| p£|jjp£|o£t|tjƒ| j| j d�}n|  ||||¡}||j|< |j|_|sÜt | jj¡D ]}|	jj  !|¡rÛ|rÕ|j"| }|j# $|¡ qÅ| jj%rò| j&|j' (t) *| jj%¡¡7  _&d S d S )Nr  Tr˜  Úunnested©ÚisouterÚ
_left_memoÚ_right_memo)+rG   r  r   Ú_should_nest_selectableÚeager_joinsÚfrom_clauserù   Úfind_join_sourcer  Ú
setdefaultr‹  r   r  Ú_entity_for_mapperr�  r9   r_   r   rW   r   r§  rx  Úrepresents_outer_joinÚ_ORMJoinr™   r   ÚJoinÚ_splice_nested_inner_joinÚstop_onÚ_find_columnsÚprimaryjoinÚmapped_tablere   Úcontains_columnrS   r	  r7   r3  rÅ  rÂ  rÃ  r
   r5   )rY   r^   r_   r`   rb   rc  rü  r  rô  r°   Úshould_nest_selectableÚ
entity_keyÚindexÚ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  r  )r™   r   r'  r   r  ÚFromGroupingr)  Úelementr  rG   Úrightr  Úleftr  r  Ú_splice_into_centerr6  rÂ  )	rY   r`   Újoin_objrü  r6  ÚsplicingÚtarget_joinÚright_splicerÄ  r#   r#   r$   r)    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õ  rb   r  r?   r   rG   Ú_result_has_identity_key)rY   r^   rh   rb   r`   ra   rû  Ú	decoratorr#   r#   r$   Ú_create_eager_adapterX  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Ô  Fr`  )r9   r@   r   r×  rØ  r  r  rW   rC  r   Ú_instance_processorrG   r(   rÚ  rÙ  r—   rj   )rY   r^   r`   ra   rG   rh   rb   ri   Úour_pathÚeager_adapterr   Ú	_instancer#   r#   r$   rj   t  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
   ÚUniqueAppenderr7   )r¢   rÇ   rÈ   rá  Úresult_listÚinst©rG  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 rH  rJ  )r¢   rÇ   rÈ   rM  rá  rN  rO  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Æ   ©rG  r#   r$   Ú load_collection_from_joined_exec¹  ó   zPJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_execr�   rç  rè  ©r7   r   rê  )rY   r^   r   rG  ri   rP  rQ  rT  r#   rO  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Æ   )rG  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
   rP  )r¢   rÇ   rÈ   rç  ©rG  r   rY   r#   r$   Ú$load_scalar_from_joined_existing_rowÍ  s   þÿÿ
zPJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_existing_rowc                    rR  r   r#   rÆ   rS  r#   r$   Úload_scalar_from_joined_execà  rU  zHJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_execr�   rç  rè  rV  )rY   r^   r   rG  ri   rW  rY  rZ  r#   rX  r$   rÚ  Ç  s   ÿÿÿz"JoinedLoader._create_scalar_loader)NNF)F)rk   rl   rm   rn   ro   rV   r   rf   rõ  rö  r  r÷  r  r)  rC  rj   rÙ  rÚ  rp   r#   r#   r[   r$   rñ  y  s*    
÷^5@ 
ÿF',rñ  Úselectinc                       sX   e Zd ZdZdZ‡ fdd„Zdd„ Ze d¡dd	„ ƒZ	d
d„ Z
e d¡dd„ ƒZ‡  ZS )ÚSelectInLoader)ri  Ú_parent_aliasÚ_in_exprÚ_parent_pk_colsÚ	_zero_idxrÚ   iô  c                    s†   t t| ƒ ||¡ | jj| _t| jjƒ| _t	| jƒ‰ ‡ fdd„| jj
D ƒ | _}t|ƒdkr9tj|Ž | _d| _d S |d | _d| _d S )Nc                    s   g | ]}ˆ   |¡‘qS r#   )Ú_adapt_elementrÝ  ©Úpa_inspr#   r$   rž      s    
ÿz+SelectInLoader.__init__.<locals>.<listcomp>r   Fr   T)rU   r\  rV   rW   ri  r   r9   rC   r]  r   rz   r_  rO  r   Útuple_r^  r`  )rY   r9   rZ   Úpk_colsr[   rb  r$   rV   û  s   


ÿ


zSelectInLoader.__init__c                 C   r^  r_  ra  rŠ   r#   r#   r$   r   
  rb  z#SelectInLoader.init_class_attributer  c                 C   r  r  r  r!  r#   r#   r$   r#    r$  z%SelectInLoader._memoized_attr__bakeryc                 C   sô   | j j| j jjst d|  ¡‚|jjpt	j
j| }t	 |d | j ¡s%d S tj ||| j¡r0d S || j }	|| j }
|	 |jdd ¡}|d urJ|j}n| j}|	 |jd¡sj| jrb|
jd | jkrad S n|
 | j¡rjd S tj ||| j | j| j|¡ d S )NrÔ  r¬  rj  rl  r   )r9   r@   r   r×  rØ  r  r  r   r7  r   rq  rr  Ú_entity_isar   ÚPostLoadÚpath_existsrW   r?   r   r_   rG   rs  ri  rt  ru  Úcallable_for_pathÚ_load_for_path)rY   r^   r`   ra   rG   rh   rb   ri   Úselectin_pathÚpath_w_propÚselectin_path_w_propr€  r�  r#   r#   r$   rj     sH   ÿÿþ

ÿÿúz#SelectInLoader.create_row_processorc                    s   |r	ˆj |vr	d S dd„ |D ƒ}ˆj‰ˆj‰ˆ ‡ ‡fdd„ˆ¡}| ‡ ‡‡‡fdd„¡ |j}	| |	j|ˆj ¡ |	j	rD| dd„ ¡ ˆjj
rS‡fdd„}
| |
¡ ˆj}|rZd	nd }|rÎ|d
ˆj… }|ˆjd … }dd„ t ||jƒj‡fdd„|D ƒd�dd„ ¡D ƒ}|D ]@\}}}|s—ˆj |jv r—q‰| ||¡}|s½|r½t|ƒdkr®t dˆ ¡ | ˆj ¡ ||j|d
 ¡ q‰| ˆj ¡ ||j|¡ q‰|s^d S d S )Nc                 S   s    g | ]\}}|j d  ||f‘qS ©r   r¶   )r›   r¢   Ú	overwriter#   r#   r$   rž   L  s    ÿz1SelectInLoader._load_for_path.<locals>.<listcomp>c                    s   |   t jdgˆ¢R Ž ˆ ¡S )Nr  )r   ÚBundler%  )r�  re  r#   r$   r%   T  s    ÿz/SelectInLoader._load_for_path.<locals>.<lambda>c                    s>   |   ˆ¡ tˆˆjjƒ ˆ ¡¡ ˆj t	j
ddd�¡¡jˆŽ S )NÚprimary_keysT)Ú	expanding)r,  r¹  r‹  rW   r   r·  r;  r^  Úin_r   rë   r3  r)  ©r�  Úpare  rY   r#   r$   r%   [  s    ÿÿÿ÷c                 S   s   |   ¡ S r   )rW  r)  r#   r#   r$   r%   n  ó    c                    s*   | j d }|j t ˆ jj¡¡}| j|Ž S ru   )rœ  rÂ  rÃ  r
   r5   rW   r3  )r*  rÄ  rÅ  r�   r#   r$   r  r  s
   
ÿ
z?SelectInLoader._load_for_path.<locals>._setup_outermost_orderbyr#   r   c                 S   s    i | ]\}}|d d„ |D ƒ“qS )c                 S   rÉ  rn  r#   rÊ  r#   r#   r$   rž   †  rÌ  z<SelectInLoader._load_for_path.<locals>.<dictcomp>.<listcomp>r#   rÍ  r#   r#   r$   Ú
<dictcomp>…  s    ÿÿz1SelectInLoader._load_for_path.<locals>.<dictcomp>c                    s$   g | ]\}}}ˆ j r|d  n|‘qS rŠ  )r`  )r›   r   r¢   ro  r�   r#   r$   rž   ‰  s    ÿÿ)rq  c                 S   s   | d S ru   r#   rÏ  r#   r#   r$   r%   Ž  rv  r   rë  )r   r_  r]  rÚ   r@  r   rF  rÀ  rW   rÁ  r3  r(   Ú
_chunksizerÑ  rÒ  r²   rò   r  r?   rO  r
   rP  rÄ   rà  )rY   r"  r^   r`   ÚstatesÚ	load_onlyr�  Ú
our_statesr*  rm  r  r(   Ú_empty_resultÚchunkÚdatar   r¢   ro  rá  r#   rt  r$   rj  D  sp   ÿüÿÿ



þÿùþþÿÿÿÝzSelectInLoader._load_for_path)rk   rl   rm   ro   rx  rV   r   r
   rZ  r#  rj   rj  rp   r#   r#   r[   r$   r\  í  s    	
1r\  c                    sT   ‡fdd„‰ ‡ fdd„}‡ fdd„}t j| d|dddd	� t j| d
|dddd	� d S )Nc                    sP   |d ur&|j ˆ j kr&| t |¡¡}|r&||ur&t dt |¡| jˆ f ¡‚|S )NzsInstance %s is already associated with an instance of %s via its %s attribute, and is only allowed a single parent.)	r   Ú	hasparentr   Úinstance_stater  r  r   Úinstance_strrC   )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$   r7   ¶  ó   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_r7   T)ÚrawÚretvalr0   r|   )r   Úlisten)r   r    r7   r‡  r#   )r„  r    r$   r8   ©  s   ÿr8   )NNNNFN)5rn   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   rN   ÚColumnPropertyÚstrategy_forrQ   Úclass_loggerrq   r†   rŒ   rï  r´   r¼   ÚRelationshipPropertyr¾   rÁ   ÚMemoizedSlotsrÏ   rV  r]  rh  rñ  r\  r8   r#   r#   r#   r$   Ú<module>   s®   
÷V#B; 
       @    u ;