o
    Šåg:Ô ã                   @  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" 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m0Z0 d'dlmZ1 d'd)lm2Z2 d'd*lm3Z3 d'd+lm4Z4 d'dlmZ d'dl4mZ5 d'd,l4m6Z6 d'd-l7m8Z8 d'd.l7m9Z9 d'd/l:m;Z; e
�r3d
d0l<m=Z= d
d1lm>Z> d'd2l?m@Z@ 					3	dfd4d5„ZAejBjCd3d3d6�G d7d8„ d8e&ƒƒZDe3jEejBjCd9d3d6�G d:d;„ d;e&ƒƒƒZFe3jEejBjCd9d<�G d=d>„ d>eFƒƒƒZGe3jEejBjCd9d9d?�ejBjCd9d9d9d@�ejBjCd9dA�G dBdC„ dCe&ƒƒƒƒƒZHG dDdE„ dEƒZIG dFdG„ dGe&ƒZJe3jEej>jCd9dA�G dHdI„ dIe&ƒƒƒZKe3jEej>jCdJdK�ej>jCddK�G dLdM„ dMeJƒƒƒƒZLe3jEej>jCd9dK�ej>jCdNdK�ej>jCdOdK�ej>jCdPdK�ej>jCdQdK�G dRdS„ dSeJejMe3jNƒƒƒƒƒƒƒZOG dTdU„ dUƒZPG dVdW„ dWeJƒZQej>jCdXdK�G dYdZ„ dZeQƒƒZRe3jEej>jCd[dK�G d\d]„ d]eQƒƒƒZSe3jEej>jCd^dK�ej>jCd3dK�G d_d`„ d`eJƒƒƒƒZTe3jEej>jCdadK�G dbdc„ dceQejMƒƒƒZUddde„ ZVdS )gzWsqlalchemy.orm.interfaces.LoaderStrategy
   implementations, and related MapperOptions.é    )ÚannotationsN)ÚAny)ÚDict)ÚOptional)ÚTuple)ÚTYPE_CHECKING)ÚUnioné   )Ú
attributes)Úexc)Ú
interfaces)Úloading)Úpath_registry)Ú
properties)Úquery)Úrelationships)Ú
unitofwork)Úutil)Ú_DEFER_FOR_STATE)Ú_RAISE_FOR_STATE)Ú_SET_DEFERRED_EXPIRED)ÚATTR_WAS_SET)ÚLoaderCallableStatus)ÚPASSIVE_OFF)ÚPassiveFlag)Ú_column_descriptions)ÚORMCompileState)ÚORMSelectCompileState)ÚQueryContext)ÚLoaderStrategy)ÚStrategizedProperty)Ú_state_session)ÚInstanceState)ÚLoad)Ú_none_only_set)ÚAliasedClassé   )Úevent)Úinspect)Úlog)Úsql)Úvisitors)ÚLABEL_STYLE_TABLENAME_PLUS_COL)ÚSelect)ÚLiteral)ÚMapper)ÚRelationshipProperty)ÚColumnElementFc	                   s   g }
|o| j ‰|r| jr|
 t¡ | j| jjv r+| jj| j \‰‰|
 ‡‡fdd„¡ |r3|
 tj¡ |rG| j	‰ ˆ rG| j
rG|
 ‡ ‡fdd„¡ |jD ]C}| |j | j¡u r�|j | j¡s�tj|j| jf| ˆ|||oq| jpq| jtju ||||| p{| j | jdœ|	¤Ž}|
D ]}||| ƒ q…qJd S )Nc                   s   t j| |jˆ fi ˆ¤ŽS ©N)Úorm_utilÚ_validator_eventsÚkey©ÚdescÚprop)ÚfnÚopts© úU/var/www/html/flaskapp/venv/lib/python3.10/site-packages/sqlalchemy/orm/strategies.pyÚ<lambda>\   s
    ÿÿz%_register_attribute.<locals>.<lambda>c                   s   t  | ˆ ˆ¡S r2   )r
   Úbackref_listenersr6   )ÚbackrefÚuselistr;   r<   r=   j   s    ÿ)Úparent_tokenr@   Úcompare_functionÚ	useobjectÚtrackparentÚtypecallableÚ	callable_Úactive_historyÚ
impl_classÚsend_modified_eventsÚdoc)r@   Úsingle_parentÚappendÚsingle_parent_validatorr5   Ú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ÚviewonlyrJ   )r8   ÚmapperrC   rB   rE   rF   Úproxy_propertyrG   rH   ÚkwÚlisten_hooksÚmr7   Úhookr;   )r?   r9   r:   r@   r<   Ú_register_attributeF   s^   


ÿ
ÿ
ÿþþ
ïî€ærc   )Ú
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 ƒ  ||¡ | jj| _d S r2   )ÚsuperÚ__init__Úparent_propertyrh   ©ÚselfrN   Ústrategy_key©Ú	__class__r;   r<   rk   ¢   ó   z#UninstrumentedColumnLoader.__init__Nc           	      K  s*   | j D ]}|r|j | }| ||¡ qd S r2   )rh   Ú_append_dedupe_col_collection)	rn   Úcompile_stateÚquery_entityÚpathÚloadoptÚadapterÚcolumn_collectionÚkwargsÚcr;   r;   r<   Úsetup_query¦   s
   


ýz&UninstrumentedColumnLoader.setup_queryc	           	      C  s   d S r2   r;   ©	rn   Úcontextru   rv   rw   r]   Úresultrx   Ú
populatorsr;   r;   r<   Úcreate_row_processorµ   s   z/UninstrumentedColumnLoader.create_row_processorr2   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__rk   r|   r�   Ú__classcell__r;   r;   rp   r<   rf   —   s    
ùrf   Tc                      s@   e Zd ZdZdZ‡ fdd„Z	ddd„Zdd	„ Zd
d„ Z‡  Z	S )ÚColumnLoaderz8Provide loading behavior for a :class:`.ColumnProperty`.)rh   Úis_compositec                   s*   t ƒ  ||¡ | jj| _t| jdƒ| _d S )NÚcomposite_class)rj   rk   rl   rh   Úhasattrr‰   rm   rp   r;   r<   rk   Ê   s   
zColumnLoader.__init__Fc	                 K  sv   | j D ]}
|r|r| |
¡}
|
d u r d S n|j |
 }
