U
    [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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
rfd
d0l<m=Z= d
d1lm>Z> d'd2l?m@Z@ 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 )gzTsqlalchemy.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krV| jj| j \|
fdd |rf|
tj |r| j	  r| j
r|
 fdd |jD ]}| |j| jkr|j| jstj|j| jf| |||o| jp| jtjk||||| p| j | jd|	}|
D ]}|||  q
qd S )Nc                   s   t j| |j fS N)orm_util_validator_eventskeydescprop)fnopts ]/var/www/html/timesheet/backend/venv/lib/python3.8/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@   Zsingle_parentappendsingle_parent_validatorr5   parent
validatorsr   Ztrack_cascade_eventsZback_populatesZ_effective_sync_backrefself_and_descendants_propsgetclass_manager_attr_has_implr
   register_attribute_implclass_	directionr   	ONETOMANYZviewonlyrJ   )r8   mapperrC   rB   rE   rF   Zproxy_propertyrG   rH   kwZlisten_hooksmr7   hookr;   )r?   r9   r:   r@   r<   _register_attributeF   sZ    





r\   )
instrumentdeferredc                      s6   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                   s   t  || | jj| _d S r2   )super__init__parent_propertyra   selfrM   strategy_key	__class__r;   r<   rc      s    z#UninstrumentedColumnLoader.__init__Nc           	      K  s*   | j D ]}|r|j | }||| qd S r2   )ra   _append_dedupe_col_collection)	rf   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;   	rf   contextrl   rm   rn   rX   resultro   
populatorsr;   r;   r<   create_row_processor   s    z/UninstrumentedColumnLoader.create_row_processor)N)	__name__
__module____qualname____doc__	__slots__rc   rs   rx   __classcell__r;   r;   rh   r<   r_      s    
r_   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`.)ra   is_compositec                   s*   t  || | jj| _t| jd| _d S )Ncomposite_class)rb   rc   rd   ra   hasattrr   re   rh   r;   r<   rc      s    
zColumnLoader.__init__Fc	                 K  sv   | j D ]<}
|r6|r,||
}
|
d kr6 d S n
|j |
 }
||
| q| j d }|rh|j | }|d krhd S ||| j< d S Nr   )ra   adapt_check_presentrj   rd   )rf   rk   rl   rm   rn   ro   rp   memoized_populatorscheck_for_adaptrq   rr   fetchr;   r;   r<   rs      s    




zColumnLoader.setup_queryc                 C  s`   d| _ | jd j}| jjpD| jd jpD|jd k	oD|j|jd | jk}t	| j|d|j
|d d S )NTr   F)rC   rB   rG   )is_class_levelra   typerd   rG   primary_keyversion_id_col_columntopropertyrQ   r\   compare_values)rf   rX   coltyperG   r;   r;   r<   init_class_attribute   s"    


z!ColumnLoader.init_class_attributec	                 C  sZ   | j D ]:}	|r|j |	 }	||	d}
|
r|d | j|
f  qVq|d | jdf d S NFquickexpireT)ra   _getterrK   r5   )rf   ru   rl   rm   rn   rX   rv   ro   rw   colgetterr;   r;   r<   rx     s    

z!ColumnLoader.create_row_processor)F)
ry   rz   r{   r|   r}   rc   rs   r   rx   r~   r;   r;   rh   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.0rr   nullr;   r<   	<genexpr>)  s    z2ExpressionColumnLoader.__init__.<locals>.<genexpr>)	rb   rc   r*   r   labelanyrd   ra   _have_default_expressionre   rh   r   r<   rc   "  s
    zExpressionColumnLoader.__init__c                 K  s   d }	|r|j r|j }	n| jr$| jj}	|	d kr0d S |	D ]}
|rF|j|
 }
||
| q4|	d }|rv|j| }|d krvd S ||| j< d S r   )_extra_criteriar   rd   ra   rj   )rf   rk   rl   rm   rn   ro   rp   r   rq   ra   rr   r   r;   r;   r<   rs   -  s"    


z"ExpressionColumnLoader.setup_queryc	                 C  sh   |rd|j rd|j }	|	D ]:}
|r&|j|
 }
