o
    ?ÊÆh„½ ã                   @  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
m1Z1 d%d)l
m2Z2 d%dl
mZ d%dl2mZ3 d%d*l2m4Z4 d%d+l5m6Z6 d%d,l5m7Z7 e	�rdd-lm8Z8 d%d.l9m:Z: 					/	dbd0d1„Z;ej<j=d/d/d2�G d3d4„ d4e$ƒƒZ>e1j?ej<j=d5d/d2�G d6d7„ d7e$ƒƒƒZ@e1j?ej<j=d5d8�G d9d:„ d:e@ƒƒƒZAe1j?ej<j=d5d5d;�ej<j=d5d5d5d<�ej<j=d5d=�G d>d?„ d?e$ƒƒƒƒƒZBG d@dA„ dAƒZCG dBdC„ dCe$ƒZDe1j?ej8j=d5d=�G dDdE„ dEe$ƒƒƒZEe1j?ej8j=dFdG�ej8j=ddG�G dHdI„ dIeDƒƒƒƒZFe1j?ej8j=d5dG�ej8j=dJdG�ej8j=dKdG�ej8j=dLdG�ej8j=dMdG�G dNdO„ dOeDejGe1jHƒƒƒƒƒƒƒZIG dPdQ„ dQƒZJG dRdS„ dSeDƒZKej8j=dTdG�G dUdV„ dVeKƒƒZLe1j?ej8j=dWdG�G dXdY„ dYeKƒƒƒZMe1j?ej8j=dZdG�ej8j=d/dG�G d[d\„ d\eDƒƒƒƒZNe1j?ej8j=d]dG�G d^d_„ d_eKejGƒƒƒZOd`da„ ZPdS )czWsqlalchemy.orm.interfaces.LoaderStrategy
   implementations, and related MapperOptions.é    )ÚannotationsN)ÚAny)ÚDict)ÚTuple)ÚTYPE_CHECKINGé   )Ú
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_set)ÚAliasedClassé   )Úevent)Úinspect)Úlog)Úsql)Úvisitors)ÚLABEL_STYLE_TABLENAME_PLUS_COL)ÚSelect)Ú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© úf/var/www/html/HyperOracle/crypto_trader/venv/lib/python3.10/site-packages/sqlalchemy/orm/strategies.pyÚ<lambda>X   s
    ÿÿz%_register_attribute.<locals>.<lambda>c                   s   t  | ˆ ˆ¡S r.   )r   Úbackref_listenersr2   )ÚbackrefÚuselistr7   r8   r9   f   s    ÿ)Úparent_tokenr<   Úcompare_functionÚ	useobjectÚtrackparentÚtypecallableÚ	callable_Úactive_historyÚ
impl_classÚsend_modified_eventsÚdoc)r<   Úsingle_parentÚappendÚsingle_parent_validatorr1   Ú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ÚviewonlyrF   )r4   Úmapperr?   r>   rA   rB   Úproxy_propertyrC   rD   ÚkwÚlisten_hooksÚmr3   Úhookr7   )r;   r5   r6   r<   r8   Ú_register_attributeB   s^   


ÿ
ÿ
ÿþþ
ïî€ær_   )Ú
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 r.   )ÚsuperÚ__init__Úparent_propertyrd   ©ÚselfrJ   Ústrategy_key©Ú	__class__r7   r8   rg   ž   ó   z#UninstrumentedColumnLoader.__init__Nc           	      K  s*   | j D ]}|r|j | }| ||¡ qd S r.   )rd   Ú_append_dedupe_col_collection)	rj   Úcompile_stateÚquery_entityÚpathÚloadoptÚadapterÚcolumn_collectionÚkwargsÚcr7   r7   r8   Úsetup_query¢   s
   


ýz&UninstrumentedColumnLoader.setup_queryc	           	      C  s   d S r.   r7   ©	rj   Úcontextrq   rr   rs   rY   Úresultrt   Ú
populatorsr7   r7   r8   Úcreate_row_processor±   s   z/UninstrumentedColumnLoader.create_row_processorr.   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__rg   rx   r}   Ú__classcell__r7   r7   rl   r8   rb   “   s    
ùrb   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`.)rd   Úis_compositec                   s*   t ƒ  ||¡ | jj| _t| jdƒ| _d S )NÚcomposite_class)rf   rg   rh   rd   Úhasattrr…   ri   rl   r7   r8   rg   Æ   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   )rd   Úadapt_check_presentro   rh   )rj   rp   rq   rr   rs   rt   ru   Úmemoized_populatorsÚcheck_for_adaptrv   rw   Úfetchr7   r7   r8   rx   Ë   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)r?   r>   rC   )Úis_class_levelrd   Útyperh   rC   Úprimary_keyÚversion_id_colÚ_columntopropertyrQ   r_   Úcompare_values)rj   rY   ÚcoltyperC   r7   r7   r8   Ú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)rd   Ú_getterrH   r1   )rj   rz   rq   rr   rs   rY   r{   rt   r|   ÚcolÚgetterr7   r7   r8   r}     s   