| |
|¡ q| j d }|r4|j | }|d u r4d S ||| j< d S ©Nr   )rh   Úadapt_check_presentrs   rl   )rn   rt   ru   rv   rw   rx   ry   Úmemoized_populatorsÚcheck_for_adaptrz   r{   Úfetchr;   r;   r<   r|   Ï   s   

ÿ


zColumnLoader.setup_queryc                 C  s`   d| _ | jd j}| jjp"| jd jp"|jd uo"|j |jd ¡| ju }t	| j|d|j
|d� d S )NTr   F)rC   rB   rG   )Úis_class_levelrh   Útyperl   rG   Úprimary_keyÚversion_id_colÚ_columntopropertyrU   rc   Úcompare_values)rn   r]   ÚcoltyperG   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)rh   Ú_getterrL   r5   )rn   r~   ru   rv   rw   r]   r   rx   r€   ÚcolÚgetterr;   r;   r<   r�     s   

þz!ColumnLoader.create_row_processor©F)
r‚   rƒ   r„   r…   r†   rk   r|   r˜   r�   r‡   r;   r;   rp   r<   rˆ   Ã   s    
÷!rˆ   )Ú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 ¡‰ t‡ fdd„| jjD ƒƒ| _d S )Nc                 3  s   � | ]	}|  ˆ ¡ V  qd S r2   )Úcompare©Ú.0r{   ©Únullr;   r<   Ú	<genexpr>)  s   € 
ÿz2ExpressionColumnLoader.__init__.<locals>.<genexpr>)	rj   rk   r*   r¦   ÚlabelÚanyrl   rh   Ú_have_default_expressionrm   rp   r¥   r<   rk   "  s
   ÿzExpressionColumnLoader.__init__c                 K  s„   d }	|r|j r|j }	n| jr| jj}	|	d u rd S |	D ]}
|r#|j|
 }
| |
|¡ q|	d }|r;|j| }|d u r;d S ||| j< d S rŒ   )Ú_extra_criteriarª   rl   rh   rs   )rn   rt   ru   rv   rw   rx   ry   rŽ   rz   rh   r{   r�   r;   r;   r<   r|   -  s"   


z"ExpressionColumnLoader.setup_queryc	                 C  sr   |r5|j r7|j }	|	D ]}
|r|j|
 }
| |
d¡}|r(|d  | j|f¡  d S q
|d  | jdf¡ d S d S d S r™   )r«   rh   rœ   rL   r5   )rn   r~   ru   rv   rw   r]   r   rx   r€   rh   r�   rž   r;   r;   r<   r�   R  s   

þõz+ExpressionColumnLoader.create_row_processorc                 C  s(   d| _ t| j|d| jd jjdd� d S )NTFr   )rC   rB   Úaccepts_scalar_loader)r‘   rc   rl   rh   r’   r–   ©rn   r]   r;   r;   r<   r˜   l  s   
ûz+ExpressionColumnLoader.init_class_attribute)r‚   rƒ   r„   rk   r|   r�   r˜   r‡   r;   r;   rp   r<   r¡     s
    %r¡   )re   rd   )re   rd   Ú	raiseload)Ú
do_nothingc                      sP   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	dd„ Z
‡  ZS )ÚDeferredColumnLoaderzAProvide loading behavior for a deferred :class:`.ColumnProperty`.)rh   Úgroupr®   c                   sJ   t ƒ  ||¡ t| jdƒrtdƒ‚| j dd¡| _| jj| _| jj	| _	d S )NrŠ   z8Deferred loading for composite types not implemented yetr®   F)
rj   rk   r‹   rl   ÚNotImplementedErrorÚstrategy_optsrU   r®   rh   r±   rm   rp   r;   r<   rk   ƒ  s   ÿ
zDeferredColumnLoader.__init__c	           
   
   C  s’   |j r"|jjjr"| j|jjjv r"| j d¡ ||||||||¡ d S | js=| j	r-| jj
}	n| jj}	|d  | j|	f¡ d S |d  | jdf¡ d S )N©)re   F©rd   TÚnewr›   F)Úrefresh_stater   Ú_compile_optionsÚ_only_load_propsr5   rl   Ú_get_strategyr�   r‘   r®   Ú_raise_column_loaderÚ_deferred_column_loaderrL   )
rn   r~   ru   rv   rw   r]   r   rx   r€   Úset_deferred_for_local_stater;   r;   r<   r�   �  s4   ÿþÿøÿÿz)DeferredColumnLoader.create_row_processorc                 C  s,   d| _ t| j|d| jd jj| jdd� d S )NTFr   )rC   rB   rF   Úload_on_unexpire)r‘   rc   rl   rh   r’   r–   Ú_load_for_stater­   r;   r;   r<   r˜   À  s   
úz)DeferredColumnLoader.init_class_attributeNc	           
      K  s´   |j jr| jjs*|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rIt|| j< d S | jsSt|| j< d S t|| j< d S )Nzundefer_group_%sFr´   )Úcompile_optionsÚ_render_for_subqueryrl   Ú_renders_in_subqueriesÚsetrh   ÚintersectionrN   Ú_should_undefer_in_wildcardr±   Ú
local_optsrU   r5   rº   r|   r‘   r   r®   r   r   )
rn   rt   ru   rv   rw   rx   ry   rŽ   Úonly_load_propsr_   r;   r;   r<   r|   Ì  sP   þýú
ÿùôó
ÿòî
ÿ÷

ö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 ¡‚ˆ jrLˆ  ˆ|d¡ t ˆjˆt|ƒt¡ tjS )Nc                   s4   g | ]}t |tƒrt |jtƒr|jˆ jkr|j‘qS r;   )Ú
isinstancer    Ústrategyr°   r±   r5   )r¤   Úp©rn   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Úraise)r5   r   Ú
ATTR_EMPTYr   ÚSQL_OKÚPASSIVE_NO_RESULTÚmanagerr]   r±   Úiterate_propertiesr!   Úorm_excÚDetachedInstanceErrorr3   Ú	state_strr®   Ú_invoke_raise_loadr   Úload_scalar_attributesrÃ   r   r   )rn   rÏ   ÚpassiveÚlocalparentÚtoloadr±   Úsessionr;   )rn   rÏ   r<   r¿   ÿ  s0   

þþÿÿz$DeferredColumnLoader._load_for_statec                 C  s   t  d| f ¡‚)Nz+'%s' is not available due to raiseload=True©Úsa_excÚInvalidRequestError©rn   rÏ   rÛ   Úlazyr;   r;   r<   rÙ   '  s   ÿz'DeferredColumnLoader._invoke_raise_loadr2   )r‚   rƒ   r„   r…   r†   rk   r�   r˜   r|   r¿   rÙ   r‡   r;   r;   rp   r<   r°   x  s    
3
÷3(r°   c                   @  s*   e Zd ZdZdddd„Zejfd	d
„ZdS )ÚLoadDeferredColumnsz7serializable loader object used by DeferredColumnLoaderFr5   Ústrr®   Úboolc                 C  s   || _ || _d S r2   )r5   r®   )rn   r5   r®   r;   r;   r<   rk   0  s   
zLoadDeferredColumns.__init__c                 C  s>   | j }|jj}|j| }| jrd}nd}| |¡}| ||¡S )N)©re   Trµ   )r®   T)rç   rµ   )r5   rÔ   r]   rT   r®   rº   r¿   )rn   rÏ   rÛ   r5   rÜ   r8   ro   rÉ   r;   r;   r<   Ú__call__4  s   

zLoadDeferredColumns.__call__NrŸ   )r5   rå   r®   ræ   )r‚   rƒ   r„   r…   rk   r
   r   rè   r;   r;   r;   r<   rä   -  s    rä   c                      s,   e Zd ZdZdZ‡ fdd„Zdd„ Z‡  ZS )ÚAbstractRelationshipLoaderz0LoaderStratgies which deal with related objects.)r]   Útargetr@   Úentityc                   s:   t ƒ  ||¡ | jj| _| jj| _| jj| _| jj| _d S r2   )rj   rk   rl   r]   rë   rê   r@   rm   rp   r;   r<   rk   J  s
   


z#AbstractRelationshipLoader.__init__c	           	   
   C  s    | j  d¡ ||||||||¡S )N))rã   Ú	immediate)rl   rº   r�   r}   r;   r;   r<   Ú#_immediateload_create_row_processorQ  s   ÿøþz>AbstractRelationshipLoader._immediateload_create_row_processor)r‚   rƒ   r„   r…   r†   rk   rí   r‡   r;   r;   rp   r<   ré   E  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)r‚   rƒ   r„   r…   r;   r;   r;   r<   rî   j  s    rî   Únoload)rã   c                   @  s$   e Zd ZdZdZdd„ Zdd„ ZdS )ÚNoLoaderzQProvide loading behavior for a :class:`.Relationship`
    with "lazy=None".

    r;   c                 C  s    d| _ t| j|d| jjd� d S )NT)rC   rE   )r‘   rc   rl   Úcollection_classr­   r;   r;   r<   r˜   �  s   
üzNoLoader.init_class_attributec	           
        s$   ‡ fdd„}	|d   ˆ j|	f¡ d S )Nc                   s(   ˆ j rt | |ˆ j¡ d S d |ˆ j< d S r2   )r@   r
   Úinit_state_collectionr5   ©rÏ   Údict_ÚrowrË   r;   r<   Úinvoke_no_load–  s   z5NoLoader.create_row_processor.<locals>.invoke_no_loadr¶   )rL   r5   )
rn   r~   ru   rv   rw   r]   r   rx   r€   rö   r;   rË   r<   r�   ‹  s   zNoLoader.create_row_processorN)r‚   rƒ   r„   r…   r†   r˜   r�   r;   r;   r;   r<   rð   v  s
    
rð   ÚselectrÐ   Úraise_on_sqlÚbaked_selectc                      s¨   e Zd ZU dZdZded< ded< ded< ded< d	ed
< d#‡ fdd„Zdd„ Zdd„ Zdd„ Z	dd„ Z
ddddejfdd„Zdd„ Ze d¡dd „ ƒZd!d"„ Z‡  ZS )$Ú
LazyLoaderztProvide loading behavior for a :class:`.Relationship`
    with "lazy=True", that is loads when first accessed.

    )Ú
_lazywhereÚ_rev_lazywhereÚ_lazyload_reverse_optionÚ	_order_byÚuse_getÚis_aliased_classÚ_bind_to_colÚ_equated_columnsÚ_rev_bind_to_colÚ_rev_equated_columnsÚ_simple_lazy_clauseÚ_raise_alwaysÚ_raise_on_sqlzColumnElement[bool]rû   zDict[str, ColumnElement[Any]]r  rü   r  úRelationshipProperty[Any]rl   rN   ro   úTuple[Any, ...]c                   s8  t ƒ  ||¡ | jd dk| _| jd dk| _t| jƒj| _| jj	}| 
¡ \| _| _| _|j
dd�\| _| _| _| jjrJdd„ t | jj¡D ƒ| _nd | _| j d| | j¡ | j om| j om| jjd	 j| jdd
| jjd�| _| jršt| jƒD ]}|| jjv r�| jj| D ]
}| j| | j|< q…qw| j d| ¡ d S d S )Nrã   rÐ   rø   T)Úreverse_directionc                 S  s   g | ]
}t  |d di¡‘qS )Ú
_orm_adaptT)Úsql_utilÚ_deep_annotate©r¤   Úelemr;   r;   r<   rÌ   Û  s    ÿÿz'LazyLoader.__init__.<locals>.<listcomp>z%s lazy loading clause %sr   F©Úuse_proxiesÚcompare_keysÚequivalentsz4%s will use Session.get() to optimize instance loads)rj   rk   r³   r  r  r(   rë   r   rl   Ú_join_conditionÚcreate_lazy_clauserû   r  r  rü   r  r  Úorder_byr   Úto_listrþ   ÚloggerÚinfor@   Ú_get_clauser¢   r]   Ú_equivalent_columnsrÿ   Úlist)rn   rN   ro   Újoin_conditionr�   r{   rp   r;   r<   rk   Ä  sR   ü
ü
þ
ÿüý€ÿúzLazyLoader.__init__c              	   C  sv   d| _ | jj}| jjrd}d}n| jjtjus| js&|r!d}d}n	d}d}nd }}t| j|d| j	| jj
||d� d S )NTF)rC   rF   rE   rG   Ú_deferred_history)r‘   rl   Ú_legacy_inactive_history_stylerG   rZ   r   Ú	MANYTOONErÿ   rc   r¿   rñ   )rn   r]   r  rG   r  r;   r;   r<   r˜      s0   ÿÿ
ùzLazyLoader.init_class_attributec                   sd   t  | jddi¡}|| j}‰ g ‰dd„ }t |i d|i¡ ‡ ‡fdd„}t |i d|i¡}|ˆfS )Nr  Tc                 S  s
   d| _ d S )NF)Úunique©Ú	bindparamr;   r;   r<   Úvisit_bindparam+  s   
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 r2   )Ú_identifying_keyrL   r5   ÚcallableÚvaluer"  ©Úbind_to_colÚparamsr;   r<   r$  0  s   
ýÿ
ÿ)r  r  rû   r  r+   ÚtraverseÚcloned_traverse)rn   Ú	lazywhereÚ	criterionr$  r;   r(  r<   Ú"_memoized_attr__simple_lazy_clause"  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¤   r5   Úidentr'  r;   r;   r<   rÌ   G  ó    z4LazyLoader._generate_lazy_clause.<locals>.<listcomp>)r  r  Úadapt_criterion_to_nullrl   rN   Úobjr
   Úinstance_dictr   ÚINIT_OKÚLOAD_AGAINST_COMMITTEDÚ#_get_committed_state_attr_by_columnÚ_get_state_attr_by_column)rn   rÏ   rÛ   r.  Ú
param_keysr]   Úorô   r*  r5   r0  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'rß   râ   r;   r;   r<   rÙ   b  s   
ÿzLazyLoader._invoke_raise_loadNr;   c                 C  sš  |j s| jjs
|jr|jstjS |j  }d }	| jo| p|j }
|t	j
@ s'|
r.|tj@ s1|r1tjS | jrG|t	j@ sG|
r@|t	j@ rG|  ||d¡ t|ƒ}|sb|t	j@ rUtjS t dt |¡| j f ¡‚|
rÀ|  |||¡}	tj|	v rstjS tj|	v r{tjS | jjs‡t |	¡r†d S nt |	¡rŽd S | j |jv rœ|t	j@ sœtj S |j!| j"|	||d�}|d ur³|tj#u r±d S |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)%r5   rl   Úload_on_pendingÚ_load_pendingÚ
session_idr   rÑ   rÿ   r«   r   rÒ   r
   ÚNON_PERSISTENT_OKrÓ   r  ÚNO_RAISEÚRELATED_OBJECT_OKrÙ   r!   rÖ   r×   r3   rØ   Ú_get_ident_for_use_getÚ	NEVER_SETr]   Úallow_partial_pksr$   rÄ   Ú
issupersetÚdictÚDEFERRED_HISTORY_LOADr   Ú_identity_lookuprë   ÚPASSIVE_CLASS_MISMATCHÚ_emit_lazyload)rn   rÏ   rÛ   rw   Úextra_criteriaÚextra_optionsÚalternate_effective_pathÚexecution_optionsÚpendingÚprimary_key_identityrÿ   rÞ   Úinstancer;   r;   r<   r¿   g  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Û   rn   rÏ   r;   r<   rÌ   è  s    ÿÿz5LazyLoader._get_ident_for_use_get.<locals>.<listcomp>)rÔ   r]   r   r6  r7  r8  rG  r“   )rn   rÞ   rÏ   rÛ   Úinstance_mapperr;   rW  r<   rC  Þ  s   
þz!LazyLoader._get_ident_for_use_getzsqlalchemy.orm.strategy_optionsc
                   s   t jj‰ˆ j ¡ }
tj|
g|
jtt	j
d�}tj}|d|dœ7 }ˆ jjd ur.| ˆ jˆ jj¡}|j }|s9|tj@ rAt  ddi¡|_ˆ j}|jsL|rt|jrt|d u rW|jˆ j }n|ˆ j }|j}|rp|jrpd}|t ˆ j|¡f7 }||_n|d u r€|jjˆ j }n|ˆ j }|rŽ| j|7  _| jd|i7  _|r²ˆ jr¨|t j!@ s¨ˆ  "||d¡ t#j$|||||	d�S ˆ j%r¹ˆ j%|_&‡ ‡fdd	„}| j'|ˆ jff7  _'ˆ  (||¡\}}|	rßt j) *|	d
|i¡}	nd
|i}	ˆ j|j+v rñ|t j,@ sñt-j.S |rÿt  /tj0| 1¡ ¡rþd S nt  /tj2| 1¡ ¡�rd S ˆ j�r|t j!@ �sˆ  "||d¡ |f|_3|j4|||	d�}| 5¡  6¡  7¡ }ˆ j8�r6|S t9|ƒ}|�rN|dk�rJt  :dˆ j ¡ |d S d S )N)Ú_raw_columnsÚ_propagate_attrsÚ_label_styler¸   F)Ú_invoke_all_eagersÚ_lazy_loaded_fromÚ	autoflushÚ_current_pathrø   )Úload_optionsrO  c                   sR   ˆ j jD ]"}|jtju r&|jr&t|jtƒs&ˆj	 
| jj|j ¡ |¡ | ¡ qd S r2   )rl   Ú_reverse_propertyrZ   r   r   Ú_use_getrÈ   rÉ   rú   r#   Ú_construct_for_existing_pathrÀ   r`  rN   ÚlazyloadÚprocess_compile_state)Úcompile_contextÚrev©rn   Ústrategy_optionsr;   r<   Ú_lazyload_reverseB  s   ÿ
þÿÿ€ôz4LazyLoader._emit_lazyload.<locals>._lazyload_reverseÚ_sa_orm_load_options)rO  r	   zKMultiple rows returned with uselist=False for lazily-loaded attribute '%s' r   );r   Ú	preloadedÚorm_strategy_optionsrë   Ú__clause_element__r-   Ú_create_raw_selectr[  r,   r   Údefault_compile_optionsr   Údefault_load_optionsrl   Ú	secondaryÚselect_fromr]   r5   r
   ÚNO_AUTOFLUSHÚimmutabledictÚ_execution_optionsrÿ   ra  r«   Ú	load_pathr3   ÚLoaderCriteriaOptionÚ_with_optionsÚ_path_registryr¸   r  r   rA  rÙ   r   Úload_on_pk_identityrþ   Ú_order_by_clausesÚ_with_context_optionsr;  Ú
