
    
 @g                   	   d Z ddlmZ ddlZddlZddlmZ ddlmZ ddlmZ ddlm	Z	 dd	l
mZ dd
l
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z  ddlm!Z! ddlm"Z" ddlm#Z# ddlm$Z$ ddlm%Z% dd l&m'Z' dd!l(m)Z) dd"l*m+Z+ dd#lm,Z, dd$lm-Z- d%d&l
m.Z. d%d
l
mZ/ d%d'l
m0Z0 d%d(l
m1Z1 d%d)l
m2Z2 d%dl
mZ d%dl2mZ3 d%d*l2m4Z4 d%d+l5m6Z6 d%d,l5m7Z7 e	rdd-lm8Z8 d%d.l9m:Z: 	 	 	 	 	 	 d`d0Z;ej<        =                    d/d/1           G d2 d3e$                      Z>e1j?        ej<        =                    d4d/1           G d5 d6e$                                  Z@e1j?        ej<        =                    d47           G d8 d9e@                                  ZAe1j?        ej<        =                    d4d4:          ej<        =                    d4d4d4;          ej<        =                    d4<           G d= d>e$                                                          ZB G d? d@          ZC G dA dBe$          ZDe1j?        ej8        =                    d4<           G dC dDe$                                  ZEe1j?        ej8        =                    dEF          ej8        =                    dF           G dG dHeD                                              ZFe1j?        ej8        =                    d4F          ej8        =                    dIF          ej8        =                    dJF          ej8        =                    dKF          ej8        =                    dLF           G dM dNeDejG        e1jH                                                                                          ZI G dO dP          ZJ G dQ dReD          ZKej8        =                    dSF           G dT dUeK                      ZLe1j?        ej8        =                    dVF           G dW dXeK                                  ZMe1j?        ej8        =                    dYF          ej8        =                    d/F           G dZ d[eD                                              ZNe1j?        ej8        =                    d\F           G d] d^eKejG                                          ZOd_ ZPdS )azWsqlalchemy.orm.interfaces.LoaderStrategy
   implementations, and related MapperOptions.    )annotationsN)Any)Dict)Tuple)TYPE_CHECKING   )
attributes)exc)
interfaces)loading)path_registry)
properties)query)relationships)
unitofwork)util)_DEFER_FOR_STATE)_RAISE_FOR_STATE)_SET_DEFERRED_EXPIRED)ATTR_WAS_SET)LoaderCallableStatus)PASSIVE_OFF)PassiveFlag)_column_descriptions)ORMCompileState)ORMSelectCompileState)QueryContext)LoaderStrategy)StrategizedProperty)_state_session)InstanceState)Load)	_none_set)AliasedClass   )event)inspect)log)sql)visitors)LABEL_STYLE_TABLENAME_PLUS_COL)Select)RelationshipProperty)ColumnElementFc	                   g }
|o| j         |r!| j        r|
                    t                     | j        | j        j        v r3| j        j        | j                 \  |
                    fd           |r|
                    t          j                   |r)| j	        r | j
        r|
                    fd           |j        D ]}| |j                            | j                  u r|j                            | j                  sbt!          j        |j        | j        f| |||o| j        p| j        t(          j        u ||||| p| j         | j        d|	}|
D ]} |||            d S )Nc                6    t          j        | |j        fi S N)orm_util_validator_eventskey)descpropfnoptss     M/var/www/piapp/venv/lib/python3.11/site-packages/sqlalchemy/orm/strategies.py<lambda>z%_register_attribute.<locals>.<lambda>X   s*    x9dh   &*        c                0    t          j        |           S r1   )r	   backref_listeners)r5   r6   backrefuselists     r9   r:   z%_register_attribute.<locals>.<lambda>f   s    :#?'7$ $ r;   )parent_tokenr?   compare_function	useobjecttrackparenttypecallable	callable_active_history
impl_classsend_modified_eventsdoc)r?   single_parentappendsingle_parent_validatorr4   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viewonlyrI   )r6   mapperrB   rA   rD   rE   proxy_propertyrF   rG   kwlisten_hooksmr5   hookr>   r7   r8   r?   s                 @@@@r9   _register_attributerb   B   s    L(DLG 5T' 53444x4;)));)$(3D    	
 	
 	
  =J;<<<  % 	t3 	      " ( ! !18<<H
 
 
 
/00::
 5 "!1#% & >~)==)#-%)2]%G$-6GH# $ % D* % ! !T4    5! !r;   )
instrumentdeferredc                  6     e Zd ZdZdZ fdZ	 ddZd Z x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                n    t                                          ||           | j        j        | _        d S r1   )super__init__parent_propertyrh   selfrM   strategy_key	__class__s      r9   rk   z#UninstrumentedColumnLoader.__init__   s.    ...+3r;   Nc                d    | j         D ]'}|r|j         |         }|                    ||           (d S r1   )rh   _append_dedupe_col_collection)	rn   compile_statequery_entitypathloadoptadaptercolumn_collectionkwargscs	            r9   setup_queryz&UninstrumentedColumnLoader.setup_query   sQ      	N 	NA 'OA&77;LMMMM	N 	Nr;   c	                    d S r1    	rn   contextrt   ru   rv   r\   resultrw   
populatorss	            r9   create_row_processorz/UninstrumentedColumnLoader.create_row_processor   s	     	r;   r1   )	__name__
__module____qualname____doc__	__slots__rk   r{   r   __classcell__rp   s   @r9   rf   rf      su          I4 4 4 4 4 N N N N      r;   rf   Tc                  <     e Zd ZdZdZ fdZ	 ddZd Zd Z xZ	S )	ColumnLoaderz8Provide loading behavior for a :class:`.ColumnProperty`.)rh   is_compositec                    t                                          ||           | j        j        | _        t	          | j        d          | _        d S )Ncomposite_class)rj   rk   rl   rh   hasattrr   rm   s      r9   rk   zColumnLoader.__init__   sF    ...+3#D$8:KLLr;   Fc	                    | j         D ]D}
|r*|r|                    |
          }
|
 d S n|j         |
         }
|                    |
|           E| j         d         }|r|j         |         }|d S ||| j        <   d S Nr   )rh   adapt_check_presentrr   rl   )rn   rs   rt   ru   rv   rw   rx   memoized_populatorscheck_for_adaptry   rz   fetchs               r9   r{   zColumnLoader.setup_query   s      		N 		NA +" +33A66Ay !  *A77;LMMMMQ 	OE*E} 49D0111r;   c                   d| _         | j        d         j        }| j        j        pA| j        d         j        p/|j        d uo&|j                            |j        d           | j        u }t          | j        |d|j
        |           d S )NTr   F)rB   rA   rF   )is_class_levelrh   typerl   rF   primary_keyversion_id_col_columntopropertyrT   rb   compare_values)rn   r\   coltyperF   s       r9   init_class_attributez!ColumnLoader.init_class_attribute   s    ",q/&  / |A* %T1 (,001FMM'( 	 	 $3)	
 	
 	
 	
 	
 	
r;   c	                    | j         D ]N}	|r|j         |	         }	|                    |	d          }
|
r%|d                             | j        |
f            d S O|d                             | j        df           d S NFquickexpireT)rh   _getterrK   r4   )rn   r   rt   ru   rv   r\   r   rw   r   colgetters              r9   r   z!ColumnLoader.create_row_processor  s     < 	: 	:C +oc*^^C//F 7#**DHf+=>>> x ''4(899999r;   F)
r   r   r   r   r   rk   r{   r   r   r   r   s   @r9   r   r      s         CB)IM M M M M : : : :B
 
 
,: : : : : : :r;   r   )query_expressionc                  0     e Zd Z fdZd Zd Zd Z xZS )ExpressionColumnLoaderc                    t                                          ||           t          j                                        d           t          fd| j        j        D                       | _        d S )Nc              3  D   K   | ]}|                                V  d S r1   )compare).0rz   nulls     r9   	<genexpr>z2ExpressionColumnLoader.__init__.<locals>.<genexpr>%  sA       ,
 ,
$%		$,
 ,
 ,
 ,
 ,
 ,
r;   )	rj   rk   r)   r   labelanyrl   rh   _have_default_expression)rn   rM   ro   r   rp   s      @r9   rk   zExpressionColumnLoader.__init__  s}    ...
 xzz%%(+ ,
 ,
 ,
 ,
)-)=)E,
 ,
 ,
 )
 )
%%%r;   c                    d }	|r|j         r|j         }	n| j        r| j        j        }	|	d S |	D ]'}
|r|j        |
         }
|                    |
|           (|	d         }|r|j        |         }|d S ||| j        <   d S r   )_extra_criteriar   rl   rh   rr   )rn   rs   rt   ru   rv   rw   rx   r   ry   rh   rz   r   s               r9   r{   z"ExpressionColumnLoader.setup_query)  s      	3w. 	3-GG* 	3*2G?F 	N 	NA 'OA&77;LMMMM
 	OE*E} 49D0111r;   c	                   |r|j         r~|j         }	|	D ]N}
|r|j        |
         }
|                    |
d          }|r%|d                             | j        |f            d S O|d                             | j        df           d S d S d S r   )r   rh   r   rK   r4   )rn   r   rt   ru   rv   r\   r   rw   r   rh   r   r   s               r9   r   z+ExpressionColumnLoader.create_row_processorN  s      	>w. 	>-G > > /!/#.CU33 w'..&/ABBBEE 8$++TXt,<=====	> 	> 	> 	>r;   c                p    d| _         t          | j        |d| j        d         j        j        d           d S )NTFr   )rB   rA   accepts_scalar_loader)r   rb   rl   rh   r   r   rn   r\   s     r9   r   z+ExpressionColumnLoader.init_class_attributeh  sI    " !\!_1@"'	
 	
 	
 	
 	
 	
r;   )r   r   r   rk   r{   r   r   r   r   s   @r9   r   r     sf        	
 	
 	
 	
 	
#: #: #:J> > >4	
 	
 	
 	
 	
 	
 	
r;   r   )rd   rc   )rd   rc   	raiseload)
do_nothingc                  H     e Zd ZdZdZ fdZd Zd Z	 d
dZd Z	d	 Z
 xZS )DeferredColumnLoaderzAProvide loading behavior for a deferred :class:`.ColumnProperty`.)rh   groupr   c                   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_optsrT   r   rh   r   rm   s      r9   rk   zDeferredColumnLoader.__init__  s    ...4'):;; 	%M   +//UCC+3)/


r;   c	           
        |j         r_|j        j        j        rN| j        |j        j        j        v r6| j                            d                              ||||||||           d S | j        sD| j	        r| j        j
        }	n| j        j        }	|d                             | j        |	f           d S |d                             | j        df           d S )N)rd   Frc   Tnewr   F)refresh_stater   _compile_options_only_load_propsr4   rl   _get_strategyr   r   r   _raise_column_loader_deferred_column_loaderrK   )
rn   r   rt   ru   rv   r\   r   rw   r   set_deferred_for_local_states
             r9   r   z)DeferredColumnLoader.create_row_processor  s   * !	;.?	; GM:KKK ..; ""	 	 	 	 	 $ 	;~ (= -,
 (@ - u$$dh0L%MNNNNNx ''5(9:::::r;   c                |    d| _         t          | j        |d| j        d         j        j        | j        d           d S )NTFr   )rB   rA   rE   load_on_unexpire)r   rb   rl   rh   r   r   _load_for_stater   s     r9   r   z)DeferredColumnLoader.init_class_attribute  sO    " !\!_1@*"	
 	
 	
 	
 	
 	
r;   Nc	           	        |j         j        r| j        j        sj|r1t	          | j                                      | j        j                  s7|r*| j	        r#|j
                            d| j	        z  d          s|r7| j        |v r. | j                            d          j        |||||||fi |	 d S | j        rt           || j        <   d S | j        st$          || j        <   d S t&          || j        <   d S )Nzundefer_group_%sFr   )compile_options_render_for_subqueryrl   _renders_in_subqueriessetrh   intersectionrM   _should_undefer_in_wildcardr   
local_optsrT   r4   r   r{   r   r   r   r   r   )
rn   rs   rt   ru   rv   rw   rx   r   only_load_propsr^   s
             r9   r{   z DeferredColumnLoader.setup_query  sj    -B%	I (?%	I %	I %%22K; %	I %	I J%	I &**&3U %	I$  %%	I$ %)H$?$?D ..; !#         	I8M 4555 	I8H 45558H 4555r;   c                    j         st          j        S |t          j        z  st          j        S j        j        } j        r fd|j	        D             }n j         g}fd|D             }t                    }|2t          j        dt          j                  d j         d           j        r                     |d           t#          j        j        t'          |          t(                     t          j        S )Nc                    g | ]H}t          |t                    r1t          |j        t                    r|j        j        k    A|j        IS r}   )
isinstancer   strategyr   r   r4   )r   prn   s     r9   
<listcomp>z8DeferredColumnLoader._load_for_state.<locals>.<listcomp>  sb       a!455 qz+?@@	
 Gtz))	  *))r;   c                &    g | ]}|j         v |S r}   )
unmodified)r   kstates     r9   r   z8DeferredColumnLoader._load_for_state.<locals>.<listcomp>  s&    <<<qa5+;&;&;&;&;&;r;   Parent instance zB is not bound to a Session; deferred load operation of attribute '' cannot proceedraise)r4   r   
ATTR_EMPTYr   SQL_OKPASSIVE_NO_RESULTmanagerr\   r   iterate_propertiesr    orm_excDetachedInstanceErrorr2   	state_strr   _invoke_raise_loadr   load_scalar_attributesr   r   r   )rn   r   passivelocalparenttoloadr   sessions   ``     r9   r   z$DeferredColumnLoader._load_for_state  s9   y 	3'22++ 	:'99m*: 		    $7  FF hZF =<<<F<<< ''?// %e,,,,dhhh8   > 	=##E7G<<<&L%U[	
 	
 	
 $00r;   c                2    t          j        d| d          )N'z(' is not available due to raiseload=Truesa_excInvalidRequestErrorrn   r   r   lazys       r9   r   z'DeferredColumnLoader._invoke_raise_load#  s$    ((=ATTC
 
 	
r;   r1   )r   r   r   r   r   rk   r   r   r{   r   r   r   r   s   @r9   r   r   t  s         LK/I0 0 0 0 01; 1; 1;f

 

 

* 1I 1I 1I 1If&1 &1 &1P
 
 
 
 
 
 
r;   r   c                  0    e Zd ZdZd
ddZej        fdZd	S )LoadDeferredColumnsz7serializable loader object used by DeferredColumnLoaderFr4   strr   boolc                "    || _         || _        d S r1   )r4   r   )rn   r4   r   s      r9   rk   zLoadDeferredColumns.__init__,  s    "r;   c                    | j         }|j        j        }|j        |         }| j        rd}nd}|                    |          }|                    ||          S )N)rd   Tr   )r   T)r   r   )r4   r   r\   rS   r   r   r   )rn   r   r   r4   r   r6   ro   r   s           r9   __call__zLoadDeferredColumns.__call__0  se    hm*!#&> 	FLL FL%%l33''w777r;   Nr   )r4   r   r   r   )r   r   r   r   rk   r	   r   r  r}   r;   r9   r   r   )  sO        AA# # # # # '1&< 8 8 8 8 8 8r;   r   c                  ,     e Zd ZdZdZ fdZd Z xZS )AbstractRelationshipLoaderz0LoaderStratgies which deal with related objects.)r\   targetr?   entityc                    t                                          ||           | j        j        | _        | j        j        | _        | j        j        | _        | j        j        | _        d S r1   )rj   rk   rl   r\   r  r  r?   rm   s      r9   rk   z#AbstractRelationshipLoader.__init__F  sU    ...*1*1*1+3r;   c	           
     j    | j                             d                              ||||||||          S )N))r   	immediate)rl   r   r   r~   s	            r9   #_immediateload_create_row_processorz>AbstractRelationshipLoader._immediateload_create_row_processorM  sJ     #11$
 


	
 	
	
r;   )r   r   r   r   r   rk   r	  r   r   s   @r9   r  r  A  sR        ::7I4 4 4 4 4
 
 
 
 
 
 
r;   r  c                      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;   r9   r  r  f  s           r;   r  noload)r   c                  "    e Zd ZdZdZd Zd ZdS )NoLoaderzQProvide loading behavior for a :class:`.Relationship`
    with "lazy=None".

    r}   c                X    d| _         t          | j        |d| j        j                   d S )NT)rB   rD   )r   rb   rl   collection_classr   s     r9   r   zNoLoader.init_class_attribute}  s@    " ->		
 	
 	
 	
 	
 	
r;   c	                V      fd}	|d                               j        |	f           d S )Nc                d    j         rt          j        | |j                   d S d |j        <   d S r1   )r?   r	   init_state_collectionr4   )r   dict_rowrn   s      r9   invoke_no_loadz5NoLoader.create_row_processor.<locals>.invoke_no_load  s9    | '0txHHHHH"&dhr;   r   )rK   r4   )
rn   r   rt   ru   rv   r\   r   rw   r   r  s
   `         r9   r   zNoLoader.create_row_processor  sD    	' 	' 	' 	' 	' 	5  $(N!;<<<<<r;   N)r   r   r   r   r   r   r   r}   r;   r9   r  r  r  sC         
 I
 
 