||
d}|r|d | j|f  qdq|d | jdf d S r   )r   ra   r   rK   r5   )rf   ru   rl   rm   rn   rX   rv   ro   rw   ra   r   r   r;   r;   r<   rx   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   r\   rd   ra   r   r   rf   rX   r;   r;   r<   r   l  s    z+ExpressionColumnLoader.init_class_attribute)ry   rz   r{   rc   rs   rx   r   r~   r;   r;   rh   r<   r     s   %r   )r^   r]   )r^   r]   	raiseload)
do_nothingc                      sN   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`.)ra   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)
rb   rc   r   rd   NotImplementedErrorstrategy_optsrQ   r   ra   r   re   rh   r;   r<   rc     s    
zDeferredColumnLoader.__init__c	           
   
   C  s   |j rB|jjjrB| j|jjjkrB| jd|||||||| nH| jsv| j	rX| jj
}	n| jj}	|d | j|	f n|d | jdf d S )N)r^   Fr]   Tnewr   F)refresh_stater   _compile_options_only_load_propsr5   rd   _get_strategyrx   r   r   _raise_column_loader_deferred_column_loaderrK   )
rf   ru   rl   rm   rn   rX   rv   ro   rw   Zset_deferred_for_local_stater;   r;   r<   rx     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   r\   rd   ra   r   r   _load_for_stater   r;   r;   r<   r     s    z)DeferredColumnLoader.init_class_attributeNc	           
      K  s   |j jr| jjsT|r(t| j| jjsT|rF| j	rF|j
d| j	 dsT|rx| j|krx| jdj|||||||f|	 n.| jrt|| j< n| jst|| j< n
t|| j< d S )Nzundefer_group_%sFr   )compile_options_render_for_subqueryrd   _renders_in_subqueriessetra   intersectionrM   _should_undefer_in_wildcardr   
local_optsrQ   r5   r   rs   r   r   r   r   r   )
rf   rk   rl   rm   rn   ro   rp   r   only_load_propsrY   r;   r;   r<   rs     sR    
 
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 krtdt j f  jr |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rf   r;   r<   
<listcomp>	  s
   
z8DeferredColumnLoader._load_for_state.<locals>.<listcomp>c                   s   g | ]}| j k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managerrX   r   iterate_propertiesr!   orm_excDetachedInstanceErrorr3   	state_strr   _invoke_raise_loadr   load_scalar_attributesr   r   r   )rf   r   passivelocalparenttoloadr   sessionr;   )rf   r   r<   r     s6    

   z$DeferredColumnLoader._load_for_statec                 C  s   t d| f d S )Nz+'%s' is not available due to raiseload=Truesa_excInvalidRequestErrorrf   r   r   lazyr;   r;   r<   r   '  s    z'DeferredColumnLoader._invoke_raise_load)N)ry   rz   r{   r|   r}   rc   rx   r   rs   r   r   r~   r;   r;   rh   r<   r   x  s   
3 
3(r   c                   @  s0   e Zd ZdZddddddZejfdd	Zd
S )LoadDeferredColumnsz7serializable loader object used by DeferredColumnLoaderFstrboolr5   r   c                 C  s   || _ || _d S r2   r   )rf   r5   r   r;   r;   r<   rc   0  s    zLoadDeferredColumns.__init__c                 C  s>   | j }|jj}|j| }| jr$d}nd}||}|||S )N)r^   Tr   )r   T)r   r   )r5   r   rX   rP   r   r   r   )rf   r   r   r5   r   r8   rg   r   r;   r;   r<   __call__4  s    

zLoadDeferredColumns.__call__N)F)ry   rz   r{   r|   rc   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.)rX   targetr@   entityc                   s:   t  || | jj| _| jj| _| jj| _| jj| _d S r2   )rb   rc   rd   rX   r   r   r@   re   rh   r;   r<   rc   J  s
    


z#AbstractRelationshipLoader.__init__c	           	   
   C  s    | j d||||||||S )N))r   	immediate)rd   r   rx   rt   r;   r;   r<   #_immediateload_create_row_processorQ  s    z>AbstractRelationshipLoader._immediateload_create_row_processor)ry   rz   r{   r|   r}   rc   r   r~   r;   r;   rh   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)ry   rz   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   r\   rd   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 n
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   )rK   r5   )
rf   ru   rl   rm   rn   rX   rv   ro   rw   r   r;   r   r<   rx     s    zNoLoader.create_row_processorN)ry   rz   r{   r|   r}   r   rx   r;   r;   r;   r<   r   v  s   
r   selectr   raise_on_sqlZ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	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_lazywhereZ_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   zRelationshipProperty[Any]rd   zTuple[Any, ...])rM   rg   c                   s8  t  || | jd dk| _| jd dk| _t| jj| _| jj	}|
 \| _| _| _|j
dd\| _| _| _| jjrdd t| jjD | _nd | _| jd| | j | j o| j o| jjd	 j| jdd
| jjd| _| jr4t| jD ]4}|| jjkr| jj| D ]}| j| | j|< qq| jd|  d S )Nr   r   r   T)Z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)rb   rc   r   r   r   r(   r   r   rd   _join_conditionZcreate_lazy_clauser   r   r   r   r   r   order_byr   to_listr   loggerinfor@   _get_clauser   rX   _equivalent_columnsr   list)rf   rM   rg   join_conditionr   rr   rh   r;   r<   rc     sP    


 zLazyLoader.__init__c              	   C  sv   d| _ | jj}| jjr d}d}n4| jjtjk	s4| jsL|rBd}d}qTd}d}nd }}t| j|d| j	| jj
||d d S )NTF)rC   rF   rE   rG   _deferred_history)r   rd   _legacy_inactive_history_stylerG   rV   r   	MANYTOONEr   r\   r   r   )rf   rX   r  rG   r  r;   r;   r<   r      s2    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                   sF   | j  kr$| j | j  d f n| jd krB| jd | jf d S r2   )_identifying_keyrK   r5   callablevaluer  Zbind_to_colparamsr;   r<   r  0  s    

)r   r   r   r   r+   traversecloned_traverse)rf   Z	lazywhere	criterionr  r;   r  r<   "_memoized_attr__simple_lazy_clause"  s       z-LazyLoader._memoized_attr__simple_lazy_clausec                 C  s   | j \}}|d kr(t|dd |D S | jj}| }t|}|tj	@ rV|tj	N }i }|D ]J\}	}
}|
d k	r|r|tj
@ r||||
|}n||||
|}|||	< q^||fS )Nc                 S  s   g | ]\}}}|qS r;   r;   )r   r5   identr  r;   r;   r<   r   G  s     z4LazyLoader._generate_lazy_clause.<locals>.<listcomp>)r   r   adapt_criterion_to_nullrd   rM   objr
   instance_dictr   INIT_OKLOAD_AGAINST_COMMITTED#_get_committed_state_attr_by_column_get_state_attr_by_column)rf   r   r   r  Z
param_keysrX   or   r  r5   r  r  r;   r;   r<   _generate_lazy_clauseB  s:    
 


      
z LazyLoader._generate_lazy_clausec                 C  s   t d| |f d S )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
@ sN|
r\|tj@ sb|rbtjS | jr|t	j@ s|
r|t	j@ r| ||d t|}|s|t	j@ rtjS tdt|| j f |
r| |||}	tj|	krtjS tj|	krtjS | jjst|	r$d S nt|	r$d S | j |jkrD|t	j@ sDtj S |j!| j"|	||d}|d k	rx|tj#krrd S |S n|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   Zlazy_loaded_from)%r5   rd   Z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_SETrX   allow_partial_pksr$   r   
issupersetdictDEFERRED_HISTORY_LOADr   Z_identity_lookupr   PASSIVE_CLASS_MISMATCH_emit_lazyload)rf   r   r   rn   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   Zget_attrr   rf   r   r;   r<   r     s   z5LazyLoader._get_ident_for_use_get.<locals>.<listcomp>)r   rX   r   r#  r$  r%  r1  r   )rf   r   r   r   instance_mapperr;   r@  r<   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 k	r\| j jj}|j }|sr|tj@ rt ddi|_ j}|js|r|jr|d kr|j j }n
| j }|j}|r|jrd}|t j|f7 }||_n$|d kr|jj j }n
| j }|r | j|7  _| jd|i7  _|rn jrZ|t j!@ sZ "||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+kr|t j,@ st-j.S |rt /tj0|1 r,d S nt /tj2|1 r,d S  jrN|t j!@ sN "||d |f|_3|j4|||	d}|5 6 7 } j8r|S t9|}|r|dkrt :d j  |d S d S d S )N)_raw_columns_propagate_attrs_label_styler   F)_invoke_all_eagers_lazy_loaded_from	autoflush_current_pathr   )load_optionsr8  c                   sR    j jD ]D}|jtjkr|jrt|jtsj	
| jj|j ||  qd S r2   )rd   Z_reverse_propertyrV   r   r  Z_use_getr   r   r   r#   Z_construct_for_existing_pathr   rH  rM   lazyloadprocess_compile_state)compile_contextZrevrf   strategy_optionsr;   r<   _lazyload_reverseB  s     

z4LazyLoader._emit_lazyload.<locals>._lazyload_reverse_sa_orm_load_options)r8  r	   zKMultiple rows returned with uselist=False for lazily-loaded attribute '%s' r   );r   	preloadedorm_strategy_optionsr   __clause_element__r-   _create_raw_selectrC  r,   r   default_compile_optionsr   default_load_optionsrd   	secondaryselect_fromrX   r5   r
   NO_AUTOFLUSHimmutabledict_execution_optionsr   rI  r   	load_pathr3   LoaderCriteriaOption_with_options_path_registryr   r   r   r+  r   r   load_on_pk_identityr   _order_by_clauses_with_context_optionsr'  
EMPTY_DICT
merge_withr1  r2  r   r   has_intersection	_none_setvalues
_never_set_where_criteriaexecuter  scalarsallr@   lenwarn)rf   r   r   r:  r   rn   r5  r6  r7  r8  clauseelementstmtrI  r9  r   effective_pathr:   rO  Zlazy_clauser  rv   lr;   rM  r<   r4    s    
 



  
  
zLazyLoader._emit_lazyloadc	              
     s   | j  |jjr@|jjjr@| j |jjjkr@| ||||||||S | jrP|r|jrt	
|jt | ||jrp||nd  }	|d | j |	f n,|js|jr fdd}
|d | j |
f 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   rI  _is_user_refreshr   r   r   r   r   r   r"   "_instance_level_callable_processorrR   LoadLazyAttribute_generate_extra_criteriarK   populate_existingalways_refresh)rf   ru   rl   rm   rn   rX   rv   ro   rw   Zset_lazy_callableru  r;   rt  r<   rx     sF    

zLazyLoader.create_row_processor)ry   rz   r{   r|   r}   __annotations__rc   r   r  r'  r   r   rc  r   r-  preload_moduler4  rx   r~   r;   r;   rh   r<   r     s.   
	<"  	
w
 r   c                   @  s.   e Zd ZdZdd Zdd ZejfddZdS )	rx  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   rg   rn   r5  )rf   r5   Zinitiating_strategyrn   r5  r;   r;   r<   rc     s    zLoadLazyAttribute.__init__c                 C  s(   | j d k	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~  )r5  r   rn  r5   rg   rn   r   r;   r;   r<   __getstate__  s    
zLoadLazyAttribute.__getstate__c                 C  s:   | j }|jj}|j| }|j| j }|j||| j| jdS )N)rn   r5  )	r5   r   rX   rP   _strategiesrg   r   rn   r5  )rf   r   r   r5   rA  r8   r   r;   r;   r<   r     s    
zLoadLazyAttribute.__call__N)	ry   rz   r{   r|   rc   r  r
   r   r   r;   r;   r;   r<   rx    s   rx  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  sN  |j jptjj| }| }td|i}|rF|j	dd }|dk}	nd }d}	|d k	r| j
jsrtd| j
 d|j	dt|  |}|	s|dk r|d||fS |	s|dt|  |d	 i}tj||| j
r|d||fS || j
 }
|| j
 }|
|jd
sB|r(|jd |krB|d||fS n|| jrB|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 relationshipZ_recursion_depth_r   r	   loaderr&   T)rk   current_pathr3   PathRegistryroot_get_top_level_contextr   rZ  r   rQ   rd   Z_is_self_referentialr   r   r8  idunionr   PostLoadpath_existscontainsr
   lengthcontains_mapperrX   )rf   ru   rm   rn   
join_depthrq  top_level_contextr8  r  Zunlimited_recursionpath_w_propZeffective_path_w_propr;   r;   r<   _setup_for_recursion  sp    
    

zPostLoader._setup_for_recursion)N)ry   rz   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                   s   t  || | jj| _d S r2   rb   rc   rd   r  re   rh   r;   r<   rc   W  s    zImmediateLoader.__init__c                 C  s   | j d| d S N)r   r   rd   r   r   r   r;   r;   r<   r   [  s
    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   )rk   r   _enable_eagerloadsr  r  r
   PASSIVE_NO_FETCH_RELATEDr   r+  r   r   r  callable_for_pathrM   rd   _load_for_path)rf   ru   rl   rm   rn   rX   rv   ro   rw   rq  
run_loaderr8  r  flagsr;   r;   r<   rx   `  s,    
z$ImmediateLoader.create_row_processorc	                 C  s   |r.t |jj}	|| f|	_| }
|	f}n|}
d}| j}| jd}|D ]P\}}|j	}|sf||krL|j
||||
|d}|ttjfkrL||||| qLd S )Nr;   r  )r6  r7  r8  )r#   rm   r   Z_recurseru   _truncate_recursiver5   rd   r   r1  r   r   r   r   get_implset_committed_value)rf   ru   rm   states	load_onlyrn   r  r  r8  Znew_optr7  r6  r5   
lazyloaderr   	overwriter   r  r;   r;   r<   r    s<    
  zImmediateLoader._load_for_path)	ry   rz   r{   r}   rc   r   rx   r  r~   r;   r;   rh   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                   s   t  || | jj| _d S r2   r  re   rh   r;   r<   rc     s    zSubqueryLoader.__init__c                 C  s   | j d| d S r  r  r   r;   r;   r<   r     s
    z#SubqueryLoader.init_class_attributec                   s   |}|j }t|d }| j|rB| j|d krB| j| j  }n||d   }|r|j| jj| t	|t	 }|r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   )getattrrm   r   r   r5   r   leftmost_mapperZnew_subq_pathr;   r<   r     s
   