EMPTY_DICTÚ
merge_withrG  rH  r   r   Úhas_intersectionÚ	_none_setÚvaluesÚ
_never_setÚ_where_criteriaÚexecuter!  ÚscalarsÚallr@   ÚlenÚwarn)rn   rÞ   rÏ   rQ  rÛ   rw   rL  rM  rN  rO  ÚclauseelementÚstmtra  rP  rÿ   Úeffective_pathr:   rk  Úlazy_clauser*  r   Úlr;   ri  r<   rK  í  s¸   
üþ
ÿ

ÿ
ûÿÿþÿÿÿÿ
þÿzLazyLoader._emit_lazyloadc	              
     sÆ   | j ‰ |jjr |jjjr | j |jjjv r |  ||||||||¡S | jr(|rI|jrIt	 
|jtˆ | ||jr8| |¡nd ƒˆ ¡}	|d  | j |	f¡ d S |jsO|jra‡ fdd„}
|d  | j |
f¡ d S d S )Nr¶   c                   s   |   |ˆ ¡ d S r2   )Ú_resetró   ©r5   r;   r<   Úreset_for_lazy_callableÅ  s   	z@LazyLoader.create_row_processor.<locals>.reset_for_lazy_callable)r5   ra  Ú_is_user_refreshr   r¸   r¹   rí   r‘   r«   r"   Ú"_instance_level_callable_processorrV   ÚLoadLazyAttributeÚ_generate_extra_criteriarL   Úpopulate_existingÚalways_refresh)rn   r~   ru   rv   rw   r]   r   rx   r€   Úset_lazy_callabler’  r;   r‘  r<   r�   ‹  sF   ÿþø
ÿù
óÿózLazyLoader.create_row_processor)rN   r  ro   r	  )r‚   rƒ   r„   r…   r†   Ú__annotations__rk   r˜   r/  r;  rÙ   r   r  r¿   rC  Úpreload_modulerK  r�   r‡   r;   r;   rp   r<   rú   Ÿ  s0   
 	<"  	