= = = = =r;   r  selectr   raise_on_sqlbaked_selectc                       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Zd Zd Zd Z	d Z
ddddej        fdZd Z ej        d          d             Zd Z x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   rM   ro   Tuple[Any, ...]c                   t                                          ||           | j        d         dk    | _        | j        d         dk    | _        t          | j                  j        | _        | j        j	        }|
                                \  | _        | _        | _        |
                    d          \  | _        | _        | _        | j        j        r.d t%          j        | j        j                  D             | _        nd | _        | j                            d| | j                   | j         o?| j         o7| j        j        d                             | j        dd	| j        j        
          | _        | j        rlt;          | j                  D ]:}|| j        j        v r*| j        j        |         D ]}| j        |         | j        |<   ;| j                            d|            d S d S )Nr   r   r  T)reverse_directionc                <    g | ]}t          j        |d di          S )
_orm_adaptT)sql_util_deep_annotate)r   elems     r9   r   z'LazyLoader.__init__.<locals>.<listcomp>  s:        '|T.BCC  r;   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   rM   ro   join_conditionr   rz   rp   s         r9   rk   zLazyLoader.__init__  s    	...!/77B!/7>I ' 4 4 E-=
 --//		
O! ---EE		
!% ( 	"  L)=)FGG  DNN
 "DN4dDOLLL %% L '*22 " K;	 3   	 < 	D122 N N$+999![<SA N N373H3M-a00KI4    	 	r;   c           	         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x}}t          | j        |d| j	        | j        j
        ||           d S )NTF)rB   rE   rD   rF   _deferred_history)r   rl   _legacy_inactive_history_stylerF   rY   r   	MANYTOONEr   rb   r   r  )rn   r\   rB  rF   rA  s        r9   r   zLazyLoader.init_class_attribute  s    "  ? 	' . 	7!N %  **2FFF< G . )!%$)!!!&$(!!166N. *->)/	
 	
 	
 	
 	
 	
