
    ؄_U                       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! 	 	 	 	 	 	 dIdZ"ej#        $                    dd           G d de                      Z%ej&        ej#        $                    d d           G d! d"e                                  Z'ej&        ej#        $                    d #           G d$ d%e'                                  Z(ej&        ej#        $                    d d &          ej#        $                    d '           G d( d)e                                              Z) G d* d+e*          Z+ G d, d-e          Z,ej&        ej-        $                    d '           G d. d/e                                  Z.ej&        ej-        $                    d01          ej-        $                    d1           G d2 d3e,                                              Z/ej&        ej-        $                    d 1          ej-        $                    d41          ej-        $                    d51          ej-        $                    d61          ej-        $                    d71           G d8 d9e,ej0                                                                                          Z1 G d: d;e*          Z2ej-        $                    d<1           G d= d>e,                      Z3ej&        ej-        $                    d?1           G d@ dAe,                                  Z4ej&        ej-        $                    dB1          ej-        $                    d1           G dC dDe,                                              Z5ej&        ej-        $                    dE1           G dF dGe,ej0                                          Z6dH Z7dS )JzWsqlalchemy.orm.interfaces.LoaderStrategy
   implementations, and related MapperOptions.    )absolute_importN   )
attributes)exc)
interfaces)loading)
properties)query)
unitofwork)util)_DEFER_FOR_STATE)_SET_DEFERRED_EXPIRED)LoaderStrategy)StrategizedProperty)_state_session)InstanceState)	_none_set)aliased   )event)inspect)log)sql)visitorsFc	                 8   t          t          j        | j        g                     }
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                  sct)          j        |j        | j        f| |||
|o| j        p| j        t0          j        u ||||| p| j         | j        d|	}|D ]} |||            d S )N)defaultc                 6    t          j        | |j        fi S N)orm_util_validator_eventskey)descpropfnoptss     ^/var/www/book.euthymeo.com/html/venv/lib/python3.11/site-packages/sqlalchemy/orm/strategies.py<lambda>z%_register_attribute.<locals>.<lambda>B   s*    x9dh   &*        c                 0    t          j        |           S r   )r   backref_listeners)r"   r#   backrefuselists     r&   r'   z%_register_attribute.<locals>.<lambda>P   s    :#?'7$ $ r(   )parent_tokenr,   compare_function	useobject	extensiontrackparenttypecallable	callable_active_history
impl_classsend_modified_eventsdoc)listr   to_listr0   r,   single_parentappendsingle_parent_validatorr!   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viewonlyr7   )r#   mapperr/   r.   r2   r3   proxy_propertyr4   r5   kwattribute_extlisten_hooksmr"   hookr+   r$   r%   r,   s                  @@@@r&   _register_attributerS   )   s2    dnbAAABBM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    9! !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                 |    t          t          |                               ||           | j        j        | _        d S r   )superrW   __init__parent_propertyrY   selfr=   strategy_key	__class__s      r&   r\   z#UninstrumentedColumnLoader.__init__   s5    ($//88NNN+3r(   Nc                 b    | j         D ]&}|r|j         |         }|                    |           'd S r   )rY   r;   )	r_   contextquery_entitypathloadoptadaptercolumn_collectionkwargscs	            r&   setup_queryz&UninstrumentedColumnLoader.setup_query   sJ      	( 	(A 'OA&$$Q''''	( 	(r(   c                     d S r    )r_   rc   re   rf   rL   resultrg   
populatorss           r&   create_row_processorz/UninstrumentedColumnLoader.create_row_processor   s	     	r(   r   )	__name__
__module____qualname____doc__	__slots__r\   rk   rp   __classcell__ra   s   @r&   rW   rW      sq          I4 4 4 4 4 ( ( ( (      r(   rW   Tc                   8     e Zd ZdZdZ fdZd Zd Zd Z xZ	S )ColumnLoaderz8Provide loading behavior for a :class:`.ColumnProperty`.)rY   is_compositec                     t          t          |                               ||           | j        j        | _        t          | j        d          | _        d S )Ncomposite_class)r[   ry   r\   r]   rY   hasattrrz   r^   s      r&   r\   zColumnLoader.__init__   sL    lD!!**6<@@@+3#D$8:KLLr(   c                     | j         D ]&}	|r|j         |	         }	|                    |	           '| j         d         }
|r|j         |
         }
|
|| j        <   d S Nr   )rY   r;   r]   )r_   rc   rd   re   rf   rg   rh   memoized_populatorsri   rj   fetchs              r&   rk   zColumnLoader.setup_query   ss      	( 	(A 'OA&$$Q''''Q 	+OE*E49D0111r(   c                     d| _         | j        d         j        }| j        j        p,| j        d         j        p|j        t          | j                  v }t          | j        |d|j	        |           d S )NTr   F)r/   r.   r4   )
is_class_levelrY   typer]   r4   primary_keyversion_id_colsetrS   compare_values)r_   rL   coltyper4   s       r&   init_class_attributez!ColumnLoader.init_class_attribute   s    ",q/&  / :|A*:$DL(9(99 	 	 $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)rY   _getterr;   r!   )
r_   rc   re   rf   rL   rn   rg   ro   colgetters
             r&   rp   z!ColumnLoader.create_row_processor   s    
 < 	: 	:C +oc*^^C//F 7#**DHf+=>>> x ''4(899999r(   )
rq   rr   rs   rt   ru   r\   rk   r   rp   rv   rw   s   @r&   ry   ry      sx         CB)IM M M M M
: : :,
 
 
$: : : : : : :r(   ry   )query_expressionc                   0     e Zd Z fdZd Zd Zd Z xZS )ExpressionColumnLoaderc                     t          t          |                               ||           t          j                    t          fd| j        j        D                       | _        d S )Nc              3   D   K   | ]}|                                V  d S r   )compare).0rj   nulls     r&   	<genexpr>z2ExpressionColumnLoader.__init__.<locals>.<genexpr>   sA       ,
 ,
$%		$,
 ,
 ,
 ,
 ,
 ,
r(   )	r[   r   r\   r   r   anyr]   rY   _have_default_expression)r_   r=   r`   r   ra   s      @r&   r\   zExpressionColumnLoader.__init__   st    $d++44V\JJJxzz(+ ,
 ,
 ,
 ,
)-)=)E,
 ,
 ,
 )
 )
%%%r(   c                     d }	|rd|j         v r|j         d         g}	n| j        r| j        j        }	|	d S |	D ]&}
|r|j        |
         }
|                    |
           '|	d         }|r|j        |         }||| j        <   d S )N
expressionr   )
local_optsr   r]   rY   r;   )r_   rc   rd   re   rf   rg   rh   r   ri   rY   rj   r   s               r&   rk   z"ExpressionColumnLoader.setup_query   s      	3|w'999),78GG* 	3*2G?F 	( 	(A 'OA&$$Q''''
 	+OE*E49D0111r(   c                 &   |rd|j         v r|j         d         g}|D ]N}	|r|j        |	         }	|                    |	d          }
|
r%|d                             | j        |
f            d S O|d                             | j        df           d S d S d S )Nr   Fr   r   T)r   rY   r   r;   r!   )r_   rc   re   rf   rL   rn   rg   ro   rY   r   r   s              r&   rp   z+ExpressionColumnLoader.create_row_processor  s    
  	>|w'999),78G > > /!/#.CU33 w'..&/ABBBEE 8$++TXt,<=====	> 	>99r(   c                 p    d| _         t          | j        |d| j        d         j        j        d           d S )NTFr   )r/   r.   accepts_scalar_loader)r   rS   r]   rY   r   r   r_   rL   s     r&   r   z+ExpressionColumnLoader.init_class_attribute"  sI    " !\!_1@"'	
 	
 	
 	
 	
 	
