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stj|j| jf| |||oq| jpq| jtju ||||| p{| j | jd|	}|
D ]}|||  qqJd S )Nc                   s   t j| |j fi S N)orm_util_validator_eventskeydescprop)fnopts [/var/www/html/ecg_monitoring/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 )UninstrumentedColumnLoaderzRepresent a non-instrumented MapperProperty.

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

    columnsc                      t  || | 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 )DoNothingLoaderzRelationship loader that makes no change to the object's state.

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

    N)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rt| jD ]}|| jjv r| jj| D ]
}| j| | j|< qqw| 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st|	rd S nt|	rd S | j |jv r|t	j@ stj S |j!| j"|	||d}|d ur|tj#u rd S |S |t	j
@ r|t	j@ stjS | $|||	||||||	S )Nr   zbParent instance %s is not bound to a Session; lazy load operation of attribute '%s' cannot proceed)r   lazy_loaded_from)%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  _' (||\}}|	rt j)*|	d
|i}	nd
|i}	 j|j+v r|t j,@ st-j.S |rt /tj0|1 rd 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_depthFz'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rt|	|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rdd |dd D }g }|rl|d}	t|	d |	d }
|r`|
|d d }
n|
|}
||
 |sFt||d d |d jg| t||d d |g }|D ]}
||
}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._SubqCollectionszGiven a :class:`_query.Query` used to emit the "subquery load",
        provide a load interface that executes the query at the
        first moment a value is needed.

        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  ormzsubqueryloader 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 sJ || j }| jj}||jd}|d u r| ||}||jd|  r fdd|D }| jr| ||||| d S |  ||||| d S )	NzThe 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.0J'%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rt|j}
nd}
|| j }tj|| j|||||
| j|d		 tj|j}|r|durtd
dd |jD |_dS dS )z@Add a left outer join to the statement that's being constructed.NzThe 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_outerjoinzDetected 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||}|rt|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sJ | p| p|dkp|jj}|	}|jd	 j fd
}|r|t fdd|D 7 }|rtj||j|| p|jjp|ot|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	   zCan't identify which query entity in which to joined eager load from.   Please use an exact match when specifying the join path.r   r   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rtj|
|j	|j|j|jd}|
j|_|S |du r	J dd S ||sd S |rt|d	kr|d
 |u sJ |dd |jdd krd 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|rt|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           =   }