þz!ColumnLoader.create_row_processor©F)
r~   r   r€   r�   r‚   rg   rx   r”   r}   rƒ   r7   r7   rl   r8   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 r.   )Úcompare©Ú.0rw   ©Únullr7   r8   Ú	<genexpr>%  s   € 
ÿz2ExpressionColumnLoader.__init__.<locals>.<genexpr>)	rf   rg   r(   r¢   ÚlabelÚanyrh   rd   Ú_have_default_expressionri   rl   r¡   r8   rg     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¦   rh   rd   ro   )rj   rp   rq   rr   rs   rt   ru   rŠ   rv   rd   rw   rŒ   r7   r7   r8   rx   )  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§   rd   r˜   rH   r1   )rj   rz   rq   rr   rs   rY   r{   rt   r|   rd   r™   rš   r7   r7   r8   r}   N  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)r�   r_   rh   rd   rŽ   r’   ©rj   rY   r7   r7   r8   r”   h  s   
ûz+ExpressionColumnLoader.init_class_attribute)r~   r   r€   rg   rx   r}   r”   rƒ   r7   r7   rl   r8   r�     s
    %r�   )ra   r`   )ra   r`   Ú	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`.)rd   Ú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)
rf   rg   r‡   rh   ÚNotImplementedErrorÚstrategy_optsrQ   rª   rd   r­   ri   rl   r7   r8   rg     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©)ra   F©r`   TÚnewr—   F)Úrefresh_stater   Ú_compile_optionsÚ_only_load_propsr1   rh   Ú_get_strategyr}   r�   rª   Ú_raise_column_loaderÚ_deferred_column_loaderrH   )
rj   rz   rq   rr   rs   rY   r{   rt   r|   Úset_deferred_for_local_stater7   r7   r8   r}   ‰  s4   ÿþÿøÿÿz)DeferredColumnLoader.create_row_processorc                 C  s,   d| _ t| j|d| jd jj| jdd� d S )NTFr   )r?   r>   rB   Úload_on_unexpire)r�   r_   rh   rd   rŽ   r’   Ú_load_for_stater©   r7   r7   r8   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_subqueryrh   Ú_renders_in_subqueriesÚsetrd   ÚintersectionrJ   Ú_should_undefer_in_wildcardr­   Ú
local_optsrQ   r1   r¶   rx   r�   r   rª   r   r   )
rj   rp   rq   rr   rs   rt   ru   rŠ   Úonly_load_propsr[   r7   r7   r8   rx   È  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 r7   )Ú
isinstancer   Ústrategyr¬   r­   r1   )r    Úp©rj   r7   r8   Ú
<listcomp>  s    ý
üüz8DeferredColumnLoader._load_for_state.<locals>.<listcomp>c                   s   g | ]	}|ˆ j v r|‘qS r7   )Ú
unmodified)r    Úk)Ústater7   r8   rÈ     s    zfParent instance %s is not bound to a Session; deferred load operation of attribute '%s' cannot proceedÚraise)r1   r   Ú
ATTR_EMPTYr   ÚSQL_OKÚPASSIVE_NO_RESULTÚmanagerrY   r­   Úiterate_propertiesr   Úorm_excÚDetachedInstanceErrorr/   Ú	state_strrª   Ú_invoke_raise_loadr   Úload_scalar_attributesr¿   r   r   )rj   rË   ÚpassiveÚlocalparentÚtoloadr­   Úsessionr7   )rj   rË   r8   r»   û  s0   

þþÿÿz$DeferredColumnLoader._load_for_statec                 C  s   t  d| f ¡‚)Nz+'%s' is not available due to raiseload=True©Úsa_excÚInvalidRequestError©rj   rË   r×   Úlazyr7   r7   r8   rÕ   #  s   ÿz'DeferredColumnLoader._invoke_raise_loadr.   )r~   r   r€   r�   r‚   rg   r}   r”   rx   r»   rÕ   rƒ   r7   r7   rl   r8   r¬   t  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 DeferredColumnLoaderFr1   Ústrrª   Úboolc                 C  s   || _ || _d S r.   )r1   rª   )rj   r1   rª   r7   r7   r8   rg   ,  s   
zLoadDeferredColumns.__init__c                 C  s>   | j }|jj}|j| }| jrd}nd}| |¡}| ||¡S )N)©ra   Tr±   )rª   T)rã   r±   )r1   rÐ   rY   rP   rª   r¶   r»   )rj   rË   r×   r1   rØ   r4   rk   rÅ   r7   r7   r8   Ú__call__0  s   

zLoadDeferredColumns.__call__Nr›   )r1   rá   rª   râ   )r~   r   r€   r�   rg   r   r   rä   r7   r7   r7   r8   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.)rY   Útargetr<   Úentityc                   s:   t ƒ  ||¡ | jj| _| jj| _| jj| _| jj| _d S r.   )rf   rg   rh   rY   rç   ræ   r<   ri   rl   r7   r8   rg   F  s
   


z#AbstractRelationshipLoader.__init__c	           	   
   C  s    | j  d¡ ||||||||¡S )N))rß   Ú	immediate)rh   r¶   r}   ry   r7   r7   r8   Ú#_immediateload_create_row_processorM  s   ÿøþz>AbstractRelationshipLoader._immediateload_create_row_processor)r~   r   r€   r�   r‚   rg   ré   rƒ   r7   r7   rl   r8   rå   A  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�   r7   r7   r7   r8   rê   f  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".

    r7   c                 C  s    d| _ t| j|d| jjd� d S )NT)r?   rA   )r�   r_   rh   Úcollection_classr©   r7   r7   r8   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 r.   )r<   r   Úinit_state_collectionr1   ©rË   Údict_ÚrowrÇ   r7   r8   Úinvoke_no_load’  s   z5NoLoader.create_row_processor.<locals>.invoke_no_loadr²   )rH   r1   )
rj   rz   rq   rr   rs   rY   r{   rt   r|   rò   r7   rÇ   r8   r}   ‡  s   zNoLoader.create_row_processorN)r~   r   r€   r�   r‚   r”   r}   r7   r7   r7   r8   rì   r  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]rh   rJ   rk   ú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    Úelemr7   r7   r8   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)rf   rg   r¯   r  r  r&   rç   rü   rh   Ú_join_conditionÚcreate_lazy_clauser÷   rý   rþ   rø   rÿ   r   Úorder_byr   Úto_listrú   ÚloggerÚinfor<   Ú_get_clauserž   rY   Ú_equivalent_columnsrû   Úlist)rj   rJ   rk   Újoin_conditionr™   rw   rl   r7   r8   rg   À  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)r?   rB   rA   rC   Ú_deferred_history)r�   rh   Ú_legacy_inactive_history_stylerC   rV   r
   Ú	MANYTOONErû   r_   r»   rí   )rj   rY   r  rC   r  r7   r7   r8   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©Ú	bindparamr7   r7   r8   Ú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 r.   )Ú_identifying_keyrH   r1   ÚcallableÚvaluer  ©Úbind_to_colÚparamsr7   r8   r   ,  s   