r(   )rq   rr   rs   r\   rk   rp   r   rv   rw   s   @r&   r   r      se        
 
 
 
 
: : :<> > >$	
 	
 	
 	
 	
 	
 	
r(   r   )rU   rT   )
do_nothingc                   B     e Zd ZdZdZ fdZd Zd Z	 d	dZd Z	 xZ
S )
DeferredColumnLoaderzAProvide loading behavior for a deferred :class:`.ColumnProperty`.)rY   groupc                     t          t          |                               ||           t          | j        d          rt          d          | j        j        | _        | j        j        | _        d S )Nr|   z8Deferred loading for composite types not implemented yet)r[   r   r\   r}   r]   NotImplementedErrorrY   r   r^   s      r&   r\   zDeferredColumnLoader.__init__6  so    "D))226<HHH4'):;; 	%M   +3)/


r(   c                     | j         s0| j        j        }|d                             | j        |f           d S |d                             | j        df           d S )Nnewr   F)r   r]   _deferred_column_loaderr;   r!   )	r_   rc   re   rf   rL   rn   rg   ro   set_deferred_for_local_states	            r&   rp   z)DeferredColumnLoader.create_row_processor?  sl     " 	;$< ) 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   )r/   r.   r3   expire_missing)r   rS   r]   rY   r   r   _load_for_stater   s     r&   r   z)DeferredColumnLoader.init_class_attributeO  sO    " !\!_1@* 	
 	
 	
 	
 	
 	
r(   Nc	           	         |r:d|j         v 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 t          || j	        <   d S )Nundefer_pkszundefer_group_%sF))rU   F)rT   T)r   r   rY   intersectionr=   _should_undefer_in_wildcardr   rD   r!   r]   _get_strategyrk   r   r   r   )
r_   rc   rd   re   rf   rg   rh   r   only_load_propsrN   s
             r&   rk   z DeferredColumnLoader.setup_query[  s2     	I "W%777%%22K;  8  8 J 8 &**&3U  8   8 %)H$?$?D ..; !#         	I8M 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          |                    |          }t          j        |j         |          	 t          j                  t          j        S )Nc                     g | ]H}t          |t                    r1t          |j        t                    r|j        j        k    A|j        IS rm   )
isinstancer   strategyr   r   r!   )r   pr_   s     r&   
<listcomp>z8DeferredColumnLoader._load_for_state.<locals>.<listcomp>  sb       a!455 qz+?@@	
 Gtz))	  *))r(   c                 &    g | ]}|j         v |S rm   )
unmodified)r   kstates     r&   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)r   refresh_state)r!   r   
ATTR_EMPTYSQL_OKPASSIVE_NO_RESULTmanagerrL   r   iterate_propertiesr   orm_excDetachedInstanceErrorr   	state_strr
   r   load_on_identObjectDeletedErrorATTR_WAS_SET)r_   r   passivelocalparenttoloadr   sessionr
   s   ``      r&   r   z$DeferredColumnLoader._load_for_state  s=   y 	)((** 	0//m*: 		    $7  FF hZF =<<<F<<< ''?// %e,,,,dhhh8   k**!uy%u   
 ,U333&&r(   r   )rq   rr   rs   rt   ru   r\   rp   r   rk   r   rv   rw   s   @r&   r   r   .  s         LK"I0 0 0 0 0; ; ; 

 

 

* -I -I -I -I^(' (' (' (' (' (' ('r(   r   c                   ,    e Zd ZdZd Zej        fdZdS )LoadDeferredColumnsz7serializable loader object used by DeferredColumnLoaderc                     || _         d S r   r!   )r_   r!   s     r&   r\   zLoadDeferredColumns.__init__  s    r(   c                     | j         }|j        j        }|j        |         }|j        t
                   }|                    ||          S r   )r!   r   rL   rC   _strategiesr   r   )r_   r   r   r!   r   r#   r   s          r&   __call__zLoadDeferredColumns.__call__  sD    hm*!#&#$89''w777r(   Nrq   rr   rs   rt   r\   r   PASSIVE_OFFr   rm   r(   r&   r   r     sE        AA   '1&< 8 8 8 8 8 8r(   r   c                   &     e Zd ZdZdZ fdZ xZS )AbstractRelationshipLoaderz0LoaderStratgies which deal with related objects.)rL   targetr,   entityc                     t          t          |                               ||           | j        j        | _        | j        j        | _        | j        j        | _        | j        j        | _        d S r   )r[   r   r\   r]   rL   r   r   r,   r^   s      r&   r\   z#AbstractRelationshipLoader.__init__  s\    ($//88NNN*1*1*1+3r(   )rq   rr   rs   rt   ru   r\   rv   rw   s   @r&   r   r     sC        ::7I4 4 4 4 4 4 4 4 4r(   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)rq   rr   rs   rt   rm   r(   r&   r   r     s           r(   r   noload)lazyc                   "    e Zd ZdZdZd Zd ZdS )NoLoaderzYProvide loading behavior for a :class:`.RelationshipProperty`
    with "lazy=None".

    rm   c                 X    d| _         t          | j        |d| j        j                   d S )NT)r/   r2   )r   rS   r]   collection_classr   s     r&   r   zNoLoader.init_class_attribute  s@    " ->		
 	
 	
 	
 	
 	
r(   c                 V      fd}|d                               j        |f           d S )Nc                     j         r5| j                            j                                      | |           d S d |j        <   d S r   )r,   r   get_implr!   
initializer   dict_rowr_   s      r&   invoke_no_loadz5NoLoader.create_row_processor.<locals>.invoke_no_load  sJ    | '&&tx00;;E5IIIII"&dhr(   r   r;   r!   )	r_   rc   re   rf   rL   rn   rg   ro   r   s	   `        r&   rp   zNoLoader.create_row_processor  sD    	' 	' 	' 	' 	' 	5  $(N!;<<<<<r(   N)rq   rr   rs   rt   ru   r   rp   rm   r(   r&   r   r     sC         
 I
 
 
	= 	= 	= 	= 	=r(   r   selectraiseraise_on_sqlbaked_selectc                        e Zd ZdZdZ fdZd Zd Zd Zd Z	d Z
d	 Z ej        d
          d             Z ej        d          d             Zd Z xZS )
LazyLoaderz|Provide loading behavior for a :class:`.RelationshipProperty`
    with "lazy=True", that is loads when first accessed.

    )
_lazywhere_rev_lazywhereuse_getis_aliased_class_bind_to_col_equated_columns_rev_bind_to_col_rev_equated_columns_simple_lazy_clause_raise_always_raise_on_sql_bakeryc                 f   t          t          |                               ||           | j        d         dk    | _        | j        d         dk    | _        t          | j                  j        | _        | j	        j
        }|                                \  | _        | _        | _        |                    d          \  | _        | _        | _        | j                            d| | j                   | j         o>| j         o6| j        j        d                             | j        d| j        j                  | _        | j        rlt5          | j                  D ]:}|| j        j        v r*| j        j        |         D ]}| j        |         | j        |<   ;| j                            d	|            d S d S )