øw
 rú   c                   @  s.   e Zd ZdZdd„ Zdd„ Zejfdd„ZdS )	r•  a¦  semi-serializable loader object used by LazyLoader

    Historically, this object would be carried along with instances that
    needed to run lazyloaders, so it had to be serializable to support
    cached instances.

    this is no longer a general requirement, and the case where this object
    is used is exactly the case where we can't really serialize easily,
    which is when extra criteria in the loader option is present.

    We can't reliably serialize that as it refers to mapped entities and
    AliasedClass objects that are local to the current process, which would
    need to be matched up on deserialize e.g. the sqlalchemy.ext.serializer
    approach.

    c                 C  s   || _ |j| _|| _|| _d S r2   ©r5   ro   rw   rL  )rn   r5   Úinitiating_strategyrw   rL  r;   r;   r<   rk   å  s   
zLoadLazyAttribute.__init__c                 C  s(   | j d ur
t d¡ | j| j| jddœS )NzvCan't reliably serialize a lazyload() option that contains additional criteria; please use eager loading for this caser;   rœ  )rL  r   rŠ  r5   ro   rw   rË   r;   r;   r<   Ú__getstate__ë  s   
ÿüzLoadLazyAttribute.__getstate__c                 C  s:   | j }|jj}|j| }|j| j }|j||| j| jd�S )N)rw   rL  )	r5   rÔ   r]   rT   Ú_strategiesro   r¿   rw   rL  )rn   rÏ   rÛ   r5   rY  r8   rÉ   r;   r;   r<   rè   ù  s   
üzLoadLazyAttribute.__call__N)	r‚   rƒ   r„   r…   rk   rž  r
   r   rè   r;   r;   r;   r<   r•  Ó  s
    r•  c                   @  s   e Zd ZdZdZddd„ZdS )Ú
PostLoaderz;A relationship loader that emits a second SELECT statement.r;   Nc                 C  sF  |j jptjj| }| ¡ }t d|i¡}|r#|j 	dd ¡}|dk}	nd }d}	|d ura| j
js9t d| j
› d�¡‚|j 	dt| ƒ› �|¡}|	sQ|dk rQ|d||fS |	sa| dt| ƒ› �|d	 i¡}tj ||| j
¡rp|d||fS || j
 }
|| j
 }|
 |jd
¡s�|r‘|jd |kr�|d||fS n| | j¡r�|d||fS |d||fS )NÚsa_top_level_orm_contextÚrecursion_depthéÿÿÿÿFz'recursion_depth option on relationship z0 not valid for non-self-referential relationshipÚ_recursion_depth_r   r	   Úloaderr&   T)rt   Úcurrent_pathr3   ÚPathRegistryÚrootÚ_get_top_level_contextr   rv  rÆ   rU   rl   Ú_is_self_referentialrà   rá   rO  ÚidÚunionr   ÚPostLoadÚpath_existsÚcontainsr
   ÚlengthÚcontains_mapperr]   )rn   r~   rv   rw   Ú
join_depthr�  Útop_level_contextrO  r¢  Úunlimited_recursionÚpath_w_propÚeffective_path_w_propr;   r;   r<   Ú_setup_for_recursion  sn   þÿ
ÿÿÿüÿÿÿ

üÿüzPostLoader._setup_for_recursionr2   )r‚   rƒ   r„   r…   r†   r·  r;   r;   r;   r<   r     s    r   rì   c                      s8   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zdd	„ Z‡  ZS )
ÚImmediateLoader©r²  c                   ri   r2   ©rj   rk   rl   r²  rm   rp   r;   r<   rk   W  rr   zImmediateLoader.__init__c                 C  ó   | j  d¡ |¡ d S ©N©)rã   r÷   ©rl   rº   r˜   r­   r;   r;   r<   r˜   [  ó   ÿz$ImmediateLoader.init_class_attributec	                 C  sl   |j jjsd S |  |||| j¡\}	}
}}|
stjtjB }ntj	tjB }t
j ||	| j| j| j||||¡	 d S r2   )rt   rÀ   Ú_enable_eagerloadsr·  r²  r
   ÚPASSIVE_NO_FETCH_RELATEDr   rA  r   r   r­  Úcallable_for_pathrN   rl   Ú_load_for_path)rn   r~   ru   rv   rw   r]   r   rx   r€   r�  Ú
run_loaderrO  r¢  Úflagsr;   r;   r<   r�   `  s,   
û÷z$ImmediateLoader.create_row_processorc	                 C  s¦   |rt |jjƒ}	|| ¡ f|	_| ¡ }
|	f}nd }	|}
d}| j}| j d¡}|D ](\}}|j	}|s5||vrP|j
||||
|d�}|ttjfvrP| |¡ |||¡ q(d S )Nr;   r½  )rM  rN  rO  )r#   rv   rë   Ú_recurser~   Ú_truncate_recursiver5   rl   rº   rG  r¿   r   r   rÓ   Úget_implÚset_committed_value)rn   r~   rv   ÚstatesÚ	load_onlyrw   rÅ  r¢  rO  Únew_optrN  rM  r5   Ú
lazyloaderrÏ   Ú	overwriterô   r'  r;   r;   r<   rÃ  Š  s>   þûþ
ÿ€ñzImmediateLoader._load_for_path)	r‚   rƒ   r„   r†   rk   r˜   r�   rÃ  r‡   r;   r;   rp   r<   r¸  S  s    *r¸  Úsubqueryc                      s†   e 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
dd„ ZG dd„ dƒZdd„ Zdd„ Zdd„ Zdd„ Z‡  ZS )ÚSubqueryLoaderr¹  c                   ri   r2   rº  rm   rp   r;   r<   rk   ½  rr   zSubqueryLoader.__init__c                 C  r»  r¼  r¾  r­   r;   r;   r<   r˜   Á  r¿  z#SubqueryLoader.init_class_attributec                   sÀ   |}|j }t |d ¡}| j |¡r!| j|d u r!| j| j‰ }n||d ‰ }|rK|j| jj| ‰t	|ƒt	ˆƒ }|rJˆt
j || d … ¡7 ‰n|‰|j}	‡ ‡fdd„|	D ƒ}
ˆ |
|ˆfS )Nr   r	   c                   s&   g | ]}t ˆjd  jˆ j| jƒ‘qS ©r   )Úgetattrrv   rë   r•   r5   r£   ©Úleftmost_mapperÚnew_subq_pathr;   r<   rÌ   í  s    ü

þÿz0SubqueryLoader._get_leftmost.<locals>.<listcomp>)rv   r3   Ú_class_to_mapperrN   Úisarl   Ú	_entitiesÚentity_zeror{  r‰  r   r§  ÚcoerceÚlocal_columns)rn   Úorig_query_entity_indexÚ	subq_pathÚcurrent_compile_stateÚis_rootÚgiven_subq_pathÚsubq_mapperÚleftmost_propÚ
additionalÚleftmost_colsÚleftmost_attrr;   rÓ  r<   Ú_get_leftmostÆ  s4   
ÿÿþÿ€ûzSubqueryLoader._get_leftmostc                 C  s*  |  ¡  d ¡}tj tj¡}|j |j¡ |}|js0d|_|j	j
|gdd„ t||d�D ƒ¢R Ž  | dd„ |D ƒ| ¡ ¡}	|	|_|j}
|
du rKd|_n|
d u rfdd„ |	D ƒD ]}t|	ƒ |j¡sed|_ nqV|jsld	|_|jdu r„|jr„t |	|j¡}|r„| |	| ¡ | t¡ ¡ }tj||dd
�}|S )NFc                 S  s    h | ]}|d  dur|d  ’qS )rë   Nr;   )r¤   Úentr;   r;   r<   Ú	<setcomp>  s
    üz?SubqueryLoader._generate_from_original_query.<locals>.<setcomp>)rt   c                 S  s   g | ]}t j t jj|¡‘qS r;   )r*   Ú	coercionsÚexpectÚrolesÚColumnsClauseRole)r¤   r:  r;   r;   r<   rÌ   0  ó    ÿÿz@SubqueryLoader._generate_from_original_query.<locals>.<listcomp>Tc                 S  s   h | ]}|j ’qS r;   )Útabler£   r;   r;   r<   rè  ?  s    r;   ©Úuse_mapper_path)Ú_cloneÚ	correlater   ÚQueryÚ__new__Ú__dict__ÚupdateÚ	_from_objÚ_enable_assertionsrt  Únon_generativer   Ú_adapt_col_listÚ_get_current_adapterrZ  Údistinct_target_keyÚ	_distinctrÃ   rF  r“   Ú_has_row_limiting_clauser}  r  Ú expand_column_list_from_order_byÚ_set_entitiesÚset_label_styler,   rÏ  r3   r%   )rn   Úorig_compile_stateÚ
orig_queryrÔ  rå  Úleftmost_relationshipÚorig_entityÚqÚq2Útarget_colsrü  ÚtÚto_addÚembed_qÚ
left_aliasr;   r;   r<   Ú_generate_from_original_query÷  sX   ÿÿþþþûþÿÿ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&   r£  Trï  c                   s    g | ]}t ˆ ˆjj| jƒ‘qS r;   )rÒ  rN   r•   r5   r£   ©Úparent_aliasrn   r;   r<   rÌ   „  s    ÿÿz2SubqueryLoader._prep_for_joins.<locals>.<listcomp>)r  ÚpairsÚ	enumerater]   r×  rL   r5   r‰  r(   r   rë   r3   r%   rl   rÛ  )rn   r  rÝ  Úto_joinr  Úir]   r8   Úprev_mapperÚ	to_appendr  Ú
local_colsÚ
local_attrr;   r  r<   Ú_prep_for_joins[  s*   ÿþ
zSubqueryLoader._prep_for_joinsc                 C  s.  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 ]}
| |
¡}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   r3   r%   rë   )r¤   Úitemr;   r;   r<   rÌ   š  s    	ûÿúÿz/SubqueryLoader._apply_joins.<locals>.<listcomp>)r‰  rÒ  Úof_typeÚpoprL   rN   Újoin)rn   r  r  r  r  Úeffective_entityÚltjÚmiddleÚinnerr  Úattrr;   r;   r<   Ú_apply_joinsŠ  sF   ÿÿþ
	÷


øÿÿÿþÿ
zSubqueryLoader._apply_joinsc           	      C  sB   |j }|r|jr|t | j| |¡¡f7 }| |¡}|j|Ž }|S r2   )rz  r«   r3   ry  rë   r–  Ú_with_current_pathÚoptions)	rn   r~   r  rÝ  Úrewritten_pathr  r  rw   Únew_optionsr;   r;   r<   Ú_setup_optionsÀ  s   
þÿ
	
zSubqueryLoader._setup_optionsc                   s&   ˆ j jr‡ fdd„}| |ˆ j ¡}|S )Nc                   ó    |  j tt ˆ jj¡ƒ7  _ d S r2   ©Úeager_order_byÚtupler   r  rl   r  ©rg  rË   r;   r<   Ú_setup_outermost_orderbyå  ó   ÿzISubqueryLoader._setup_outermost_orderby.<locals>._setup_outermost_orderby)rl   r  Ú_add_context_option)rn   r  r-  r;   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.Query` used to emit the "subquery load",
        provide a load interface that executes the query at the
        first moment a value is needed.

        ©rÞ   rO  ra  r*  ÚsubqÚ_datac                 C  s4   |j | _ |j| _|j| _|jpi | _|| _d | _d S r2   r0  )rn   r~   r1  r;   r;   r<   rk      s   