r;   c                    t          j        | j        ddi          }|| j        c}g d }t	          j        |i d|i           fd}t	          j        |i d|i          }|fS )Nr.  Tc                    d| _         d S )NF)unique)	bindparams    r9   visit_bindparamzFLazyLoader._memoized_attr__simple_lazy_clause.<locals>.visit_bindparam'  s    $Ir;   rG  c                    | j         v r*                    | j        | j                  d f           d S | j        $                    | j        d | j        f           d S d S r1   )_identifying_keyrK   r4   callablevalue)rG  bind_to_colparamss    r9   rH  zFLazyLoader._memoized_attr__simple_lazy_clause.<locals>.visit_bindparam,  s    )[88!#I$>?     #+y}dIODEEEEE ,+r;   )r/  r0  r  r"  r*   traversecloned_traverse)rn   	lazywhere	criterionrH  rM  rN  s       @@r9   "_memoized_attr__simple_lazy_clausez-LazyLoader._memoized_attr__simple_lazy_clause  s    +OlD1
 
	 #,T->	;	% 	% 	% 	)R+)GHHH
	F 
	F 
	F 
	F 
	F 
	F ,rK9
 
	 &  r;   c                   | j         \  }}|t          j        |d |D                       S | j        j        }|                                }t          j        |          }|t          j	        z  r|t          j	        z  }i }|D ]O\  }	}
}|
B|r(|t          j
        z  r|                    |||
|          }n|                    |||
|          }|||	<   P||fS )Nc                    g | ]\  }}}|	S r}   r}   )r   r4   identrL  s       r9   r   z4LazyLoader._generate_lazy_clause.<locals>.<listcomp>C  s    DDD$5CCDDDr;   )r&  r/  adapt_criterion_to_nullrl   rM   objr	   instance_dictr   INIT_OKLOAD_AGAINST_COMMITTED#_get_committed_state_attr_by_column_get_state_attr_by_column)rn   r   r   rR  
param_keysr\   or  rN  r4   rV  rL  s               r9   _generate_lazy_clausez LazyLoader._generate_lazy_clause>  s    $ 8	:=3DDDDD   %,IIKK(++[(( 	+{**G!+ 	  	 C  w)KK "FFueW EE #<<ueW E  F3KK&  r;   c                8    t          j        d| d|d          )Nr   z ' is not available due to lazy='r   r   s       r9   r   zLazyLoader._invoke_raise_load^  s*    ((8<dddC
 
 	
r;   Nr}   c                2   |j         s&| j        j        s|j        r|j        st
          j        S |j          }d }	| j        o
| p|j         }
|t          j
        z  s|
r|t          j        z  s|rt
          j        S | j        r7|t          j        z  s(|
r|t          j        z  r|                     ||d           t%          |          }|sM|t          j        z  rt
          j        S t'          j        dt+          j        |          d| j         d          |
r|                     |||          }	t
          j        |	v rt
          j        S t
          j        |	v rt
          j        S t3          j        |	          rd S | j         |j        v r|t          j        z  st
          j        S |                    | j        |	||          }||t
          j         u rd S |S |t          j
        z  r|t          j        z  st
          j        S | !                    |||	||||||	  	        S )Nr   r   z> is not bound to a Session; lazy load operation of attribute 'r   )r   lazy_loaded_from)"r4   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   r2   r   _get_ident_for_use_get	NEVER_SETr#   
issupersetdictDEFERRED_HISTORY_LOADr   _identity_lookupr  PASSIVE_CLASS_MISMATCH_emit_lazyload)rn   r   r   rv   extra_criteriaextra_optionsalternate_effective_pathexecution_optionspendingprimary_key_identityr   r   instances                r9   r   zLazyLoader._load_for_statec  s    y 	3(8	3 +	3
 #	3 (22i-#,OK$Nw7N3N+,, 	:W 	:*66	:;B	: (99 	= k22		= 	= [::	= ##E7G<<< '' 	-- >+==// %e,,,,dhhh8    '	>#'#>#>$ $  $59MMM+==%/3GGG+55#$899 t EJ&&+"CC ' ,88 //$!&	 0  H #3JJJ4#Ok00>!>>> ,=="" $

 

 
	
r;   c                     j         j        }t          j        z  r|j        n|j        j         fd j        j        D             S )Nc                D    g | ]} j         |                    S )r   r#  )r   pkr  get_attrr   rn   r   s     r9   r   z5LazyLoader._get_ident_for_use_get.<locals>.<listcomp>  sD     
 
 
 HUE4#8#<gNNN
 
 
r;   )r   r\   r   r[  r\  r]  rm  r   )rn   r   r   r   instance_mapperr  r~  s   ` `` @@r9   rj  z!LazyLoader._get_ident_for_use_get  s    -.[77 	A&JHH&@H

 
 
 
 
 
 
 
k-
 
 
 	
r;   zsqlalchemy.orm.strategy_optionsc
                N    t           j        j         j                                        }
t          j        |
g|
j        t          t          j
                  }t          j        }|d|dz  } j        j        %|                     j         j        j                  }|j         }|s|t$          j        z  rt          j        ddi          |_         j        }|j        s	|ra|j        rZ||j         j                 }n| j                 }|j        }|r'|j        r d}|t5          j         j        |          fz  }||_        n'||j        j         j                 }n| j                 }|r|xj        |z  c_        |xj        d|iz  c_        |rF j        r&|t@          j!        z  s "                    ||d           tG          j$        |||||	          S  j%        r j%        |_&         fd}|xj'        | j        ffz  c_'         (                    ||          \  }}|	r#t           j)        *                    |	d	|i          }	nd	|i}	 j        |j+        v r|t@          j,        z  stZ          j.        S |r4t          j/        t4          j0        |1                                          rd S n3t          j/        t4          j2        |1                                          rd S  j        r&|t@          j!        z  s "                    ||d           |f|_3        |4                    |||	
          }|5                                6                                7                                } j8        r|S ts          |          }|r*|dk    rt          j:        d j        z             |d         S d S )N)_raw_columns_propagate_attrs_label_styler   F)_invoke_all_eagers_lazy_loaded_from	autoflush_current_pathr  )load_optionsru  c                8   j         j        D ]}|j        t          j        u rv|j        rot          |j        t                    sUj	        
                    | j        j        |j                                               |                              |            d S r1   )rl   _reverse_propertyrY   r   rC  _use_getr   r   r  r"   _construct_for_existing_pathr   r  rM   lazyloadprocess_compile_state)compile_contextrevrn   strategy_optionss     r9   _lazyload_reversez4LazyLoader._emit_lazyload.<locals>._lazyload_reverse7  s    += K K MZ%999 :&s|Z@@ : %)FF'7EJ  hsmm$9$9/$J$J$JK Kr;   _sa_orm_load_options)ru  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\   r4   r	   NO_AUTOFLUSHimmutabledict_execution_optionsr   r  r   	load_pathr2   LoaderCriteriaOption_with_options_path_registryr   r(  r   rh  r   r   load_on_pk_identityr  _order_by_clauses_with_context_optionsr`  
EMPTY_DICT
merge_withrm  rn  r   r   has_intersectionr#   values
_never_set_where_criteriaexecuterF  scalarsallr?   lenwarn)rn   r   r   rw  r   rv   rr  rs  rt  ru  clauseelementstmtr  rv  r   effective_pathr8   r  lazy_clauserN  r   lr  s   `                     @r9   rq  zLazyLoader._emit_lazyload  sc     >>6688('*;7,D	
 
 
 $8"'!&
 
 	

 )5##T1; D i-  	Og
 77 	O&*&8+u9M&N&ND#, 	L' 	Lg.E 	L'/!&1E!F!9$:N!O%D 72 1$+~NN  "&D%- #\89MNNN 6d6JKN 	0-//>!BB 
	! H'K4H*H H''wGGG.$)"3    > 	4%)^D"	K 	K 	K 	K 	K 	K 	"" 45'
 	
"" #88HHV 
	 $ : :!*L! ! '!
 H
""k?? # (44 	$X%7II t "8#6HH 	4 	Dg0D&D 	D##E7NCCC +~&,= ! 
 
 ((**..00< 	MFA 
q55IJ./   ay tr;   c	                   | j         |j        j        rE|j        j        j        r4| j         |j        j        j        v r|                     ||||||||          S | j        r	|rr|j        rkt          j
        |j        t          | ||j        r|                    |          nd                     }	|d                             | j         |	f           d S |j        s|j        r)fd}
|d                             | j         |
f           d S d S )Nr   c                4    |                      |           d S r1   )_reset)r   r  r  r4   s      r9   reset_for_lazy_callablez@LazyLoader.create_row_processor.<locals>.reset_for_lazy_callable  s     UC(((((r;   )r4   r  _is_user_refreshr   r   r   r	  r   r   r!   "_instance_level_callable_processorrU   LoadLazyAttribute_generate_extra_criteriarK   populate_existingalways_refresh)rn   r   rt   ru   rv   r\   r   rw   r   set_lazy_callabler  r4   s              @r9   r   zLazyLoader.create_row_processor  sy    h  1	.?	 GM:KKK;;	 	 	 " &	Jw &	J73J &	J @$!.G44W===  ! ! u$$dh0A%BCCCCC& 	J&*? 	J	) 	) 	) 	) 	) u$$dh0G%HIIIII	J 	Jr;   )rM   r)  ro   r*  )r   r   r   r   r   __annotations__rk   r   rS  r`  r   r   r  r   rj  preload_modulerq  r   r   r   s   @r9   r  r    sT         
I  $###////''''3333....: : : : : :x 
  
  
D! ! !@! ! !@
 
 
 !%/n
 n
 n
 n