Nr   r   r   T)reverse_directionz%s lazy loading clause %sr   use_proxiesequivalentsz2%s will use query.get() to optimize instance loads)r[   r   r\   strategy_optsr   r  r   r   r   r]   _join_conditioncreate_lazy_clauser   r   r   r   r   r   loggerinfor,   _get_clauser   rL   _equivalent_columnsr   r8   )r_   r=   r`   join_conditionr   rj   ra   s         r&   r\   zLazyLoader.__init__  s   j$((>>>!/77B!/7>I ' 4 4 E-=
 --//		
O! ---EE		
!% 	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G    	 	r(   c                     d| _         | j        j        p| j        j        t          j        up| j         }t          | j        |d| j        | j        j	        |           d S )NT)r/   r3   r2   r4   )
r   r]   r4   rI   r   	MANYTOONEr   rS   r   r   )r_   rL   r4   s      r&   r   zLazyLoader.init_class_attributeJ  s~    "  /  #-Z5II < 	 	 *->)	
 	
 	
 	
 	
 	
r(   c                     | j         | j        c}g d }t          j        |i d|i           fd}t          j        |i d|i          }|fS )Nc                     d| _         d S NF)unique)	bindparams    r&   visit_bindparamzFLazyLoader._memoized_attr__simple_lazy_clause.<locals>.visit_bindparamg  s    $Ir(   r  c                     | j         v r*                    | j        | j                  d f           d S | j        $                    | j        d | j        f           d S d S r   )_identifying_keyr;   r!   callablevalue)r  bind_to_colparamss    r&   r  zFLazyLoader._memoized_attr__simple_lazy_clause.<locals>.visit_bindparaml  s    )[88!#I$>?     #+y}dIODEEEEE ,+r(   )r   r   r   traversecloned_traverse)r_   	criterionr  r  r  s      @@r&   "_memoized_attr__simple_lazy_clausez-LazyLoader._memoized_attr__simple_lazy_clauseb  s    "&/43D	;	% 	% 	% 	)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 rm   rm   )r   r!   identr  s       r&   r   z4LazyLoader._generate_lazy_clause.<locals>.<listcomp>  s    DDD$5CCDDDr(   )r   sql_utiladapt_criterion_to_nullr]   r=   objr   instance_dictINIT_OKLOAD_AGAINST_COMMITTED#_get_committed_state_attr_by_column_get_state_attr_by_column)r_   r   r   r   
param_keysrL   or   r  r!   r$  r  s               r&   _generate_lazy_clausez LazyLoader._generate_lazy_clause~  s    $ 8	:=3DDDDD   %,IIKK(++Z'' 	*z))G!+ 	  	 C  w)JJ "FFueW EE #<<ueW E  F3KK&  r(   c                 8    t          j        d| d|d          )N'z ' is not available due to lazy=')sa_excInvalidRequestError)r_   r   r   r   s       r&   _invoke_raise_loadzLazyLoader._invoke_raise_load  s*    ((8<dddC
 
 	
r(   c                    |j         s&| j        j        s|j        r|j        st
          j        S |j          }d }|t
          j        z  s| j        r|t
          j	        z  s|rt
          j
        S | j        r<|t
          j        z  s-| j        r|t
          j        z  r|                     ||d           t          |          }|sM|t
          j        z  rt
          j
        S t!          j        dt%          j        |          d| j         d          | j        r|                     |||          }t
          j
        |v rt
          j
        S t
          j        |v rt
          j        S t-          j        |          rd 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)r!   r]   load_on_pending_load_pending
session_idr   r   r   r   NON_PERSISTENT_OKr   r   NO_RAISERELATED_OBJECT_OKr4  r   r   r   r   r   _get_ident_for_use_get	NEVER_SETr   
issupersetr
   _identity_lookupr   PASSIVE_CLASS_MISMATCH_emit_lazyload)r_   r   r   pendingprimary_key_identityr   instances          r&   r   zLazyLoader._load_for_state  s]   y 	)(8	) +	)
 #	) ((i-#*++ 	0DL 	0*66	0;B	0 // 	= j11		= L	= Z99	=  ##E7G<<< '' 	,, 4!33// %e,,,,dhhh8   <  	4#'#>#>$ $  +/CCC!33%)===!++#$899 t }}77$!&	 8  H #z@@@4#Oj//4!==4 "33""U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   r_   r   s     r&   r   z5LazyLoader._get_ident_for_use_get.<locals>.<listcomp>  sD     
 
 
 HUE4#8#<gNNN
 
 
r(   )r   rL   r   r*  r+  r,  dictr   )r_   r   r   r   instance_mapperr   rK  s   ` `` @@r&   r=  z!LazyLoader._get_ident_for_use_get  s    -.Z66 	A&JHH&@H

 
 
 
 
 
 
 
k-
 
 
 	
r(   sqlalchemy.ext.bakedc                 .    |                     d          S N2   )sizebakeryr_   bakeds     r&   _memoized_attr__bakeryz!LazyLoader._memoized_attr__bakery
      |||$$$r(   zsqlalchemy.orm.strategy_optionsc                 @                           fd           }|                    d  j                    j        j        s|                    d            j        j        |                     fd           j         }|s|t          j        z  r|                    d            j	        r-j
         j                 }|                    j	        |            j        rk j        r                     |d            ||                              fd                              |                     j                  |          S  j        j        r|                     fd	            j        j        D ]Oj        t,          j        u r:j        r3t3          j        t6                    s|                    fd
           P                     |          \  |r4t;          j        t>          j         !                                          rd S n3t;          j        t>          j"        !                                          rd S  j        r                     |d           |                    fd           fd}	 ||                              fd                              |	          #                                }
 j$        r|
S tK          |
          }|r*|dk    rt;          j&        d j        z             |
d         S d S )Nc                 8    |                      j                  S r   )r
   r   )r   r_   s    r&   r'   z+LazyLoader._emit_lazyload.<locals>.<lambda>)  s    t{)C)C r(   c                 P    |                                                      d          S r  )_adapt_all_clauses_with_invoke_all_eagersqs    r&   r'   z+LazyLoader._emit_lazyload.<locals>.<lambda>,  s     a**,,DDUKK r(   T)fullc                 N    |                      j        j        j                  S r   )select_fromrL   r]   	secondaryr_  r_   s    r&   r'   z+LazyLoader._emit_lazyload.<locals>.<lambda>5  s"    !--K!5!?  r(   c                 ,    |                      d          S r  )	autoflushr^  s    r&   r'   z+LazyLoader._emit_lazyload.<locals>.<lambda>>  s    Q[[%7%7 r(   r   c                 .    |                                S r   _set_lazyload_fromr_  r   s    r&   r'   z+LazyLoader._emit_lazyload.<locals>.<lambda>P  s    a.B.B5.I.I r(   c                 P     | j         t          j        j        j                    S r   )order_byr   r9   r]   rd  s    r&   r'   z+LazyLoader._emit_lazyload.<locals>.<lambda>X  s#    *!*\$"6"?@@ r(   c                     |                      j                            | j        j                                               j                            S r   )optionsLoadfor_existing_path_current_pathr=   lazyloadr!   )r_  revstrategy_optionss    r&   r'   z+LazyLoader._emit_lazyload.<locals>.<lambda>g  sF    aii(-??OCJ7 "(37++  r(   c                 .    |                                S r   )filter)r_  lazy_clauses    r&   r'   z+LazyLoader._emit_lazyload.<locals>.<lambda>z  s    +!6!6 r(   c                 J                         | j                   | _        | S r   )update_params)r_  r  s    r&   set_default_paramsz5LazyLoader._emit_lazyload.<locals>.set_default_params~  s#    MM!)$$$AIHr(   c                 .    |                                S r   rh  rj  s    r&   r'   z+LazyLoader._emit_lazyload.<locals>.<lambda>  s    !*>*>u*E*E r(   r   zKMultiple rows returned with uselist=False for lazily-loaded attribute '%s' r   )'r  add_criteriar]   bake_queriesspoilrc  r!   r   NO_AUTOFLUSHload_options	load_path_add_lazyload_optionsr   r  r4  with_post_criteria_load_on_pk_identityr
   rL   rl  _reverse_propertyrI   r   r  _use_getr   r   r   r/  r   has_intersectionr   r   values
_never_setallr,   lenwarn)r_   rt  r   r   rD  r   r_  rC  effective_pathr{  rn   lrw  r  rs  s   `` `        @@@r&   rB  zLazyLoader._emit_lazyload  s   6 LLCCCCTJJ	KK 	
 	
 	

 #0 	GGG)5NN      i-  	9g
 77 	9NN77888 	H #_T-ABN##E$6GGG< 
	! H''wGGG '

##$I$I$I$IJJ%%MM$+..0D  ( 	NN      '9 	 	C !555L 6"3<<< 6
        #88HHV 	$X%7II t "8#6HH 	4 	D##E7NCCC	6666777	 	 	 	 	 AgJJ E E E EFF 233SUU	 	 < 	MFA 
q55IJ./   ay tr(   c                 ,  
 | j         
| j        sMt          j        |j        t          
|           
          }|d                             | j         |f           d S |j        s|j        r)
fd}	|d                             | j         |	f           d S d S )Nr   c                 4    |                      |           d S r   )_reset)r   r   r   r!   s      r&   reset_for_lazy_callablez@LazyLoader.create_row_processor.<locals>.reset_for_lazy_callable  s     UC(((((r(   )	r!   r   r   "_instance_level_callable_processorrE   LoadLazyAttributer;   populate_existingalways_refresh)r_   rc   re   rf   rL   rn   rg   ro   set_lazy_callabler  r!   s             @r&   rp   zLazyLoader.create_row_processor  s     h" 	J @"$5c4$@$@#!G !G u$$dh0A%BCCCCC& 	J&*? 	J	) 	) 	) 	) 	) u$$dh0G%HIIIII	J 	Jr(   )rq   rr   rs   rt   ru   r\   r   r!  r/  r4  r   r=  r   dependenciesrW  rB  rp   rv   rw   s   @r&   r   r     s        
I/ / / / /b
 
 
0! ! !8! ! !@
 
 

V
 V
 V
p
 
 
 T-..% % /.% T899H H :9HT J  J  J  J  J  J  Jr(   r   c                   ,    e Zd ZdZd Zej        fdZdS )r  z-serializable loader object used by LazyLoaderc                 ,    || _         |j        | _        d S r   )r!   r`   )r_   r!   initiating_strategys      r&   r\   zLoadLazyAttribute.__init__  s    /<r(   c                     | j         }|j        j        }|j        |         }|j        | j                 }|                    ||          S r   )r!   r   rL   rC   r   r`   r   )r_   r   r   r!   rM  r#   r   s          r&   r   zLoadLazyAttribute.__call__  sF    h-.%c*#D$56''w777r(   Nr   rm   r(   r&   r  r    sE        77= = = '1&< 8 8 8 8 8 8r(   r  	immediatec                   *    e Zd ZdZd Z	 	 ddZd ZdS )ImmediateLoaderrm   c                 `    | j                             d                              |           d S N)r   r   r]   r   r   r   s     r&   r   z$ImmediateLoader.init_class_attribute  2    **!	
 	