ýÿ
ÿ)r  r	  r÷   rý   r)   ÚtraverseÚcloned_traverse)rj   Ú	lazywhereÚ	criterionr   r7   r$  r8   Ú"_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 r7   r7   )r    r1   Úidentr#  r7   r7   r8   rÈ   C  ó    z4LazyLoader._generate_lazy_clause.<locals>.<listcomp>)r  r  Úadapt_criterion_to_nullrh   rJ   Úobjr   Úinstance_dictr   ÚINIT_OKÚLOAD_AGAINST_COMMITTEDÚ#_get_committed_state_attr_by_columnÚ_get_state_attr_by_column)rj   rË   r×   r*  Ú
param_keysrY   Úorð   r&  r1   r,  r#  r7   r7   r8   Ú_generate_lazy_clause>  s,   
ÿ


ÿÿ
z LazyLoader._generate_lazy_clausec                 C  s   t  d| |f ¡‚)Nz&'%s' is not available due to lazy='%s'rÛ   rÞ   r7   r7   r8   rÕ   ^  s   
ÿzLazyLoader._invoke_raise_loadNr7   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 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)"r1   rh   Ú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Ó   r/   rÔ   Ú_get_ident_for_use_getÚ	NEVER_SETr"   Ú
issupersetÚdictÚDEFERRED_HISTORY_LOADr   Ú_identity_lookuprç   ÚPASSIVE_CLASS_MISMATCHÚ_emit_lazyload)rj   rË   r×   rs   Úextra_criteriaÚextra_optionsÚalternate_effective_pathÚexecution_optionsÚpendingÚprimary_key_identityrû   rÚ   Úinstancer7   r7   r8   r»   c  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×   rj   rË   r7   r8   rÈ   Ý  s    ÿÿz5LazyLoader._get_ident_for_use_get.<locals>.<listcomp>)rÐ   rY   r   r2  r3  r4  rB  r�   )rj   rÚ   rË   r×   Úinstance_mapperr7   rR  r8   r?  Ó  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_optionsrJ  c                   sR   ˆ j jD ]"}|jtju r&|jr&t|jtƒs&ˆj	 
| jj|j ¡ |¡ | ¡ qd S r.   )rh   Ú_reverse_propertyrV   r
   r  Ú_use_getrÄ   rÅ   rö   r!   Ú_construct_for_existing_pathr¼   r[  rJ   ÚlazyloadÚprocess_compile_state)Úcompile_contextÚrev©rj   Ústrategy_optionsr7   r8   Ú_lazyload_reverse7  s   ÿ
þÿÿ€ôz4LazyLoader._emit_lazyload.<locals>._lazyload_reverseÚ_sa_orm_load_options)rJ  r   zKMultiple rows returned with uselist=False for lazily-loaded attribute '%s' r   );r   Ú	preloadedÚorm_strategy_optionsrç   Ú__clause_element__r+   Ú_create_raw_selectrV  r*   r   Údefault_compile_optionsr   Údefault_load_optionsrh   Ú	secondaryÚselect_fromrY   r1   r   ÚNO_AUTOFLUSHÚimmutabledictÚ_execution_optionsrû   r\  r§   Ú	load_pathr/   ÚLoaderCriteriaOptionÚ_with_optionsÚ_path_registryr´   r  r   r=  rÕ   r   Úload_on_pk_identityrú   Ú_order_by_clausesÚ_with_context_optionsr7  Ú
EMPTY_DICTÚ
merge_withrB  rC  r   r   Úhas_intersectionr"   ÚvaluesÚ
_never_setÚ_where_criteriaÚexecuter  ÚscalarsÚallr<   ÚlenÚwarn)rj   rÚ   rË   rL  r×   rs   rG  rH  rI  rJ  ÚclauseelementÚstmtr\  rK  rû   Úeffective_pathr6   rf  Úlazy_clauser&  r{   Úlr7   rd  r8   rF  â  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 r.   )Ú_resetrï   ©r1   r7   r8   Úreset_for_lazy_callable¸  s   	z@LazyLoader.create_row_processor.<locals>.reset_for_lazy_callable)r1   r\  Ú_is_user_refreshr   r´   rµ   ré   r�   r§   r    Ú"_instance_level_callable_processorrR   ÚLoadLazyAttributeÚ_generate_extra_criteriarH   Úpopulate_existingÚalways_refresh)rj   rz   rq   rr   rs   rY   r{   rt   r|   Úset_lazy_callablerŒ  r7   r‹  r8   r}   €  sF   ÿþø
ÿúõÿózLazyLoader.create_row_processor)rJ   r  rk   r  )r~   r   r€   r�   r‚   Ú__annotations__rg   r”   r+  r7  rÕ   r   rz  r»   r?  Úpreload_modulerF  r}   rƒ   r7   r7   rl   r8   rö   ›  s0   
 	<"  	
øp
 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 r.   ©r1   rk   rs   rG  )rj   r1   Úinitiating_strategyrs   rG  r7   r7   r8   rg   Ø  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 caser7   r–  )rG  r   r„  r1   rk   rs   rÇ   r7   r7   r8   Ú__getstate__Þ  s   