`
 
 
 T:;;[ [ <;[zCJ CJ CJ CJ CJ CJ CJr;   r  c                  2    e Zd ZdZd Zd Zej        f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                H    || _         |j        | _        || _        || _        d S r1   r4   ro   rv   rr  )rn   r4   initiating_strategyrv   rr  s        r9   rk   zLoadLazyAttribute.__init__  s)    /<,r;   c                d    | j         t          j        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  )rr  r   r  r4   ro   rv   )rn   s    r9   __getstate__zLoadLazyAttribute.__getstate__  sH    *I    8 -| 	
 
 	
r;   c                    | j         }|j        j        }|j        |         }|j        | j                 }|                    ||| j        | j                  S )N)rv   rr  )	r4   r   r\   rS   _strategiesro   r   rv   rr  )rn   r   r   r4   r  r6   r   s          r9   r  zLoadLazyAttribute.__call__  s^    h-.%c*#D$56''L.	 ( 
 
 	
r;   N)	r   r   r   r   rk   r  r	   r   r  r}   r;   r9   r  r    sX         "- - -
 
 
 '1&< 
 
 
 
 
 
r;   r  c                      e Zd ZdZdZddZdS )
PostLoaderz;A relationship loader that emits a second SELECT statement.r}   Nc                B   |j         j        pt          j        j        |z   }|                                }t          j        d|i          }|r"|j        	                    dd           }|dk    }	nd }d}	|| j
        j        st          j        d| j
         d          |j        	                    dt          |            |          }|	s|dk     r|d||fS |	s*|                    dt          |            |d	z
  i          }t"          j                            ||| j
                  r|d||fS || j
                 }
|| j
                 }|
                    |j        d
          s7|r|j        dz  |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)rs   current_pathr2   PathRegistryroot_get_top_level_contextr   r  r   rT   rl   _is_self_referentialr   r   ru  idunionr   PostLoadpath_existscontainsr	   lengthcontains_mapperr\   )rn   r   ru   rv   
join_depthr  top_level_contextru  r  unlimited_recursionpath_w_propeffective_path_w_props               r9   _setup_for_recursionzPostLoader._setup_for_recursion  sL   !.L(2G2L $::<< .'):;
 
  	(%0445FMMO"1R"7"O"'&'< 08+8 8 8  
 &7;;.BtHH.. O ' ?Q+>+>"%#	  ' $5$;$;6BtHH66!8K% %! ''^T%9
 
 	M "5*;_LL4/0 .t/C D##G$6AA 	 (/!3j@@&)'	  A '66t{CC "%#	  t%6GGr;   r1   )r   r   r   r   r   r  r}   r;   r9   r  r    s?        EEIDH DH DH DH DH DHr;   r  r  c                  4     e Zd ZdZ fdZd Zd Zd Z xZS )ImmediateLoaderr  c                n    t                                          ||           | j        j        | _        d S r1   rj   rk   rl   r  rm   s      r9   rk   zImmediateLoader.__init__J  .    ....9r;   c                `    | j                             d                              |           d S N)r   r  rl   r   r   r   s     r9   r   z$ImmediateLoader.init_class_attributeN  2    **!	
 	


v
&
&
&
&
&r;   c	                    |                      |||| j                  \  }	}
}}|
st          j        t          j        z  }nt          j        t          j        z  }t          j        	                    ||	| j
        | j        | j        ||||	  	         d S r1   )r  r  r	   PASSIVE_NO_FETCH_RELATEDr   rh  r   r   r  callable_for_pathrM   rl   _load_for_path)rn   r   rt   ru   rv   r\   r   rw   r   r  
run_loaderru  r  flagss                 r9   r   z$ImmediateLoader.create_row_processorS  s      %%gtWdoNN	
 	B
 7+:NNEE*[-AAE**K 
	
 
	
 
	
 
	
 
	
r;   c	                   |rLt          |j        j                  }	||                                f|	_        |                                }
|	f}nd }	|}
d}| j        }| j                            d          }|D ]k\  }}|j	        }|s||vrY|
                    ||||
|          }|t          t          j        fvr*|                    |                              |||           ld S )Nr}   r  )rs  rt  ru  )r"   ru   r  _recurser   _truncate_recursiver4   rl   r   rm  r   r   r   r   get_implset_committed_value)rn   r   ru   states	load_onlyrv   r  r  ru  new_optrt  rs  r4   
lazyloaderr   	overwriter  rL  s                     r9   r  zImmediateLoader._load_for_pathy  s/     	7<.//G  ""GO (,'?'?'A'A$$JMMG'+$Mh)778MNN
 & 	 	E9JE Cu,,"22"/-E&7 3    (:!   NN3'';;ue  	 	r;   )	r   r   r   r   rk   r   r   r  r   r   s   @r9   r  r  F  sk        I: : : : :' ' '
$
 $
 $
L+ + + + + + +r;   r  subqueryc                  ~     e Zd ZdZ fdZd Zd Zd Zd Zd Z	d Z
d	 Z G d
 d          Zd Zd Zd Zd Z xZS )SubqueryLoaderr  c                n    t                                          ||           | j        j        | _        d S r1   r  rm   s      r9   rk   zSubqueryLoader.__init__  r  r;   c                `    | j                             d                              |           d S r  r  r   s     r9   r   z#SubqueryLoader.init_class_attribute  r  r;   c                   |}|j         }t          j        |d                   }| j                            |          r| j        |d         u r| j        | j        c}n||d         c}|rj|j        |         j        j        |         t          |          t                    z
  }|r+t          j                            || d                    z  n||j        }	fd|	D             }
|
|fS )Nr   r   c                p    g | ]2}t          j        d          j        j        |         j                  3S r   )getattrru   r  r   r4   )r   rz   leftmost_mappernew_subq_paths     r9   r   z0SubqueryLoader._get_leftmost.<locals>.<listcomp>  sQ     
 
 

 	 "1%,1!48 
 
 
r;   )ru   r2   _class_to_mapperrM   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
  s              @@r9   _get_leftmostzSubqueryLoader._get_leftmost  s9    $N	/	!== KOOK((	G$	!44-1[$:N*O]]-8)A,*O] 	, 2;'.8M Y#m*<*<<J !;!B!Bzkll+" "  ,M%3
 
 
 
 

 #
 
 
 }mKKr;   c                   |                                                     d           }t          j                            t          j                  }|j                            |j                   |}|j        s3d|_         |j	        j
        |gd t          ||          D             R   |                    d |D             |                                          }	|	|_        |j        }
|
du rd|_        nA|
?d |	D             D ]2}t#          |	                              |j                  s	d|_         n3|j        sd|_        |j        du r;|j        r4t-          j        |	|j                  }|r|                    |	|z              |                    t4                                                    }t9          j        ||d          }|S )	NFc                .    h | ]}|d          
|d          S )r  r}   )r   ents     r9   	<setcomp>z?SubqueryLoader._generate_from_original_query.<locals>.<setcomp>  s4        8}0	 M 100r;   )rs   c                l    g | ]1}t           j                            t           j        j        |          2S r}   )r)   	coercionsexpectrolesColumnsClauseRole)r   r_  s     r9   r   z@SubqueryLoader._generate_from_original_query.<locals>.<listcomp>  s?        $$SY%@!DD  r;   Tc                    h | ]	}|j         
S r}   )tabler   rz   s     r9   r  z?SubqueryLoader._generate_from_original_query.<locals>.<setcomp>.  s    333!ag333r;   r}   use_mapper_path)_clone	correlater   Query__new____dict__update	_from_obj_enable_assertionsr  non_generativer   _adapt_col_list_get_current_adapterr  distinct_target_key	_distinctr   rl  r   _has_row_limiting_clauser  r/   expand_column_list_from_order_by_set_entitiesset_label_styler+   r   r2   r$   )rn   orig_compile_state
orig_queryr	  r  leftmost_relationshiporig_entityqq2target_colsr5  tto_addembed_q
left_aliass                  r9   _generate_from_original_queryz,SubqueryLoader._generate_from_original_query  s3    ))$// [  --
1:&&& { 	#(A (AM(	 3"2D       	 	 	 	0 )88 &   3355
 
 %3G$&&AKK ( 43{333  ;''221=AA "&AKE
 ) 	%"$A;$1#6 >Q0 F  6f 4555 ##$BCCLLNN*Wd
 
 

 r;   c                    g }t          |                                          }t          |          D ]\\  }\  }}|dk    r0||dz
           d         j        }|                    |          r|n|}	n|}	|                    |	|j        f           ]t          |          dk     r|nEt          |d         d                   }
|
j	        r|
j
        nt          j        |
j
        d           j        j        } fd|D             }||fS )Nr   r   r%   r  Tr(  c                Z    g | ]'}t          j        j        |         j                  (S r}   )r  rM   r   r4   )r   rz   parent_aliasrn   s     r9   r   z2SubqueryLoader._prep_for_joins.<locals>.<listcomp>s  s@     
 
 
 L$+"?"B"FGG
 
 
r;   )r>  pairs	enumerater\   r  rK   r4   r  r'   r!  r  r2   r$   rl   r  )rn   rE  r  to_joinrJ  ir\   r6   prev_mapper	to_appendr;  
local_cols
local_attrrI  s   `            @r9   _prep_for_joinszSubqueryLoader._prep_for_joinsJ  sJ   Y__&&''!*5!1!1 	2 	2A~1uu $AEl1o4+6??6+B+BNKK		"	NNItx01111
 w<<! &LL72;q>**D$ #{  (4K      )7

 
 
 
 

 
 

 