z0SubqueryLoader._get_leftmost.<locals>.<listcomp>)rm   r3   _class_to_mapperrM   isard   	_entitiesentity_zeror_  rm  r   r  coercelocal_columns)rf   orig_query_entity_index	subq_pathZcurrent_compile_stateis_rootZgiven_subq_pathZsubq_mapperZleftmost_prop
additionalZleftmost_colsleftmost_attrr;   r  r<   _get_leftmost  s4    
zSubqueryLoader._get_leftmostc                 C  s.  |  d }tjtj}|j|j |}|js^d|_|j	j
|fdd t||dD   |dd |D | }	|	|_|j}
|
dkrd|_n6|
d krdd |	D D ]}t|	|jsd|_ qq|jsd	|_|jdkr|jrt|	|j}|r||	|  |t }tj||dd
}|S )NFc                 S  s    h | ]}|d  dk	r|d  qS )r   Nr;   )r   entr;   r;   r<   	<setcomp>  s   z?SubqueryLoader._generate_from_original_query.<locals>.<setcomp>)rk   c                 S  s   g | ]}t jt jj|qS r;   )r*   	coercionsexpectrolesColumnsClauseRole)r   r&  r;   r;   r<   r   /  s   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_objZ_enable_assertionsrX  non_generativer   _adapt_col_list_get_current_adapterrB  distinct_target_key	_distinctr   r0  r   _has_row_limiting_clausera  r    expand_column_list_from_order_by_set_entitiesset_label_styler,   r  r3   r%   )rf   orig_compile_state
orig_queryr  r  leftmost_relationshipZorig_entityqq2Ztarget_colsr  tZto_addZembed_q
left_aliasr;   r;   r<   _generate_from_original_query  s^        z,SubqueryLoader._generate_from_original_queryc                   s   g }t | }t|D ]N\}\}}|dkrR||d  d j}||rL|n|}	n|}	||	|jf qt|dk rz| n.t|d d }
|
j	r|
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  rM   r   r5   r   parent_aliasrf   r;   r<   r     s   z2SubqueryLoader._prep_for_joins.<locals>.<listcomp>)r  pairs	enumeraterX   r  rK   r5   rm  r(   r   r   r3   r%   rd   r  )rf   r  r  to_joinr  irX   r8   Zprev_mapperZ	to_appendr	  
local_cols
local_attrr;   r  r<   _prep_for_joinsZ  s,     zSubqueryLoader._prep_for_joinsc                 C  s0  t |}|dkr,t||d d |g}n|dkrft||d d |t||d d |g}n|dkrdd |dd D }g }|r|d}	t|	d |	d }
|r|
|d d }
n
|
|}
||
 qt||d d |d jg| t||d d |g }|D ]}
