
    h                   	   d Z ddlmZ ddlZddlZddlmZ ddlmZ ddlmZ ddlm	Z	 ddlm
Z
 dd	lmZ d
dlmZ d
dlmZ d
dlmZ d
dlmZ d
dlmZ d
dlmZ d
dlmZ d
dlmZ d
dlmZ d
dlmZ d
dlmZ d
dlmZ d
dlmZ d
dlmZ d
dlmZ d
dlmZ d
dlm Z  d
dl!m"Z" d
dl!m#Z# d
dl!m$Z$ d
dl!m%Z% d
d lm&Z& d
d!lm'Z' d
d"l(m)Z) d
d#l*m+Z+ d
d$l,m-Z- d
d%lm.Z. d
d&lm/Z/ d'd(lm0Z0 d'dlmZ1 d'd)lm2Z2 d'd*lm3Z3 d'd+lm4Z4 d'dlmZ d'dl4mZ5 d'd,l4m6Z6 d'd-l7m8Z8 d'd.l7m9Z9 d'd/l:m;Z; e
rd
d0l<m=Z= d
d1lm>Z> d'd2l?m@Z@ 	 	 	 	 	 	 ddd4ZAej                  j                  d3d35       G d6 d7e&             ZDe3j                  ej                  j                  d8d35       G d9 d:e&                    ZFe3j                  ej                  j                  d8;       G d< d=eF                    ZGe3j                  ej                  j                  d8d8>      ej                  j                  d8d8d8?      ej                  j                  d8@       G dA dBe&                                  ZH G dC dD      ZI G dE dFe&      ZJe3j                  ej|                  j                  d8@       G dG dHe&                    ZKe3j                  ej|                  j                  dIJ      ej|                  j                  dJ       G dK dLeJ                           ZLe3j                  ej|                  j                  d8J      ej|                  j                  dMJ      ej|                  j                  dNJ      ej|                  j                  dOJ      ej|                  j                  dPJ       G dQ dReJej                  e3j                                                                  ZO G dS dT      ZP G dU dVeJ      ZQej|                  j                  dWJ       G dX dYeQ             ZRe3j                  ej|                  j                  dZJ       G d[ d\eQ                    ZSe3j                  ej|                  j                  d]J      ej|                  j                  d3J       G d^ d_eJ                           ZTe3j                  ej|                  j                  d`J       G da dbeQej                                      ZUdc ZVy)ezWsqlalchemy.orm.interfaces.LoaderStrategy
   implementations, and related MapperOptions.    )annotationsN)Any)Dict)Optional)Tuple)TYPE_CHECKING)Union   )
attributes)exc)
interfaces)loading)path_registry)
properties)query)relationships)
unitofwork)util)_DEFER_FOR_STATE)_RAISE_FOR_STATE)_SET_DEFERRED_EXPIRED)ATTR_WAS_SET)LoaderCallableStatus)PASSIVE_OFF)PassiveFlag)_column_descriptions)ORMCompileState)ORMSelectCompileState)QueryContext)LoaderStrategy)StrategizedProperty)_state_session)InstanceState)Load)_none_only_set)AliasedClass   )event)inspect)log)sql)visitors)LABEL_STYLE_TABLENAME_PLUS_COL)Select)Literal)Mapper)RelationshipProperty)ColumnElementFc	                   g }
|xr | j                   |r!| j                  r|
j                  t               | j                  | j
                  j                  v r;| j
                  j                  | j                     \  |
j                  fd       |r|
j                  t        j                         |r/| j                  r!| j                  r|
j                  fd       |j                  D ]  }| |j                  j                  | j                        u s+|j                  j                  | j                        rQt!        j"                  |j$                  | j                  f| |||xr* | j                  xs | j&                  t(        j*                  u ||||| xs | j,                   | j.                  d|	}|
D ]  } |||          y )Nc                H    t        j                  | |j                  fi S N)orm_util_validator_eventskey)descpropfnoptss     BD:\EasyAligner\venv\Lib\site-packages\sqlalchemy/orm/strategies.py<lambda>z%_register_attribute.<locals>.<lambda>\   s#    x99dhh &*     c                2    t        j                  |       S r5   )r   backref_listeners)r9   r:   backrefuselists     r=   r>   z%_register_attribute.<locals>.<lambda>j   s    :#?#?'7$r?   )parent_tokenrC   compare_function	useobjecttrackparenttypecallable	callable_active_history
impl_classsend_modified_eventsdoc)rC   single_parentappendsingle_parent_validatorr8   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viewonlyrM   )r:   mapperrF   rE   rH   rI   proxy_propertyrJ   rK   kwlisten_hooksmr9   hookrB   r;   r<   rC   s                 @@@@r=   _register_attributerf   F   s    L(DLLGT''34xx4;;)));;))$((3D	
 J;;< %%t33" ((188<<HH
 
//00:55 "!1#% && >~~)=)==)#-%)2]%G$--6GHH#$ %D* %T4  %3 )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         |   ||       | j                  j                  | _        y r5   )super__init__parent_propertyrk   selfrQ   strategy_key	__class__s      r=   rn   z#UninstrumentedColumnLoader.__init__   s%    .++33r?   c                l    | j                   D ]%  }|r|j                   |   }|j                  ||       ' y r5   )rk   _append_dedupe_col_collection)	rq   compile_statequery_entitypathloadoptadaptercolumn_collectionkwargscs	            r=   setup_queryz&UninstrumentedColumnLoader.setup_query   s4     AOOA&77;LM r?   c	                     y r5    	rq   contextrw   rx   ry   r`   resultrz   
populatorss	            r=   create_row_processorz/UninstrumentedColumnLoader.create_row_processor   s     	r?   r5   )	__name__
__module____qualname____doc__	__slots__rn   r~   r   __classcell__rs   s   @r=   rj   rj      s$     I4 Nr?   rj   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`.)rk   is_compositec                    t         |   ||       | j                  j                  | _        t	        | j                  d      | _        y )Ncomposite_class)rm   rn   ro   rk   hasattrr   rp   s      r=   rn   zColumnLoader.__init__   s;    .++33#D$8$8:KLr?   c	                    | j                   D ]<  }
|r&|r|j                  |
      }
|
 y |j                   |
   }
|j                  |
|       > | j                   d   }|r|j                   |   }|y ||| j                  <   y Nr   )rk   adapt_check_presentru   ro   )rq   rv   rw   rx   ry   rz   r{   memoized_populatorscheck_for_adaptr|   r}   fetchs               r=   r~   zColumnLoader.setup_query   s     A"33A6Ay*A77;LM  QOOE*E} 49D001r?   c                v   d| _         | j                  d   j                  }| j                  j                  xs] | j                  d   j
                  xsB |j                  d uxr2 |j                  j                  |j                  d       | j                  u }t        | j                  |d|j                  |       y )NTr   F)rF   rE   rJ   )is_class_levelrk   typero   rJ   primary_keyversion_id_col_columntopropertyrX   rf   compare_values)rq   r`   coltyperJ   s       r=   init_class_attributez!ColumnLoader.init_class_attribute   s    ",,q/&&   // ||A** %%T1 (,,001F1FM''( 	 	  $33)	
r?   c	                    | j                   D ]I  }	|r|j                   |	   }	|j                  |	d      }
|
s)|d   j                  | j                  |
f        y  |d   j                  | j                  df       y NFquickexpireT)rk   _getterrO   r8   )rq   r   rw   rx   ry   r`   r   rz   r   colgetters              r=   r   z!ColumnLoader.create_row_processor  ss     <<Cooc*^^C/F7#**DHHf+=>   x ''4(89r?   F)
r   r   r   r   r   rn   r~   r   r   r   r   s   @r=   r   r      s)     C)I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                         j	                  d       t        fd| j                  j                  D              | _        y )Nc              3  B   K   | ]  }|j                           y wr5   )compare).0r}   nulls     r=   	<genexpr>z2ExpressionColumnLoader.__init__.<locals>.<genexpr>)  s!      ,
)EA		$)Es   )	rm   rn   r+   r   labelanyro   rk   _have_default_expression)rq   rQ   rr   r   rs   s      @r=   rn   zExpressionColumnLoader.__init__"  sP    .
 xxz%(+ ,
)-)=)=)E)E,
 )
%r?   c                ,   d }	|r|j                   r|j                   }	n"| j                  r| j                  j                  }	|	y |	D ]%  }
|r|j                  |
   }
|j	                  |
|       ' |	d   }|r|j                  |   }|y ||| j                  <   y r   )_extra_criteriar   ro   rk   ru   )rq   rv   rw   rx   ry   rz   r{   r   r|   rk   r}   r   s               r=   r~   z"ExpressionColumnLoader.setup_query-  s     w..--G****22G?AOOA&77;LM 
 
OOE*E} 49D001r?   c	                   |r|j                   r{|j                   }	|	D ]I  }
|r|j                  |
   }
|j                  |
d      }|s)|d   j                  | j                  |f        y  |d   j                  | j                  df       y y y r   )r   rk   r   rO   r8   )rq   r   rw   rx   ry   r`   r   rz   r   rk   r   r   s               r=   r   z+ExpressionColumnLoader.create_row_processorR  s     w..--G!//#.CU3w'..&/AB  8$++TXXt,<= /7r?   c                    d| _         t        | j                  |d| j                  d   j                  j
                  d       y )NTFr   )rF   rE   accepts_scalar_loader)r   rf   ro   rk   r   r   rq   r`   s     r=   r   z+ExpressionColumnLoader.init_class_attributel  s;    "  !\\!_11@@"'	
r?   )r   r   r   rn   r~   r   r   r   r   s   @r=   r   r     s    	
#:J>4	
r?   r   )rh   rg   )rh   rg   	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`.)rk   groupr   c                   t         |   ||       t        | j                  d      rt	        d      | j
                  j                  dd      | _        | j                  j                  | _        | j                  j                  | _	        y )Nr   z8Deferred loading for composite types not implemented yetr   F)