v
&
&
&
&
&r(   Nc                     d S r   rm   )	r_   rc   r   re   rf   rg   rh   parentmapperri   s	            r&   rk   zImmediateLoader.setup_query  s	     	r(   c                 V      fd}|d                               j        |f           d S )Nc                 d    |                      j                                      | |           d S r   )r   r!   rD   r   s      r&   load_immediatez<ImmediateLoader.create_row_processor.<locals>.load_immediate  s-    NN48$$((66666r(   delayedr   )	r_   rc   re   rf   rL   rn   rg   ro   r  s	   `        r&   rp   z$ImmediateLoader.create_row_processor  sD    	7 	7 	7 	7 	7 	9$$dh%?@@@@@r(   NN)rq   rr   rs   ru   r   rk   rp   rm   r(   r&   r  r    sX        I' ' '    A A A A Ar(   r  subqueryc                        e Zd ZdZ fdZd Z	 	 ddZd Zd Zd Z	d	 Z
d
 Zd Z G d de          Zd Zd Zd Z xZS )SubqueryLoader)
join_depthc                 |    t          t          |                               ||           | j        j        | _        d S r   )r[   r  r\   r]   r  r^   s      r&   r\   zSubqueryLoader.__init__  s4    nd##,,V\BBB.9r(   c                 `    | j                             d                              |           d S r  r  r   s     r&   r   z#SubqueryLoader.init_class_attribute  r  r(   Nc                 h   |j         j        sd S |j         j        r|j                             d           || j                 }|                    |j        dd           }	|	|	}
n| j        }
|j                            dt          j	        j
                  }||z   }|                    |j        d          sY| j        r6|j         j        r|j         j        j        nd|j        z   dz  | j        k    rd S n|                    | j                  rd S |                     |          \  }}}|j                            dt$          f|j                   }|                     |||||j                  }|j                             |
          }dt$          f|d|i|_        |                    d          }|                     ||          \  }}} |j        | }|                     |||||
          }|                     ||||
          }|                     |          }|                    |j        d|           d S )	Nr  path_with_polymorphic)subquery_pathNloaderr   r   
orig_queryF)r
   _enable_eagerloads
_yield_per_no_yield_perr]   rD   r   r   r   PathRegistryrootcontainsr  rq  lengthcontains_mapperrL   _get_leftmostr  _generate_from_original_queryentity_zeror   _attributes_set_enable_single_crit_prep_for_joinsadd_columns_apply_joins_setup_options_setup_outermost_orderbyr   )r_   rc   r   re   rf   rg   rh   r  ri   with_poly_entityeffective_entity	subq_pathleftmost_mapperleftmost_attrleftmost_relationshipr  
left_aliasr_  to_join
local_attrparent_aliass                        r&   rk   zSubqueryLoader.setup_query  s    }/ 	4F]% 	4M''
333D()  88 7
 
 '/#{&**#X%:%?
 
	 $	 }}W/:: 	  #=63::k"  ( ( F( **4;77  y))		
! '++>*GM
 

 77!
 

 $$%566>*J#Y

 %%e,,,0,@,@	-
 -
)\ AM:&w
L2B
 
 9j:JKK))!,, 	#Z33333r(   c                    j         t          j        d                   }| j                            |          r| j        d         u r| j        | j        c}n|d         c}|j        }fd|D             }||fS )Nr   r   c                 f    g | ]-}t          d          j        j        |         j                  .S r   )getattrr   _columntopropertyr!   )r   rj   r  r  s     r&   r   z0SubqueryLoader._get_leftmost.<locals>.<listcomp>k  sL     
 
 
  !#_%Fq%I%M 
 
 