||
}q|S )Nr	   r   r&   r  c                 S  s:   g | ]2}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>)rm  r  of_typepoprK   rM   join)rf   r  r  r  r  effective_entityZltjZmiddleinnerr  attrr;   r;   r<   _apply_joins  sD    
	



zSubqueryLoader._apply_joinsc           	      C  sB   |j }|r*|jr*|t| j||f7 }||}|j| }|S r2   )r^  r   r3   r]  r   ry  Z_with_current_pathoptions)	rf   ru   r  r  rewritten_pathr  r  rn   new_optionsr;   r;   r<   _setup_options  s    
	

zSubqueryLoader._setup_optionsc                   s&    j jr" fdd}|| j }|S )Nc                   s    |  j tt jj7  _ d S r2   eager_order_bytupler   r  rd   r  rL  r   r;   r<   _setup_outermost_orderby  s    zISubqueryLoader._setup_outermost_orderby.<locals>._setup_outermost_orderby)rd   r  _add_context_option)rf   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   r8  rI  r  subq_datac                 C  s4   |j | _ |j| _|j| _|jp i | _|| _d | _d S r2   r  )rf   ru   r  r;   r;   r<   rc     s    z(SubqueryLoader._SubqCollections.__init__c                 C  s    | j d kr|   | j ||S r2   )r  _loadrQ   )rf   r5   defaultr;   r;   r<   rQ   	  s    
z#SubqueryLoader._SubqCollections.getc                 C  s   t t| _| j}|jd ks t|| 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=         z7SubqueryLoader._SubqCollections._load.<locals>.<lambda>c                 s  s   | ]}|d  V  qdS )r   Nr;   r   Zvvr;   r;   r<   r     s     z8SubqueryLoader._SubqCollections._load.<locals>.<genexpr>)collectionsdefaultdictr  r  r  r   AssertionErrorZwith_sessionrI  _populate_existingrz  r  	itertoolsgroupbyextend)rf   r  rowsr   vr;   r;   r<   r    s    z%SubqueryLoader._SubqCollections._loadc                 C  s   | j d kr|   d S r2   )r  r  )rf   r   r   r   r;   r;   r<   r    s    
z&SubqueryLoader._SubqCollections.loaderN)	ry   rz   r{   r|   r}   rc   rQ   r  r  r;   r;   r;   r<   _SubqCollections  s   	
r  c              	   C  s  |j }|jjr|jjrd S |j|}d|_|| j }||j	dd }	|	d k	rT|	}
n| j
}
|jjdtjjtjjf\}}|tjjk}|| }|| }|jjdtf|j}t|d}|jr|jjd krtd| |f  |j}|j|dd}| ||||\}}}}| ||||||}t|
}|jj|jdtf|d||fi|_|d}|  ||\}}}|j!| }| "|||||
}| #||||||
|}| $|}|S )	NTpath_with_polymorphic)Z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)%rk   r   r  _for_refresh_stater  indexloaders_require_bufferingrd   rQ   r
   r   r   r[  r3   r  r  r  r   _get_plugin_class_for_plugin_is_lambda_elementrI  rF  r   rn  	_resolved_create_entities_collectionr  r  r  rd  r8  Z_set_enable_single_critr  add_columnsr  r  r  )rf   ru   rl   rm   r   rn   ro   rk   r  with_poly_entityr  r  r  r  r  Z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 k	r&|j jjr&tdd |jrD| |||||| |S | |||| j\}	}
}	}	|
sfd S t	|j t
svd S | jj| j jjstd|  t|dkrt|j| jsd S nt|d | jsd S | ||||d | }|d krd S |jd kst|| j }| jj}||jd}|d krH| ||}||jd|  r` fdd|D }| jr||  ||||| n| !||||| 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                   s   g | ]} j | qS r;   r`   r   ro   r;   r<   r     s     z7SubqueryLoader.create_row_processor.<locals>.<listcomp>)"rk   	statementis_dmlr   warn_deprecatedr   r   r  r  r   r   rM   rR   r5   implsupports_populationr   r   rm  r3   _entity_isar  r  r   r  rd   r  rQ   r
   r  r   r@   _create_collection_loader_create_scalar_loader)rf   ru   rl   rm   rn   rX   rv   ro   rw   _r  r  r  r  r;   r  r<   rx     s    
   		

        z#SubqueryLoader.create_row_processorc                   sp   | | fddfdd}|d jf |d j|f |jrl|d j jf d S )Nc                   s*     |d}| j| || d S )Nr;   )rQ   r  r5   r  )r   r   r   