rm   rn   r   ro   NotImplementedErrorstrategy_optsrX   r   rk   r   rp   s      r=   rn   zDeferredColumnLoader.__init__  su    .4''):;%J  ++//UC++33))//
r?   c	           
     $   |j                   r~|j                  j                  j                  r^| j                  |j                  j                  j                  v r2| j
                  j                  d      j                  ||||||||       y | j                  sZ| j                  r| j
                  j                  }	n| j
                  j                  }	|d   j                  | j                  |	f       y |d   j                  | j                  df       y )N)rh   Frg   Tnewr   F)refresh_stater   _compile_options_only_load_propsr8   ro   _get_strategyr   r   r   _raise_column_loader_deferred_column_loaderrO   )
rq   r   rw   rx   ry   r`   r   rz   r   set_deferred_for_local_states
             r=   r   z)DeferredColumnLoader.create_row_processor  s    * !!..??GMM::KKK  ..;""	 $$~~((== -
 ((@@ - u$$dhh0L%MNx ''5(9:r?   c                    d| _         t        | j                  |d| j                  d   j                  j
                  | j                  d       y )NTFr   )rF   rE   rI   load_on_unexpire)r   rf   ro   rk   r   r   _load_for_stater   s     r=   r   z)DeferredColumnLoader.init_class_attribute  sD    "  !\\!_11@@**"	
r?   c	           	     j   |j                   j                  r| j                  j                  s|r8t	        | j
                        j                  | j                  j                        sG|r5| j                  r)|j                  j                  d| j                  z  d      s|rA| j                  |v r3 | j                  j                  d      j                  |||||||fi |	 y | j                  rt         || j                  <   y | j"                  st$        || j                  <   y t&        || j                  <   y )Nzundefer_group_%sFr   )compile_options_render_for_subqueryro   _renders_in_subqueriessetrk   intersectionrQ   _should_undefer_in_wildcardr   
local_optsrX   r8   r   r~   r   r   r   r   r   )
rq   rv   rw   rx   ry   rz   r{   r   only_load_propsrb   s
             r=   r~   z DeferredColumnLoader.setup_query  s    --BB((?? %22KK;;
 JJ&&**&3U  DHH$?D  ..;k!#    8M 4 458H 4 458H 4 45r?   c                D   |j                   st        j                  S |t        j                  z  st        j
                  S |j                  j                  }| j                  rg|j                  D cg c]Q  }t        |t              r?t        |j                  t              r%|j                  | j                  k(  r|j                   S }}n| j                   g}|D cg c]  }||j                  v s| }}t        |      }|9t!        j"                  dt%        j&                  |      d| j                   d      | j(                  r| j+                  ||d       t-        j.                  |j                  |t1        |      t2               t        j4                  S c c}w c c}w )NParent instance zB is not bound to a Session; deferred load operation of attribute '' cannot proceedraise)r8   r   
ATTR_EMPTYr   SQL_OKPASSIVE_NO_RESULTmanagerr`   r   iterate_properties
isinstancer!   strategyr   
unmodifiedr"   orm_excDetachedInstanceErrorr6   	state_strr   _invoke_raise_loadr   load_scalar_attributesr   r   r   )	rq   statepassivelocalparentptoloadkr   sessions	            r=   r   z$DeferredColumnLoader._load_for_state  sZ   yy'222+++'999mm**:: %777Aa!45qzz+?@GGtzz)	 7   hhZF #<Fqa5+;+;&;F< '?// %%e,dhh8  >>##E7G<&&LL%U[	
 $0009 =s   0AFF.Fc                4    t        j                  d| d      )N'z(' is not available due to raiseload=Truesa_excInvalidRequestErrorrq   r   r   lazys       r=   r   z'DeferredColumnLoader._invoke_raise_load'  s    ((=AC
 	
r?   r5   )r   r   r   r   r   rn   r   r   r~   r   r   r   r   s   @r=   r   r   x  s5     L/I01;f

* 1If&1P
r?   r   c                  8    e Zd ZdZdddZej                  fdZy)LoadDeferredColumnsz7serializable loader object used by DeferredColumnLoaderc                     || _         || _        y r5   )r8   r   )rq   r8   r   s      r=   rn   zLoadDeferredColumns.__init__0  s    "r?   c                    | j                   }|j                  j                  }|j                  |   }| j                  rd}nd}|j                  |      }|j                  ||      S )N)rh   Tr   )r   T)r   r   )r8   r   r`   rW   r   r   r   )rq   r   r   r8   r   r:   rr   r   s           r=   __call__zLoadDeferredColumns.__call__4  sc    hhmm**!!#&>>L FL%%l3''w77r?   Nr   )r8   strr   bool)r   r   r   r   rn   r   r   r   r   r?   r=   r   r   -  s    A# '1&<&< 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`   targetrC   entityc                    t         |   ||       | j                  j                  | _        | j                  j                  | _        | j                  j
                  | _        | j                  j                  | _        y r5   )rm   rn   ro   r`   r  r  rC   rp   s      r=   rn   z#AbstractRelationshipLoader.__init__J  s^    .**11**11**11++33r?   c	           
     d    | j                   j                  d      j                  ||||||||      S )N))r   	immediate)ro   r   r   r   s	            r=   #_immediateload_create_row_processorz>AbstractRelationshipLoader._immediateload_create_row_processorQ  sC     ##11$


	
	
r?   )r   r   r   r   r   rn   r	  r   r   s   @r=   r  r  E  s    :7I4
r?   r  c                      e Zd ZdZy)DoNothingLoaderzRelationship loader that makes no change to the object's state.

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

    N)r   r   r   r   r   r?   r=   r  r  j  s    r?   r  noload)r   c                       e Zd ZdZdZd Zd Zy)NoLoaderzQProvide loading behavior for a :class:`.Relationship`
    with "lazy=None".

    r   c                l    d| _         t        | j                  |d| j                  j                         y )NT)rF   rH   )r   rf   ro   collection_classr   s     r=   r   zNoLoader.init_class_attribute  s0    "  -->>		
r?   c	                P      fd}	|d   j                   j                  |	f       y )Nc                    j                   r"t        j                  | |j                         y d |j                  <   y r5   )rC   r   init_state_collectionr8   )r   dict_rowrq   s      r=   invoke_no_loadz5NoLoader.create_row_processor.<locals>.invoke_no_load  s-    ||00txxH"&dhhr?   r   )rO   r8   )
rq   r   rw   rx   ry   r`   r   rz   r   r  s
   `         r=   r   zNoLoader.create_row_processor  s&    	' 	5  $((N!;<r?   N)r   r   r   r   r   r   r   r   r?   r=   r  r  v  s    
 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]ro   c                   t         |   ||       | j                  d   dk(  | _        | j                  d   dk(  | _        t        | j                        j                  | _        | j                  j                  }|j                         \  | _        | _        | _        |j                  d      \  | _        | _        | _        | j                  j"                  rSt%        j&                  | j                  j"                        D cg c]  }t)        j*                  |ddi       c}| _        nd | _        | j.                  j1                  d| | j                         | j                   xrY | j2                   xrJ | j                  j4                  d   j7                  | j                  dd	| j8                  j:                  
      | _        | j<                  rt?        | j                        D ]U  }|| j8                  j:                  v s| j8                  j:                  |   D ]  }| j                  |   | j                  |<     W | j.                  j1                  d|        y y c c}w )Nr   r   r  T)reverse_direction
_orm_adaptz%s lazy loading clause %sr   Fuse_proxiescompare_keysequivalentsz4%s will use Session.get() to optimize instance loads) rm   rn   r   r'  r(  r)   r  r!  ro   _join_conditioncreate_lazy_clauser  r"  r#  r  r$  r%  order_byr   to_listsql_util_deep_annotater  loggerinforC   _get_clauser   r`   _equivalent_columnsr   list)rq   rQ   rr   join_conditionelemr   r}   rs   s          r=   rn   zLazyLoader.__init__  s$    	.!//77B!//7>I ' 4 E E--==
 --/		