ÿüzLoadLazyAttribute.__getstate__c                 C  s:   | j }|jj}|j| }|j| j }|j||| j| jd�S )N)rs   rG  )	r1   rÐ   rY   rP   Ú_strategiesrk   r»   rs   rG  )rj   rË   r×   r1   rT  r4   rÅ   r7   r7   r8   rä   ì  s   
üzLoadLazyAttribute.__call__N)	r~   r   r€   r�   rg   r˜  r   r   rä   r7   r7   r7   r8   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.r7   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)rp   Úcurrent_pathr/   ÚPathRegistryÚrootÚ_get_top_level_contextr   rq  rÂ   rQ   rh   Ú_is_self_referentialrÜ   rÝ   rJ  ÚidÚunionr   ÚPostLoadÚpath_existsÚcontainsr   ÚlengthÚcontains_mapperrY   )rj   rz   rr   rs   Ú
join_depthr‡  Útop_level_contextrJ  rœ  Úunlimited_recursionÚpath_w_propÚeffective_path_w_propr7   r7   r8   Ú_setup_for_recursionÿ  sn   þÿ
ÿÿÿüÿÿÿ

üÿüzPostLoader._setup_for_recursionr.   )r~   r   r€   r�   r‚   r±  r7   r7   r7   r8   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                   re   r.   ©rf   rg   rh   r¬  ri   rl   r7   r8   rg   J  rn   zImmediateLoader.__init__c                 C  ó   | j  d¡ |¡ d S ©N©)rß   ró   ©rh   r¶   r”   r©   r7   r7   r8   r”   N  ó   ÿz$ImmediateLoader.init_class_attributec	                 C  s^   |   |||| j¡\}	}
}}|
stjtjB }ntjtjB }tj 	||	| j
| j| j||||¡	 d S r.   )r±  r¬  r   ÚPASSIVE_NO_FETCH_RELATEDr   r=  r   r   r§  Úcallable_for_pathrJ   rh   Ú_load_for_path)rj   rz   rq   rr   rs   rY   r{   rt   r|   r‡  Ú
run_loaderrJ  rœ  Úflagsr7   r7   r8   r}   S  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 )Nr7   r·  )rH  rI  rJ  )r!   rr   rç   Ú_recurserz   Ú_truncate_recursiver1   rh   r¶   rB  r»   r   r   rÏ   Úget_implÚset_committed_value)rj   rz   rr   ÚstatesÚ	load_onlyrs   r¾  rœ  rJ  Únew_optrI  rH  r1   Ú
lazyloaderrË   Ú	overwriterð   r#  r7   r7   r8   r¼  y  s>   þûþ
ÿ€ñzImmediateLoader._load_for_path)	r~   r   r€   r‚   rg   r”   r}   r¼  rƒ   r7   r7   rl   r8   r²  F  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                   re   r.   r´  ri   rl   r7   r8   rg   ¬  rn   zSubqueryLoader.__init__c                 C  rµ  r¶  r¸  r©   r7   r7   r8   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   )Úgetattrrr   rç   r‘   r1   rŸ   ©Úleftmost_mapperÚnew_subq_pathr7   r8   rÈ   Ü  s    ü

þÿz0SubqueryLoader._get_leftmost.<locals>.<listcomp>)rr   r/   Ú_class_to_mapperrJ   Úisarh   Ú	_entitiesÚentity_zerorv  rƒ  r   r¡  ÚcoerceÚlocal_columns)rj   Úorig_query_entity_indexÚ	subq_pathÚcurrent_compile_stateÚis_rootÚgiven_subq_pathÚsubq_mapperÚleftmost_propÚ
additionalÚleftmost_colsÚleftmost_attrr7   rÌ  r8   Ú_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ç   Nr7   )r    Úentr7   r7   r8   Ú	<setcomp>  s
    üz?SubqueryLoader._generate_from_original_query.<locals>.<setcomp>)rp   c                 S  s   g | ]}t j t jj|¡‘qS r7   )r(   Ú	coercionsÚexpectÚrolesÚColumnsClauseRole)r    r6  r7   r7   r8   rÈ     ó    ÿÿz@SubqueryLoader._generate_from_original_query.<locals>.<listcomp>Tc                 S  s   h | ]}|j ’qS r7   )ÚtablerŸ   r7   r7   r8   rá  .  s    r7   ©Úuse_mapper_path)Ú_cloneÚ	correlater   ÚQueryÚ__new__Ú__dict__ÚupdateÚ	_from_objÚ_enable_assertionsro  Únon_generativer   Ú_adapt_col_listÚ_get_current_adapterrU  Údistinct_target_keyÚ	_distinctr¿   rA  r�   Ú_has_row_limiting_clauserx  r  Ú expand_column_list_from_order_byÚ_set_entitiesÚset_label_styler*   rÈ  r/   r#   )rj   Úorig_compile_stateÚ
orig_queryrÍ  rÞ  Úleftmost_relationshipÚorig_entityÚqÚq2Útarget_colsrõ  ÚtÚto_addÚembed_qÚ
left_aliasr7   r7   r8   Ú_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 r7   )rË  rJ   r‘   r1   rŸ   ©Úparent_aliasrj   r7   r8   rÈ   s  s    ÿÿz2SubqueryLoader._prep_for_joins.<locals>.<listcomp>)r  ÚpairsÚ	enumeraterY   rÐ  rH   r1   rƒ  r&   rü   rç   r/   r#   rh   rÔ  )rj   r  rÖ  Úto_joinr	  ÚirY   r4   Úprev_mapperÚ	to_appendr  Ú
local_colsÚ
local_attrr7   r  r8   Ú_prep_for_joinsJ  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ü   r/   r#   rç   )r    Úitemr7   r7   r8   rÈ   ‰  s    üÿüÿz/SubqueryLoader._apply_joins.<locals>.<listcomp>)rƒ  rË  Úof_typeÚpoprH   rJ   Újoin)rj   rÿ  r  r  r  Úeffective_entityÚltjÚmiddleÚinnerr  Úattrr7   r7   r8   Ú_apply_joinsy  sF   ÿÿþ
ù	