L00r;   c                   t          |          }|dk    r2t          ||d         d                                       |          g}nu|dk    r`t          ||d         d                                       |          t          ||d         d                                       |          g}n|dk    rd |dd         D             }g }|r|                    d          }	t          |	d         |	d                   }
|r"|
                    |d         d                   }
n|
                    |          }
|                    |
           |t          ||d         d                                       |d         j                  g|z   t          ||d         d                                       |          gz   }|D ]}
|                    |
          }|S )Nr   r   r%   r  c                    g | ]K}t          |d                    j        st          j        |d                    n|d          j        |d         fLS )r   r   )r'   r!  r2   r$   r  )r   items     r9   r   z/SubqueryLoader._apply_joins.<locals>.<listcomp>  sg        	 #47++<(H)$q'222aG	  r;   )r  r  of_typepoprK   rM   join)rn   r?  rL  rE  rI  effective_entityltjmiddleinnerrU  attrs              r9   _apply_joinszSubqueryLoader._apply_joinsy  s    'll!88
GAJqM22::;KLLGG AXX
GAJqM22::<HHgbk!n55==$ GG 1WW  $AbDM  F E #zz!}}tAwQ00 6<<q	!55DD<<55DT"""  # WQZ]33;;E!HOLLM L'"+a.99AA(    	 	DtAAr;   c                    |j         }|r8|j        r1|t          j        | j        |                    |                    fz  }|                    |          } |j        | }|S r1   )r  r   r2   r  r  r  _with_current_pathoptions)	rn   r   r?  r  rewritten_pathr<  rY  rv   new_optionss	            r9   _setup_optionszSubqueryLoader._setup_options  s{    " !. 	w. 	-K44W==  K   00AI{#r;   c                `      j         j        r  fd}|                    | j                   }|S )Nc                z    | xj         t          t          j        j        j                            z  c_         d S r1   eager_order_bytupler   r9  rl   r8  r  rn   s    r9   _setup_outermost_orderbyzISubqueryLoader._setup_outermost_orderby.<locals>._setup_outermost_orderby  s<    ..%L!5!>??3 3 ....r;   )rl   r8  _add_context_option)rn   r?  rk  s   `  r9   rk  z'SubqueryLoader._setup_outermost_orderby  sP    ( 		    
 %%($*> A r;   c                  .    e Zd ZdZdZd Zd Zd Zd ZdS )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   ru  r  rN  subq_datac                    |j         | _         |j        | _        |j        | _        |j        pi | _        || _        d | _        d S r1   ro  )rn   r   rp  s      r9   rk   z(SubqueryLoader._SubqCollections.__init__  sC     #?DL%,%>D" ' 4D!..BDKDIDJJJr;   c                n    | j         |                                  | j                             ||          S r1   )rq  _loadrT   )rn   r4   defaults      r9   rT   z#SubqueryLoader._SubqCollections.get  s-    z!

:>>#w///r;   c                   t          j        t                    | _        | j        }|j        J |                    | j                  }| j        j        r|	                                }t          |
                    | j
                            }t          j        |d           D ]/\  }}| j        |                             d |D                        0d S )Nc                    | dd          S )Nr   r}   xs    r9   r:   z7SubqueryLoader._SubqCollections._load.<locals>.<lambda>
  s    !ABB% r;   c              3  &   K   | ]}|d          V  dS )r   Nr}   r   vvs     r9   r   z8SubqueryLoader._SubqCollections._load.<locals>.<genexpr>  s&      $7$7rRU$7$7$7$7$7$7r;   )collectionsdefaultdictr>  rq  rp  r   with_sessionr  _populate_existingr  rN  	itertoolsgroupbyextend)rn   r?  rowsr   vs        r9   rt  z%SubqueryLoader._SubqCollections._load  s    $066DJ	A9$$$t|,,A 3 *'')) --..D!)$@@ 8 81
1$$$7$7Q$7$7$777778 8r;   c                @    | j         |                                  d S d S r1   )rq  rt  )rn   r   r  r  s       r9   r  z&SubqueryLoader._SubqCollections.loader  s#    z!

 "!r;   N)	r   r   r   r   r   rk   rT   rt  r  r}   r;   r9   _SubqCollectionsrn    sa        	 	
		 	 		0 	0 	0
	8 	8 	8"	 	 	 	 	r;   r  c           	        |j         }|j        j        r|j        j        rd S |j                            |          }d|_        || j                 }|                    |j	        dd           }	|	|	}
n| j
        }
|j        j                            dt          j        j        t          j        j        f          \  }}|t          j        j        u }||z   }||z   }|j        j                            dt           f|j                  }t#          j        |d          }|j        r.|j        j        t-          j        d| d|d           |j        }|                    |d	
          }|                     ||||          \  }}}}|                     ||||||          }t          j        |
          }|j        j                            |j        dt           f|d||fi          |_        |                    d	          }|                      ||          \  }}} |j!        | }| "                    |||||
          }| #                    ||||||
|          }| $                    |          }|S )NTpath_with_polymorphic)subquery_pathsNr<  ormzsubqueryloader for "z!" must invoke lambda callable at z 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)%rs   r   _enable_eagerloads_for_refresh_stater  indexloaders_require_bufferingrl   rT   r	   r  r   r  r2   r  r  r  r   _get_plugin_class_for_plugin_is_lambda_elementr  r  r   r  	_resolved_create_entities_collectionr  rF  r,  r  ru  _set_enable_single_critrR  add_columnsr^  rd  rk  )rn   r   rt   ru   r  rv   rw   rs   r  with_poly_entityrY  r  rb  r  r<  compile_state_clsr;  r	  r  r=  rE  r?  rL  rQ  rI  s                            r9   _setup_query_from_rowprocz(SubqueryLoader._setup_query_from_rowproc  s     --@	,?	 F"/"9"?"?"M"M,0)D()  88$&=t
 
 '/#{$+M$D$H$H$"')>)CD%
 %
!	> x499$	'$. ]599>*GM
 

 ,H
 
 ( 
	.#5=		 ttZZZ)   $-J
 /JJu K 
 
 #	
 
	
! 77!
 

 K())&}?JJ%~.
(9n*E 
  
 %%e,,,0,@,@	-
 -
)\ AM:&w
L2B
 
 
 
 ))!,,r;   c	           
        |j         r|                     |||||||          S |                     |||| j                  \  }	}
}	}	|
sd S t	          |j        t                    sd S | j        j        | j	                 j
        j        st          j        d| z            t          |          dk    r"t          j        |j        | j                  sd S n"t          j        |d         | j                  sd S |                     ||||d         |          }|d S |j        J || j                 }| j        j        }|                    |j        d          }|2|                     ||          }|                    |j        d|           rfd|D             }| j        r|                     |||||           d S |                     |||||           d S )NJ'%s' does not support object population - eager loading cannot be applied.r   r  r}  c                *    g | ]}j         |         S r}   rg   )r   rz   rw   s     r9   r   z7SubqueryLoader.create_row_processor.<locals>.<listcomp>  s     AAA'/!,AAAr;   )r   r	  r  r  r   rs   r   rM   rU   r4   implsupports_populationr   r   r  r2   _entity_isar  r  r   rl   r  rT   r	   r  r   r?   _create_collection_loader_create_scalar_loader)rn   r   rt   ru   rv   r\   r   rw   r   _r  rp  rP  r}  s          `      r9   r   z#SubqueryLoader.create_row_processor  s[      
	;;	 	 	 #77T7DO
 
:q!  	F'/1FGG 	 F{(27K 	,@BFG   t99>>'(@$+NN %d2h<< 	F--H
 
 <F|###D())7

 hhw1=AA//>>KHHW'DDD 	BAAAAjAAAJ< 	**j*     &&j*    r;   c                :    |                     |           fd fd}|d                              j        f           |d                              j        |f           |j        r)|d                              j        j        f           d S d S )Nc                     j          |          d          }|                     j                                      | ||           d S )Nr}   )rT   r  r4   r  )r   r  r  
collectionr}  rn   tuple_getters       r9   load_collection_from_subqzKSubqueryLoader._create_collection_loader.<locals>.load_collection_from_subq  sW    (c):):B??JNN48$$88uj    r;   c                8    j         |vr | ||           d S d S r1   r4   )r   r  r  r  rn   s      r9   &load_collection_from_subq_existing_rowzXSubqueryLoader._create_collection_loader.<locals>.load_collection_from_subq_existing_row  s3    xu$$))%<<<<< %$r;   r   existingeager_tuple_getterrK   r4   invoke_all_eagersr  )	rn   r   r   r}  rP  r   r  r  r  s	   `  `   @@r9   r  z(SubqueryLoader._create_collection_loader  s     ++J77	 	 	 	 	 	 		= 	= 	= 	= 	= 	= 	5  $(,E!FGGG:%%X=>	
 	
 	
 $ 	Gw&&+2D'EFFFFF	G 	Gr;   c                :    |                     |           fd fd}|d                              j        f           |d                              j        |f           |j        r)|d                              j        j        f           d S d S )Nc                     j          |          d          }t          |          dk    rt          j        dz             |d         }|                     j                                      | ||           d S )Nr1   r   LMultiple rows returned with uselist=False for eagerly-loaded attribute '%s' r   )rT   r  r   r  r  r4   r  )r   r  r  r  scalarr}  rn   r  s        r9   load_scalar_from_subqzCSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subq  s    (c):):GDDJ:""	GIMN  
  ]FNN48$$88vNNNNNr;   c                8    j         |vr | ||           d S d S r1   r  )r   r  r  r  rn   s      r9   "load_scalar_from_subq_existing_rowzPSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subq_existing_row  s3    xu$$%%eUC88888 %$r;   r   r  r  r  )	rn   r   r   r}  rP  r   r  r  r  s	   `  `   @@r9   r  z$SubqueryLoader._create_scalar_loader	  s     ++J77		O 		O 		O 		O 		O 		O 		O	9 	9 	9 	9 	9 	9 	5  $(,A!BCCC:%%X9:	
 	
 	
 $ 	Gw&&+2D'EFFFFF	G 	Gr;   )r   r   r   r   rk   r   r  rF  rR  r^  rd  rk  r  r  r   r  r  r   r   s   @r9   r  r    s*         I: : : : :' ' '