O! ---E		
!% (( !LL)=)=)F)FGGD ''|T.BCGDN
 "DN4dDOOL %%% LL ''*22 " KK;;	 3  	 <<D112$++999![[<<SA373H3H3M--a0 B 3
 KKF 7s   Ic           	     l   d| _         | j                  j                  }| j                  j                  rd}d}nB| j                  j                  t
        j                  us| j                  s|rd}d}n	d}d}ndx}}t        | j                  |d| j                  | j                  j                  ||       y )NTF)rF   rI   rH   rJ   _deferred_history)r   ro   _legacy_inactive_history_stylerJ   r]   r   	MANYTOONEr   rf   r   r  )rq   r`   r@  rJ   r?  s        r=   r   zLazyLoader.init_class_attribute   s    "   ?? 	' ..!N %   ***2F2FF<<-!%$)!!&$(!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| _         y )NF)unique)	bindparams    r=   visit_bindparamzFLazyLoader._memoized_attr__simple_lazy_clause.<locals>.visit_bindparam+  s
    $Ir?   rE  c                    | j                   v r,j                  | j                  | j                      d f       y | j                  )j                  | j                  d | j                  f       y y r5   )_identifying_keyrO   r8   callablevalue)rE  bind_to_colparamss    r=   rF  zFLazyLoader._memoized_attr__simple_lazy_clause.<locals>.visit_bindparam0  sh    ))[8!#I$>$>? ##+y}}dIOODE ,r?   )r5  r6  r  r"  r,   traversecloned_traverse)rq   	lazywhere	criterionrF  rK  rL  s       @@r=   "_memoized_attr__simple_lazy_clausez-LazyLoader._memoized_attr__simple_lazy_clause"  s    ++OOlD1
	 #,T->->	;	% 	)R+)GH
	F ,,rK9
	 &  r?   c                   | j                   \  }}|,t        j                  ||D cg c]  \  }}}|
 c}}}      S | j                  j                  }|j                         }	t        j                  |	      }
|t        j                  z  r|t        j                  z  }i }|D ]K  \  }}}|>|r(|t        j                  z  r|j                  ||
||      }n|j                  ||
||      }|||<   M ||fS c c}}}w r5   )r&  r5  adapt_criterion_to_nullro   rQ   objr   instance_dictr   INIT_OKLOAD_AGAINST_COMMITTED#_get_committed_state_attr_by_column_get_state_attr_by_column)rq   r   r   rP  
param_keysr8   identrJ  r`   or  rL  s               r=   _generate_lazy_clausez LazyLoader._generate_lazy_clauseB  s    $ 8 8	:=33D$5CCD  %%,,IIK((+[((({***G!+C w)K)KK"FFueWE #<<ueWE  F3K ", &  3 Es   C5c                :    t        j                  d| d|d      )Nr   z ' is not available due to lazy='r   r   s       r=   r   zLazyLoader._invoke_raise_loadb  s    ((8<dC
 	
r?   Nr   c                   |j                   s>| j                  j                  s|j                  r|j                  st
        j                  S |j                    }d }	| j                  xr | xs |j                   }
|t        j                  z  s|
r|t        j                  z  s|rt
        j                  S | j                  r;|t        j                  z  s(|
r|t        j                   z  r| j#                  ||d       t%        |      }|s\|t        j                  z  rt
        j                  S t'        j(                  dt+        j,                  |      d| j                   d      |
r@| j/                  |||      }	t
        j                  |	v rt
        j                  S t
        j0                  |	v rt
        j0                  S | j2                  j4                  st7        j8                  |	      ry t7        j:                  |	      ry | j                   |j<                  v r#|t        j>                  z  st
        j@                  S |jC                  | jD                  |	||      }||t
        jF                  u ry |S |t        j                  z  r|t        j                   z  st
        j                  S | jI                  |||	||||||	      S )Nr   r   z> is not bound to a Session; lazy load operation of attribute 'r   )r   lazy_loaded_from)%r8   ro   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   r6   r   _get_ident_for_use_get	NEVER_SETr`   allow_partial_pksr%   r   
issupersetdictDEFERRED_HISTORY_LOADr   _identity_lookupr  PASSIVE_CLASS_MISMATCH_emit_lazyload)rq   r   r   ry   extra_criteriaextra_optionsalternate_effective_pathexecution_optionspendingprimary_key_identityr   r   instances                r=   r   zLazyLoader._load_for_stateg  sx    yy((88++##'222ii-#,,OK$Nw7N7N3N+,,,W*6667'999 k222 [::: ##E7G< '---+===// %%e,dhh8  #'#>#>$  $559MM+===%//3GG+555
 ;;00!../CD!,,-AB EJJ&+"C"CC+888 //$!&	 0 H #3JJJ#Ok000!>!>>+==="" $

 
	
r?   c           	        |j                   j                  }|t        j                  z  r|j                  }n|j
                  }|j                  }| j                  j                  D cg c]  } |||| j                  |   |       c}S c c}w )Nr   )	r   r`   r   rW  rX  rY  rk  r   r#  )rq   r   r   r   instance_mapperget_attrr  pks           r=   rg  z!LazyLoader._get_ident_for_use_get  s    --..[777&JJH&@@H

 kk--
- UE4#8#8#<gN-
 	
 
s   ' B
zsqlalchemy.orm.strategy_optionsc
                v    t         j                  j                   j                  j	                         }
t        j                  |
g|
j                  t        t        j                        }t        j                  }|d|dz  } j                  j                  0|j                   j                    j                  j                        }|j"                   }|s|t$        j&                  z  rt        j(                  ddi      |_         j,                  }|j.                  s|r|j0                  rs||j2                   j                     }n| j                     }|j.                  }|r2|j0                  r&d}|t5        j6                   j                  |      fz  }||_        n5|$|j                   j:                   j                     }n| j                     }|r|xj8                  |z  c_        |xj<                  d|iz  c_        |rL j>                  r&|t@        jB                  z  s jE                  ||d       tG        jH                  |||||	      S  jJ                  r jJ                  |_&         fd}|xjN                  | j                  ffz  c_'         jQ                  ||      \  }}|	r#t         jR                  jU                  |	d	|i      }	nd	|i}	 j"                  |jV                  v r#|t@        jX                  z  stZ        j\                  S |r3t        j^                  t4        j`                  |jc                               r4y t        j^                  t4        jd                  |jc                               ry  j>                  r&|t@        jB                  z  s jE                  ||d       |f|_3        |ji                  |||	
      }|jk                         jm                         jo                         } jp                  r|S ts        |      }|r,|dkD  r"t        jt                  d j                  z         |d   S y )N)_raw_columns_propagate_attrs_label_styler   F)_invoke_all_eagers_lazy_loaded_from	autoflush_current_pathr  )load_optionsrs  c                z   j                   j                  D ]  }|j                  t        j                  u s |j
                  s-t        |j                  t              rHj                  j                  | j                  j                  |j                           j                  |      j                  |         y r5   )ro   _reverse_propertyr]   r   rA  _use_getr   r   r  r$   _construct_for_existing_pathr   r  rQ   lazyloadprocess_compile_state)compile_contextrevrq   strategy_optionss     r=   _lazyload_reversez4LazyLoader._emit_lazyload.<locals>._lazyload_reverseB  s    ++== MMZ%9%99&s||Z@$))FF'77EEJJ hsm$9$9/$J >r?   _sa_orm_load_options)rs  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_optionsro   	secondaryselect_fromr`   r8   r   NO_AUTOFLUSHimmutabledict_execution_optionsr   r  r   	load_pathr6   LoaderCriteriaOption_with_options_path_registryr   r(  r   re  r   r   load_on_pk_identityr  _order_by_clauses_with_context_optionsr]  
EMPTY_DICT
merge_withrk  rl  r   r   has_intersection	_none_setvalues
_never_set_where_criteriaexecuterD  scalarsallrC   lenwarn)rq   r   r   ru  r   ry   rp  rq  rr  rs  clauseelementstmtr  rt  r   effective_pathr<   r  lazy_clauserL  r   lr  s   `                     @r=   ro  zLazyLoader._emit_lazyload  s     >>>>668(('*;;7,DD	
 $88"'!&
 	

 ))5##T11;;D ii- g
 7 77&*&8&8+u9M&ND#,,'g.E.E'/!&1E1E!F!9$:N:N!O%%D72211$++~N  "&D%- #\\889M9MNN 6d6J6JKN-//>!BB!!'K4H4H*H''wG..$)"3  >>%)^^D"	K 	"" 4 45'
 	
" #88HV $ : :!*L! '!
 HH

"k???'444$$X%7%7I""8#6#6Hg0D0D&D##E7NC +~&,= ! 
 ((*..0<<MFAq5IIJ../ ay r?   c	                   | j                   |j                  j                  rd|j                  j                  j
                  rD| j                   |j                  j                  j
                  v r| j                  ||||||||      S | j                  r|rw|j                  rkt        j                  |j                  t        | ||j                  r|j                  |      nd             }	|d   j                  | j                   |	f       y |j                  s|j                   r&fd}
|d   j                  | j                   |
f       y y )Nr   c                *    | j                  |       y r5   )_reset)r   r  r  r8   s      r=   reset_for_lazy_callablez@LazyLoader.create_row_processor.<locals>.reset_for_lazy_callable  s     UC(r?   )r8   r  _is_user_refreshr   r   r   r	  r   r   r#   "_instance_level_callable_processorrY   LoadLazyAttribute_generate_extra_criteriarO   populate_existingalways_refresh)rq   r   rw   rx   ry   r`   r   rz   r   set_lazy_callabler  r8   s              @r=   r   zLazyLoader.create_row_processor  s8    hh   11..??GMM::KKK;;	 	 ""w73J3J @@$$! #22  88A!	 !" u$$dhh0A%BC&&&*?*?	) u$$dhh0G%HI +@r?   )rQ   r)  rr   zTuple[Any, ...])r   r   r   r   r   __annotations__rn   r   rQ  r]  r   r   r  r   rg  preload_modulero  r   r   r   s   @r=   r  r    s    
I  $#//''33..:/:?N:x 
D!@!@
 !%//u