øÿÿÿþÿ
zSubqueryLoader._apply_joinsc           	      C  sB   |j }|r|jr|t | j| |¡¡f7 }| |¡}|j|Ž }|S r.   )ru  r§   r/   rt  rç   r�  Ú_with_current_pathÚoptions)	rj   rz   rÿ  rÖ  Úrewritten_pathrü  r  rs   Únew_optionsr7   r7   r8   Ú_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 r.   ©Úeager_order_byÚtupler   r  rh   r  ©rb  rÇ   r7   r8   Ú_setup_outermost_orderbyÒ  ó   ÿzISubqueryLoader._setup_outermost_orderby.<locals>._setup_outermost_orderby)rh   r  Ú_add_context_option)rj   rÿ  r&  r7   rÇ   r8   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Ú   rJ  r\  r&  ÚsubqÚ_datac                 C  s4   |j | _ |j| _|j| _|jpi | _|| _d | _d S r.   r)  )rj   rz   r*  r7   r7   r8   rg   í  s   
z(SubqueryLoader._SubqCollections.__init__c                 C  s    | j d u r	|  ¡  | j  ||¡S r.   )r+  Ú_loadrQ   )rj   r1   Údefaultr7   r7   r8   rQ   ÷  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   r7   ©Úxr7   r7   r8   r9   
  s    z7SubqueryLoader._SubqCollections._load.<locals>.<lambda>c                 s  ó   � | ]}|d  V  qdS )r   Nr7   ©r    Úvvr7   r7   r8   r£     ó   € z8SubqueryLoader._SubqCollections._load.<locals>.<genexpr>)ÚcollectionsÚdefaultdictr  r+  r*  rÚ   Úwith_sessionr\  Ú_populate_existingr‘  r&  Ú	itertoolsÚgroupbyÚextend)rj   rÿ  ÚrowsrÊ   Úvr7   r7   r8   r,  ü  s   ÿz%SubqueryLoader._SubqCollections._loadc                 C  s   | j d u r|  ¡  d S d S r.   )r+  r,  )rj   rË   rð   rñ   r7   r7   r8   rŸ    s   
ÿz&SubqueryLoader._SubqCollections.loaderN)	r~   r   r€   r�   r‚   rg   rQ   r,  rŸ  r7   r7   r7   r8   Ú_SubqCollectionsÝ  s    	
r=  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)%rp   r¼   Ú_enable_eagerloadsÚ_for_refresh_staterÑ  ÚindexÚloaders_require_bufferingrh   rQ   r   rç   r   rr  r/   r¡  r¢  rÉ  r   Ú_get_plugin_class_for_pluginÚ_is_lambda_elementr\  rY  r   r„  Ú	_resolvedÚ_create_entities_collectionrß  r  rì  r{  rJ  Ú_set_enable_single_critr  Úadd_columnsr  r   r&  )rj   rz   rq   rr   rç   rs   rt   rp   rÕ  Úwith_poly_entityr  rÖ  r  rØ  rü  Úcompile_state_clsrû  rÍ  rÞ  rý  r  rÿ  r  r  r  r7   r7   r8   Ú_setup_query_from_rowproc  s¨   	ÿþ
ÿþ
ÿÿûÿÿ	üû
ú
þþ

ÿ

ÿù
	z(SubqueryLoader._setup_query_from_rowprocc	              
     sf  |j r|  ||||||ˆ |¡S |  |||| j¡\}	}
}	}	|
s d S t|jtƒs(d S | jj| j	 j
js8t d|  ¡‚t|ƒdkrIt |j| j¡sHd S nt |d | j¡sTd S |  ||||d |ˆ ¡}|d u rfd S |jd u smJ ‚|| j }| jj}| |jd¡}|d u r�|  ||¡}| |jd|¡ ˆ rš‡ fdd„|D ƒ}| jr¨|  |||||¡ d S |  |||||¡ d S )NúJ'%s' does not support object population - eager loading cannot be applied.r   r�  r4  c                   ó   g | ]}ˆ j | ‘qS r7   rc   rŸ   ©rt   r7   r8   rÈ   ç  r-  z7SubqueryLoader.create_row_processor.<locals>.<listcomp>)r³   ré   r±  r¬  rÄ   rp   r   rJ   rR   r1   ÚimplÚsupports_populationrÜ   rÝ   rƒ  r/   Ú_entity_isarÒ  rN  rÚ   rh   rÔ  rQ   r   r=  r¿   r<   Ú_create_collection_loaderÚ_create_scalar_loader)rj   rz   rq   rr   rs   rY   r{   rt   r|   Ú_r½  r*  r  r4  r7   rQ  r8   r}   ™  sp   ø
ÿÿÿ	ÿú	