r(   )re   r   _class_to_mapperr=   isar]   local_columns)r_   r  subq_mapperleftmost_propleftmost_colsr  r  s    `    @r&   r  zSubqueryLoader._get_leftmost\  s    N	/	!== KOOK((	G$	!44-1[$:N*O]]-8)A,*O]%3
 
 
 
 
 #	
 
 
 }<<r(   c                    |                                                     d           }|j        s?|                    t	          t          d |j        D                                 d           |                    |          }|                    |           |j	        }|du rd|_
        nN|Lt          d |D                       D ]2}	t          |                              |	j                  s	d|_
         n3|j        du r|j        |_        |j        |j        d |_        |                                                                }
t'          j        ||
d          }|S )Nc                 .    g | ]}|d          
|d          S )r   rm   )r   ents     r&   r   z@SubqueryLoader._generate_from_original_query.<locals>.<listcomp>  s0        #"8}8  M888r(   FTc              3   $   K   | ]}|j         V  d S r   )table)r   rj   s     r&   r   z?SubqueryLoader._generate_from_original_query.<locals>.<genexpr>  s$      66Q666666r(   use_mapper_path)_clone	correlate	_from_obj_set_select_fromr8   r   column_descriptions_adapt_col_list_set_entitiesdistinct_target_key	_distinctr?  r   	_order_byrl  _limit_offsetwith_labelsr  r   AliasedClass)r_   r  r  r  r  orig_entityr_  target_colsr  tembed_qr  s               r&   r  z,SubqueryLoader._generate_from_original_queryt  s    ))$// { 	 '1'E       " ''66	$$$3G$&&AKK ( 66+66666  ;''221=AA "&AKE ;%)2AK 8	 1AK
 --//**,,*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   Tr  c                 Z    g | ]'}t          j        j        |         j                  (S rm   )r  r=   r  r!   )r   rj   r  r_   s     r&   r   z2SubqueryLoader._prep_for_joins.<locals>.<listcomp>  s@     
 
 
 L$+"?"B"FGG
 
 
r(   )r8   pairs	enumeraterL   r  r;   r!   r  r   r   r   r   r  r]   r  )r_   r  r  r  r  irL   r#   prev_mapper	to_appendr  
local_colsr  r  s   `            @r&   r  zSubqueryLoader._prep_for_joins  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 ]}
|                    |
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   r   r  r   )r   items     r&   r   z/SubqueryLoader._apply_joins.<locals>.<listcomp>  sg        	 #47++<(H)$q'222aG	  r(   T)from_joinpoint)r  r  of_typepopr;   r=   join)r_   r_  r  r  r  r  ltjmiddleinnerr  attrs              r&   r  zSubqueryLoader._apply_joins  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(    	2 	2DtD11AAr(   c                 t    |                     |          } |j        |j         }|j        r|j        |_        |S r   )_with_current_path_conditional_options_with_options_populate_existing)r_   r_  r  r  r  s        r&   r  zSubqueryLoader._setup_options  sE       ++"A"J$<=( 	A#-#@A r(   c                     | j         j        rM|j        d         }|j                            t          j        | j         j                            } |j        | }|S r   )r]   rl  r  _target_adaptercopy_and_processr   r9   )r_   r_  	eagerjoineager_order_bys       r&   r  z'SubqueryLoader._setup_outermost_orderby"  s]    ( 
	, AI&6GGT1:;; N 
N+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.

        Nc                     || _         d S r   )subq)r_   r  s     r&   r\   z(SubqueryLoader._SubqCollections.__init__9  s    DIIIr(   c                 n    | j         |                                  | j                             ||          S r   )_data_loadrD   )r_   r!   r   s      r&   rD   z#SubqueryLoader._SubqCollections.get<  s-    z!

:>>#w///r(   c                     t          j        t                    | _        t	          j        | j        d           D ]/\  }}| j        |                             d |D                        0d S )Nc                     | dd          S )Nr   rm   xs    r&   r'   z7SubqueryLoader._SubqCollections._load.<locals>.<lambda>C  s    qu r(   c              3   &   K   | ]}|d          V  dS )r   Nrm   r   vvs     r&   r   z8SubqueryLoader._SubqCollections._load.<locals>.<genexpr>D  s&      $7$7rRU$7$7$7$7$7$7r(   )collectionsdefaultdictr8   r  	itertoolsgroupbyr  extend)r_   r   vs      r&   r  z%SubqueryLoader._SubqCollections._loadA  sn    $066DJ!)$)__EE 8 81
1$$$7$7Q$7$7$777778 8r(   c                 @    | j         |                                  d S d S r   )r  r  )r_   r   r   r   s       r&   r  z&SubqueryLoader._SubqCollections.loaderF  s#    z!

 "!r(   )	rq   rr   rs   rt   r  r\   rD   r  r  rm   r(   r&   _SubqCollectionsr  0  sa        	 	 	 	 		0 	0 	0
	8 	8 	8
	 	 	 	 	r(   r+  c                 F   | j         j        | j                 j        j        st          j        d| z            || j                 }|                    |j	        d          }|d S |j
        |j
        u s
J d            | j        j        }	|                    |j	        d          }
|
1|                     |          }
|                    |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  zlSubquery session doesn't refer to that of our context.  Are there broken context caching schemes being used?r$  c                 *    g | ]}j         |         S rm   rX   )r   rj   rg   s     r&   r   z7SubqueryLoader.create_row_processor.<locals>.<listcomp>k  s     AAA'/!,AAAr(   )r=   rE   r!   implsupports_populationr2  r3  r]   rD   r   r   r  r+  r   r,   _create_collection_loader_create_scalar_loader)r_   rc   re   rf   rL   rn   rg   ro   r  r   r$  s         `    r&   rp   z#SubqueryLoader.create_row_processorJ  so    {(27K 	,@BFG  
 D()xx*J77<F|w..." /.. )7

 hhw1=AA//55K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         t          fdD                       d          }|                     j                                      | ||           d S )Nc                      g | ]
}|         S rm   rm   r   r   r   s     r&   r   z_SubqueryLoader._create_collection_loader.<locals>.load_collection_from_subq.<locals>.<listcomp>{      666Cs3x666r(   rm   )rD   tupler   r!   set_committed_value)r   r   r   
collectionr$  r   r_   s     ` r&   load_collection_from_subqzKSubqueryLoader._create_collection_loader.<locals>.load_collection_from_subqy  sr    (6666:66677 J NN48$$88uj    r(   c                 8    j         |vr | ||           d S d S r   r   )r   r   r   r;  r_   s      r&   &load_collection_from_subq_existing_rowzXSubqueryLoader._create_collection_loader.<locals>.load_collection_from_subq_existing_row  s3    xu$$))%<<<<< %$r(   r   existingeagerr;   r!   invoke_all_eagersr  )r_   rc   r$  r   ro   r=  r;  s   ` ``  @r&   r1  z(SubqueryLoader._create_collection_loaderv  s    	 	 	 	 	 	 		= 	= 	= 	= 	= 	= 	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         t          fdD                       d          }t          |          dk    rt          j        dz             |d         }|                     j                                      | ||           d S )Nc                      g | ]
}|         S rm   rm   r6  s     r&   r   zWSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subq.<locals>.<listcomp>  r7  r(   r   r   LMultiple rows returned with uselist=False for eagerly-loaded attribute '%s' r   )rD   r8  r  r   r  r   r!   r9  )r   r   r   r:  scalarr$  r   r_   s     `  r&   load_scalar_from_subqzCSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subq  s    (6666:66677 J :""	GIMN  
  ]FNN48$$88vNNNNNr(   c                 8    j         |vr | ||           d S d S r   r   )r   r   r   rG  r_   s      r&   "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@  )r_   rc   r$  r   ro   rI  rG  s   ` ``  @r&   r2  z$SubqueryLoader._create_scalar_loader  s    	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  )rq   rr   rs   ru   r\   r   rk   r  r  r  r  r  r  objectr+  rp   r1  r2  rv   rw   s   @r&   r  r    s.         I: : : : :' ' ' a4 a4 a4 a4F= = =0? ? ?B-1 -1 -1^2 2 2h        6   4* * *XG G G.G G G G G G Gr(   r  joinedc                   z     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 Z	 ddZd Zd Zd Zd Z xZS )JoinedLoaderzcProvide loading behavior for a :class:`.RelationshipProperty`
    using joined eager loading.

    )r  _aliased_class_poolc                     t          t          |                               ||           | j        j        | _        g | _        d S r   )r[   rM  r\   r]   r  rN  r^   s      r&   r\   zJoinedLoader.__init__  s>    lD!!**6<@@@.9#%   r(   c                 `    | j                             d                              |           d S r  r  r   s     r&   r   z!JoinedLoader.init_class_attribute  r  r(   NFc	                 *   |j         j        sdS |j         j        r!| j        r|j                             d           || j                 }d}
|r|                     ||          nd}|dur|                     |||||          \  }}}nu|                    |j	        d          s9| j
        r|j        dz  | j
        k    rdS n|                    | j                  rdS |                     ||||||||          \  }}}}|                    |j	        dd          }|t!          |          j        }