collectionr  rf   tuple_getterr;   r<   load_collection_from_subq  s      zKSubqueryLoader._create_collection_loader.<locals>.load_collection_from_subqc                   s   j |kr | || d S r2   rt  r   )r%  rf   r;   r<   &load_collection_from_subq_existing_row  s    
zXSubqueryLoader._create_collection_loader.<locals>.load_collection_from_subq_existing_rowr   existingeager_tuple_getterrK   r5   invoke_all_eagersr  )rf   ru   rv   r  r  rw   r&  r;   )r  r%  rf   r$  r<   r    s    
z(SubqueryLoader._create_collection_loaderc                   sp   | | fddfdd}|d jf |d j|f |jrl|d j jf d S )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   )rQ   rm  r   rn  r  r5   r  )r   r   r   r"  scalarr#  r;   r<   load_scalar_from_subq,  s    zCSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subqc                   s   j |kr | || d S r2   rt  r   )r.  rf   r;   r<   "load_scalar_from_subq_existing_row7  s    
zPSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subq_existing_rowr   r'  r(  r)  )rf   ru   rv   r  r  rw   r/  r;   )r  r.  rf   r$  r<   r   '  s    
z$SubqueryLoader._create_scalar_loader)ry   rz   r{   r}   rc   r   r  r  r  r  r  r  r  r  rx   r  r   r~   r;   r;   rh   r<   r    s   1d/6"4 	er  Z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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                   s   t  || | jj| _d S r2   r  re   rh   r;   r<   rc   N  s    zJoinedLoader.__init__c                 C  s   | j d| d S r  r  r   r;   r;   r<   r   R  s
    z!JoinedLoader.init_class_attributeNFc	                 K  st  |j jsdS |r0|jdk	r0|jjr0tdd n| jr<d|_|| j }|rZ| 	|||j