ÿ
ÿ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 )Nr7   )rQ   rÁ  r1   rÂ  )rË   rð   rñ   Ú
collection©r4  rj   Útuple_getterr7   r8   Úload_collection_from_subq÷  s   ÿzKSubqueryLoader._create_collection_loader.<locals>.load_collection_from_subqc                   ó   ˆj |vrˆ | ||ƒ d S d S r.   r‹  rï   )r\  rj   r7   r8   Ú&load_collection_from_subq_existing_rowý  ó   
ÿzXSubqueryLoader._create_collection_loader.<locals>.load_collection_from_subq_existing_rowr²   ÚexistingÚeager©Ú_tuple_getterrH   r1   Úinvoke_all_eagersrŸ  )rj   rz   r{   r4  r  r|   r^  r7   )r4  r\  rj   r[  r8   rU  ò  s   
ÿÿz(SubqueryLoader._create_collection_loaderc                   rX  )Nc                   sL   ˆ   ˆ|ƒd¡}t|ƒdkrt dˆ ¡ |d }|  ˆj¡ | ||¡ d S )Nr.   r   úLMultiple rows returned with uselist=False for eagerly-loaded attribute '%s' r   )rQ   rƒ  r   r„  rÁ  r1   rÂ  )rË   rð   rñ   rY  ÚscalarrZ  r7   r8   Úload_scalar_from_subq  s   ÿÿzCSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subqc                   r]  r.   r‹  rï   )rg  rj   r7   r8   Ú"load_scalar_from_subq_existing_row  r_  zPSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subq_existing_rowr²   r`  ra  rb  )rj   rz   r{   r4  r  r|   rh  r7   )r4  rg  rj   r[  r8   rV  	  s   
ÿÿz$SubqueryLoader._create_scalar_loader)r~   r   r€   r‚   rg   r”   rß  r  r  r  r   r&  r=  rN  r}   rU  rV  rƒ   r7   r7   rl   r8   rÉ  §  s     1d/4"4 	Y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„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                   re   r.   r´  ri   rl   r7   r8   rg   0  rn   zJoinedLoader.__init__c                 C  rµ  r¶  r¸  r©   r7   r7   r8   r”   4  r¹  z!JoinedLoader.init_class_attributeNFc	                 K  sP  |j jsdS | jrd|_|| j }d}
|r|  |||j¡nd}|dur0|  |||||¡\}}}n0| |jd¡sM| j	rE|j
d | j	krDdS n| | j¡rMdS |  ||||||||¡\}}}}d|_| |jdd¡}|durrt|ƒ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.NTFrŸ  r$   r>  )Ú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 r.   r7   rŸ   r7   r7   r8   rÈ   ¬  s    z,JoinedLoader.setup_query.<locals>.<listcomp>)r¼   rB  r<   Úmulti_row_eager_loadersrh   Ú_init_user_defined_eager_procr   Ú$_setup_query_on_user_defined_adapterr©  r¬  rª  r«  rY   Ú_generate_row_adapterÚeager_adding_joinsrQ   r&   Úwith_polymorphic_mappersrç   r   Ú_setup_entity_queryr   ÚNONE_SETrÀ   Úsecondary_columnsrÜ   rÝ   )rj   rp   rq   rr   rs   rt   ru   rl  rm  rv   rk  Úuser_defined_adapterÚclausesÚadd_to_collectionrL  Ú	has_nonesr7   r7   r8   rx   9  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_entityr>  )r  )rÂ   rr   rJ   rQ   r   rÄ   rá   ræ   Úaliasr/   Ú
ORMAdapterÚ_TraceAdaptRoleÚJOINEDLOAD_USER_DEFINED_ALIASrY   r  r©  Ú JOINEDLOAD_PATH_WITH_POLYMORPHICÚ_polymorphic_adaptersr¿   )
rj   rs   rp   Útarget_attributesrr   rt   r€  Úroot_mapperr4   rL  r7   r7   r8   ro  °  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)rj   rz   rç   rr   rt   rw  ry  r7   r7   r8   rp  é  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 )Nr>  T)Úflat)r€  r‹  ré  Újoinedloader_ormadapterF)r  Úadapt_requiredÚallow_label_resolveÚanonymize_labelsÚ	innerjoinr7   Úeager_row_processor)rQ   r   r&   rç   rü   r~  r/   r#   rY   Ú_anonymous_fromclauseÚ_memor�  r‚  ÚJOINEDLOAD_MEMOIZED_ADAPTERr  rÂ   rh   r�  Úcreate_eager_joinsrH   Ú_create_eager_joinr§   rv  r¿   )rj   rp   rç   rr   rs   rt   ru   rl  rm  rL  Úto_adaptÚinspÚalt_selectableÚto_adapt_insprx  r�  ry  r7   r7   r8   rq  	  sd   ÿ
ÿú	ø
ÿý÷ÿz"JoinedLoader._generate_row_adapterc
              	     sD  |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	ˆ   |||||¡}||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_criteriar7   c                 3  s"   � | ]}|j r| ˆ j¡V  qd S r.   )Úpropagate_to_loadersÚ_resolve_where_criteriarY   )r    ÚaerÇ   r7   r8   r£   ·	  s   € ý

ÿz2JoinedLoader._create_eager_join.<locals>.<genexpr>©ÚisouterÚ
_left_memoÚ_right_memor§   )0rY   rn  Ú_should_nest_selectableÚeager_joinsÚfrom_clausesr  Ú#find_left_clause_that_matches_givenr~  rƒ  rÜ   rÝ   Ú
setdefaultrË  Úaliased_inspÚ_entity_for_mapperrÐ  rJ   rç   r1   rh   r/   r#   rü   rÒ  Úrepresents_outer_joinÚglobal_attributesrQ   r$  Ú_ORMJoinrÄ   r(   ÚJoinÚ_splice_nested_inner_joinÚstop_onÚ_find_columnsÚprimaryjoinÚpersist_selectablerw   Úcontains_columnrd   ro   rŠ  r  r#  Ú_target_adapterÚcopy_and_processr   r  )rj   rp   rq   rr   rt   rl  rx  r�  rm  rG  rØ   Úshould_nest_selectableÚquery_entity_keyÚindexesÚclauseÚdefault_towrapÚtowrapÚefmÚonclauseÚattach_on_outsideÚextra_join_criteriarœ  Ú	eagerjoinr™   r7   rÇ   r8   r–  O	  sÂ   þ
ÿþÿÿþÿ
ÿý
ÿû	
ÿþü
ÿ
þÿ÷
ÿ
ÿ
ÿ€
ÿÿÿzJoinedLoader._create_eager_joinc           
   	   C  s<  |du rt |tjƒsJ ‚n1t |tjjƒr|  ||j||||¡S t |tjƒs>|d  |¡r<tj||j	|d||d j