/L /L /Lbb b bH-1 -1 -1^2 2 2h     D  2 2 2 2 2 2 2 2hF F FPW W WrG G G.G G G G G G Gr;   r  joinedc                  t     e Zd ZdZdZ fdZd Z	 	 	 ddZd Zd	 Z	d
 Z
d Z	 ddZd Zd Zd Zd Z xZS )JoinedLoaderz[Provide loading behavior for a :class:`.Relationship`
    using joined eager loading.

    r  c                n    t                                          ||           | j        j        | _        d S r1   r  rm   s      r9   rk   zJoinedLoader.__init__0  r  r;   c                `    | j                             d                              |           d S r  r  r   s     r9   r   z!JoinedLoader.init_class_attribute4  r  r;   NFc	                R   |j         j        sdS | j        rd|_        || j                 }d}
|r|                     |||j                  nd}|dur|                     |||||          \  }}}n||                    |j        d          s9| j	        r|j
        dz  | j	        k    rdS n|                    | j                  rdS |                     ||||||||          \  }}}}d|_        |                    |j        dd          }|t!          |          j        }
nd}
|| j                 }t'          j        || j        |||||
| j        |	  	         t*          j                            |j                  }|r.|t3          j        d          d	 |j        D             |_        dS dS )
z@Add a left outer join to the statement that's being constructed.NTFr  r%   r  )with_polymorphicparentmapperchained_from_outerjoinzDetected unaliased columns when generating joined load.  Make sure to use aliased=True or flat=True when using joined loading with with_polymorphic().c                    g | ]}||S r1   r}   r'  s     r9   r   z,JoinedLoader.setup_query.<locals>.<listcomp>  s      3 3 3!-A---r;   )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_joinsrT   r'   with_polymorphic_mappersr  r   _setup_entity_queryr   NONE_SETr   secondary_columnsr   r   )rn   rs   rt   ru   rv   rw   rx   r  r  ry   r  user_defined_adapterclausesadd_to_collectionr  	has_noness                   r9   r{   zJoinedLoader.setup_query9  s`    ,? 	9F\ 	948M1D() D..(@    	  u,, 99$ 	!!  ==!98DD ? {Q88 9))$+66 F **!&	 	!& 04M,88$&=t
 
 '&    &   $DK #K-#9
	
 
	
 
	
 
	
 M..}/NOO	 
	+0I  3 3,>3 3 3///
	 
	r;   c                   d|j         vrdS |j        j        }|                    |j        dd          }|dur|S |j         d         }|dd          \  }}|gt          |t                    r|j                            |          }t          j
        t          j        j        |j        ||j        j        d          }n|                    |j        d          rL|                    |j        d          }	t          j
        t          j        j        |	|j        j                  }n |j                            |j        d           }|                    |d|           |S )Neager_from_aliasF user_defined_eager_row_processor)
selectabler5  limit_on_entityr  )r5  )r   ru   rM   rT   r	   r   r   r  aliasr2   
ORMAdapter_TraceAdaptRoleJOINEDLOAD_USER_DEFINED_ALIASr\   r=  r   JOINEDLOAD_PATH_WITH_POLYMORPHIC_polymorphic_adaptersr   )
rn   rv   rs   target_attributesru   rw   r  root_mapperr6   r  s
             r9   r  z*JoinedLoader._init_user_defined_eager_proc  s    W%7775|" (($&H%
 
 %N "#56 IT%%% 1))%00)(F  K; %  GG }}(*A   $(88!,.E$ $  #-,M$ $ ?   (=AAK  	.	
 	
 	
 r;   c                    |                     |          }|r4|r2|                    |          }|                    |j        d|           n |r|}|                    |j        d|           |j        }|||fS )Nr  )_get_entity_clauseswrapr   r	   primary_columns)rn   r   r  ru   rw   r  r  s          r9   r  z1JoinedLoader._setup_query_on_user_defined_adapter  s    
 ,,W55 	+ 	#7#<#<W#E#E HH"2$   
  	#* HH"2$   $3#W.???r;   c	                   |                     |j        dd           }	|	r|	}
nZt          | j                  }|j        r|j        }nd }t          j        | j        ||	                    d          nd dd          }
t          |
          }|
                    d| ft          j        t          j        j        || j        j        ddd          }|j        sJ |%|j                             d| j        j                  n| j        j        }|sd}|j                            | j        ||||||||r|j        nd	f	           |j        }|                    |j        d
|           ||||fS )Nr  T)flat)r  r  r)  joinedloader_ormadapterF)r5  adapt_requiredallow_label_resolveanonymize_labels	innerjoinr}   eager_row_processor)rT   r	   r'   r  r!  r  r2   r$   r\   _anonymous_fromclause_memor  r  JOINEDLOAD_MEMOIZED_ADAPTERr=  r   rl   r  create_eager_joinsrK   _create_eager_joinr   r  r   )rn   rs   r  ru   rv   rw   rx   r  r  r  to_adaptinspalt_selectableto_adapt_inspr  r  r  s                    r9   r  z"JoinedLoader._generate_row_adapter	  s     88$&=t
 
  	'HH4;''D$ &!%!%,!- %:::EEE $  H  ))%%&-$@7 %! & 	
 	
 '''' " "";0D0NOOO%/ 	  	* &*"(//'&+2:''
	
 	
 	
 *;)+@'JJJ!24JJJr;   c
           	     F    ||j         }
n|}
|j        o|j        }d }||j        vrn|sl|j        ret          j        |j        |j                  }t          |          dk    rt          j
        d          |r|j        |d                  }|d         |}}|	||j        }}|j                            ||          }|rt          |dd          r\|j                            |
                     j                  r|
n j                  }t          |j         j         j                  }nBt          t)          j         j        |j        d           j         j                  }n j        }|j        sJ | p| p|dk    p|j        j        }|	}|j                            d	 j         fd
          }|r|t7           fd|D                       z  }|rTt)          j        ||j        || p'|j        j        p|ot;          |t<          j                   j         j         |          }n                      |||||          }||j        |<   |j        |_!        |sjt          j"         j        j#                  D ]K}|
j$        j%        &                    |          r*|r|j'        |         }|(                    ||j)                   L j        j*        rS|xj+        t7          |j,        -                    t]          j/         j        j*                                      z  c_+        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  Z   K   | ]%}|j         	|                    j                  V  &d S r1   )propagate_to_loaders_resolve_where_criteriar\   )r   aern   s     r9   r   z2JoinedLoader._create_eager_join.<locals>.<genexpr>	  sP       ) )*)**4;77) ) ) ) ) )r;   isouter
_left_memo_right_memor   )0r\   r  _should_nest_selectableeager_joinsfrom_clausesr/  #find_left_clause_that_matches_givenr  r  r   r   
setdefaultr  aliased_insp_entity_for_mapperr  rM   r  r4   rl   r2   r$   r!  r  represents_outer_joinglobal_attributesrT   ri  _ORMJoinr   r)   Join_splice_nested_inner_joinstop_on_find_columnsprimaryjoinpersist_selectablerz   contains_columnrh   rr   r  r8  rh  _target_adaptercopy_and_processr   r9  )rn   rs   rt   ru   rw   r  r  r  r  rr  r   should_nest_selectablequery_entity_keyindexesclausedefault_towraptowrapefmonclauseattach_on_outsideextra_join_criteriar  	eagerjoinr   s   `                       r9   r  zJoinedLoader._create_eager_joinO	  s    &-KK&K 1 65 	
    999* :* : B*L,C G 7||a 00    F&3GAJ?
 4;1:v. #' -
 *55n
 
  	,w 2E:: 
 *=="t{33%KK  #3:tx9MNN")W%7   H(  +H'''' '& >}>J&> '=	 	 -%2%D%H%H)4;7&
 &
" & 	5 ) ) ) )4) ) ) $ $   	 )$% M+AM*Kz&#(/K/K; K 3
 
 
II 66fgx1D I 7@!"23 )3	 	  -$0    13CCCHH  3%oc2!??]:   ( 	((E*;;L!5!>?? - - ((((	 	r;   c           	     d   |du rt          |t          j                  sJ nt          |t          j        j                  r|                     ||j        ||||          S t          |t          j                  sH|d                             |          r+t          j        ||j	        |d||d         j
        |          S d S |                     ||j        ||||j                  }|9d}|                     ||j        ||||j                  }||dus