n
 T:;[ <[zEJr?   r  c                  :    e Zd ZdZd Zd Zej                  fdZy)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                P    || _         |j                  | _        || _        || _        y r5   r8   rr   ry   rp  )rq   r8   initiating_strategyry   rp  s        r=   rn   zLoadLazyAttribute.__init__  s&    /<<,r?   c                    | 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  )rp  r   r  r8   rr   ry   )rq   s    r=   __getstate__zLoadLazyAttribute.__getstate__  sE    *II  88 --|| 	
 	
r?   c                    | j                   }|j                  j                  }|j                  |   }|j                  | j
                     }|j                  ||| j                  | j                        S )N)ry   rp  )	r8   r   r`   rW   _strategiesrr   r   ry   rp  )rq   r   r   r8   ry  r:   r   s          r=   r   zLoadLazyAttribute.__call__  sn    hh--..%%c*##D$5$56''LL..	 ( 
 	
r?   N)	r   r   r   r   rn   r  r   r   r   r   r?   r=   r  r    s!    "-
 '1&<&< 
r?   r  c                      e Zd ZdZdZddZy)
PostLoaderz;A relationship loader that emits a second SELECT statement.r   Nc                   |j                   j                  xs t        j                  j                  |z   }|j                         }t        j                  d|i      }|r"|j                  j                  dd       }|dk(  }	nd }d}	|| j                  j                  s#t        j                  d| j                   d      |j                  j                  dt        |        |      }|	s|dk  r|d||fS |	s"|j!                  dt        |        |d	z
  i      }t"        j$                  j'                  ||| j                        r|d||fS || j                     }
|| j                     }|
j)                  |j*                  d
      s;|r|j,                  dz  |kD  r'|d||fS |j/                  | j0                        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)rv   current_pathr6   PathRegistryroot_get_top_level_contextr   r  r   rX   ro   _is_self_referentialr   r   rs  idunionr   PostLoadpath_existscontainsr   lengthcontains_mapperr`   )rq   r   rx   ry   
join_depthr  top_level_contextrs  r  unlimited_recursionpath_w_propeffective_path_w_props               r=   _setup_for_recursionzPostLoader._setup_for_recursion  s   !!..L(2G2G2L2L $::< ..'):;
 %00445FMO"1R"7"O"'&''<<00=++, -88 
 &77;;#BtH:.O '?Q+>"%#	  '$5$;$;+BtH:6!8K%! ''^T%9%9
 "5*;_LL4//0 .t/C/C D##G$6$6A(//!3j@&)'	  '66t{{C"%#	  t%6GGr?   r5   )r   r   r   r   r   r  r   r?   r=   r  r    s    EI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                \    t         |   ||       | j                  j                  | _        y r5   rm   rn   ro   r  rp   s      r=   rn   zImmediateLoader.__init__W  %    ...99r?   c                X    | j                   j                  d      j                  |       y N)r   r  ro   r   r   r   s     r=   r   z$ImmediateLoader.init_class_attribute[  $    **!	


v
&r?   c	                   |j                   j                  j                  sy | j                  |||| j                        \  }	}
}}|
s"t
        j                  t        j                  z  }n!t
        j                  t        j                  z  }t        j                  j                  ||	| j                  | j                  | j                  ||||	       y r5   )rv   r   _enable_eagerloadsr  r  r   PASSIVE_NO_FETCH_RELATEDr   re  r   r   r  callable_for_pathrQ   ro   _load_for_path)rq   r   rw   rx   ry   r`   r   rz   r   r  
run_loaderrs  r  flagss                 r=   r   z$ImmediateLoader.create_row_processor`  s     $$44GG %%gtWdooN	
 
 77+:N:NNE**[-A-AAE**KK  
	
r?   c	                   |rJt        |j                  j                        }	||j                         f|	_        |j                         }
|	f}nd }	|}
d}| j                  }| j                  j                  d      }|D ]i  \  }}|j                  }|s||vs|j                  ||||
|      }|t        t        j                  fvsH|j                  |      j                  |||       k y )Nr   r  )rq  rr  rs  )r$   rx   r  _recurser   _truncate_recursiver8   ro   r   rk  r   r   r   r   get_implset_committed_value)rq   r   rx   states	load_onlyry   r  r  rs  new_optrr  rq  r8   
lazyloaderr   	overwriter  rJ  s                     r=   r  zImmediateLoader._load_for_path  s     7<<../G  "GO (,'?'?'A$$JMG'+$Mhh))778MN
 &E9JJECu,"22"/-E&7 3   (::!  NN3';;ue !'r?   )	r   r   r   r   rn   r   r   r  r   r   s   @r=   r  r  S  s    I:'
(
T+r?   r  subqueryc                  x     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                \    t         |   ||       | j                  j                  | _        y r5   r  rp   s      r=   rn   zSubqueryLoader.__init__  r  r?   c                X    | j                   j                  d      j                  |       y r  r  r   s     r=   r   z#SubqueryLoader.init_class_attribute  r  r?   c                v   |}|j                   }t        j                  |d         }| j                  j	                  |      r*| j
                  |d   u r| j                  | j
                  }}n||d   }}|rf|j                  |   j                  j                  |   }	t        |      t        |	      z
  }
|
r)|	t        j                  j                  ||
 d        z  }	n|}	|j                  }|D cg c]<  }t        |	j                   d   j                  |j                   |   j"                        > }}||||	fS c c}w )Nr   r
   )rx   r6   _class_to_mapperrQ   isaro   	_entitiesentity_zeror  r  r   r  coercelocal_columnsgetattrr  r   r8   )rq   orig_query_entity_index	subq_pathcurrent_compile_stateis_rootgiven_subq_pathsubq_mapperleftmost_mapperleftmost_propnew_subq_path
additionalleftmost_colsr}   leftmost_attrs                 r=   _get_leftmostzSubqueryLoader._get_leftmost  sN    $NN	//	!= KKOOK($$	!4-1[[$:N:N]O-8)A,]O 2;;'k..8M Y#m*<<J!;!;!B!Bzkl+"  ,M%33 #

 #	 ""1%,,11!488 # 	 
 }mKK
s   -AD6c           	        |j                         j                  d       }t        j                  j	                  t        j                        }|j
                  j                  |j
                         |}|j                  sEd|_         |j                  j                  |gt        ||      D 	ch c]  }	|	d   |	d    c}	  |j                  |D 
cg c]:  }
t        j                  j                  t        j                   j"                  |
      < c}
|j%                               }||_        |j(                  }|du rd|_        nN|L|D ch c]  }|j,                   c}D ]/  }t/        |      j1                  |j2                        r(d|_         n |j4                  sd|_        |j*                  du rB|j6                  r6t9        j:                  ||j6                        }|r|j=                  ||z          |j?                  t@              jC                         }tE        jF                  ||d      }|S c c}	w c c}
w c c}w )NF)rv   r  Tr   use_mapper_path)$_clone	correlater   Query__new____dict__update	_from_obj_enable_assertionsr  non_generativer   _adapt_col_listr+   	coercionsexpectrolesColumnsClauseRole_get_current_adapterr}  distinct_target_key	_distincttabler   rj  r   _has_row_limiting_clauser  r5   expand_column_list_from_order_by_set_entitiesset_label_styler-   r  r6   r&   )rq   orig_compile_state
orig_queryr  r  leftmost_relationshiporig_entityqq2entr\  target_colsr*  r}   tto_addembed_q
left_aliass                     r=   _generate_from_original_queryz,SubqueryLoader._generate_from_original_query  s"    ))$/ [[  -
1::& {{#(A (AMM((	  4"2D   8}0	 M 	0 )88 '&A $$SYY%@%@!D& 335
 %3GG$&AK ( (33{!agg{3;'221==A"&AK 4 ))"$A;;$1#6#6 >>Q00F f 45 ##$BCLLN**Wd

 A. 4s   .H6
?H;I c                n   g }t        |j                               }t        |      D ]W  \  }\  }}|dkD  r+||dz
     d   j                  }|j	                  |      r|n|}	n|}	|j                  |	|j                  f       Y t        |      dk  r|}