z(SubqueryLoader._SubqCollections.__init__c                 C  s    | j d u r	|  ¡  | j  ||¡S r2   )r2  Ú_loadrU   )rn   r5   Údefaultr;   r;   r<   rU   
  s   
z#SubqueryLoader._SubqCollections.getc                 C  s„   t  t¡| _| j}|jd u sJ ‚| | j¡}| jjr| 	¡ }t| 
| j
¡ƒ}t |dd„ ¡D ]\}}| j|  dd„ |D ƒ¡ q.d S )Nc                 S  s   | dd … S )Nr	   r;   ©Úxr;   r;   r<   r=     s    z7SubqueryLoader._SubqCollections._load.<locals>.<lambda>c                 s  ó   � | ]}|d  V  qdS )r   Nr;   ©r¤   Úvvr;   r;   r<   r§     ó   € z8SubqueryLoader._SubqCollections._load.<locals>.<genexpr>)ÚcollectionsÚdefaultdictr  r2  r1  rÞ   Úwith_sessionra  Ú_populate_existingr—  r*  Ú	itertoolsÚgroupbyÚextend)rn   r  ÚrowsrÎ   Úvr;   r;   r<   r3    s   ÿz%SubqueryLoader._SubqCollections._loadc                 C  s   | j d u r|  ¡  d S d S r2   )r2  r3  )rn   rÏ   rô   rõ   r;   r;   r<   r¥     s   
ÿz&SubqueryLoader._SubqCollections.loaderN)	r‚   rƒ   r„   r…   r†   rk   rU   r3  r¥  r;   r;   r;   r<   Ú_SubqCollectionsð  s    	
rD  c              	   C  s¦  |j }|jjr|jjrd S |j |¡}d|_|| j }| |j	dd ¡}	|	d ur*|	}
n| j
}
|jj dtjjtjjf¡\}}|tjju }|| }|| }|jj dtf|j¡}t |d¡}|jrq|jjd u rnt d| |f ¡ |j}|j|dd�}|  ||||¡\}}}}|  ||||||¡}t |
¡}|jj |jdtf|d||fi¡|_| d¡}|   ||¡\}}}|j!|Ž }|  "|||||
¡}|  #||||||
|¡}|  $|¡}|S )	NTÚpath_with_polymorphic)Úsubquery_pathsNr  ÚormzÙsubqueryloader for "%s" must invoke lambda callable at %r in order to produce a new query, decreasing the efficiency of caching for this statement.  Consider using selectinload() for more effective full-lambda cachingF)Úlegacy)%rt   rÀ   rÀ  Ú_for_refresh_staterØ  ÚindexÚloaders_require_bufferingrl   rU   r
   rë   r   rw  r3   r§  r¨  rÐ  r   Ú_get_plugin_class_for_pluginÚ_is_lambda_elementra  r^  r   rŠ  Ú	_resolvedÚ_create_entities_collectionræ  r  ró  r€  rO  Ú_set_enable_single_critr  Úadd_columnsr"  r'  r-  )rn   r~   ru   rv   rë   rw   rx   rt   rÜ  Úwith_poly_entityr  rÝ  r%  rß  r  Úcompile_state_clsr  rÔ  rå  r  r  r  r  r  r  r;   r;   r<   Ú_setup_query_from_rowproc$  s¨   	ÿþ
ÿþ
ÿÿûÿÿ	üû
ú
þþ

ÿ

ÿù
	z(SubqueryLoader._setup_query_from_rowprocc	              
     sŒ  |r|j jd ur|j jjrt dd¡ |jr"|  ||||||ˆ |¡S |  |||| j¡\}	}
}	}	|
s3d S t	|j t
ƒs;d S | jj| j jjsKt d|  ¡‚t|ƒdkr\t |j| j¡s[d S nt |d | j¡sgd S |  ||||d |ˆ ¡}|d u ryd S |jd u s€J ‚|| j }| jj}| |jd¡}|d u r¢|  ||¡}| |jd|¡ ˆ r­‡ fdd„|D ƒ}| jr»|  |||||¡ d S |   |||||¡ d S )	Nz°The subqueryload loader option is not compatible with DML statements such as INSERT, UPDATE.  Only SELECT may be used.This warning will become an exception in a future release.ú2.0úJ'%s' does not support object population - eager loading cannot be applied.r	   r£  r;  c                   ó   g | ]}ˆ j | ‘qS r;   rg   r£   ©rx   r;   r<   rÌ     r1  z7SubqueryLoader.create_row_processor.<locals>.<listcomp>)!rt   Ú	statementÚis_dmlr   Úwarn_deprecatedr·   rí   r·  r²  rÈ   r   rN   rV   r5   ÚimplÚsupports_populationrà   rá   r‰  r3   Ú_entity_isarÙ  rT  rÞ   rl   rÛ  rU   r
   rD  rÃ   r@   Ú_create_collection_loaderÚ_create_scalar_loader)rn   r~   ru   rv   rw   r]   r   rx   r€   Ú_rÄ  r1  r  r;  r;   rX  r<   r�   ¬  s‚   ÿÿüø
ÿÿÿ	ÿú	