J d            d S nd}|rR|j        s|j        s|                    |          }	n[t          j        |j        ||j        |j        |j                  }	n-t          j        ||j        |j        |j        |j                  }	|j        |	_        |	S )	NFr  r  r  z9assertion failed attempting to produce joined eager loadsT)r  r  )r  r  )r   r2   r  r)   r  FromGroupingr  elementr  r  r\   rightr  leftr  r  _splice_into_centerr  r  )
rn   ru   join_objr  r  rr  splicingtarget_joinright_splicer  s
             r9   r  z&JoinedLoader._splice_nested_inner_join	  s(    u h(9::::::#."=>> 	11    Hh&788 	Bx||H%% ((!' $R$2    t44N 
 
  L88# K " E)))N *))t #  L 	 # 	K,? 	$88EE		$-M%$,'2  		 !)! ($0  I %0$?	!r;   c                >   |j         }|r|                     |||j                  nd}|dur5|}|j        r|r|                    |j                  }n.|j        r|j        }n|                    |j        d          }|dS | j                            ||          r|S dS )NFr  )rs   r  r	   compound_eager_adapterr  rT   r\   _result_has_identity_key)	rn   r   r   rw   ru   rv   rs   r  	decorators	            r9   _create_eager_adapterz"JoinedLoader._create_eager_adapterG
  s    - D..(:    	  u,,,I 3 A	 A%NN!8 		 5 A)@	(*? I  u;//	BB 	 5r;   c	           
     $   | j         j        | j                 j        j        st          j        d| z            | j        rd|_        || j	                 }	| 
                    ||||	|          }
|
durk| j        }t          j        || j        |||	| j                 |
          }| j        s|                     ||||           d S |                     ||||           d S | j	                            d                              ||||||||           d S )Nr  TFr  )rM   rU   r4   r  r  r   r   r?   loaders_require_uniquingrl   r(  r   _instance_processorr\   r  r  r  r   r   )rn   r   rt   ru   rv   r\   r   rw   r   our_patheager_adapterr4   	_instances                r9   r   z!JoinedLoader.create_row_processork
  sm    {(27K 	,@BFG  
 < 	4/3G,,-22VWh
 
 %%(C3% I < **7CJOOOOO..S)Z      ..% ""	 	 	 	 	r;   c                   fd}fd}fd}|d                              | j        |f           |d                              | j        |f           j        r$|d                              | j        |f           d S d S )Nc                    t          j        | |          }t          j        |d          }|j         | f<    |          }||                    |           d S d S Nappend_without_eventr	   r  r   UniqueAppenderrK   )	r   r  r  r  result_listinstr.  r   r4   s	         r9   #load_collection_from_joined_new_rowzSJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_new_row
  sy     $9%LLJ-2 K 0;Gs|,9S>>D""4(((((  r;   c                    | fj         v rj         | f         }n7t          j        | |          }t          j        |d          }|j         | f<    |          }||                    |           d S d S r1  r3  )	r   r  r  r5  r  r6  r.  r   r4   s	         r9   (load_collection_from_joined_existing_rowzXJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_existing_row
  s    s|w111%0%> (=5# 
 #1 6  4?"E3<09S>>D""4(((((  r;   c                     |           d S r1   r}   r   r  r  r.  s      r9    load_collection_from_joined_execzPJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_exec
      IcNNNNNr;   r   r  r  rK   r4   r  )rn   r   r4   r.  r   r7  r9  r<  s    ```    r9   r  z&JoinedLoader._create_collection_loader
  s   	) 	) 	) 	) 	) 	) 	)	) 	) 	) 	) 	) 	) 	)&	 	 	 	 	 	5  X:;	
 	
 	
 	:%%X?@	
 	
 	
 $ 	w&&;<    	 	r;   c                    fd} fd}fd}|d                               j        |f           |d                               j        |f           |j        r$|d                               j        |f           d S d S )Nc                $     |          |<   d S r1   r}   )r   r  r  r.  r4   s      r9   load_scalar_from_joined_new_rowzKJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_new_row
  s     #3E#JJJr;   c                z     |          }|v r%||         urt          j        dz             d S d S ||<   d S )Nr  )r   r  )r   r  r  r  r.  r4   rn   s       r9   $load_scalar_from_joined_existing_rowzPJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_existing_row
  so     !y~~H e||5:--IK     .- &c


r;   c                     |           d S r1   r}   r;  s      r9   load_scalar_from_joined_execzHJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_exec
  r=  r;   r   r  r  r>  )rn   r   r4   r.  r   rA  rC  rE  s   ` ``    r9   r  z"JoinedLoader._create_scalar_loader
  s    	( 	( 	( 	( 	( 	(
	& 	& 	& 	& 	& 	& 	&&	 	 	 	 	 	5  $(,K!LMMM:%%X;<	
 	
 	
 $ 	w&&78    	 	r;   )NNFr   )r   r   r   r   r   rk   r   r{   r  r  r  r  r  r(  r   r  r  r   r   s   @r9   r  r  %  s&        
 I: : : : :' ' ' $u u u un7 7 7r@ @ @2KK KK KKZ] ] ]@ KPW W W Wr" " "H8 8 8t- - -^# # # # # # #r;   r  selectinc                  |     e Zd ZdZ ej        dg d          ZdZ fdZd Z	d Z
d Zd	 Zd
 Zd Zd Zd Z x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                   t                                          ||           | j        j        | _        | j        j        t
          j        u }| j        j        | j        j        | _        nf| j                            d          }|r|j	        | _        n=| j
        j        d                             |j        dd| j
        j                  | _        | j        rQ|r4|                                 | _        |                                 | _        d S |                                 | _        d S |                                 | _        d S )Nr  r   TFr2  )rj   rk   rl   r  rY   r   rC  rI  r   r   rM   r<  r   r  r=  _init_for_omit_join_m2orK  _init_for_joinrL  _init_for_omit_join)rn   rM   ro   is_m2or  rp   s        r9   rk   zSelectInLoader.__init__  s:   ....9%/:3GG)5!1;DNN-;;% J  !+!3!%!8!;!C!C- $!& $ ?	 "D " " > 	5 >#'#?#?#A#A ,0,?,?,A,A)))#'#;#;#=#=   #2244Dr;   c                d    t           j        j        j                                       fdt                    D                        fd j        j        D             x}}t          |          dk    rt          j
        | }d}n
|d         }d}                     dd|||d           S )Nc              3  r   K   | ]1}j         j                            |d           D ]}||         fV  2dS )r}   N)rM   r=  rT   )r   r   equivpk_to_fkrn   s      r9   r   z5SelectInLoader._init_for_omit_join.<locals>.<genexpr>5  sl       
 
8<<QCC
 
  HQK 
 
 
 
 
 
 
r;   c                (    g | ]}|v |         S r}   r}   )r   r   r\  s     r9   r   z6SelectInLoader._init_for_omit_join.<locals>.<listcomp>;  s)     
 
 
!xHSMr;   r   Fr   T)rm  rl   r6  local_remote_pairsr/  r>  rM   r   r  r)   tuple_
query_info)rn   rQ  fk_colsrP  rR  r\  s   `    @r9   rW  z"SelectInLoader._init_for_omit_join1  s     0C
 
 	 
 
 
 
 
(^^
 
 
 	
 	
 	

 
 
 
%)[%<
 
 
 	
' w<<!j'*GHHajGHueWgxNNNr;   c                    | j         j        }t          |          dk    rt          j        | }d}n
|d         }d}| j                            d          fd|D             }|                     dd||||          S )Nr   Fr   Tr  c                *    g | ]}j         |         S r}   r|  )r   r}  r  s     r9   r   z:SelectInLoader._init_for_omit_join_m2o.<locals>.<listcomp>Q  s!    III2z226IIIr;   )r\   r   r  r)   r_  rl   r   r`  )rn   rQ  rP  rR  lookup_colsr  s        @r9   rU  z&SelectInLoader._init_for_omit_join_m2oG  s    +)w<<!j'*GHHajGH)778MNN
IIIIIII%'8[
 
 	
r;   c                (   t          | j        j                  | _        t	          | j                  fd| j        j        D             }t          |          dk    rt          j        | }d}n
|d         }d}| 	                    dd|||d           S )Nc                :    g | ]}                     |          S r}   _adapt_element)r   r   pa_insps     r9   r   z1SelectInLoader._init_for_join.<locals>.<listcomp>Z  s4     
 
 
,/G""3''
 
 
r;   r   Fr   T)
r$   rM   rX   rJ  r'   r   r  r)   r_  r`  )rn   rQ  rP  rR  ri  s       @r9   rV  zSelectInLoader._init_for_joinW  s    )$+*<==$,--
 
 
 
37;3J
 
 
 w<<!j'*GHHajGHudGWhMMMr;   c                `    | j                             d                              |           d S r  r  r   s     r9   r   z#SelectInLoader.init_class_attributee  r  r;   c	                   |j         r|                     ||||||||          S |                     |||| j                  \  }	}
}}|
sd S | j        j        | j                 j        j        st          j
        d| z            t          |          dk    r"t          j        |j        | j                  sd S n"t          j        |d         | j                  sd S |	}|| j                 }|                    |j        dd           }|t%          |          }n| j        }t(          j                            ||| j        | j        | j        ||||	  	         d S )Nr  r  r   r  r  )r   r	  r  r  rM   rU   r4   r  r  r   r   r  r2   r  r  rl   rT   r	   r'   r  r   r  r  r  )rn   r   rt   ru   rv   r\   r   rw   r   r  r  ru  r  selectin_pathr  r  rY  s                    r9   r   z#SelectInLoader.create_row_processorj  s      
	;;	 	 	  %%T7t & 
 
	

  	F{(27K 	,@BFG   t99>>'(@$+NN %d2h<< 	F&4/0 '?? 7
 
 '&'788#{**K 
	
 
	
 
	
 
	
 
	
r;   c	                d    |r j         |vrd S  j        }	|	j        rt          j        t
                    }