nKt        |d   d         }|j                  r|j                  }
n!t        j                  |j                  d      }
| j                  j                  }|D cg c]/  }t        |
| j                   j"                  |   j                        1 }}|||
fS c c}w )Nr   r
   r'   r  Tr  )r;  pairs	enumerater`   r  rO   r8   r  r)   r!  r  r6   r&   ro   r	  r
  rQ   r   )rq   r<  r  to_joinr?  ir`   r:   prev_mapper	to_appendparent_aliasr8  
local_colsr}   
local_attrs                  r=   _prep_for_joinszSubqueryLoader._prep_for_joins[  s5   Y__&'!*5!1A~1u $AEl1o44+6??6+BK	"	NNItxx01 "2& w<! &L72;q>*D$$#{{  (44KK  ))77
  
 L$++"?"?"B"F"FG 	 
 
L00	
s   74D2c                d   t        |      }|dk(  r$t        ||d   d         j                  |      g}n^|dk(  rDt        ||d   d         j                  |      t        ||d   d         j                  |      g}n|dkD  r|dd D cg c]F  }t        |d         j                  st        j                  |d         n|d   j                  |d   fH }}g }	|rb|j                  d      }t        |d   |d         }
|r|
j                  |d   d         }
n|
j                  |      }
|	j                  |
       |rbt        ||d   d         j                  |	d   j                        g|	z   t        ||d   d         j                  |      gz   }|D ]  }
|j                  |
      } |S c c}w )Nr
   r   r'   r  )r  r
  of_typer)   r!  r6   r&   r  poprO   rQ   join)rq   r5  rA  r<  rE  effective_entityltjitemmiddleinnerattrs              r=   _apply_joinszSubqueryLoader._apply_joins  s    'l!8
GAJqM2::;KLG AX
GAJqM2::<Hgbk!n5==$G 1W $AbM
 *D  'tAw/@@ !--d1g6!!W^^G *  
 Ezz!}tAwQ0<<q	!5D<<5DT"  WQZ]3;;E!HOOLM L'"+a.9AA(  DtA  I
s   AF-c                    |j                   }|r?|j                  r3|t        j                  | j                  |j                  |            fz  }|j                  |      } |j                  | }|S r5   )r  r   r6   r  r  r  _with_current_pathoptions)	rq   r   r5  r  rewritten_pathr2  rM  ry   new_optionss	            r=   _setup_optionszSubqueryLoader._setup_options  ss    " !..w..--KK44W= K   0AII{#r?   c                v      j                   j                  r! fd}|j                  | j                         }|S )Nc                    | xj                   t        t        j                  j                  j
                              z  c_         y r5   eager_order_bytupler   r4  ro   r3  r  rq   s    r=   _setup_outermost_orderbyzISubqueryLoader._setup_outermost_orderby.<locals>._setup_outermost_orderby  s3    ..%LL!5!5!>!>?3 .r?   )ro   r3  _add_context_option)rq   r5  r`  s   `  r=   r`  z'SubqueryLoader._setup_outermost_orderby  s;    ((
 %%($*>*>A r?   c                  ,    e Zd ZdZdZd Zd Zd Zd Zy)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   rs  r  rL  subq_datac                    |j                   | _         |j                  | _        |j                  | _        |j                  xs i | _        || _        d | _        y r5   rd  )rq   r   re  s      r=   rn   z(SubqueryLoader._SubqCollections.__init__   sI     #??DL%,%>%>D" ' 4 4D!...BDKDIDJr?   c                r    | j                   | j                          | j                   j                  ||      S r5   )rf  _loadrX   )rq   r8   defaults      r=   rX   z#SubqueryLoader._SubqCollections.get
  s*    zz!

::>>#w//r?   c                   t        j                  t              | _        | j                  }|j
                  J |j                  | j
                        }| j                  j                  r|j                         }t        |j                  | j                              }t        j                  |d       D ]*  \  }}| j                  |   j                  d |D               , y )Nc                    | dd  S )Nr
   r   xs    r=   r>   z7SubqueryLoader._SubqCollections._load.<locals>.<lambda>  s
    !AB%r?   c              3  &   K   | ]	  }|d      yw)r   Nr   r   vvs     r=   r   z8SubqueryLoader._SubqCollections._load.<locals>.<genexpr>  s     $7QrRUQ   )collectionsdefaultdictr;  rf  re  r   with_sessionr  _populate_existingr  rL  	itertoolsgroupbyextend)rq   r5  rowsr   vs        r=   ri  z%SubqueryLoader._SubqCollections._load  s    $006DJ		A99$$$t||,A  33'') -.D!))$@1

1$$$7Q$77 Ar?   c                >    | j                   | j                          y y r5   )rf  ri  )rq   r   r  r  s       r=   r  z&SubqueryLoader._SubqCollections.loader   s    zz!

 "r?   N)	r   r   r   r   r   rn   rX   ri  r  r   r?   r=   _SubqCollectionsrc    s"    	
			0
	8"	r?   r}  c           	     z   |j                   }|j                  j                  r|j                  j                  ry |j                  j                  |      }d|_        || j                     }|j                  |j                  dd       }	|	|	}
n| j                  }
|j                  j                  j                  dt        j                  j                  t        j                  j                  f      \  }}|t        j                  j                  u }||z   }||z   }|j                  j                  j                  dt         f|j                        }t#        j$                  |d      }|j&                  r>|j(                  j*                  t-        j.                  d| d|d       |j0                  }|j3                  |d	
      }| j5                  ||||      \  }}}}| j7                  ||||||      }t        j8                  |
      }|j                  j                  j;                  |j<                  dt         f|d||fi      |_        |j?                  d	      }| jA                  ||      \  }}} |jB                  | }| jE                  |||||
      }| jG                  ||||||
|      }| jI                  |      }|S )NTpath_with_polymorphic)subquery_pathsNr2  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)%rv   r   r  _for_refresh_stater  indexloaders_require_bufferingro   rX   r   r  r   r  r6   r  r  r   r   _get_plugin_class_for_plugin_is_lambda_elementr  r  r   r  	_resolved_create_entities_collectionr  r=  r  r  rs  _set_enable_single_critrH  add_columnsrS  rY  r`  )rq   r   rw   rx   r  ry   rz   rv   r  with_poly_entityrM  r  rW  r  r2  compile_state_clsr1  r  r  r3  r<  r5  rA  rG  rE  s                            r=   _setup_query_from_rowprocz(SubqueryLoader._setup_query_from_rowproc$  s     ----@@,,??"/"9"9"?"?"M,0)D(()  88$$&=t
 '/#{{$+MM$D$D$H$H$""'')>)>)C)CD%
!	> x44999$	'$. ]]5599>*GMM

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

 KK()&}}??JJ%%~.
(9n*E 
 %%e,,0,@,@	-
)\ AMM:&w
L2B
 
 ))!,r?   c	           
        |rL|j                   j                  6|j                   j                  j                  rt        j                  dd       |j
                  r| j                  ||||||||      S | j                  |||| j                        \  }	}
}	}	|
sy t        |j                   t              sy | j                  j                  | j                     j                  j                  st!        j"                  d| z        t%        |      dk(  r+t'        j(                  |j*                  | j                        s%y t'        j(                  |d   | j                        sy | j-                  ||||d   ||      }|y |j.                  J || j0                     }| j0                  j2                  }|j5                  |j6                  d      }|/| j9                  ||      }|j;                  |j6                  d|       |r|D cg c]  }|j<                  |    }}| j>                  r| jA                  |||||       y | jC                  |||||       y c c}w )NzThe subqueryload loader option is not compatible with DML statements such as INSERT, UPDATE.  Only SELECT may be used.This warning will become an exception in a future release.2.0J'%s' does not support object population - eager loading cannot be applied.r
   r  rs  )"rv   	statementis_dmlr   warn_deprecatedr   r	  r  r  r   r   rQ   rY   r8   implsupports_populationr   r   r  r6   _entity_isar  r  r   ro   r	  rX   r   r}  r   rk   rC   _create_collection_loader_create_scalar_loader)rq   r   rw   rx   ry   r`   r   rz   r   _r  re  rF  rs  r}   s                  r=   r   z#SubqueryLoader.create_row_processor  sT    %%//;%%//66  M 	   ;;	 	 #77T7DOO
:q! '//1FG {{((277KK,,@BFG  t9>''(@(@$++N%%d2h<--H
 <||###D(()))77

 hhw11=A//>KHHW''D6@Aj'//!,jJA<<**j* &&j* Bs   Ic                6    |j                  |       fd fd}|d   j                   j                  f       |d   j                   j                  |f       |j                  r+|d   j                   j                  j                  f       y y )Nc                     j                    |      d      }| j                  j                        j                  | ||       y )Nr   )rX   r  r8   r  )r   r  r  
collectionrs  rq   tuple_getters       r=   load_collection_from_subqzKSubqueryLoader._create_collection_loader.<locals>.load_collection_from_subq  s<    (c):B?JNN488$88ujr?   c                8    j                   |vr | ||       y y r5   r8   )r   r  r  r  rq   s      r=   &load_collection_from_subq_existing_rowzXSubqueryLoader._create_collection_loader.<locals>.load_collection_from_subq_existing_row  s     xxu$)%< %r?   r   existingeager_tuple_getterrO   r8   invoke_all_eagersr  )	rq   r   r   rs  rF  r   r  r  r  s	   `  `   @@r=   r  z(SubqueryLoader._create_collection_loader  s     ++J7		= 	5  $((,E!FG:%%XX=>	
 $$w&&+2D2D'EF %r?   c                6    |j                  |       fd fd}|d   j                   j                  f       |d   j                   j                  |f       |j                  r+|d   j                   j                  j                  f       y y )Nc                     j                    |      d      }t        |      dkD  rt        j                  dz         |d   }| j	                  j
                        j                  | ||       y )Nr5   r
   LMultiple rows returned with uselist=False for eagerly-loaded attribute '%s' r   )rX   r  r   r  r  r8   r  )r   r  r  r  scalarrs  rq   r  s        r=   load_scalar_from_subqzCSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subq-  sk    (c):GDJ:"		GIMN
  ]FNN488$88vNr?   c                8    j                   |vr | ||       y y r5   r  )r   r  r  r  rq   s      r=   "load_scalar_from_subq_existing_rowzPSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subq_existing_row8  s     xxu$%eUC8 %r?   r   r  r  r  )	rq   r   r   rs  rF  r   r  r  r  s	   `  `   @@r=   r  z$SubqueryLoader._create_scalar_loader(  s     ++J7		O	9 	5  $((,A!BC:%%XX9:	
 $$w&&+2D2D'EF %r?   )r   r   r   r   rn   r   r  r=  rH  rS  rY  r`  r}  r  r   r  r  r   r   s   @r=   r   r     s^      I:'