nd}
|
dk	r| |||||
\}}}n`||j
ds| jr|jd | jkrdS n|| jrdS | ||||||||\}}}}d|_||j
dd}|dk	rt|j}nd}|| j }tj|| j|||||| j|d		 tj|j}|rp|dk	r^td
ndd |jD |_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.r  TFr  r&   r	  )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 k	r|qS r2   r;   r   r;   r;   r<   r     s     z,JoinedLoader.setup_query.<locals>.<listcomp>)r   r  r  r  r   r  r@   multi_row_eager_loadersrd   _init_user_defined_eager_procr
   $_setup_query_on_user_defined_adapterr  r  r  r  rX   _generate_row_adaptereager_adding_joinsrQ   r(   with_polymorphic_mappersr   r   _setup_entity_queryNONE_SETr   secondary_columnsr   r   )rf   rk   rl   rm   rn   ro   rp   r2  r3  rq   user_defined_adapterclausesadd_to_collectionr  r1  Z	has_nonesr;   r;   r<   rs   W  s    
    


zJoinedLoader.setup_queryc           
      C  s   d|j krdS |jj}||jdd}|dk	r2|S |j d }|dd  \}}|d k	rt|trj|j|}t	j
t	jj|j||jjdd}nF||jdr||jd}	t	j
t	jj|	|jjd}n|j|jd }||d| |S )NZeager_from_aliasF user_defined_eager_row_processor)
selectabler  limit_on_entityr	  )r  )r   rm   rM   rQ   r
   r   r   r   aliasr3   
ORMAdapter_TraceAdaptRoleJOINEDLOAD_USER_DEFINED_ALIASrX   r  r   JOINEDLOAD_PATH_WITH_POLYMORPHIC_polymorphic_adaptersr   )
rf   rn   rk   Ztarget_attributesrm   ro   rD  Zroot_mapperr8   r  r;   r;   r<   r5    sZ    
  

   z*JoinedLoader._init_user_defined_eager_procc                 C  sV   | |}|r.|r.||}||jd| n|rF|}||jd| |j}|||fS )Nr@  )_get_entity_clauseswrapr   r
   primary_columns)rf   ru   r   rm   ro   r=  r?  r;   r;   r<   r6  	  s"    

z1JoinedLoader._setup_query_on_user_defined_adapterc	                 C  s  | |jdd }	|	r|	}
nDt| j}|jr2|j}nd }tj| j|d k	rR|j	ddnd ddd}
t|
}|j
d| ftjtjj|| jjdddd}|jst|d k	r|j d| jjn| jj}|sd}|j| j||||||||r|jnd	f	 |j}||jd
| ||||fS )Nr	  T)flat)rD  rM  r  Zjoinedloader_ormadapterF)r  adapt_requiredallow_label_resolveanonymize_labels	innerjoinr;   eager_row_processor)rQ   r
   r(   r   r   rB  r3   r%   rX   _anonymous_fromclause_memorE  rF  JOINEDLOAD_MEMOIZED_ADAPTERr  r  r   rd   rQ  create_eager_joinsrK   _create_eager_joinr   r<  r   )rf   rk   r   rm   rn   ro   rp   r2  r3  r  Zto_adaptinspZalt_selectableZto_adapt_inspr>  rQ  r?  r;   r;   r<   r7  )	  sh      

z"JoinedLoader._generate_row_adapterc
              	     sb  |d kr|j }
n|}
|jo|j}d }||jkr~|s~|jr~t|j|j}t|dkr^t	
d|r~|j|d  }|d | }}|d kr||j }}|j||}|rt|ddr|j|
 jr|
n j}t|j j j}n ttj j|jdd j j}n j}|jst| p8| p8|dkp8|jj}|	}|jd	 j fd
}|rr|t fdd|D 7 }|rtj||j|| p|jjp|ot|tj  j| j  |d}n !||d ||||}||j|< |j|_"|s0t# jj$D ]4}|
j%j&'|r|r|j(| }|)||j* q jj+r^| j,t|j-.t/0 jj+7  _,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  Zunnestedadditional_entity_criteriar;   c                 3  s    | ]}|j r| jV  qd S r2   )propagate_to_loaders_resolve_where_criteriarX   )r   aer   r;   r<   r   	  s   z2JoinedLoader._create_eager_join.<locals>.<genexpr>isouter
_left_memo_right_memor   rA  )1rX   r4  _should_nest_selectableeager_joinsfrom_clausesr   #find_left_clause_that_matches_givenrB  rm  r   r   
setdefaultr  aliased_insp_entity_for_mapperr  rM   r   r5   rd   r3   r%   r   r  r  represents_outer_joinglobal_attributesrQ   r  _ORMJoinr   r*   Join_splice_nested_inner_joinstop_on_find_columnsZprimaryjoinpersist_selectablerr   contains_columnra   rj   rL  r  r  _target_adaptercopy_and_processr   r  )rf   rk   rl   rm   ro   r2  r>  rQ  r3  r5  r   Zshould_nest_selectableZquery_entity_keyindexesclauseZdefault_towrapZtowrapZefmonclauseZattach_on_outsideZextra_join_criteriarY  	eagerjoinr   r;   r   r<   rW  x	  s      
  	 
     

 
zJoinedLoader._create_eager_joinz#Union[Mapper, None, Literal[False]]z$Optional[path_registry.PathRegistry]entity_inside_join_structuredetected_existing_pathc	              
   C  s  ||d kst |dkr(t|tjs(t t|tjjrN| |||j||||S t|tjrB|j	}	| j|||j
||||	d k	r|	d jnd d}
|
d k	r|js|
js||
}ntj|j|
|j|j|jd}|
j|_|S | j|||j||||j|	d}
|
d k	r&tj|
|j
|j|j|j	d}|
j|_|S |dkr>ds>t dd S ||sRd S |rt|d	kr|d
 |ksxt |dd |jdd krd S tj||j|d|||d j |dS )NrA  Fr  )rx  )r^  r_  rw  )r^  r`  z9assertion failed attempting to produce joined eager loadsr&   r   r]  )r  r   r3   rj  r*   rB  FromGroupingrl  elementr`  rightrX   r^  _splice_into_centerleftru  r_  rq  r  rm  rm   rf  )rf   rm   Zentity_we_want_to_splice_ontoZjoin_objr>  ru  r5  rx  ry  Zjoin_right_pathZtarget_joinrv  r;   r;   r<   rl  
  s    	

$z&JoinedLoader._splice_nested_inner_joinc           	      C  s   |j }|r| |||jnd}|dk	rP|}|jrB|rB||j}qj|jrj|j}n||jd}|d krjdS | j||r||S dS d S )NFrR  )rk   r5  r
   compound_eager_adapterrK  rQ   rX   _result_has_identity_key)	rf   ru   rv   ro   rm   rn   rk   r=  	decoratorr;   r;   r<   _create_eager_adapter
  s4      
 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k	r| j}t|| j|||	| j |
}| j
s| |||| q| |||| n | jd|||||||| d S )Nr  TFr  )rk   r   r  rM   rR   r5   r  r  r   r   r@   loaders_require_uniquingrd   r  r   _instance_processorrX   r   r   r  r   rx   )rf   ru   rl   rm   rn   rX   rv   ro   rw   Zour_pathZeager_adapterr5   	_instancer;   r;   r<   rx   
  s`    

    	   z!JoinedLoader.create_row_processorc                   sr    fdd} fdd} fdd}|d  | j|f |d  | j|f jrn|d	  | j|f d S )