ÿ
ÿz#SubqueryLoader.create_row_processorc                   ót   |  |¡‰‡ ‡‡fdd„‰‡‡fdd„}|d  ˆjˆf¡ |d  ˆj|f¡ |jr8|d  ˆjˆ jf¡ d S d S )Nc                   s*   ˆ   ˆ|ƒd¡}|  ˆj¡ | ||¡ d S )Nr;   )rU   rÈ  r5   rÉ  )rÏ   rô   rõ   Ú
collection©r;  rn   Útuple_getterr;   r<   Úload_collection_from_subq  s   ÿzKSubqueryLoader._create_collection_loader.<locals>.load_collection_from_subqc                   ó   ˆj |vrˆ | ||ƒ d S d S r2   r‘  ró   )rf  rn   r;   r<   Ú&load_collection_from_subq_existing_row  ó   
ÿzXSubqueryLoader._create_collection_loader.<locals>.load_collection_from_subq_existing_rowr¶   ÚexistingÚeager©Ú_tuple_getterrL   r5   Úinvoke_all_eagersr¥  )rn   r~   r   r;  r  r€   rh  r;   )r;  rf  rn   re  r<   r_    s   
ÿÿz(SubqueryLoader._create_collection_loaderc                   rb  )Nc                   sL   ˆ   ˆ|ƒd¡}t|ƒdkrt dˆ ¡ |d }|  ˆj¡ | ||¡ d S )Nr2   r	   úLMultiple rows returned with uselist=False for eagerly-loaded attribute '%s' r   )rU   r‰  r   rŠ  rÈ  r5   rÉ  )rÏ   rô   rõ   rc  Úscalarrd  r;   r<   Úload_scalar_from_subq-  s   ÿÿzCSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subqc                   rg  r2   r‘  ró   )rq  rn   r;   r<   Ú"load_scalar_from_subq_existing_row8  ri  zPSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subq_existing_rowr¶   rj  rk  rl  )rn   r~   r   r;  r  r€   rr  r;   )r;  rq  rn   re  r<   r`  (  s   
ÿÿz$SubqueryLoader._create_scalar_loader)r‚   rƒ   r„   r†   rk   r˜   ræ  r  r  r"  r'  r-  rD  rT  r�   r_  r`  r‡   r;   r;   rp   r<   rÐ  ¸  s     1d/6"4 	erÐ  Ú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#dd„Zdd„ Zdd„ Zdd„ Zdd „ Z‡  ZS )$ÚJoinedLoaderz[Provide loading behavior for a :class:`.Relationship`
    using joined eager loading.

    r²  c                   ri   r2   rº  rm   rp   r;   r<   rk   O  rr   zJoinedLoader.__init__c                 C  r»  r¼  r¾  r­   r;   r;   r<   r˜   S  r¿  z!JoinedLoader.init_class_attributeNFc	                 K  st  |j jsdS |r|jdur|jjrt dd¡ n| jrd|_|| j }d}
|r/|  	|||j
¡nd}|durB|  |||||¡\}}}n0| |j
d¡s_| jrW|jd | jkrVdS n| | j¡r_dS |  ||||||||¡\}}}}d|_| |j
dd¡}|dur„t|ƒj}
nd}
|| j }tj|| j|||||
| j|d	�	 tj |j¡}|r¸|dur­t d
¡‚dd„ |jD ƒ|_dS dS )z@Add a left outer join to the statement that's being constructed.Nz®The joinedload loader option is not compatible with DML statements such as INSERT, UPDATE.  Only SELECT may be used.This warning will become an exception in a future release.rU  TFr¥  r&   rE  )Úwith_polymorphicÚparentmapperÚ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().c                 S  s   g | ]}|d ur|‘qS r2   r;   r£   r;   r;   r<   rÌ   Ö  s    z,JoinedLoader.setup_query.<locals>.<listcomp>)rÀ   rÀ  rY  rZ  r   r[  r@   Úmulti_row_eager_loadersrl   Ú_init_user_defined_eager_procr
   Ú$_setup_query_on_user_defined_adapterr¯  r²  r°  r±  r]   Ú_generate_row_adapterÚeager_adding_joinsrU   r(   Úwith_polymorphic_mappersrë   r   Ú_setup_entity_queryÚNONE_SETrÄ   Úsecondary_columnsrà   rá   )rn   rt   ru   rv   rw   rx   ry   rv  rw  rz   ru  Úuser_defined_adapterÚclausesÚadd_to_collectionrR  Ú	has_nonesr;   r;   r<   r|   X  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rEt|tƒr5|j |¡}t	j
t	jj|j||jjdd�}n#| |jd¡r`| |jd¡}	t	j
t	jj|	|jjd�}n|j |jd ¡}| |d|¡ |S )NÚeager_from_aliasFÚ user_defined_eager_row_processoréþÿÿÿ)Ú
selectabler  Úlimit_on_entityrE  )r  )rÆ   rv   rN   rU   r
   rÈ   rå   rê   Úaliasr3   Ú
ORMAdapterÚ_TraceAdaptRoleÚJOINEDLOAD_USER_DEFINED_ALIASr]   r  r¯  Ú JOINEDLOAD_PATH_WITH_POLYMORPHICÚ_polymorphic_adaptersrÃ   )
rn   rw   rt   Útarget_attributesrv   rx   rŠ  Úroot_mapperr8   rR  r;   r;   r<   ry  Ú  sP   
ÿ

ûÿÿýÿýz*JoinedLoader._init_user_defined_eager_procc                 C  sV   |  |¡}|r|r| |¡}| |jd|¡ n|r#|}| |jd|¡ |j}|||fS )Nr†  )Ú_get_entity_clausesÚwraprÃ   r
   Úprimary_columns)rn   r~   rë   rv   rx   r�  rƒ  r;   r;   r<   rz  	  s"   

ýý
z1JoinedLoader._setup_query_on_user_defined_adapterc	                 C  s  |  |jdd ¡}	|	r|	}
n"t| jƒ}|jr|j}nd }tj| j|d ur)|j	dd�nd ddd�}
t|
ƒ}|j
d| ftjtjj|| jjdddd�}|jsLJ ‚|d urY|j  d| jj¡n| jj}|sad}|j | j||||||||rr|jnd	f	¡ |j}| |jd
|¡ ||||fS )NrE  T)Úflat)rŠ  r•  rð  Újoinedloader_ormadapterF)r  Úadapt_requiredÚallow_label_resolveÚanonymize_labelsÚ	innerjoinr;   Úeager_row_processor)rU   r
   r(   rë   r   rˆ  r3   r%   r]   Ú_anonymous_fromclauseÚ_memor‹  rŒ  ÚJOINEDLOAD_MEMOIZED_ADAPTERr  rÆ   rl   rš  Úcreate_eager_joinsrL   Ú_create_eager_joinr«   r€  rÃ   )rn   rt   rë   rv   rw   rx   ry   rv  rw  rR  Úto_adaptÚinspÚalt_selectableÚto_adapt_inspr‚  rš  rƒ  r;   r;   r<   r{  ,	  sd   ÿ
ÿøø
ÿý÷ÿz"JoinedLoader._generate_row_adapterc
              	     sP  |d u r|j }
n|}
|jo|j}d }||jvr?|s?|jr?t |j|j¡}t|ƒdkr/t	 
d¡‚|r?|j|d  }|d |}}|d u rI||j}}|j ||¡}|r‚t|ddƒrq|j |
 ˆ j¡rc|
nˆ j¡}t|jˆ jˆ jƒ}nttjˆ j|jdd�ˆ jˆ jƒ}nˆ j}|jsŠJ ‚| p—| p—|dkp—|jj}|	}|j d	ˆ j fd
¡}|r³|t‡ fdd„|D ƒƒ7 }|rÔtj||j|| pÉ|jjpÉ|oÉt|tjƒˆ j|ˆ j  |d�}nˆ   ||d ||||¡}||j|< |j|_!|�st "ˆ jj#¡D ]}|
j$j% &|¡�r|�r|j'| }| (||j)¡ qóˆ jj*�r&| j+t|j, -t. /ˆ jj*¡¡ƒ7  _+d S d S )Nr	   z€Can't identify which query entity in which to joined eager load from.   Please use an exact match when specifying the join path.r   r   FTrï  ÚunnestedÚadditional_entity_criteriar;   c                 3  s"   � | ]}|j r| ˆ j¡V  qd S r2   )Úpropagate_to_loadersÚ_resolve_where_criteriar]   )r¤   ÚaerË   r;   r<   r§   ã	  s   € ý