nd}
|| j                 }t'          j        || j        |||||
| j        |	  	         |*dt+          |j                  v rt/          j        d          dS dS )	z@Add a left outer join to the statement that's being constructed.Nzjoined collectionFr  r   r  )with_polymorphicr  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().)r
   r  r  r,   r  r]   _init_user_defined_eager_proc$_setup_query_on_user_defined_adapterr  r   r  r  r  rL   _generate_row_adapterrD   r   with_polymorphic_mappersr   r   _setup_entity_queryr   secondary_columnsr2  r3  )r_   rc   rd   re   rf   rg   rh   r  rS  ri   rR  user_defined_adapterclausesadd_to_collectionr  s                  r&   rk   zJoinedLoader.setup_query  s?    }/ 	=F]% 	=$, 	=M''(;<<<D() D..w@@@ 	  u,,
 99tW6J 	!! ==!3X>> ? {Q88 9))$+66 F **!&	 	!&  88 7
 
 '&    &   $DK #K-#9
	
 
	
 
	
 
	
 'DC%5
 5
 -
 -
 ,E   (' -
 -
r(   c                    d|j         vrdS |j        j        }|                    |j        dd          }|dur|S |j         d         }|dd          \  }}|Pt          |t                    r|j                            |          }t          j
        ||j        j                  }n||                    |j        d          r<|                    |j        d          }t          j        ||j        j                  }n%|j        j                            |j        d           }|                    |j        d|           |S )Neager_from_aliasF user_defined_eager_row_processor)r  r  )r   re   r=   rD   r   r   strr   aliasr%  ColumnAdapterrL   r  r  r   
ORMAdapterr
   _polymorphic_adaptersr   )	r_   rf   rc   re   rg   rb  root_mapperr#   r  s	            r&   rT  z*JoinedLoader._init_user_defined_eager_proc  sq    W%7775|" (( BE
 
 %N "#56 IT%%% 1))%00,4;#B  GG }}W/1HII #'88&(?$ $  #-$ $ ?  
 "-=AAK  	 BG	
 	
 	
 r(   c                     |                     |j        |          }|r4|r2|                    |          }|                    |j        d|           n |r|}|                    |j        d|           |j        }|||fS )Nr_  )_get_entity_clausesr
   wrapr   r   primary_columns)r_   rc   r   re   rg   rZ  r\  s          r&   rU  z1JoinedLoader._setup_query_on_user_defined_adapterM  s     ,,W]GDD 	+ 	#7#<#<W#E#E HH"2$   
  	#* HH"2$   $3#W.???r(   c                    t          | j                  j        rt          | j                  j        }nd }d| f}||j        vrdx|j        |<   }n|j        |         dz   x|j        |<   }|t          | j                  k    rht          j        | j	        ||
                    d          nd dd          }t          |          j        j         | j                            |           | j        |         S )Njoinedloader_acr   r   T)flat)rb  rm  r  )r   r   r   
selectabler   r  rN  r   r  rL   rb  rj   r;   )r_   rc   alt_selectabler!   idxto_adapts         r&   _gen_pooled_aliased_classz&JoinedLoader._gen_pooled_aliased_classg  s   
 4;0 	"$T[11<NN!N $'g(((,--Gs#cc,3,>s,Ca,GGGs#c#d.////,!- %***555 $  H H(**$++H555',,r(   c	           
      2   |                     |j        dd           }	|	r|	}
n|                     |          }
t          |
                              d| ft
          j        |
| j        j        ddd          }|j	        J | j
        j        rd|_        |%|j                             d| j
        j                  n| j
        j        }|sd}|j                            | j        |||||||f           |j        }|                    |j        d|           ||||fS )Nr  joinedloader_ormadapterTF)r  adapt_requiredallow_label_resolveanonymize_labels	innerjoineager_row_processor)rD   r   rr  r   _memor   rd  rL   r  aliased_classr]   r,   multi_row_eager_loadersr   rx  create_eager_joinsr;   _create_eager_joinrY  r   )r_   rc   r   re   rf   rg   rh   r  rS  r  rq  r[  rx  r\  s                 r&   rV  z"JoinedLoader._generate_row_adapter  sl     88 7
 
  	?'HH55g>>H(##))&-7 %! * 
 
 $000' 	3.2G+ " "";0D0NOOO%/ 	  	* &*""))'&		
 	
 	
 $5#%:GDDD!24JJJr(   c	           	         ||j         }	n|}	|j        o|j        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           rit          |j                                      |	                    | j                  r|	n| j                  }t          |j        | j        | j                  }nBt          t-          j        | j        |j        d          | j        | j                  }n| j        }|j        J | p| p|dk    p|j        j        }|rSt-          j        ||j        || p'|j        j        p|ot7          |t8          j                  | j        | j                   }n|                     ||||          }||j        |<   |j        |_        |sit          j         | j        j!                  D ]J}|	j"        j#        $                    |          r)|r|j%        |         }|j&        '                    |           K| j        j(        rF|xj)        |j*        +                    tY          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{  Tr  unnestedisouter
_left_memo_right_memo).rL   r|  r
   _should_nest_selectableeager_joinsfrom_clauser%  #find_left_clause_that_matches_givenrn  r  r2  r3  
setdefaultr  r   r{  _entity_for_mapperr  r=   r   r!   r]   r   r  r  represents_outer_join_ORMJoinr   r   Join_splice_nested_inner_joinstop_on_find_columnsprimaryjoinpersist_selectablerj   contains_columnrY   rj  r;   rl  r  r  r  r   r9   )r_   rc   rd   re   rg   r  r[  rx  rS  r   should_nest_selectablequery_entity_keyindexesclausedefault_towraptowrapefmonclauseattach_on_outsider  r   s                        r&   r~  zJoinedLoader._create_eager_join  s    &-KK&K + 65 	
    333* 4# 4 B#\%< G 7||a 00    F ,WQZ8
 4;1:v. #' -
 $//n
 
  	,w66 
 g344GG"t{33%KK  #3:tx9MNN")W%7   H(  +H$000 '& >}>J&> '=	 	  	 )%% M+AM*Kz&#(/K/K; K	 	 	II 66fgx I 1:,- )3	 	8  -$0  8 8 13CCCHH 8 3%oc2+223777( 	;"")::l4/899+; +;;""""	; 	;r(   c           	      :   |du rt          |t          j                  sJ nt          |t          j        j                  r|                     ||j        |||          S t          |t          j                  s6|d         |u r*t          j        ||j        |d||d         j	                  S d S |                     ||j
        |||j                  }|8d}|                     ||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   r   r  r   rn  FromGroupingr  elementr{  rL   rightr  leftr  r  _splice_into_centerr  r  )	r_   re   join_objr[  r  splicingtarget_joinright_splicer  s	            r&   r  z&JoinedLoader._splice_nested_inner_joinX  s    u h(9::::::#."=>> 	11h&8   Hh&788 	Bx8##()!' $R    t44(.'8X5I
 
  L88hmWh8K K " E)))N *))t #  L 	 # 	K,? 	$88EE		$-M%$,'2  		 !)! ($0  I %0$?	!r(   c                 $   |r|                      ||          nd}|dur5|}|j        r|r|                    |j                  }n.|j        r|j        }n|                    |j        d          }|dS | j                            ||          r|S dS )NFry  )rT  rg   ri  rD   r   rL   _result_has_identity_key)r_   rc   rn   rg   re   rf   rZ  	decorators           r&   _create_eager_adapterz"JoinedLoader._create_eager_adapter  s     D..w@@@ 	  u,,,I  ,9 ,%NN7?;;		 ,#O	!35JKKI u;//	BB 	 5r(   c           	         | j         j        | j                 j        j        st          j        d| z            || j                 }|                     |||||          }	|	durj| j        }
t          j
        | j        |||| j                 |	          }| j        s|                     ||
||           d S |                     ||
||           d S | j                            d                              |||||||           d S )Nr-  Fr  )r=   rE   r!   r/  r0  r2  r3  r]   r  r   _instance_processorrL   r   r,   r2  r1  r   rp   )r_   rc   re   rf   rL   rn   rg   ro   our_patheager_adapterr!   	_instances               r&   rp   z!JoinedLoader.create_row_processor  sO    {(27K 	,@BFG  
 ,-22VWh
 
 %%(C3% I < **7CJOOOOO..S)Z      ..% ""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                     t          j        | |          }t          j        |d          }|j         | f<    |          }||                    |           d S d S Nappend_without_eventr   init_state_collectionr   UniqueAppenderr;   )	r   r   r   r:  result_listinstr  rc   r!   s	         r&   #load_collection_from_joined_new_rowzSJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_new_row  sw    #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 r  r  )	r   r   r   r  r:  r  r  rc   r!   s	         r&   (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 r   rm   r   r   r   r  s      r&    load_collection_from_joined_execzPJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_exec      IcNNNNNr(   r   r>  r?  r;   r!   rA  )r_   rc   r!   r  ro   r  r  r  s    ```    r&   r1  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 r   rm   )r   r   r   r  r!   s      r&   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 )NrE  )r   r  )r   r   r   r>  r  r!   r_   s       r&   $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 r   rm   r  s      r&   load_scalar_from_joined_execzHJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_exec&  r  r(   r   r>  r?  r  )r_   rc   r!   r  ro   r  r  r  s   ` ``    r&   r2  z"JoinedLoader._create_scalar_loader  s    	( 	( 	( 	( 	( 	(
	& 	& 	& 	& 	& 	& 	&&	 	 	 	 	 	5  $(,K!LMMM:%%X;<	
 	
 	
 $ 	w&&78    	 	r(   )NNF)F)rq   rr   rs   rt   ru   r\   r   rk   rT  rU  rr  rV  r~  r  r  rp   r1  r2  rv   rw   s   @r&   rM  rM    s1        
 4I& & & & &