|d�S d S |  ||j||||j¡}|d u rkd}|  ||j||||j¡}|d u rj|dushJ dƒ‚d S nd}|rŠ|js{|js{| |¡}	ntj|j||j|j|jd�}	ntj||j|j|j|jd�}	|j|	_|	S )	NFr}  r�  r   z9assertion failed attempting to produce joined eager loadsT)r¡  r¢  )r¡  r£  )rÄ   r/   r­  r(   r~  ÚFromGroupingr¯  ÚelementrÐ  r©  rY   Úrightr£  Úleftr¢  r¡  Ú_splice_into_centerr¾  rµ  )
rj   rr   Újoin_objrx  r¾  rG  ÚsplicingÚtarget_joinÚright_splicerÁ  r7   r7   r8   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‘  )rp   ro  r   Úcompound_eager_adapterr‰  rQ   rY   Ú_result_has_identity_key)	rj   rz   r{   rt   rr   rs   rp   rw  Ú	decoratorr7   r7   r8   Ú_create_eager_adapterG
  s0   ýÿû
ÿ€ÿz"JoinedLoader._create_eager_adapterc	              
   C  sÄ   | j j| j jjst d|  ¡‚| jrd|_|| j	 }	|  
||||	|¡}
|
durP| j}t || j|||	| j |
¡}| jsF|  ||||¡ d S |  ||||¡ d S | j	 d¡ ||||||||¡ d S )NrO  TFr·  )rJ   rR   r1   rR  rS  rÜ   rÝ   r<   Úloaders_require_uniquingrh   rÎ  r   Ú_instance_processorrY   rç   rV  rU  r¶   r}   )rj   rz   rq   rr   rs   rY   r{   rt   r|   Úour_pathÚeager_adapterr1   Ú	_instancer7   r7   r8   r}   k
  sP   ÿÿ

ÿú	ÿÿø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   ÚUniqueAppenderrH   )rË   rð   rñ   rY  Úresult_listÚinst©rÓ  rz   r1   r7   r8   Ú#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Ø  rY  rÙ  rÚ  r7   r8   Ú(load_collection_from_joined_existing_row³
  s   ÿÿÿzXJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_existing_rowc                   ó   ˆ |ƒ d S r.   r7   rï   ©rÓ  r7   r8   Ú load_collection_from_joined_execÆ
  ó   zPJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_execr²   r`  ra  ©rH   r1   rd  )rj   rz   r1   rÓ  r|   rÛ  rÜ  rß  r7   rÚ  r8   rU  ¥
  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.   r7   rï   )rÓ  r1   r7   r8   Ú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 )Nre  )r   r„  )rË   rð   rñ   r`  ©rÓ  r1   rj   r7   r8   Ú$load_scalar_from_joined_existing_rowÚ
  s   þÿÿ
zPJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_existing_rowc                   rÝ  r.   r7   rï   rÞ  r7   r8   Úload_scalar_from_joined_execí
  rà  zHJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_execr²   r`  ra  rá  )rj   rz   r1   rÓ  r|   râ  rä  rå  r7   rã  r8   rV  Ô
  s   ÿÿÿz"JoinedLoader._create_scalar_loader)NNFr›   )r~   r   r€   r�   r‚   rg   r”   rx   ro  rp  rq  r–  r¯  rÎ  r}   rU  rV  rƒ   r7   r7   rl   r8   rj  %  s(    
÷w9M !
ÿY$:/rj  Ú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  )rf   rg   rh   r¬  rV   r
   r  rè  r¶   rû   rJ   r  rž   rø   r  Ú_init_for_omit_join_m2orê  Ú_init_for_joinrë  Ú_init_for_omit_join)rj   rJ   rk   Úis_m2orÆ  rl   r7   r8   rg     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 )r7   N)rJ   r  rQ   )r    rÊ   Úequiv©Úpk_to_fkrj   r7   r8   r£   5  s   € ý
þÿz5SelectInLoader._init_for_omit_join.<locals>.<genexpr>c                   s   g | ]
}|ˆ v rˆ | ‘qS r7   r7   ©r    r™   )rù  r7   r8   rÈ   ;  s    z6SelectInLoader._init_for_omit_join.<locals>.<listcomp>r   Fr   T)rB  rh   r  Úlocal_remote_pairsrï  r  rJ   r�   rƒ  r(   Útuple_Ú
query_info)rj   rð  Úfk_colsrï  rñ  r7   rø  r8   rõ  1  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                   rP  r7   rO  rP  ©rÆ  r7   r8   rÈ   Q  r-  z:SelectInLoader._init_for_omit_join_m2o.<locals>.<listcomp>)rY   r�   rƒ  r(   rü  rh   r¶   rý  )rj   rð  rï  rñ  Úlookup_colsr7   rÿ  r8   ró  G  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 r7   ©Ú_adapt_elementrú  ©Úpa_inspr7   r8   rÈ   Z  ó    
ÿz1SelectInLoader._init_for_join.<locals>.<listcomp>r   Fr   T)
r#   rJ   rU   ré  r&   r�   rƒ  r(   rü  rý  )rj   rð  rï  rñ  r7   r  r8   rô  W  s   

ÿ
zSelectInLoader._init_for_joinc                 C  rµ  r¶  r¸  r©   r7   r7   r8   r”   e  r¹  z#SelectInLoader.init_class_attributec	                 C  sö   |j r|  ||||||||¡S | j|||| jd�\}	}
}}|
s!d S | jj| j jjs1t	 
d|  ¡‚t|ƒdkrBt |j| j¡sAd S nt |d | j¡sMd S |	}|| j }| |jdd ¡}|d uret|ƒ}n| j}tj ||| j| j| j||||¡	 d S )Nr³  rO  r   r�  r>  )r³   ré   r±  r¬  rJ   rR   r1   rR  rS  rÜ   rÝ   rƒ  r/   rT  rÒ  rh   rQ   r   r&   rç   r   r§  r»  r¼  )rj   rz   rq   rr   rs   rY   r{   rt   r|   r‡  r½  rJ  rœ  Úselectin_pathr¯  rL  r  r7   r7   r8   r}   j  sh   ø
ÿûÿÿ	ÿ
ÿ
÷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 )rN  N)r4  r   ÚPASSIVE_NO_FETCH)r    Úlk)rY   rË   Ú
state_dictr7   r8   r£   Ï  s   € úü
ÿz0SelectInLoader._load_for_path.<locals>.<genexpr>c                 S  s$   g | ]\}}|j d  ||j|f‘qS )r   )r1   rB  )r    rË   rÇ  r7   r7   r8   rÈ   ì  s    ÿÿz1SelectInLoader._load_for_path.<locals>.<listcomp>c                   r  r7   r  rú  ©r  r7   r8   rÈ   ü  r  rQ  r@  )Úcompile_state_pluginÚplugin_subject)rU  rW  r´   rV  Úprimary_keysc                   s   g | ]
\}}|  ˆ |¡‘qS r7   )Ú'_adapt_cached_option_to_uncached_option)r    Úorig_optÚuncached_opt)rz   r7   r8   rÈ   N  s    ýÿÿr[  T)r‘  c                   r  r7   r  r
  r  r7   r8   rÈ   l  s    ÿÿc                   r!  r.   r"  r%  rÇ   r7   r8   r&  s  r'  z?SelectInLoader._load_for_path.<locals>._setup_outermost_orderby)6r1   rê  rí  r4  r5  r  rJ   rB  r$  rò  r   rÏ   rë  rH   rð  rï  rî  rü   r  r/   ÚBundlerj  r+   rk  r*   r   rl  ro  ré  r  rË  rh   r  ÚfilterÚin_r(   r  rp   Úselect_statementr   ru  Úzipr§   rt  r�  rÀ  r  Ú_update_compile_optionsr‘  rJ  r  r(  Ú_load_via_childÚ_load_via_parent)rj   rz   rr   rÃ  rÄ  r  rs   rœ  rJ  rý  Ú
our_statesÚnone_statesrÇ  Úrelated_identrð  rï  Ú
bundle_entÚ
bundle_sqlÚ
entity_sqlrÿ  rü  r‡  r  Úcached_optionsÚuncached_optionsr#  r&  r7   )rz   r  rY   rj   rË   r
  r8   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 r7   r7   )r    rÊ   r<  r7   r7   r8   Ú
<dictcomp>š  s    ÿÿz2SelectInLoader._load_via_child.<locals>.<dictcomp>r  c                   s   g | ]}ˆ j r|d  n|‘qS rÊ  ©rñ  )r    r1   ©rý  r7   r8   rÈ   Ÿ  ræ  z2SelectInLoader._load_via_child.<locals>.<listcomp>©r&  rJ  )
r<   ÚsortedÚ
_chunksizerÚ   r€  r  rQ   r1   rÁ  rÂ  )rj   r  r  rý  rÿ  rz   rJ  r<   Úour_keysÚchunkÚdatar1   Úrelated_objrË   rð   rÇ  r7   r$  r8   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 )Nr7   r   c                   s&   g | ]\}}}}ˆ j r|d  n|‘qS rÊ  r#  )r    r1   rË   r
  rÇ  r$  r7   r8   rÈ   Ë  s    
ÿÿz3SelectInLoader._load_via_parent.<locals>.<listcomp>r  r%  c                 S  s   | d S rˆ   r7   r.  r7   r7   r8   r9   ×  s    z1SelectInLoader._load_via_parent.<locals>.<lambda>c                 s  r0  )r   Nr7   r1  r7   r7   r8   r£   Ù  r3  z2SelectInLoader._load_via_parent.<locals>.<genexpr>r   re  )r<   r'  r4  r5  r  r8  r9  rÚ   r€  r  r:  r1   rQ   rƒ  r   r„  rÁ  rÂ  )rj   r  rý  rÿ  rz   rJ  r<   Ú_empty_resultr)  r  r*  rÊ   r<  r1   rË   r
  rÇ  rY  r7   r$  r8   r  Á  sJ   
þ
ýúþÿ
ÿÿÙzSelectInLoader._load_via_parent)r~   r   r€   r‚   r4  Ú
namedtuplerý  r'  rg   rõ  ró  rô  r”   r}   r¼  r  r  rƒ   r7   r7   rl   r8   rç  ú
  s"    þM 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)	r1   Ú	hasparentr   Úinstance_staterÜ   rÝ   r/   Úinstance_strrU   )rË   r#  ÚoldvalueÚ	initiatorr0  )r4   r7   r8   Ú	_do_checkô  s   ýûz*single_parent_validator.<locals>._do_checkc                   s   ˆ | |d |ƒS r.   r7   )rË   r#  r4  ©r5  r7   r8   rH     ó   z'single_parent_validator.<locals>.appendc                   s   ˆ | |||ƒS r.   r7   )rË   r#  r3  r4  r6  r7   r8   Úset_  r7  z%single_parent_validator.<locals>.set_rH   T)ÚrawÚretvalrC   r¿   )r%   Úlisten)r3   r4   rH   r8  r7   )r5  r4   r8   rI   ó  s   ÿrI   )NNNNFN)Qr�   Ú
__future__r   r4  r8  Útypingr   r   r   r   Ú r   r	   rÒ   r
   r   r   r   r   r   r   r   r/   Úbaser   r   r   r   r   r   r   rz   r   r   r   r   r   r   rÚ   r   rË   r    re  r!   r"   r#   r%   rÜ   r&   r'   r(   r  r)   Úsql.selectabler*   r+   r,   Úsql.elementsr-   r_   ÚColumnPropertyÚstrategy_forrb   Úclass_loggerr„   r�   r¬   rà   rå   rê   rì   ÚMemoizedSlotsÚ
Identifiedrö   r�  rš  r²  rÉ  rj  rç  rI   r7   r7   r7   r8   Ú<module>   sô   	
÷Q+ZWÿ 0%
&

ÿ    )4L`          W   z