ÿz2JoinedLoader._create_eager_join.<locals>.<genexpr>©ÚisouterÚ
_left_memoÚ_right_memor«   r‡  )0r]   rx  Ú_should_nest_selectableÚeager_joinsÚfrom_clausesr  Ú#find_left_clause_that_matches_givenrˆ  r‰  rà   rá   Ú
setdefaultrÒ  Úaliased_inspÚ_entity_for_mapperr×  rN   rë   r5   rl   r3   r%   r   rÙ  Úrepresents_outer_joinÚglobal_attributesrU   r+  Ú_ORMJoinrÈ   r*   ÚJoinÚ_splice_nested_inner_joinÚstop_onÚ_find_columnsÚprimaryjoinÚpersist_selectabler{   Úcontains_columnrh   rs   r”  r  r*  Ú_target_adapterÚcopy_and_processr   r  )rn   rt   ru   rv   rx   rv  r‚  rš  rw  rL  rÜ   Úshould_nest_selectableÚquery_entity_keyÚindexesÚclauseÚdefault_towrapÚtowrapÚefmÚonclauseÚattach_on_outsideÚextra_join_criteriar¦  Ú	eagerjoinr�   r;   rË   r<   r   {	  sÂ   þ
ÿþÿÿþÿ
ÿý
ÿû	
ÿþü
ÿ
þÿ÷ÿ
ÿ
ÿ€
ÿÿÿzJoinedLoader._create_eager_joinÚentity_inside_join_structureú#Union[Mapper, None, Literal[False]]Údetected_existing_pathú$Optional[path_registry.PathRegistry]c	              
   C  s¨  ||d u sJ ‚|du rt |tjƒsJ ‚t |tjjƒr'|  |||j||||¡S t |tjƒrœ|j}	| j|||j	||||	d urB|	d j
nd d�}
|
d urj|jsV|
jsV| |
¡}ntj|j|
|j|j|jd�}|
j|_|S | j|||j||||j|	d�}
|
d ur‘tj|
|j	|j|j|jd�}|
j|_|S |du rš	J dƒ‚d S | |¡s£d S |rÂt|ƒd	krÂ|d
 |u s³J ‚|dd… |jdd… krÂd S tj||j|d|||d j
 |d�S )Nr‡  Fr£  )rÌ  )r«  r¬  )rÌ  rÎ  )r«  r­  z9assertion failed attempting to produce joined eager loadsr&   éýÿÿÿr   rª  )rÈ   r3   r·  r*   rˆ  ÚFromGroupingr¹  Úelementr­  Úrightr]   r«  Ú_splice_into_centerÚleftrÈ  r¬  r¿  r×  r‰  rv   r³  )rn   rv   Úentity_we_want_to_splice_ontoÚjoin_objr‚  rÈ  rL  rÌ  rÎ  Újoin_right_pathÚtarget_joinrË  r;   r;   r<   r¹  
  sž   ù	
ÿöûøûÿþ
$ùz&JoinedLoader._splice_nested_inner_joinc           	      C  s€   |j }|r|  |||j¡nd}|dur(|}|jr!|r!| |j¡}n|jr'|j}n| |jd¡}|d u r5dS | j ||¡r>|S dS )NFr›  )rt   ry  r
   Úcompound_eager_adapterr“  rU   r]   Ú_result_has_identity_key)	rn   r~   r   rx   rv   rw   rt   r�  Ú	decoratorr;   r;   r<   Ú_create_eager_adapterÇ
  s0   ýÿû
ÿ€ÿz"JoinedLoader._create_eager_adapterc	              
   C  sÒ   |j jjsd S | jj| j jjst 	d|  ¡‚| j
rd|_|| j }	|  ||||	|¡}
|
durW| j}t || j|||	| j |
¡}| j
sM|  ||||¡ d S |  ||||¡ d S | j d¡ ||||||||¡ d S )NrV  TFr½  )rt   rÀ   rÀ  rN   rV   r5   r\  r]  rà   rá   r@   Úloaders_require_uniquingrl   rÝ  r   Ú_instance_processorr]   rë   r`  r_  rº   r�   )rn   r~   ru   rv   rw   r]   r   rx   r€   Úour_pathÚeager_adapterr5   Ú	_instancer;   r;   r<   r�   ë
  sT   
ÿÿ

ÿú	ÿÿø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
   rò   r   ÚUniqueAppenderrL   )rÏ   rô   rõ   rc  Úresult_listÚinst©râ  r~   r5   r;   r<   Ú#load_collection_from_joined_new_row*  s   ÿÿzSJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_new_rowc                   sh   | ˆfˆj v rˆj | ˆf }nt  | |ˆ¡}t |d¡}|ˆj | ˆf< ˆ |ƒ}|d ur2| |¡ d S d S rã  rå  )rÏ   rô   rõ   rç  rc  rè  ré  r;   r<   Ú(load_collection_from_joined_existing_row7  s   ÿÿÿzXJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_existing_rowc                   ó   ˆ |ƒ d S r2   r;   ró   ©râ  r;   r<   Ú load_collection_from_joined_execJ  ó   zPJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_execr¶   rj  rk  ©rL   r5   rn  )rn   r~   r5   râ  r€   rê  rë  rî  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 r2   r;   ró   )râ  r5   r;   r<   Úload_scalar_from_joined_new_rowY  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 )Nro  )r   rŠ  )rÏ   rô   rõ   rj  ©râ  r5   rn   r;   r<   Ú$load_scalar_from_joined_existing_row^  s   þÿÿ
zPJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_existing_rowc                   rì  r2   r;   ró   rí  r;   r<   Úload_scalar_from_joined_execq  rï  zHJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_execr¶   rj  rk  rð  )rn   r~   r5   râ  r€   rñ  ró  rô  r;   rò  r<   r`  X  s   ÿÿÿz"JoinedLoader._create_scalar_loader)NNF)FN)rÌ  rÍ  rÎ  rÏ  )r‚   rƒ   r„   r…   r†   rk   r˜   r|   ry  rz  r{  r   r¹  rÝ  r�   r_  r`  r‡   r;   r;   rp   r<   rt  D  s.    
÷ 9O *õ .$>/rt  Úselectinc                      st   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dd„ Zdd„ Zdd„ Zdd„ Z‡  ZS )ÚSelectInLoader)r²  Ú	omit_joinÚ_parent_aliasÚ_query_infoÚ_fallback_query_infoÚ	queryinfo)Úload_only_childÚload_with_joinÚin_exprÚpk_colsÚzero_idxÚchild_lookup_colsiô  c                   s¸   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d| j
jd�| _| jrU|rN|  ¡ | _|  ¡ | _d S |  ¡ | _d S |  ¡ | _d S )Nr½  r   TFr  )rj   rk   rl   r²  rZ   r   r   r÷  rº   rÿ   rN   r  r¢   rü   r  Ú_init_for_omit_join_m2orù  Ú_init_for_joinrú  Ú_init_for_omit_join)rn   rN   ro   Úis_m2orÍ  rp   r;   r<   rk   —  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)rN   r  rU   )r¤   rÎ   Úequiv©Úpk_to_fkrn   r;   r<   r§   ¹  s   € ý
þÿz5SelectInLoader._init_for_omit_join.<locals>.<genexpr>c                   s   g | ]
}|ˆ v rˆ | ‘qS r;   r;   ©r¤   r�   )r  r;   r<   rÌ   ¿  s    z6SelectInLoader._init_for_omit_join.<locals>.<listcomp>r	   Fr   T)rG  rl   r  Úlocal_remote_pairsrö  r  rN   r“   r‰  r*   Útuple_Ú
query_info)rn   rÿ  Úfk_colsrþ  r   r;   r  r<   r  µ  s   ÿþ

ÿ
z"SelectInLoader._init_for_omit_joinc                   sb   | j j}t|ƒdkrtj|Ž }d}n|d }d}| j d¡‰ ‡ fdd„|D ƒ}|  dd||||¡S )Nr	   Fr   Tr½  c                   rW  r;   rT  rU  ©rÍ  r;   r<   rÌ   Õ  r1  z:SelectInLoader._init_for_omit_join_m2o.<locals>.<listcomp>)r]   r“   r‰  r*   r  rl   rº   r  )rn   rÿ  rþ  r   Úlookup_colsr;   r  r<   r  Ë  s   
ÿz&SelectInLoader._init_for_omit_join_m2oc                   sj   t | jjƒ| _t| jƒ‰ ‡ fdd„| jjD ƒ}t|ƒdkr%tj|Ž }d}n|d }d}|  	dd|||d ¡S )Nc                   ó   g | ]}ˆ   |¡‘qS r;   ©Ú_adapt_elementr	  ©Úpa_inspr;   r<   rÌ   Þ  ó    
ÿz1SelectInLoader._init_for_join.<locals>.<listcomp>r	   Fr   T)
r%   rN   rY   rø  r(   r“   r‰  r*   r  r  )rn   rÿ  rþ  r   r;   r  r<   r  Û  s   