' ' ' $^ ^ ^ ^@- - -^@ @ @4!- !- !-F=K =K =K~M; M; M;` ;@D D D DL  8% % %N* * *X# # # # # # #r(   rM  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 ej        d
          d             Zd Z ej        d
          d             Zd Zd Z xZS )SelectInLoader)r  	omit_join_parent_alias_query_info_fallback_query_infor  	queryinfo)load_only_childload_with_joinin_exprpk_colszero_idxchild_lookup_colsi  c                    t          t          |                               ||           | j        j        | _        | j        j        t          j        u }| j        j        | j        j        | _        ne| j        	                    d          }|r|j
        | _        n<| j        j        d                             |j        d| j        j                  | _        | j        rQ|r4|                                 | _        |                                 | _        d S |                                 | _        d S |                                 | _        d S )Nr  r   Tr  )r[   r  r\   r]   r  rI   r   r  r  r   r   r=   r  r   r   r  _init_for_omit_join_m2or  _init_for_joinr  _init_for_omit_join)r_   r=   r`   is_m2o
lazyloaderra   s        r&   r\   zSelectInLoader.__init__M  s=   nd##,,V\BBB.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 )rm   N)r=   r  rD   )r   r   equivpk_to_fkr_   s      r&   r   z5SelectInLoader._init_for_omit_join.<locals>.<genexpr>n  sl       
 
8<<QCC
 
  HQK 
 
 
 
 
 
 
r(   c                 (    g | ]}|v |         S rm   rm   )r   r   r  s     r&   r   z6SelectInLoader._init_for_omit_join.<locals>.<listcomp>t  s)     
 
 
!xHSMr(   r   Fr   T)rL  r]   r	  local_remote_pairsry  r8   r=   r   r  r   tuple_
query_info)r_   r  fk_colsr  r  r  s   `    @r&   r  z"SelectInLoader._init_for_omit_joinj  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 rm   rI  )r   rJ  r  s     r&   r   z:SelectInLoader._init_for_omit_join_m2o.<locals>.<listcomp>  s!    III2z226IIIr(   )rL   r   r  r   r  r]   r   r  )r_   r  r  r  lookup_colsr  s        @r&   r  z&SelectInLoader._init_for_omit_join_m2o  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 rm   _adapt_element)r   r   pa_insps     r&   r   z1SelectInLoader._init_for_join.<locals>.<listcomp>  s4     
 
 
,/G""3''
 
 
r(   r   Fr   T)
r   r=   rH   r  r   r   r  r   r  r  )r_   r  r  r  r  s       @r&   r  zSelectInLoader._init_for_join  s    $T[%788$,--
 
 
 
37;3J
 
 
 w<<!j'*GHHajGHudGWhMMMr(   c                 `    | j                             d                              |           d S r  r  r   s     r&   r   z#SelectInLoader.init_class_attribute  r  r(   rN  c                 .    |                     d          S rP  rS  rU  s     r&   rW  z%SelectInLoader._memoized_attr__bakery  rX  r(   c                    | j         j        | j                 j        j        st          j        d| z            |j        j        pt          j
        j        |z   }t          j        |d         | j                   sd S t          j                            ||| j                  rd S || j                 }	|| j                 }
|	                    |j        dd           }||}n| j        }|	                    |j        d          s9| j        r|
j        dz  | j        k    rd S n|
                    | j                  rd S t          j                            ||| j         | j        | j        |           d S )Nr-  r  r  r  r   )r=   rE   r!   r/  r0  r2  r3  r
   rq  r   r  r  _entity_isar   PostLoadpath_existsr]   rD   r   r   r  r  r  r  rL   callable_for_path_load_for_path)r_   rc   re   rf   rL   rn   rg   ro   selectin_pathpath_w_propselectin_path_w_propr  r  s                r&   rp   z#SelectInLoader.create_row_processor  s    {(27K 	,@BFG   M'E8+@+E #DHdk:: 	F'']D$8
 
 	 F4/0,T-AB '?? 7
 
 '/#{##G$6AA 	 '.2T_DDF E%55dkBB **K 	
 	
 	
 	
 	
r(   c                 t    |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        sGt#                    j        r1fdD                                           fdD                                  fd           }|j        s|                    fd           n! j        |                     fd           |j        r|                    fd           n|                    fd	           |j        }|                    |j        | j                            |j        r|                    d
             j        j        r[|j        s: j        j        j        rfdD             |                    fd           n fd}|                    |           |j        r                     ||	|||           d S                      ||||           d S )Nc              3   ^   K   | ]'}                     |t          j                   V  (dS )rH  N)r,  r   PASSIVE_NO_FETCH)r   lkrL   r   