/LbbH-1^4l D2 2hFPcJG.Gr?   r   joinedc                  ~     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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                \    t         |   ||       | j                  j                  | _        y r5   r  rp   s      r=   rn   zJoinedLoader.__init__O  r  r?   c                X    | j                   j                  d      j                  |       y r  r  r   s     r=   r   z!JoinedLoader.init_class_attributeS  r  r?   c	                <   |j                   j                  sy|r9|j                  -|j                  j                  rt	        j
                  dd       n| j                  rd|_        || j                     }d}
|r| j                  |||j                        nd}|dur| j                  |||||      \  }}}n|j                  |j                  d      sE| j                  r|j                  dz  | j                  kD  ry|j                  | j                         ry| j#                  ||||||||      \  }}}}d|_        |j'                  |j                  dd      }|t)        |      j*                  }
nd}
|| j,                     }t/        j0                  || j                   |||||
| j                   |		       t        j2                  j5                  |j6                        }|r:|t9        j:                  d
      |j6                  D cg c]  }||	 c}|_        yyc c}w )z@Add a left outer join to the statement that's being constructed.NzThe joinedload loader option is not compatible with DML statements such as INSERT, UPDATE.  Only SELECT may be used.This warning will become an exception in a future release.r  TFr  r'   r  )with_polymorphicparentmapperchained_from_outerjoinzDetected unaliased columns when generating joined load.  Make sure to use aliased=True or flat=True when using joined loading with with_polymorphic().)r   r  r  r  r   r  rC   multi_row_eager_loadersro   _init_user_defined_eager_procr   $_setup_query_on_user_defined_adapterr  r  r  r  r`   _generate_row_adaptereager_adding_joinsrX   r)   with_polymorphic_mappersr  r   _setup_entity_queryNONE_SETr   secondary_columnsr   r   )rq   rv   rw   rx   ry   rz   r{   r  r  r|   r  user_defined_adapterclausesadd_to_collectionr  	has_nonesr}   s                    r=   r~   zJoinedLoader.setup_queryX  sV    ,,??''3''..  M 	 \\48M1D(()  ..(@(@  	  u, 99$	!  ==!9!98D??{{Q8))$++6 **!&	!& 04M,88$$&=t
 '&  &&   $DKK ##KK-#9
	
 MM..}/N/NO	+00I   ->>3>!!-A>3/ 3s   HHc                ,   d|j                   vry|j                  j                  }|j                  |j                  dd      }|dur|S |j                   d   }|dd  \  }}||t        |t              r|j                  j                  |      }t        j                  t        j                  j                  |j                  ||j                  j                  d      }n|j                  |j                  d      ra|j                  |j                  d      }	t        j                  t        j                  j                   |	|j                  j                        }n&|j"                  j                  |j                  d       }|j%                  |d|       |S )Neager_from_aliasF user_defined_eager_row_processor)
selectabler0  limit_on_entityr  )r0  )r   rx   rQ   rX   r   r   r   r  aliasr6   
ORMAdapter_TraceAdaptRoleJOINEDLOAD_USER_DEFINED_ALIASr`   r:  r   JOINEDLOAD_PATH_WITH_POLYMORPHIC_polymorphic_adaptersr   )
rq   ry   rv   target_attributesrx   rz   r  root_mapperr:   r  s
             r=   r  z*JoinedLoader._init_user_defined_eager_proc  sx    W%7%77||"" (($$&H%
 %N ""#56 IT%%))%0))((FF  KK;; %G }}((*A $(88!,,.E$  #--,,MM$ $ ? ? (==AAKK 	.	
 r?   c                    |j                  |      }|r1|r/|j                  |      }|j                  |j                  d|       n!|r|}|j                  |j                  d|       |j                  }|||fS )Nr  )_get_entity_clauseswrapr   r   primary_columns)rq   r   r  rx   rz   r  r  s          r=   r  z1JoinedLoader._setup_query_on_user_defined_adapter	  s    
 ,,W5+#7#<#<W#E HH""2$
 #* HH""2$ $33#W.???r?   c	                ^   |j                  |j                  dd       }	|	r|	}
ngt        | j                        }|j                  r|j
                  }nd }t        j                  | j                  ||j                  d      nd dd      }
t        |
      }|j                  d| ft        j                  t        j                  j                  || j                  j                  ddd      }|j                  sJ |0|j                  j                  d| j                   j"                        n| j                   j"                  }|sd}|j$                  j'                  | j(                  ||||||||r|j*                  nd	f	       |j,                  }|j/                  |j                  d