Nc                   sF   t | |}t|d}|j | f<  |}|d k	rB|| d S Nappend_without_eventr
   r   r   UniqueAppenderrK   )r   r   r   r"  result_listinstr  ru   r5   r;   r<   #load_collection_from_joined_new_row'  s     zSJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_new_rowc                   sd   | fj krj | f }n(t | |}t|d}|j | f<  |}|d k	r`|| d S r  r  )r   r   r   r  r"  r  r  r;   r<   (load_collection_from_joined_existing_row4  s       zXJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_existing_rowc                   s    | d S r2   r;   r   r  r;   r<    load_collection_from_joined_execG  s    zPJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_execr   r'  r(  rK   r5   r+  )rf   ru   r5   r  rw   r  r  r  r;   r  r<   r  &  s    z&JoinedLoader._create_collection_loaderc                   sp    fdd} fdd} fdd}|d  j|f |d  j|f |jrl|d	  j|f d S )
Nc                   s    ||< d S r2   r;   r   )r  r5   r;   r<   load_scalar_from_joined_new_rowV  s    zKJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_new_rowc                   s8    |}|kr,|| k	r4t d  n||< d S )Nr,  )r   rn  )r   r   r   r'  r  r5   rf   r;   r<   $load_scalar_from_joined_existing_row[  s    	zPJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_existing_rowc                   s    | d S r2   r;   r   r  r;   r<   load_scalar_from_joined_execn  s    zHJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_execr   r'  r(  r  )rf   ru   r5   r  rw   r  r  r  r;   r  r<   r   U  s    z"JoinedLoader._create_scalar_loader)NNF)FN)ry   rz   r{   r|   r}   rc   r   rs   r5  r6  r7  rW  rl  r  rx   r  r   r~   r;   r;   rh   r<   r0  C  s,      
 9O *   .$>/r0  selectinc                	      s|   e Zd ZdZedddddddg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_infoZ	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k}| jjd k	r>| jj| _n<| jd}|rX|j	| _n"| j
jd j|jdd| j
jd| _| jr|r|  | _|  | _q|  | _n
|  | _d S )Nr  r   TFr  )rb   rc   rd   r  rV   r   r  r  r   r   rM   r
  r   r   r  _init_for_omit_join_m2or  _init_for_joinr  _init_for_omit_join)rf   rM   rg   Zis_m2or  rh   r;   r<   rc     s,    


zSelectInLoader.__init__c                   s   t jjj   fddt D   fddjjD  }}t|dkrbt	j
| }d}n|d }d}dd|||d S )	Nc                 3  s0   | ](}j j|d D ]}| | fV  qqdS )r;   N)rM   r  rQ   )r   r   equivpk_to_fkrf   r;   r<   r     s    z5SelectInLoader._init_for_omit_join.<locals>.<genexpr>c                   s   g | ]}| kr | qS r;   r;   r   r   )r  r;   r<   r     s     z6SelectInLoader._init_for_omit_join.<locals>.<listcomp>r	   Fr   T)r1  rd   r  Zlocal_remote_pairsr  r  rM   r   rm  r*   tuple_
query_info)rf   r  Z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                   s   g | ]} j | qS r;   r=  r>  r  r;   r<   r     s     z:SelectInLoader._init_for_omit_join_m2o.<locals>.<listcomp>)rX   r   rm  r*   r  rd   r   r  )rf   r  r  r  Z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rJtj| }d}n|d }d}| 	dd|||d S )Nc                   s   g | ]}  |qS r;   _adapt_elementr  Zpa_inspr;   r<   r     s    z1SelectInLoader._init_for_join.<locals>.<listcomp>r	   Fr   T)
r%   rM   rU   r  r(   r   rm  r*   r  r  )rf   r  r  r  r;   r  r<   r    s    


zSelectInLoader._init_for_joinc                 C  s   | j d| d S r  r  r   r;   r;   r<   r     s
    z#SelectInLoader.init_class_attributec	                 C  s  |j r| ||||||||S | j|||| jd\}	}
}}|
sBd S |jjjsPd S | jj| j	 j
jsptd|  t|dkrt|j| jsd S nt|d | jsd S |	}|| j }||jdd }|d k	rt|}n| j}tj||| j| j| j||||	 d S )Nr  r  r	   r  r	  )r   r   r  r  rk   r   r  rM   rR   r5   r  r  r   r   rm  r3   r  r  rd   rQ   r
   r(   r   r   r  r  r  )rf   ru   rl   rm   rn   rX   rv   ro   rw   rq  r  r8  r  Zselectin_pathr  r  r  r;   r;   r<   rx     st       
	
  