ÿ
zSelectInLoader._init_for_joinc                 C  r»  r¼  r¾  r­   r;   r;   r<   r˜   é  r¿  z#SelectInLoader.init_class_attributec	                 C  s  |j r|  ||||||||¡S | j|||| jd�\}	}
}}|
s!d S |jjjs(d S | jj| j	 j
js8t d|  ¡‚t|ƒdkrIt |j| j¡sHd S nt |d | j¡sTd S |	}|| j }| |jdd ¡}|d urlt|ƒ}n| j}tj ||| j| j| j||||¡	 d S )Nr¹  rV  r	   r£  rE  )r·   rí   r·  r²  rt   rÀ   rÀ  rN   rV   r5   r\  r]  rà   rá   r‰  r3   r^  rÙ  rl   rU   r
   r(   rë   r   r­  rÂ  rÃ  )rn   r~   ru   rv   rw   r]   r   rx   r€   r�  rÄ  rO  r¢  Úselectin_pathrµ  rR  r  r;   r;   r<   r�   î  sl   ø
ÿû
ÿÿ	ÿ
ÿ
÷z#SelectInLoader.create_row_processorc	                   s°  |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svˆjrv‡fdd„|D ƒ}ˆ |¡}tjdg|¢R Ž }| ¡ }ˆ ¡ }tj||gttjdˆdœd	�}|	jsŸ| ˆ¡}n| ˆj¡ tˆjˆjj ƒ  ˆ¡¡}| !| "t# $d
¡¡¡}ˆ j%j&}|ˆj }|ˆ j'u rÎ|j(}n|j(}ˆ j'j(}‡ fdd„t)||ƒD ƒ}|rò|j*rò|t +ˆ| ,ˆ ¡¡f7 }|d urú| -¡ }|j.|Ž }| /d|i¡}ˆ j0�r|j1dd�}ˆjj2�r=|	j�s0ˆjj2}ˆj�r*‡fdd„|D ƒ}|j2|Ž }n‡fdd„}| 3|ˆj¡}|	j�rMˆ 4|
||	|ˆ |¡ d S ˆ 5|
|	|ˆ |¡ d S )Nc                 3  s$   � | ]}ˆ j ˆˆ|tjd �V  qdS )rS  N)r8  r
   ÚPASSIVE_NO_FETCH)r¤   Úlk)r]   rÏ   Ú
state_dictr;   r<   r§   V  s   € úü
ÿz0SelectInLoader._load_for_path.<locals>.<genexpr>c                 S  s$   g | ]\}}|j d  ||j|f‘qS )r	   )r5   rG  )r¤   rÏ   rÎ  r;   r;   r<   rÌ   s  s    ÿÿz1SelectInLoader._load_for_path.<locals>.<listcomp>c                   r  r;   r  r	  ©r  r;   r<   rÌ   ƒ  r  rV  rG  )Úcompile_state_pluginÚplugin_subject)rZ  r\  r¸   r[  Úprimary_keysc                   s   g | ]
\}}|  ˆ |¡‘qS r;   )Ú'_adapt_cached_option_to_uncached_option)r¤   Úorig_optÚuncached_opt)r~   r;   r<   rÌ   Õ  s    ýÿÿr`  T)r—  c                   r  r;   r  r  r  r;   r<   rÌ   ó  s    ÿÿc                   r(  r2   r)  r,  rË   r;   r<   r-  ú  r.  z?SelectInLoader._load_for_path.<locals>._setup_outermost_orderby)6r5   rù  rü  r;  r<  r  rN   rG  r+  r  r   rÓ   rú  rL   rÿ  rþ  rý  r   r  r3   ÚBundlero  r-   rp  r,   r   rq  rt  rø  r  rÒ  rl   r  ÚfilterÚin_r*   r#  rt   Úselect_statementÚuser_passed_queryrz  Úzipr«   ry  r–  rÇ  r$  Ú_update_compile_optionsr—  rO  r  r/  Ú_load_via_childÚ_load_via_parent)rn   r~   rv   rÊ  rË  r  rw   r¢  rO  r  Ú
our_statesÚnone_statesrÎ  Úrelated_identrÿ  rþ  Ú
bundle_entÚ
bundle_sqlÚ
entity_sqlr  r  r�  r&  Úcached_optionsÚuncached_optionsr*  r-  r;   )r~   r  r]   rn   rÏ   r  r<   rÃ  >  sÆ   
ù
ÿþ
ÿ
þü
ÿÿ


ÿü
	þÿ


þÿú	
ÿzSelectInLoader._load_for_pathc                   sø   | j }t|ƒ}|r_|d| j… }	|| jd … }dd„ |jj|d‡ fdd„|	D ƒi|d� ¡ D ƒ}
|	D ]*}|
 |d ¡}|| D ]\}}}|sK| j|v rKq>| | j¡ 	|||sW|n|g¡ q>q2|s	|D ]\}}}|sn| j|v rnqa| | j¡ 	||d ¡ qad S )Nr   c                 S  s   i | ]\}}||“qS r;   r;   )r¤   rÎ   rC  r;   r;   r<   Ú
<dictcomp>!  s    ÿÿz2SelectInLoader._load_via_child.<locals>.<dictcomp>r  c                   s   g | ]}ˆ j r|d  n|‘qS rÑ  ©r   )r¤   r5   ©r  r;   r<   rÌ   &  rí  z2SelectInLoader._load_via_child.<locals>.<listcomp>©r*  rO  )
r@   ÚsortedÚ
_chunksizerÞ   r†  r!  rU   r5   rÈ  rÉ  )rn   r*  r+  r  r  r~   rO  r@   Úour_keysÚchunkÚdatar5   Úrelated_objrÏ   rô   rÎ  r;   r4  r<   r(    sB   	þÿø	õýüè"ú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|	i|d� 	¡ dd„ ¡D ]\}}|
|  
d	d
„ |D ƒ¡ q:|D ]>\}}}}|s[| j|v r[qM|
 ||¡}|s€|r€t|ƒdkrrt d|  ¡ | | j¡ |||d ¡ qM| | j¡ |||¡ qM|sd S d S )Nr;   r   c                   s&   g | ]\}}}}ˆ j r|d  n|‘qS rÑ  r3  )r¤   r5   rÏ   r  rÎ  r4  r;   r<   rÌ   R  s    
ÿÿz3SelectInLoader._load_via_parent.<locals>.<listcomp>r  r5  c                 S  s   | d S rŒ   r;   r5  r;   r;   r<   r=   ^  s    z1SelectInLoader._load_via_parent.<locals>.<lambda>c                 s  r7  )r	   Nr;   r8  r;   r;   r<   r§   `  r:  z2SelectInLoader._load_via_parent.<locals>.<genexpr>r	   ro  )r@   r7  r;  r<  r  r?  r@  rÞ   r†  r!  rA  r5   rU   r‰  r   rŠ  rÈ  rÉ  )rn   r*  r  r  r~   rO  r@   Ú_empty_resultr9  r  r:  rÎ   rC  r5   rÏ   r  rÎ  rc  r;   r4  r<   r)  H  sJ   
þ
ýúþÿ
ÿÿÙzSelectInLoader._load_via_parent)r‚   rƒ   r„   r†   r;  Ú
namedtupler  r7  rk   r  r  r  r˜   r�   rÃ  r(  r)  r‡   r;   r;   rp   r<   rö  ~  s"    þP T7rö  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)	r5   Ú	hasparentr
   Úinstance_staterà   rá   r3   Úinstance_strrY   )rÏ   r'  ÚoldvalueÚ	initiatorr@  )r8   r;   r<   Ú	_do_check{  s   ýûz*single_parent_validator.<locals>._do_checkc                   s   ˆ | |d |ƒS r2   r;   )rÏ   r'  rD  ©rE  r;   r<   rL   ˆ  ó   z'single_parent_validator.<locals>.appendc                   s   ˆ | |||ƒS r2   r;   )rÏ   r'  rC  rD  rF  r;   r<   Úset_‹  rG  z%single_parent_validator.<locals>.set_rL   T)ÚrawÚretvalrG   rÃ   )r'   Úlisten)r7   r8   rL   rH  r;   )rE  r8   r<   rM   z  s   ÿrM   )NNNNFN)Wr…   Ú
__future__r   r;  r?  Útypingr   r   r   r   r   r   Ú r
   r   rÖ   r   r   r   r   r   r   r   r   r3   Úbaser   r   r   r   r   r   r   r~   r   r   r   r   r   r    rÞ   r!   rÏ   r"   rj  r#   r$   r%   r'   rà   r(   r)   r*   r  r+   Úsql.selectabler,   r-   Úutil.typingr.   r]   r/   r0   Úsql.elementsr1   rc   ÚColumnPropertyÚstrategy_forrf   Úclass_loggerrˆ   r¡   r°   rä   ré   rî   rð   ÚMemoizedSlotsÚ
Identifiedrú   r•  r   r¸  rÐ  rt  rö  rM   r;   r;   r;   r<   Ú<module>   sþ   	
÷Q+ZWÿ 0%
&

ÿ    24Ld           =   }