state_dicts     r&   r   z0SelectInLoader._load_for_path.<locals>.<genexpr>  s]       & &  44" * ;	 5  & & & & & &r(   c                 @    g | ]\  }}|j         d          ||j        |fS )r   )r!   rL  )r   r   	overwrites      r&   r   z1SelectInLoader._load_for_path.<locals>.<listcomp>		  s=       $E9 1uej)<  r(   c                 :    g | ]}                     |          S rm   r  r   r   insps     r&   r   z1SelectInLoader._load_for_path.<locals>.<listcomp>	  '    GGG4..s33GGGr(   c                 :    g | ]}                     |          S rm   r  r   s     r&   r   z1SelectInLoader._load_for_path.<locals>.<listcomp>	  r  r(   c                 P    |                      t          j        dgR            S )NrJ  )r
   Bundle)r   r  r  s    r&   r'   z/SelectInLoader._load_for_path.<locals>.<lambda>	  s-    GMMT,G,,,.>  r(   c                 .    |                                S r   )rb  )r_  r  s    r&   r'   z/SelectInLoader._load_for_path.<locals>.<lambda>+	  s    Q]]3C%D%D r(   c                     |                                                    t          j        j                                                          S r   )rb  r  r  r]   r!   r  )r_  r  par_   s    r&   r'   z/SelectInLoader._load_for_path.<locals>.<lambda>2	  sI    !--++00B 4 899AA(   r(   c                 |    |                                          t          j        dd                              S Nprimary_keysT)	expandingrv  in_r   r  r_  r  s    r&   r'   z/SelectInLoader._load_for_path.<locals>.<lambda>;	  3    !((KKn M M MNN  r(   c                 |    |                                          t          j        dd                              S r
  r  r  s    r&   r'   z/SelectInLoader._load_for_path.<locals>.<lambda>A	  r  r(   c                 *    |                                  S r   )r  r^  s    r&   r'   z/SelectInLoader._load_for_path.<locals>.<lambda>M	  s    Q%8%8%:%: r(   c                 :    g | ]}                     |          S rm   r  )r   elemr  s     r&   r   z1SelectInLoader._load_for_path.<locals>.<listcomp>S	  s4     & & &6:++D11& & &r(   c                      | j          S r   )rl  )r_  r  s    r&   r'   z/SelectInLoader._load_for_path.<locals>.<lambda>V	  s    ^)D r(   c                     | j         d         } | j        |j                            t	          j        j        j                             S r   )r  rl  r  r  r   r9   r]   )r_  r  r_   s     r&   r  z?SelectInLoader._load_for_path.<locals>._setup_outermost_orderbyY	  sJ     !"AI%1:"2CC L)=)FGG  r(   )r!   r  r  r$  r%  r8   r=   rL  r8  r  r   r   r  r;   r  r  r  r   r   r  r  r}  r  r
   r  r  r]   r  rl  _load_via_child_load_via_parent)r_   rV  rc   re   states	load_onlyr  r  
our_statesnone_statesr  related_identr_  r  r  r  r  r  rL   r  r  r   r  s   `     `        @@@@@@@@r&   r  zSelectInLoader._load_for_path  s2   
  	22F%
% !	G$066JK[F$* G G y"Z
 % & & & & & & ):& & & ! ! /=@@!%!:JE },,}-44
I6     &&z9'EFFFF ) 	 (.  J
 $$( 	H +,,D$ HGGGGwGGG--g66GGGGwGGGLL     	
 
 ( 	 NNDDDDEEEE
 #BNN        % 	NN       NN      ]
	$d4+?&@	
 	
 	
 ( 	<NN::;;;( 	9, 9!%!5!>( & & & &>L& & &N DDDDEEEE	 	 	 	 	 7888% 	F  KQ     !!*j!WEEEEEr(   c                 H   | j         }t          |          }|r|d| j                 }|| j        d          }d  ||j                                      fd|D                       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 rm   rm   )r   r   r)  s      r&   
<dictcomp>z2SelectInLoader._load_via_child.<locals>.<dictcomp>u	  s.       Aq 1  r(   c                 2    g | ]}j         r|d          n|S r  r  )r   r!   r  s     r&   r   z2SelectInLoader._load_via_child.<locals>.<listcomp>x	  s6     " " "CF*"5>A3" " "r(   r  )	r,   sorted
_chunksizer   r  rD   r!   r   r9  )r_   r  r  r  r_  rc   r,   our_keyschunkdatar!   related_objr   r   r  s      `           r&   r  zSelectInLoader._load_via_childm	  s   , *%% 	Q01E 1 12H Ago..55" " " "JO" " " 6    D    #hhsD11/9#  +E5)$ !U):): NN48,,@@+2E   	'  	: (3 	M 	M#E5) U!2!2 NN48$$88tLLLL	M 	Mr(   c                     | j         }|rdnd }|rl|d| j                 }|| j        d          }fd|D             }t          j        t                    }	t          j         ||j                                      |          d           D ]*\  }
}|	|
         	                    d |D                        +|D ]\  }}}}|s
| j
        |v r|	                    ||          }|sb|r`t          |          dk    rt          j        d| z             |                    | j
                                      |||d                    |                    | j
                                      |||           |jd S d S )	Nrm   r   c                 <    g | ]\  }}}}j         r|d          n|S r  r"  )r   r!   r   r  r  r  s        r&   r   z3SelectInLoader._load_via_parent.<locals>.<listcomp>	  sA       5C
I %-6A3  r(   r#  c                     | d         S r   rm   r  s    r&   r'   z1SelectInLoader._load_via_parent.<locals>.<lambda>	  s
    !A$ r(   c              3   &   K   | ]}|d          V  dS )r   Nrm   r"  s     r&   r   z2SelectInLoader._load_via_parent.<locals>.<genexpr>	  s&      11r!u111111r(   r   rE  )r,   r%  r$  r%  r8   r&  r'  r   r  r(  r!   rD   r  r   r  r   r9  )r_   r  r  r_  rc   r,   _empty_resultr'  r  r(  r   r)  r!   r   r  r  r:  s     `              r&   r  zSelectInLoader._load_via_parent	  s   ,%/4 &	q4?23E#DO$5$56J   9>  L
 *400D!)'/""))|)DD  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:   I  &	 &	 &	 &	 &	r(   )rq   rr   rs   ru   r$  
namedtupler  r%  r\   r  r  r  r   r   r  rW  rp   r  r  r  rv   rw   s   @r&   r  r  3  s=       I ('	
 	
 	

 
J J5 5 5 5 5:O O O,
 
 
 N N N' ' '
 T-..% % /.%1
 1
 1
f T-..PF PF /.PFd(M (M (MT* * * * * * *r(   r  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)	r!   	hasparentr   instance_stater2  r3  r   instance_strrH   )r   r  oldvalue	initiatorr4  r#   s        r&   	_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 r   rm   )r   r  r8  r9  s      r&   r;   z'single_parent_validator.<locals>.append	  s    ytY777r(   c                       | |||          S r   rm   )r   r  r7  r8  r9  s       r&   set_z%single_parent_validator.<locals>.set_	  s    yx;;;r(   r;   T)rawretvalr4   r   )r   listen)r"   r#   r;   r<  r9  s    `  @r&   r<   r<   	  s        8 8 8 8 8< < < < < 
LhDd    
LudT$OOOOOOr(   )NNNNFN)8rt   
__future__r   r$  r&   r   r   r   r   r   r	   r
   r   r   r   baser   r   r   r   r   r   r   r   r   r   r   r2  r   r   r   r%  r   rS   ColumnPropertystrategy_forrW   class_loggerry   r   r   rJ  r   r   RelationshipPropertyr   r   MemoizedSlotsr   r  r  r  rM  r  r<   rm   r(   r&   <module>rH     s  2 2 & & & & & &                                                         " " " " " " ' ' ' ' ' ' & & & & & & + + + + + + # # # # # #                                                             " " " " " "       S! S! S! S!l ''55'II              JI F ''4%'HH?: ?: ?: ?: ?:> ?: ?: IH ?:D '''>>B
 B
 B
 B
 B
\ B
 B
 ?> B
J ''$'GG''4'88A' A' A' A' A'> A' A' 98 HG A'H8 8 8 8 8& 8 8 8
4 
4 
4 
4 
4 
4 
4 
4  --->>    n   ?>   --8-<< --4-88= = = = =) = = 98 =< =<  --4-88 --8-<< --7-;; -->-BB -->-BBuJ uJ uJ uJ uJ+T-? uJ uJ CB CB <; =< 98 uJp8 8 8 8 8 8 8 8   --;-??A A A A A0 A A @?A<  --:->>yG yG yG yG yG/ yG yG ?> yGx  --8-<< --5-99D
 D
 D
 D
 D
- D
 D
 :9 =< D
N  --:->>L L L L L/1C L L ?> L^P P P P Pr(   