|       ||||fS )Nr  T)flat)r  r  r  joinedloader_ormadapterF)r0  adapt_requiredallow_label_resolveanonymize_labels	innerjoinr   eager_row_processor)rX   r   r)   r  r!  r  r6   r&   r`   _anonymous_fromclause_memor  r  JOINEDLOAD_MEMOIZED_ADAPTERr:  r   ro   r  create_eager_joinsrO   _create_eager_joinr   r  r   )rq   rv   r  rx   ry   rz   r{   r  r  r  to_adaptinspalt_selectableto_adapt_inspr  r  r  s                    r=   r  z"JoinedLoader._generate_row_adapter,	  s     88$$&=t
 'H4;;'D$$!%!%,, &1 #88d8C $	H  )%%&-$$@@77 %! & 	
 '''' " "";0D0D0N0NO%%// 	  &*"((//''&+2''
	
 *;;))+@'J!24JJJr?   c
           	         ||j                   }
n|}
|j                  xr |j                  }d }||j                  vrv|st|j                  rht        j                  |j                  |j                        }t        |      dkD  rt        j                  d      |r|j                  |d      }|d   |}}|||j                  }}|j                  j                  |      }|rt        |dd      rn|j                  j                  |
j                   j                         r|
n j                         }t        |j"                   j$                   j&                        }nXt        t)        j*                   j                   |j                  d       j$                   j&                        }n j&                  }|j,                  sJ | xs" | xs |dk(  xs |j.                  j0                  }|	}|j2                  j5                  d	 j                   fd
      }|r|t7         fd|D              z  }|rwt)        j8                  ||j                  || xs6 |j.                  j0                  xs |xr t;        |t<        j>                         j                   | j                      |      }n jA                  ||d   ||||      }||j                  |<   |j                  |_!        |st        jD                   j&                  jF                        D ]U  }|
jH                  jJ                  jM                  |      s)|r|jN                  |   }|jQ                  ||jR                         W  j&                  jT                  r_|xjV                  t7        |jX                  j[                  t]        j^                   j&                  jT                                    z  c_+        y y )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  l   K   | ]+  }|j                   r|j                  j                         - y wr5   )propagate_to_loaders_resolve_where_criteriar`   )r   aerq   s     r=   r   z2JoinedLoader._create_eager_join.<locals>.<genexpr>	  s1      )4B** **4;;74s   14isouter
_left_memo_right_memor   r  )0r`   r  _should_nest_selectableeager_joinsfrom_clausesr5  #find_left_clause_that_matches_givenr  r  r   r   
setdefaultr
  aliased_insp_entity_for_mapperr  rQ   r  r8   ro   r6   r&   r!  r  represents_outer_joinglobal_attributesrX   r^  _ORMJoinr   r+   Join_splice_nested_inner_joinstop_on_find_columnsprimaryjoinpersist_selectabler}   contains_columnrk   ru   r  r3  r]  _target_adaptercopy_and_processr   r4  )rq   rv   rw   rx   rz   r  r  r  r  rp  r   should_nest_selectablequery_entity_keyindexesclausedefault_towraptowrapefmonclauseattach_on_outsideextra_join_criteriar  	eagerjoinr   s   `                       r=   r  zJoinedLoader._create_eager_join{	  s    &--K&K 11 655 	
    9 99***BB**L,C,CG 7|a 000  &33GAJ?
 4;1:v. #'' -
 **55n
 w 2E:
 **=="t{{3   #3::txx9M9MN"))W%7%7 HH(( ++H'''' '& >}>J&> ''==	 	 -%2%D%D%H%H)4;;7&
" &5 )4) $   ))$$% M++AAM*Kz&#((/K;; - 3
I 66d2h;NI 7@!!"23 )33	  --$$00 1133CCCH%ooc2!??]:: ((((E**;;LL!5!5!>!>?- ( )r?   c	           
        ||d   u sJ |du rt        |t        j                        sJ t        |t        j                  j
                        r!| j                  |||j                  ||||      S t        |t        j                        rQ|j                  }	| j                  |||j                  ||||	|	d   j                  nd       }
|
|j                  s|
j                  s|j                  |
      }nBt        j                  |j                  |
|j                  |j                  |j                        }|
j                   |_        |S | j                  |||j                  ||||j                  |	      }
|
Ut        j                  |
|j                  |j                  |j                  |j                        }|
j                   |_        |S |du r	 J d       y |j#                  |      sy |r-t%        |      d	kD  r|d
   |u sJ |dd |j&                  dd k7  ry t        j                  ||j(                  |d|||d   j                     |      S )Nr  Fr  )entity_inside_join_structure)r  r  )r  detected_existing_path)r  r  z9assertion failed attempting to produce joined eager loadsr'   r   r  )r   r6   r  r+   r  FromGroupingr  elementr  rightr`   r  _splice_into_centerleftr  r  r  r  r  rx   r  )rq   rx   entity_we_want_to_splice_ontojoin_objr  r  rp  r  r  join_right_pathtarget_joinr  s               r=   r  z&JoinedLoader._splice_nested_inner_join
  s   * -R888'50h(9(9:::h ; ;<11-  ,  ("3"34 '22O 88- '2 $B'.. 9 K &  ''0C0C ( < <[ II ( 1 1 # )) ( 0 0#+#6#6!I -8,G,G	)   #<<1MM"191D1D+: = 	 * ( 1 1#  )) ( 0 0$,$8$8!I 1<0K0KI-$$ ,u4ONO -001MN "c*@&AA&E
 *"-1MMMMH &a+tyy2>    3T"X__-*
 	
r?   c                j   |j                   }|r| j                  |||j                        nd}|durE|}|j                  r|r|j	                  |j                        }n8|j                  r,|j                  }n|j                  |j                  d      }|y| j                  j                  ||      r|S y)NFr  )rv   r  r   compound_eager_adapterr  rX   r`   _result_has_identity_key)	rq   r   r   rz   rx   ry   rv   r  	decorators	            r=   _create_eager_adapterz"JoinedLoader._create_eager_adapter
  s    --  ..(:(:  	  u,,I 33	%NN!88	 55)@@	((*?I  ;;//	B r?   c	           
        |j                   j                  j                  sy | j                  j                  | j
                     j                  j                  st        j                  d| z        | j                  rd|_        || j                     }	| j                  ||||	|      }
|
durs| j
                  }t        j                  || j                   |||	| j"                     |
      }| j                  s| j%                  ||||       y | j'                  ||||       y | j                  j)                  d      j+                  ||||||||       y )Nr  TFr  )rv   r   r  rQ   rY   r8   r  r  r   r   rC   loaders_require_uniquingro   r"  r   _instance_processorr`   r  r  r  r   r   )rq   r   rw   rx   ry   r`   r   rz   r   our_patheager_adapterr8   	_instances                r=   r   z!JoinedLoader.create_row_processor
  sN    $$44GG{{((277KK,,@BFG 
 <</3G,,,-22VWh
 %((C33%I <<**7CJO..S)Z   ..%""	r?   c                
   fd}fd}fd}|d   j                  | j                  |f       |d   j                  | j                  |f       j                  r!|d   j                  | j                  |f       y y )Nc                    t        j                  | |      }t        j                  |d      }|j                   | f<    |      }||j	                  |       y y Nappend_without_eventr   r  r   UniqueAppenderrO   )	r   r  r  r  result_listinstr(  r   r8   s	         r=   #load_collection_from_joined_new_rowzSJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_new_row*  sg     $99%LJ--2K 0;Gs|,S>D""4(  r?   c                    | fj                   v rj                   | f   }n>t        j                  | |      }t        j                  |d      }|j                   | f<    |      }||j	                  |       y y r+  r-  )	r   r  r  r/  r  r0  r(  r   r8   s	         r=   (load_collection_from_joined_existing_rowzXJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_existing_row7  s    s|w111%00%> (==5#
 #11 6 4?""E3<0S>D""4(  r?   c                     |       y r5   r   r   r  r  r(  s      r=    load_collection_from_joined_execzPJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_execJ  
    cNr?   r   r  r  rO   r8   r  )rq   r   r8   r(  r   r1  r3  r6  s    ```    r=   r  z&JoinedLoader._create_collection_loader)  s    	)	)&	 	5  XX:;	
 	:%%XX?@	
 $$w&&;< %r?   c                    fd} fd}fd}|d   j                   j                  |f       |d   j                   j                  |f       |j                  r!|d   j                   j                  |f       y y )Nc                     |      |<   y r5   r   )r   r  r  r(  r8   s      r=   load_scalar_from_joined_new_rowzKJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_new_rowY  s     #3E#Jr?   c                j     |      }|v r!||   urt        j                  dz         y y ||<   y )Nr  )r   r  )r   r  r  r  r(  r8   rq   s       r=   $load_scalar_from_joined_existing_rowzPJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_existing_row^  sM     !~H e|5:-IIK . &c
r?   c                     |       y r5   r   r5  s      r=   load_scalar_from_joined_execzHJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_execq  r7  r?   r   r  r  r8  )rq   r   r8   r(  r   r;  r=  r?  s   ` ``    r=   r  z"JoinedLoader._create_scalar_loaderX  s    	(
	&&	 	5  $((,K!LM:%%XX;<	
 $$w&&78 %r?   )NNF)FN)r  z#Union[Mapper, None, Literal[False]]r  z$Optional[path_registry.PathRegistry])r   r   r   r   r   rn   r   r~   r  r  r  r  r  r"  r   r  r  r   r   s   @r=   r  r  D  s    
 I:' $@D7r@2MK^]R GKk
'
k
 !Ek
Z"H<|-^#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                  | _        n~| j                  j                  d      }|r|j                  | _        nO| j                  j                  d   j                  |j                  dd| j                  j                        | _        | j                  rC|r+| j                         | _        | j#                         | _        y | j'                         | _        y | j#                         | _        y )Nr  r   TFr-  )rm   rn   ro   r  r]   r   rA  rC  r   r   rQ   r9  r   r  r:  _init_for_omit_join_m2orE  _init_for_joinrF  _init_for_omit_join)rq   rQ   rr   is_m2or  rs   s        r=   rn   zSelectInLoader.__init__  s$   ...99%%//:3G3GG))5!11;;DN--;;%J !+!3!3!%!8!8!;!C!C-- $!& $ ? ?	 "D " >>#'#?#?#A ,0,?,?,A)#'#;#;#= #224Dr?   c                    t         j                  j                  j                        j	                   fdt              D                j                  j                  D cg c]  }|v s|    c}x}}t        |      dkD  rt        j                  | }d}n|d   }d} j                  dd|||d       S c c}w )Nc              3     K   | ]6  }j                   j                  j                  |d       D ]  }||   f  8 yw)r   N)rQ   r:  rX   )r   r   equivpk_to_fkrq   s      r=   r   z5SelectInLoader._init_for_omit_join.<locals>.<genexpr>  sF      
#88<<QC HQK C !#s   <?r
   Fr   T)rk  ro   r1  local_remote_pairsr   r;  rQ   r   r  r+   tuple_
query_info)rq   r   rK  fk_colsrJ  rL  rV  s   `     @r=   rQ  z"SelectInLoader._init_for_omit_join  s      00CC
 	 
(^
 	
 &*[[%<%<
%<cxHSM%<
 	
' w<!jj'*GHajGHueWgxNN
s   (	B>2B>c                &   | j                   j                  }t        |      dkD  rt        j                  | }d}n|d   }d}| j
                  j                  d      }|D cg c]  }|j                  |    }}| j                  dd||||      S c c}w )Nr
   Fr   Tr  )	r`   r   r  r+   rX  ro   r   r#  rY  )rq   rK  rJ  rL  r  r{  lookup_colss          r=   rO  z&SelectInLoader._init_for_omit_join_m2o  s    ++))w<!jj'*GHajGH))778MN
AHI2z2226I%'8[
 	
 Js    Bc                b   t        | j                  j                        | _        t	        | j                        }| j                  j
                  D cg c]  }|j                  |       }}t        |      dkD  rt        j                  | }d}n|d   }d}| j                  dd|||d       S c c}w )Nr
   Fr   T)r&   rQ   r\   rD  r)   r   _adapt_elementr  r+   rX  rY  )rq   pa_inspr   rK  rJ  rL  s         r=   rP  zSelectInLoader._init_for_join  s    )$++*<*<=$,,-37;;3J3J
3JCG""3'3J 	 
 w<!jj'*GHajGHudGWhMM
s   B,c                X    | j                   j                  d      j                  |       y r  r  r   s     r=   r   z#SelectInLoader.init_class_attribute  r  r?   c	                N   |j                   r| j                  ||||||||      S | j                  |||| j                        \  }	}
}}|
sy |j                  j
                  j                  sy | j                  j                  | j                     j                  j                  st        j                  d| z        t        |      dk(  r+t        j                   |j"                  | j                        s%y t        j                   |d   | j                        sy |	}|| j$                     }|j'                  |j(                  dd       }|t+        |      }n| j,                  }t.        j0                  j3                  ||| j                  | j$                  | j4                  ||||	       y )Nr  r  r
   r  r  )r   r	  r  r  rv   r   r  rQ   rY   r8   r  r  r   r   r  r6   r  r  ro   rX   r   r)   r  r   r  r  r  )rq   r   rw   rx   ry   r`   r   rz   r   r  r  rs  r  selectin_pathr  r  rM  s                    r=   r   z#SelectInLoader.create_row_processor  s      ;;	 	  %%T7t & 
	

 $$44GG{{((277KK,,@BFG  t9>''(@(@$++N%%d2h<&4//0 '?? 7
 '&'78#{{**KK  
	
r?   c	                	    ! |r j                   |vry  j                  }	|	j                  rt        j                  t
              }
g } j                   |D ]  \  }j                  !t         !fd|	j                  D              }t        j                  |v r j                  }	 n2d |vr|
|   j                  !|f       n|j                  !|f        |	j                  s/|D cg c]"  \  }}|j                   d   ||j                  |f$ }
}}|	j                  }|	j                  }|	j                   s;|j"                  r/|D cg c]  }|j%                  |       }}|j%                  |      }t'        j(                  dg| }|j+                         }|j+                         }t-        j.                  ||gt0        t2        j4                  d|d      }|	j                   s|j7                  |      }na|j7                   j8                        j;                  t=         j8                   j>                  j                         jA                  |            }|jC                  |jE                  tG        jH                  d                  }|jJ                  jL                  }| j>                     }||jN                  u r|jP                  }nP|jP                  }|jN                  jP                  }tS        ||      D cg c]  \  }}|jU                  ||       }}}|r5|jV                  r)|t'        jX                  ||j[                  |            fz  }||j]                         } |j^                  | }|ja                  d|i      }|jb                  r|je                  d	
      } j>                  jf                  r}|	j                   sP j>                  jf                  }|j"                  r|D cg c]  }|j%                  |       }} |jf                  | }n! fd}|ji                  | j>                        }|	j                  r jk                  
|	|||       y  jm                  
|	|||       y c c}}w c c}w c c}}w c c}w )Nc              3  d   K   | ]'  }j                  |t        j                          ) yw)rx  N)rY  r   PASSIVE_NO_FETCH)r   lkr`   r   
state_dicts     r=   r   z0SelectInLoader._load_for_path.<locals>.<genexpr>V  s?      & ; 44" * ; ;	 5  ;s   -0r
   r{  r  )compile_state_pluginplugin_subject)r}  r  r   r~  primary_keysr  T)r  c                    | xj                   t        t        j                  j                  j
                              z  c_         y r5   r\  r_  s    r=   r`  z?SelectInLoader._load_for_path.<locals>._setup_outermost_orderby  s3    #22eT%9%9%B%BC7 2r?   )7r8   rE  rH  rs  rt  r;  rQ   rk  r^  rM  r   r   rF  rO   rK  rJ  rI  r!  r^  r6   Bundler  r.   r  r-   r   r  r  rD  rL  r
  ro   rJ  filterin_r+   rE  rv   select_statementuser_passed_queryr  zip'_adapt_cached_option_to_uncached_optionr   r  r  r  rV  _update_compile_optionsr  rs  r3  ra  _load_via_child_load_via_parent)"rq   r   rx   r  r  rM  ry   r  rs  rY  
our_statesnone_statesr  related_identr   rK  rJ  r   
bundle_ent
bundle_sql
entity_sqlr5  r2  r  rX  cached_optionsuncached_optionsorig_optuncached_optr]  r=  r`  r`   rg  s"   `             `                 @@r=   r  zSelectInLoader._load_for_path>  s    2%%
%%$006JK[[F$* y"ZZ
 % & )::& ! (99]J!%!:!:J },}-44
I6  &&z9'EF7 %+< )) )/(.$E9 1uejj)<(.  
 $$$$((  00DKDKS$33C8G   +99'B__T4G4
224
%88:
%%$j17,DD(-"2	
 (( ./A
 d00166**D,@,@,D,DEMM$A HHW[[~!>?@ **;;
2 d223222$22K'55N&88FF /2"$4/	/*Hl @@\/	   w..--$44W= K &+??ANAII{#%%&GH$$##d#;A((,,!%!5!5!>!>#44 %3&$2D )77=$2 # & AJJ/
 )),d.B.B %%  ! !!J74Eu d<&s   ,'Q2
Q8>Q=.Rc           	        | j                   }t        |      }|r|d| j                   }	|| j                  d  }|j                  j	                  |d|	D 
cg c]  }
|j
                  r|
d   n|
 c}
i|      j                         D ci c]  \  }}||
 }}}|	D ]d  }
|j                  |
d       }||
   D ]H  \  }}}|s| j                  |v r|j                  | j                        j                  |||s|n|g       J f |r|D ]C  \  }}}|s| j                  |v r|j                  | j                        j                  ||d        E y c c}
w c c}}w )Nr   rj  rL  rs  )rC   sorted
_chunksizer   r  rL  rD  rX   r8   r  r  )rq   rv  rw  rY  r5  r   rs  rC   our_keyschunkr8   r   r{  datarelated_objr   r  r  s                     r=   rt  zSelectInLoader._load_via_child  s    ,, *%Q1E 12H $OO33&',)', '1&9&9CFsB',) '8 4 	 &(		DAq 1	    #hhsD1/9#+E5)$U): NN488,@@+2	 0? # D (3#E5)U!2 NN488$88tL (35)s   EEc           
     B   | j                   }|rdnd }|r|d| j                   }|| j                  d  }|D 	
cg c]  \  }	}
}}|j                  r|	d   n|	 }}}
}	}t        j                  t
              }t        j                  |j                  j                  |d|i|      j                         d       D ]   \  }}||   j                  d |D               " |D ]  \  }	}
}}|s| j                  |v r|j                  |	|      }|sX|rVt        |      dkD  rt        j                   d| z         |
j#                  | j                        j%                  |
||d          |
j#                  | j                        j%                  |
||        |ry y c c}}}
}	w )	Nr   r   rj  r  c                    | d   S r   r   rm  s    r=   r>   z1SelectInLoader._load_via_parent.<locals>.<lambda>^  s    !A$r?   c              3  &   K   | ]	  }|d      yw)r
   Nr   rp  s     r=   r   z2SelectInLoader._load_via_parent.<locals>.<genexpr>`  s     1qr!uqrr  r
   r  )rC   r  rL  rs  rt  r;  rw  rx  r   r  rD  ry  r8   rX   r  r   r  r  r  )rq   rv  rY  r5  r   rs  rC   _empty_resultr  r8   r   rg  r  rj  r  r   r{  r  s                     r=   ru  zSelectInLoader._load_via_parentH  s    ,,%4q4??3E#DOO$56J :?9>5C
I %--A369>  
 **40D!))''*L9&7 (  &(1 Q1q11 6;1UJ	 TXX%;!XXc=9
::*		.045
 NN488,@@z:a= NN488,@@z:' 6;) s   F
)r   r   r   r   rs  
namedtuplerY  r  rn   rQ  rO  rP  r   r   r  rt  ru  r   r   s   @r=   rB  rB  ~  sb    I (''	

J J5<O,
 N'
N
`Qf5Mn/r?   rB  c                    fdfd}fd}t        j                  | d|ddd       t        j                  | d|ddd       y )Nc           	        ||j                   j                   k(  rh|j                  t        j                  |            }|rB||ur>t	        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)	r8   	hasparentr   instance_stater   r   r6   instance_strr\   )r   rJ  oldvalue	initiatorr  r:   s        r=   	_do_checkz*single_parent_validator.<locals>._do_check{  sz    $((!:!++J,E,Ee,LMIXU200  ,,U3U\\4I    r?   c                     | |d |      S r5   r   )r   rJ  r  r  s      r=   rO   z'single_parent_validator.<locals>.append  s    tY77r?   c                     | |||      S r5   r   )r   rJ  r  r  r  s       r=   set_z%single_parent_validator.<locals>.set_  s    x;;r?   rO   T)rawretvalrJ   r   )r(   listen)r9   r:   rO   r  r  s    `  @r=   rP   rP   z  sE    8< 
LLhDd 
LLudT$Or?   )NNNNFN)Wr   
__future__r   rs  rw  typingr   r   r   r   r   r	    r   r   r   r   r   r   r   r   r   r   r   r6   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+   r5  r,   sql.selectabler-   r.   util.typingr/   r`   r0   r1   sql.elementsr2   rf   ColumnPropertystrategy_forrj   class_loggerr   r   r   r   r  r  r  MemoizedSlots
Identifiedr  r  r  r  r   r  rB  rP   r   r?   r=   <module>r     s  2 #                    " " '  &   ) $ * ! & + #   "          "  ; # !3, N!b ''55'I( ( J(V ''4%'HW:> W: I W:t '''>T
\ T
 ? T
n ''$'G''dd (  ''4'8l
> l
 9 H l
^8 80"
 "
J ##00D0An  B  ##00h0?##00d0;#=) #= < @ #=L ##00d0;##00h0?##00g0>##00n0E##00n0EkJ 2 2CNNkJ F F ? @ < kJ\1
 1
hIH+ IHX ##00k0Baj a CaH ##00j0AG
GZ G
G B G
GT ##00h0?##00e0<t- t = @ tn ##00j0AwZ!3!3 w B wtPr?   