z#SelectInLoader.create_row_processorc	                   s  |rj |krd S j}	|	jrtt}
g }j|D ]l\}jtfdd|	j	D }t
j|krtj}	 qd |kr|
| |f q6||f q6|	jsdd |D }
|	j}|	j}|	jsjrfdd|D }|}tjd| }| } }tj||gttjddd	}|	js<|}n$|jtjjj  }|!|"t#$d
} j%j&}|j }| j'kr|j(}n&|j(} j'j(} fddt)||D }|r|j*r|t+|, f7 }|d k	r|- }|j.| }|/d|i} j0r&|j1dd}jj2r|	jsfjj2}jrZfdd|D }|j2| }nfdd}|3|j}|	jr4|
||	| | n5|
|	| | d S )Nc                 3  s"   | ]} j |tjd V  qdS )r<  N)r%  r
   PASSIVE_NO_FETCH)r   lk)rX   r   
state_dictr;   r<   r   S  s   z0SelectInLoader._load_for_path.<locals>.<genexpr>c                 S  s$   g | ]\}}|j d  ||j|fqS )r	   )r5   r1  )r   r   r  r;   r;   r<   r   p  s   z1SelectInLoader._load_for_path.<locals>.<listcomp>c                   s   g | ]}  |qS r;   r  r  r  r;   r<   r     s    r?  r
  )compile_state_pluginplugin_subject)rB  rD  r   rC  primary_keysc                   s   g | ]\}}|  |qS r;   )'_adapt_cached_option_to_uncached_option)r   Zorig_optuncached_opt)ru   r;   r<   r     s
    rH  T)rz  c                   s   g | ]}  |qS r;   r  r   r  r;   r<   r     s   c                   s    |  j tt jj7  _ d S r2   r  r  r   r;   r<   r    s    z?SelectInLoader._load_for_path.<locals>._setup_outermost_orderby)r?  )6r5   r  r  r  r   r  rM   r1  r  r  r   r   r  rK   r  r  r  r   r  r3   BundlerS  r-   rT  r,   r   rU  rX  r  r  r  rd   r  filterin_r*   r  rk   select_statementuser_passed_queryr^  zipr   r]  ry  r  r  _update_compile_optionsrz  r8  r  r  _load_via_child_load_via_parent)rf   ru   rm   r  r  r  rn   r  r8  r  
our_statesnone_statesr  Zrelated_identr  r  Z
bundle_entZ
bundle_sqlZ
entity_sqlr  r  rq  r  cached_optionsuncached_optionsr  r  r;   )ru   r  rX   rf   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 ]T}|
|d }|| D ]:\}}}|s| j|krq||| j	|||s|n|g q|qdq|D ]0\}}}|s| j|krq|| j	||d  qd S )Nr   c                 S  s   i | ]\}}||qS r;   r;   )r   r   r  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   #  s   z2SelectInLoader._load_via_child.<locals>.<listcomp>r  r8  )
r@   sorted
_chunksizer   rj  r  rQ   r5   r  r  )rf   r  r  r  r  ru   r8  r@   Zour_keyschunkdatar5   Zrelated_objr   r   r  r;   r  r<   r    s<    	 

zSelectInLoader._load_via_childc                   s$  | j }|rdnd }|r |d| j }|| jd  } fdd|D }	tt}
t|jj|d|	i|d	 dd D ] \}}|
| 
d	d
 |D  qv|D ]\}}}}|s| j|krq|
||}|s|rt|dkrtd|   || j|||d  q|| j||| qqd S )Nr;   r   c                   s&   g | ]\}}}} j r|d  n|qS r  r  )r   r5   r   r  r  r  r;   r<   r   O  s   
z3SelectInLoader._load_via_parent.<locals>.<listcomp>r  r  c                 S  s   | d S r   r;   r  r;   r;   r<   r=   [  r  z1SelectInLoader._load_via_parent.<locals>.<lambda>c                 s  s   | ]}|d  V  qdS )r	   Nr;   r  r;   r;   r<   r   ]  s     z2SelectInLoader._load_via_parent.<locals>.<genexpr>r	   r,  )r@   r  r  r   r  r  r  r   rj  r  r  r5   rQ   rm  r   rn  r  r  )rf   r  r  r  ru   r8  r@   Z_empty_resultr  r  r  r   r  r5   r   r  r  r"  r;   r  r<   r  E  sN    

    zSelectInLoader._load_via_parent)ry   rz   r{   r}   r  
namedtupler  r  rc   r  r  r  r   rx   r  r  r  r~   r;   r;   rh   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 k	rP|j  j krP|t|}|rP||k	rPt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.Zbbf1)code)	r5   	hasparentr
   instance_stater   r   r3   instance_strrU   )r   r  oldvalue	initiatorr  )r8   r;   r<   	_do_checkx  s    z*single_parent_validator.<locals>._do_checkc                   s    | |d |S r2   r;   )r   r  r  r  r;   r<   rK     s    z'single_parent_validator.<locals>.appendc                   s    | |||S r2   r;   )r   r  r  r  r  r;   r<   set_  s    z%single_parent_validator.<locals>.set_rK   T)rawretvalrG   r   )r'   listen)r7   r8   rK   r  r;   )r  r8   r<   rL   w  s         rL   )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   ru   r   r   r   r   r   r    r   r!   r   r"   rN  r#   r$   r%   r'   r   r(   r)   r*   r   r+   sql.selectabler,   r-   util.typingr.   rX   r/   r0   sql.elementsr1   r\   ColumnPropertystrategy_forr_   class_loggerr   r   r   r   r   r   r   MemoizedSlots
Identifiedr   rx  r  r  r  r0  r  rL   r;   r;   r;   r<   <module>
   s        
Q+ZW   0%
&
      24Lc           ;   }