g } j        |D ]\  }j        t          fd|	j	        D                       }t          j        |v r	 j        }	 n<d |vr|
|                             |f           h|                    |f           |	j        sd |D             }
|	j        }|	j        }|	j        s*j        r#fd|D             }                    |          }t'          j        dg|R  }|                                }                                }t-          j        ||gt0          t2          j        dd          }|	j        s|                              }n]|                     j                                      t=           j         j        j                                                            }|!                    |"                    tG          j$        d                              }j%        j&        }| j                 }|j'        u r|j(        }n/|j(        }j'        j(        }fd	tS          ||          D             }|r3|j*        r,|t'          j+        |,                                        fz  }||-                                } |j.        | }|/                    d
|i          }j0        r|1                    d          } j        j2        rS|	j        s, j        j2        }j        rfd|D             } |j2        | }n  fd}|3                    | j                  }|	j        r 4                    |
||	||           d S  5                    |
|	||           d S )Nc              3  ^   K   | ]'}                     |t          j                   V  (dS )r{  N)r]  r	   PASSIVE_NO_FETCH)r   lkr\   r   
state_dicts     r9   r   z0SelectInLoader._load_for_path.<locals>.<genexpr>  s]       & &  44" * ;	 5  & & & & & &r;   c                @    g | ]\  }}|j         d          ||j        |fS )r   )r4   rm  )r   r   r  s      r9   r   z1SelectInLoader._load_for_path.<locals>.<listcomp>  s=       $E9 1uej)<  r;   c                :    g | ]}                     |          S r}   rg  )r   r   rY  s     r9   r   z1SelectInLoader._load_for_path.<locals>.<listcomp>  s5       =@$33C88  r;   r}  r  )compile_state_pluginplugin_subject)r  r  r   r  primary_keysc                B    g | ]\  }}|                     |          S r}   )'_adapt_cached_option_to_uncached_option)r   orig_optuncached_optr   s      r9   r   z1SelectInLoader._load_for_path.<locals>.<listcomp>N  sD        +Hl @@\   r;   r  T)r  c                :    g | ]}                     |          S r}   rg  )r   r1  rY  s     r9   r   z1SelectInLoader._load_for_path.<locals>.<listcomp>l  s7     & & &  )77==& & &r;   c                z    | xj         t          t          j        j        j                            z  c_         d S r1   rg  rj  s    r9   rk  z?SelectInLoader._load_for_path.<locals>._setup_outermost_orderbys  s<    #22eT%9%BCC7 7 2222r;   )6r4   rK  rN  r}  r~  r>  rM   rm  ri  rS  r   r   rL  rK   rQ  rP  rO  r!  rh  r2   Bundler  r,   r  r+   r   r  r  rJ  rX  r  rl   rV  filterin_r)   rG  rs   select_statementr   r  zipr   r  r  r  ra  _update_compile_optionsr  ru  r8  rl  _load_via_child_load_via_parent)rn   r   ru   r  r  rY  rv   r  ru  r`  
our_statesnone_statesr  related_identrQ  rP  
bundle_ent
bundle_sql
entity_sqlr?  r<  r  rc  cached_optionsuncached_optionsrh  rk  r\   r   rq  s   ``   `                     @@@r9   r  zSelectInLoader._load_for_path  s     	22F%
% !	G$066JK[F$* G G y"Z
 % & & & & & & ):& & & ! ! (9]JJ!%!:JE },,}-44
I6     &&z9'EFFFF ) 	 (.  J
 $$( 	C  0 C   DK   +99'BB_T4G444
2244
%88::
%$j17,D(-"2 	
 
 
 ( 	 .//AA
 d01166*D,@,DEEMM$  A HHW[[~!>!>??@@ *;
2 d23&&$2KK'5N&}:    /2"$4/ /	  K  	w. 	-$44W==  K &+??AANAI{#%%&GHH$ 	<##d#;;A( 	, !%!5!>#4 & & & &$2& & &N AJ/    
 )),d.B  % 	  !     !!J74E    r;   c                b   | j         }t          |          }|r|d| j                 }	|| j        d          }d |j                            |dfd|	D             i|                                          D             }
|	D ]g}|
                    |d           }||         D ]F\  }}}|s
| j        |v r|                    | j                  	                    |||s|n|g           Gh||D ]A\  }}}|s
| j        |v r|                    | j                  	                    ||d            Bd S )Nr   c                    i | ]\  }}||	S r}   r}   )r   r   r  s      r9   
<dictcomp>z2SelectInLoader._load_via_child.<locals>.<dictcomp>  s.       Aq 1  r;   rv  c                2    g | ]}j         r|d          n|S r  rR  )r   r4   r`  s     r9   r   z2SelectInLoader._load_via_child.<locals>.<listcomp>  s9     ) ) ) # '1&9BCFFs) ) )r;   rN  ru  )
r?   sorted
_chunksizer   r  rF  rT   r4   r  r  )rn   r  r  r`  r?  r   ru  r?   our_keyschunkdatar4   related_objr   r  r  s      `            r9   r  zSelectInLoader._load_via_child  s    , *%%  	Q01E 1 12H #O33& ) ) ) )',) ) ) '8 4 	 	 &((  D    #hhsD11/9#  +E5)$ !U):): NN48,,@@+2E   	1   	D (3 	M 	M#E5) U!2!2 NN48$$88tLLLL	M 	Mr;   c                   | j         }|rdnd }|ry|d| j                 }|| j        d          }fd|D             }	t          j        t                    }
t          j        |j                            |d|	i|          	                                d           D ]*\  }}|
|         
                    d |D                        +|D ]\  }}}}|s
| j        |v r|
                    ||          }|sb|r`t          |          dk    rt          j        d	| z             |                    | j                                      |||d                    |                    | j                                      |||           |wd S d S )
Nr}   r   c                <    g | ]\  }}}}j         r|d          n|S r  r  )r   r4   r   rq  r  r`  s        r9   r   z3SelectInLoader._load_via_parent.<locals>.<listcomp>  sA       5C
I %-6A3  r;   rv  r  c                    | d         S r   r}   rx  s    r9   r:   z1SelectInLoader._load_via_parent.<locals>.<lambda>  s
    !A$ r;   c              3  &   K   | ]}|d          V  dS )r   Nr}   r{  s     r9   r   z2SelectInLoader._load_via_parent.<locals>.<genexpr>  s&      11r!u111111r;   r   r  )r?   r  r}  r~  r>  r  r  r   r  rF  r  r4   rT   r  r   r  r  r  )rn   r  r`  r?  r   ru  r?   _empty_resultr  rv  r  r   r  r4   r   rq  r  r  s     `               r9   r  zSelectInLoader._load_via_parent  s    ,%/4 )	q4?23E#DO$5$56J   9>  L
 *400D!)''*L9&7 (   &((  2 21 Q11q11111115:  1UJ	  TX%;%;!XXc=99
 : :**	.045  
 NN48,,@@z:a=    NN48,,@@z:   O  )	 )	 )	 )	 )	r;   )r   r   r   r   r}  
namedtupler`  r  rk   rW  rU  rV  r   r   r  r  r  r   r   s   @r9   rH  rH  
  s        I ('	
 	
 	

 
J J5 5 5 5 5<O O O,
 
 
 N N N' ' '
K
 K
 K
ZQ Q Qf5M 5M 5Mn/ / / / / / /r;   rH  c                    fdfd}fd}t          j        | d|ddd           t          j        | d|ddd           d S )Nc           	         |t|j         j         k    rd|                    t          j        |                    }|r;||ur7t	          j        dt          j        |          d| j        ddd          |S )Nz	Instance z+ is already associated with an instance of z	 via its z0 attribute, and is only allowed a single parent.bbf1)code)	r4   	hasparentr	   instance_stater   r   r2   instance_strrX   )r   rL  oldvalue	initiatorr  r6   s        r9   	_do_checkz*single_parent_validator.<locals>._do_check  s    $(!:!:!++J,Ee,L,LMMI XU2200  ,U3333U\\\444I      r;   c                      | |d |          S r1   r}   )r   rL  r  r  s      r9   rK   z'single_parent_validator.<locals>.append  s    ytY777r;   c                      | |||          S r1   r}   )r   rL  r  r  r  s       r9   set_z%single_parent_validator.<locals>.set_  s    yx;;;r;   rK   T)rawretvalrF   r   )r&   listen)r5   r6   rK   r  r  s    `  @r9   rL   rL     s        8 8 8 8 8< < < < < 
LhDd    
LudT$OOOOOOr;   )NNNNFN)Qr   
__future__r   r}  r  typingr   r   r   r    r	   r
   r   r   r   r   r   r   r   r   r   r2   baser   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r   r!   r  r"   r#   r$   r&   r   r'   r(   r)   r/  r*   sql.selectabler+   r,   r-   sql.elementsr.   rb   ColumnPropertystrategy_forrf   class_loggerr   r   r   r   r  r  r  MemoizedSlots
Identifiedr  r  r  r  r  r  rH  rL   r}   r;   r9   <module>r     s	  2 2 # " " " " "                                                                                                   " " " " " " " " " " " " ' ' ' ' ' '       & & & & & &             ) ) ) ) ) ) $ $ $ $ $ $ * * * * * * ! ! ! ! ! ! & & & & & & + + + + + + # # # # # #             " " " " " "                                                 " " " " " "       ; ; ; ; ; ; # # # # # # -333333,,,,,, N! N! N! N!b ''55'II( ( ( ( ( ( ( JI(V ''4%'HHW: W: W: W: W:> W: W: IH W:t '''>>T
 T
 T
 T
 T
\ T
 T
 ?> T
n ''$'GG''dd (   ''4'88l
 l
 l
 l
 l
> l
 l
 98  HG l
^8 8 8 8 8 8 8 80"
 "
 "
 "
 "
 "
 "
 "
J #00D0AA    n   BA  #00h0??#00d0;;#= #= #= #= #=) #= #= <; @? #=L #00d0;;#00h0??#00g0>>#00n0EE#00n0EEbJ bJ bJ bJ bJ 2CNbJ bJ FE FE ?> @? <; bJJ1
 1
 1
 1
 1
 1
 1
 1
hIH IH IH IH IH+ IH IH IHX #00k0BB] ] ] ] ]j ] ] CB]@ #00j0AAy	G y	G y	G y	G y	GZ y	G y	G BA y	Gx #00h0??#00e0<<O O O O O- O O =< @? Od #00j0AAt t t t tZ!3 t t BA tnP P P P Pr;   