
    )f                   	   d Z ddlmZ ddlZddlZddlmZ ddlmZ ddlmZ ddlm	Z	 dd	l
mZ dd
l
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z  ddlm!Z! ddlm"Z" ddlm#Z# ddlm$Z$ ddlm%Z% dd l&m'Z' dd!l(m)Z) dd"l*m+Z+ dd#lm,Z, dd$lm-Z- d%d&l
m.Z. d%d
l
mZ/ d%d'l
m0Z0 d%d(l
m1Z1 d%d)l
m2Z2 d%dl
mZ d%dl2mZ3 d%d*l2m4Z4 d%d+l5m6Z6 d%d,l5m7Z7 e	rdd-lm8Z8 d%d.l9m:Z: 	 	 	 	 	 	 d`d0Z;ejx                  j{                  d/d/1       G d2 d3e$             Z>e1j~                  ejx                  j{                  d4d/1       G d5 d6e$                    Z@e1j~                  ejx                  j{                  d47       G d8 d9e@                    ZAe1j~                  ejx                  j{                  d4d4:      ejx                  j{                  d4d4d4;      ejx                  j{                  d4<       G d= d>e$                                  ZB G d? d@      ZC G dA dBe$      ZDe1j~                  ejp                  j{                  d4<       G dC dDe$                    ZEe1j~                  ejp                  j{                  dEF      ejp                  j{                  dF       G dG dHeD                           ZFe1j~                  ejp                  j{                  d4F      ejp                  j{                  dIF      ejp                  j{                  dJF      ejp                  j{                  dKF      ejp                  j{                  dLF       G dM dNeDej                  e1j                                                                  ZI G dO dP      ZJ G dQ dReD      ZKejp                  j{                  dSF       G dT dUeK             ZLe1j~                  ejp                  j{                  dVF       G dW dXeK                    ZMe1j~                  ejp                  j{                  dYF      ejp                  j{                  d/F       G dZ d[eD                           ZNe1j~                  ejp                  j{                  d\F       G d] d^eKej                                      ZOd_ ZPy)azWsqlalchemy.orm.interfaces.LoaderStrategy
   implementations, and related MapperOptions.    )annotationsN)Any)Dict)Tuple)TYPE_CHECKING   )
attributes)exc)
interfaces)loading)path_registry)
properties)query)relationships)
unitofwork)util)_DEFER_FOR_STATE)_RAISE_FOR_STATE)_SET_DEFERRED_EXPIRED)ATTR_WAS_SET)LoaderCallableStatus)PASSIVE_OFF)PassiveFlag)_column_descriptions)ORMCompileState)ORMSelectCompileState)QueryContext)LoaderStrategy)StrategizedProperty)_state_session)InstanceState)Load)	_none_set)AliasedClass   )event)inspect)log)sql)visitors)LABEL_STYLE_TABLENAME_PLUS_COL)Select)RelationshipProperty)ColumnElementFc	                   g }
|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     V/var/www/html/flask-app/venv/lib/python3.12/site-packages/sqlalchemy/orm/strategies.py<lambda>z%_register_attribute.<locals>.<lambda>X   s%    x99dhh &*      c                2    t        j                  |       S r1   )r	   backref_listeners)r5   r6   backrefuselists     r9   r:   z%_register_attribute.<locals>.<lambda>f   s    :#?#?'7$ r;   )parent_tokenr?   compare_function	useobjecttrackparenttypecallable	callable_active_history
impl_classsend_modified_eventsdoc)r?   single_parentappendsingle_parent_validatorr4   parent
validatorsr   track_cascade_eventsback_populates_effective_sync_backrefself_and_descendants_propsgetclass_manager_attr_has_implr	   register_attribute_implclass_	directionr   	ONETOMANYviewonlyrI   )r6   mapperrB   rA   rD   rE   proxy_propertyrF   rG   kwlisten_hooksmr5   hookr>   r7   r8   r?   s                 @@@@r9   _register_attributerb   B   s    L(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 r1   )super__init__parent_propertyrg   selfrM   strategy_key	__class__s      r9   rj   z#UninstrumentedColumnLoader.__init__   s%    .++33r;   c                l    | j                   D ]%  }|r|j                   |   }|j                  ||       ' y r1   )rg   _append_dedupe_col_collection)	rm   compile_statequery_entitypathloadoptadaptercolumn_collectionkwargscs	            r9   setup_queryz&UninstrumentedColumnLoader.setup_query   s;      	NAOOA&77;LM	Nr;   c	                     y r1    	rm   contextrs   rt   ru   r\   resultrv   
populatorss	            r9   create_row_processorz/UninstrumentedColumnLoader.create_row_processor   s     	r;   r1   )	__name__
__module____qualname____doc__	__slots__rj   rz   r   __classcell__ro   s   @r9   rf   rf      s$     I4 Nr;   rf   Tc                  <     e Zd ZdZdZ fdZ	 ddZd Zd Z xZ	S )ColumnLoaderz8Provide loading behavior for a :class:`.ColumnProperty`.)rg   is_compositec                    t         |   ||       | j                  j                  | _        t	        | j                  d      | _        y )Ncomposite_class)ri   rj   rk   rg   hasattrr   rl   s      r9   rj   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   )rg   adapt_check_presentrq   rk   )rm   rr   rs   rt   ru   rv   rw   memoized_populatorscheck_for_adaptrx   ry   fetchs               r9   rz   zColumnLoader.setup_query   s      		NA"33A6Ay*A77;LM		N 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)rB   rA   rF   )is_class_levelrg   typerk   rF   primary_keyversion_id_col_columntopropertyrT   rb   compare_values)rm   r\   coltyperF   s       r9   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)rg   _getterrK   r4   )rm   r~   rs   rt   ru   r\   r   rv   r   colgetters              r9   r   z!ColumnLoader.create_row_processor  sx     << 	:Cooc*^^C/F7#**DHHf+=>	: x ''4(89r;   F)
r   r   r   r   r   rj   rz   r   r   r   r   s   @r9   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r1   )compare).0ry   nulls     r9   	<genexpr>z2ExpressionColumnLoader.__init__.<locals>.<genexpr>%  s!      ,
$%		$,
s   )	ri   rj   r)   r   labelanyrk   rg   _have_default_expression)rm   rM   rn   r   ro   s      @r9   rj   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   rk   rg   rq   )rm   rr   rs   rt   ru   rv   rw   r   rx   rg   ry   r   s               r9   rz   z"ExpressionColumnLoader.setup_query)  s     w..--G****22G? 	NAOOA&77;LM	N
 
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   rg   r   rK   r4   )rm   r~   rs   rt   ru   r\   r   rv   r   rg   r   r   s               r9   r   z+ExpressionColumnLoader.create_row_processorN  s     w..--G >!//#.CU3w'..&/AB> 8$++TXXt,<= /7r;   c                    d| _         t        | j                  |d| j                  d   j                  j
                  d       y )NTFr   )rB   rA   accepts_scalar_loader)r   rb   rk   rg   r   r   rm   r\   s     r9   r   z+ExpressionColumnLoader.init_class_attributeh  s;    "  !\\!_11@@"'	
r;   )r   r   r   rj   rz   r   r   r   r   s   @r9   r   r     s    	
#:J>4	
r;   r   )rd   rc   )rd   rc   	raiseload)
do_nothingc                  H     e Zd ZdZdZ fdZd Zd Z	 d	dZd Z	d Z
 xZS )
DeferredColumnLoaderzAProvide loading behavior for a deferred :class:`.ColumnProperty`.)rg   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)
ri   rj   r   rk   NotImplementedErrorstrategy_optsrT   r   rg   r   rl   s      r9   rj   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)rd   Frc   Tnewr   F)refresh_stater   _compile_options_only_load_propsr4   rk   _get_strategyr   r   r   _raise_column_loader_deferred_column_loaderrK   )
rm   r~   rs   rt   ru   r\   r   rv   r   set_deferred_for_local_states
             r9   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   )rB   rA   rE   load_on_unexpire)r   rb   rk   rg   r   r   _load_for_stater   s     r9   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_subqueryrk   _renders_in_subqueriessetrg   intersectionrM   _should_undefer_in_wildcardr   
local_optsrT   r4   r   rz   r   r   r   r   r   )
rm   rr   rs   rt   ru   rv   rw   r   only_load_propsr^   s
             r9   rz   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)r4   r   
ATTR_EMPTYr   SQL_OKPASSIVE_NO_RESULTmanagerr\   r   iterate_properties
isinstancer   strategyr   
unmodifiedr    orm_excDetachedInstanceErrorr2   	state_strr   _invoke_raise_loadr   load_scalar_attributesr   r   r   )	rm   statepassivelocalparentptoloadkr   sessions	            r9   r   z$DeferredColumnLoader._load_for_state  sV   yy'222+++'999mm**:: %77a!45qzz+?@GGtzz)	 F  hhZF #<qa5+;+;&;<< '?// %%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rm   r   r   lazys       r9   r   z'DeferredColumnLoader._invoke_raise_load#  s    ((=AC
 	
r;   r1   )r   r   r   r   r   rj   r   r   rz   r   r   r   r   s   @r9   r   r   t  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 r1   )r4   r   )rm   r4   r   s      r9   rj   zLoadDeferredColumns.__init__,  s    "r;   c                    | j                   }|j                  j                  }|j                  |   }| j                  rd}nd}|j                  |      }|j                  ||      S )N)rd   Tr   )r   T)r   r   )r4   r   r\   rS   r   r   r   )rm   r   r   r4   r   r6   rn   r   s           r9   __call__zLoadDeferredColumns.__call__0  sc    hhmm**!!#&>>L FL%%l3''w77r;   Nr   )r4   strr   bool)r   r   r   r   rj   r	   r   r   r|   r;   r9   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\   targetr?   entityc                    t         |   ||       | j                  j                  | _        | j                  j                  | _        | j                  j
                  | _        | j                  j                  | _        y r1   )ri   rj   rk   r\   r  r   r?   rl   s      r9   rj   z#AbstractRelationshipLoader.__init__F  s^    .**11**11**11++33r;   c	           
     d    | j                   j                  d      j                  ||||||||      S )N))r   	immediate)rk   r   r   r}   s	            r9   #_immediateload_create_row_processorz>AbstractRelationshipLoader._immediateload_create_row_processorM  sC     ##11$


	
	
r;   )r   r   r   r   r   rj   r  r   r   s   @r9   r   r   A  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;   r9   r  r  f  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)rB   rD   )r   rb   rk   collection_classr   s     r9   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 r1   )r?   r	   init_state_collectionr4   )r   dict_rowrm   s      r9   invoke_no_loadz5NoLoader.create_row_processor.<locals>.invoke_no_load  s-    ||00txxH"&dhhr;   r   )rK   r4   )
rm   r~   rs   rt   ru   r\   r   rv   r   r  s
   `         r9   r   zNoLoader.create_row_processor  s&    	' 	5  $((N!;<r;   N)r   r   r   r   r   r   r   r|   r;   r9   r
  r
  r  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]rk   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) ri   rj   r   r#  r$  r'   r  r  rk   _join_conditioncreate_lazy_clauser  r  r  r  r   r!  order_byr   to_listsql_util_deep_annotater  loggerinfor?   _get_clauser   r\   _equivalent_columnsr  list)rm   rM   rn   join_conditionelemr   ry   ro   s          r9   rj   zLazyLoader.__init__  s,    	.!//77B!//7>I ' 4 E E--==
 --/		
O! ---E		
!% (( !LL)=)=)F)FG ''|T.BCDN
 "DN4dDOOL %%% LL ''*22 " KK;;	 3  	 <<D112 N$++999![[<<SA N373H3H3M--a0NN
 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)rB   rE   rD   rF   _deferred_history)r   rk   _legacy_inactive_history_stylerF   rY   r   	MANYTOONEr  rb   r   r  )rm   r\   r<  rF   r;  s        r9   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    r9   visit_bindparamzFLazyLoader._memoized_attr__simple_lazy_clause.<locals>.visit_bindparam'  s
    $Ir;   rA  c                    | j                   v r,j                  | j                  | j                      d f       y | j                  )j                  | j                  d | j                  f       y y r1   )_identifying_keyrK   r4   callablevalue)rA  bind_to_colparamss    r9   rB  zFLazyLoader._memoized_attr__simple_lazy_clause.<locals>.visit_bindparam,  sh    ))[8!#I$>$>? ##+y}}dIOODE ,r;   )r1  r2  r  r  r*   traversecloned_traverse)rm   	lazywhere	criterionrB  rG  rH  s       @@r9   "_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 r1   )r"  r1  adapt_criterion_to_nullrk   rM   objr	   instance_dictr   INIT_OKLOAD_AGAINST_COMMITTED#_get_committed_state_attr_by_column_get_state_attr_by_column)rm   r   r   rL  
param_keysr4   identrF  r\   or  rH  s               r9   _generate_lazy_clausez LazyLoader._generate_lazy_clause>  s    $ 8 8	:=33D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       r9   r   zLazyLoader._invoke_raise_load^  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 t3        j4                  |	      ry | j                   |j6                  v r#|t        j8                  z  st
        j:                  S |j=                  | j>                  |	||      }||t
        j@                  u ry |S |t        j                  z  r|t        j                   z  st
        j                  S | jC                  |||	||||||	      S )Nr   r   z> is not bound to a Session; lazy load operation of attribute 'r   )r   lazy_loaded_from)"r4   rk   load_on_pending_load_pending
session_idr   r   r  r   r   r   r	   NON_PERSISTENT_OKr   r#  NO_RAISERELATED_OBJECT_OKr   r    r   r   r2   r   _get_ident_for_use_get	NEVER_SETr#   
issupersetdictDEFERRED_HISTORY_LOADr   _identity_lookupr  PASSIVE_CLASS_MISMATCH_emit_lazyload)rm   r   r   ru   extra_criteriaextra_optionsalternate_effective_pathexecution_optionspendingprimary_key_identityr  r   instances                r9   r   zLazyLoader._load_for_statec  sW    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##$89 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   rS  rT  rU  rf  r   r  )rm   r   r   r   instance_mapperget_attrr  pks           r9   rc  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_optionsrn  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 r1   )rk   _reverse_propertyrY   r   r=  _use_getr   r   r  r"   _construct_for_existing_pathr   r~  rM   lazyloadprocess_compile_state)compile_contextrevrm   strategy_optionss     r9   _lazyload_reversez4LazyLoader._emit_lazyload.<locals>._lazyload_reverse7  s    ++== K MMZ%9%99&s||Z@$))FF'77EEJJ hsm$9$9/$JKr;   _sa_orm_load_options)rn  r   zKMultiple rows returned with uselist=False for lazily-loaded attribute '%s' r   );r   	preloadedorm_strategy_optionsr  __clause_element__r,   _create_raw_selectry  r+   r   default_compile_optionsr   default_load_optionsrk   	secondaryselect_fromr\   r4   r	   NO_AUTOFLUSHimmutabledict_execution_optionsr  r  r   	load_pathr2   LoaderCriteriaOption_with_options_path_registryr   r$  r   ra  r   r   load_on_pk_identityr  _order_by_clauses_with_context_optionsrY  
EMPTY_DICT
merge_withrf  rg  r   r   has_intersectionr#   values
_never_set_where_criteriaexecuter@  scalarsallr?   lenwarn)rm   r   r   rp  r   ru   rk  rl  rm  rn  clauseelementstmtr  ro  r  effective_pathr8   r  lazy_clauserH  r   lr  s   `                     @r9   rj  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 r1   )_reset)r   r  r  r4   s      r9   reset_for_lazy_callablez@LazyLoader.create_row_processor.<locals>.reset_for_lazy_callable  s     UC(r;   )r4   r  _is_user_refreshr   r   r   r  r   r   r!   "_instance_level_callable_processorrU   LoadLazyAttribute_generate_extra_criteriarK   populate_existingalways_refresh)rm   r~   rs   rt   ru   r\   r   rv   r   set_lazy_callabler  r4   s              @r9   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;   )rM   r%  rn   zTuple[Any, ...])r   r   r   r   r   __annotations__rj   r   rM  rY  r   r   r  r   rc  preload_modulerj  r   r   r   s   @r9   r  r    s    
I  $#//''33..:/:?N:x 
D!@!@
 !%//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 r1   r4   rn   ru   rk  )rm   r4   initiating_strategyru   rk  s        r9   rj   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  )rk  r   r  r4   rn   ru   )rm   s    r9   __getstate__zLoadLazyAttribute.__getstate__  sE    *II  88 --|| 	
 	
r;   c                    | j                   }|j                  j                  }|j                  |   }|j                  | j
                     }|j                  ||| j                  | j                        S )N)ru   rk  )	r4   r   r\   rS   _strategiesrn   r   ru   rk  )rm   r   r   r4   rt  r6   r   s          r9   r   zLoadLazyAttribute.__call__  sn    hh--..%%c*##D$5$56''LL..	 ( 
 	
r;   N)	r   r   r   r   rj   r  r	   r   r   r|   r;   r9   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)rr   current_pathr2   PathRegistryroot_get_top_level_contextr   r  r   rT   rk   _is_self_referentialr   r   rn  idunionr   PostLoadpath_existscontainsr	   lengthcontains_mapperr\   )rm   r~   rt   ru   
join_depthr  top_level_contextrn  r  unlimited_recursionpath_w_propeffective_path_w_props               r9   _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;   r1   )r   r   r   r   r   r  r|   r;   r9   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 r1   ri   rj   rk   r  rl   s      r9   rj   zImmediateLoader.__init__L  %    ...99r;   c                X    | j                   j                  d      j                  |       y N)r   r  rk   r   r   r   s     r9   r   z$ImmediateLoader.init_class_attributeP  $    **!	


v
&r;   c	                ^   | j                  |||| j                        \  }	}
}}|
s"t        j                  t        j
                  z  }n!t        j                  t        j
                  z  }t        j                  j                  ||	| j                  | j                  | j                  ||||	       y r1   )r  r  r	   PASSIVE_NO_FETCH_RELATEDr   ra  r   r   r  callable_for_pathrM   rk   _load_for_path)rm   r~   rs   rt   ru   r\   r   rv   r   r  
run_loaderrn  r  flagss                 r9   r   z$ImmediateLoader.create_row_processorU  s      %%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  )rl  rm  rn  )r"   rt   r  _recurser~   _truncate_recursiver4   rk   r   rf  r   r   r   r   get_implset_committed_value)rm   r~   rt   states	load_onlyru   r  r  rn  new_optrm  rl  r4   
lazyloaderr   	overwriter  rF  s                     r9   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   rj   r   r   r  r   r   s   @r9   r  r  H  s    I:'
$
L+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 r1   r  rl   s      r9   rj   zSubqueryLoader.__init__  r  r;   c                X    | j                   j                  d      j                  |       y r  r  r   s     r9   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   )rt   r2   _class_to_mapperrM   isark   	_entitiesentity_zeror  r  r   r  coercelocal_columnsgetattrr  r   r4   )rm   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_colsry   leftmost_attrs                 r9   _get_leftmostzSubqueryLoader._get_leftmost  sI    $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)rr   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_adapterrx  distinct_target_key	_distincttabler   re  r   _has_row_limiting_clauser  r1   expand_column_list_from_order_by_set_entitiesset_label_styler+   r  r2   r$   )rm   orig_compile_state
orig_queryr
  r  leftmost_relationshiporig_entityqq2entrX  target_colsr#  ry   tto_addembed_q
left_aliass                     r9   _generate_from_original_queryz,SubqueryLoader._generate_from_original_query  s    ))$/ [[  -
1::& {{#(A (AMM((	  4"2D  8}0	 M	0 )88 ' $$SYY%@%@!D 335
 %3GG$&AK ( (33!agg3 ;'221==A"&AK ))"$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  )r7  pairs	enumerater\   r  rK   r4   r  r'   r  r  r2   r$   rk   r  r  rM   r   )rm   r5  r  to_joinr8  ir\   r6   prev_mapper	to_appendparent_aliasr4  
local_colsry   
local_attrs                  r9   _prep_for_joinszSubqueryLoader._prep_for_joinsL  s7   Y__&'!*5!1 	2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  r2   r$   r  poprK   rM   join)rm   r.  r:  r5  r>  effective_entityltjitemmiddleinnerattrs              r9   _apply_joinszSubqueryLoader._apply_joins{  s    'l!8
GAJqM2::;KLG AX
GAJqM2::<Hgbk!n5==$G 1W $AbM
   'tAw/@@ !--d1g6!!W^^G
F 
 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 r1   )r  r   r2   r  r  r  _with_current_pathoptions)	rm   r~   r.  r  rewritten_pathr+  rF  ru   new_optionss	            r9   _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 r1   eager_order_bytupler   r0  rk   r/  r  rm   s    r9   _setup_outermost_orderbyzISubqueryLoader._setup_outermost_orderby.<locals>._setup_outermost_orderby  s3    ..%LL!5!5!>!>?3 .r;   )rk   r/  _add_context_option)rm   r.  rY  s   `  r9   rY  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   rn  r  rH  subq_datac                    |j                   | _         |j                  | _        |j                  | _        |j                  xs i | _        || _        d | _        y r1   r]  )rm   r~   r^  s      r9   rj   z(SubqueryLoader._SubqCollections.__init__  sI     #??DL%,%>%>D" ' 4 4D!...BDKDIDJr;   c                r    | j                   | j                          | j                   j                  ||      S r1   )r_  _loadrT   )rm   r4   defaults      r9   rT   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    r9   r:   z7SubqueryLoader._SubqCollections._load.<locals>.<lambda>  s    !AB% r;   c              3  &   K   | ]	  }|d      yw)r   Nr|   r   vvs     r9   r   z8SubqueryLoader._SubqCollections._load.<locals>.<genexpr>  s     $7rRU$7   )collectionsdefaultdictr7  r_  r^  r   with_sessionr  _populate_existingr  rH  	itertoolsgroupbyextend)rm   r.  rowsr   vs        r9   rb  z%SubqueryLoader._SubqCollections._load   s    $006DJ		A99$$t||,A  33'') -.D!))$@ 81

1$$$7Q$778r;   c                >    | j                   | j                          y y r1   )r_  rb  )rm   r   r  r  s       r9   r  z&SubqueryLoader._SubqCollections.loader  s    zz!

 "r;   N)	r   r   r   r   r   rj   rT   rb  r  r|   r;   r9   _SubqCollectionsr\    s"    	
			0
	8"	r;   rv  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_pathsNr+  ormzsubqueryloader for "z!" must invoke lambda callable at z in order to produce a new query, decreasing the efficiency of caching for this statement.  Consider using selectinload() for more effective full-lambda cachingF)legacy)%rr   r   _enable_eagerloads_for_refresh_stater  indexloaders_require_bufferingrk   rT   r	   r  r   r  r2   r  r  r  r   _get_plugin_class_for_plugin_is_lambda_elementr  r|  r   r  	_resolved_create_entities_collectionr  r6  r  r  rn  _set_enable_single_critrA  add_columnsrL  rR  rY  )rm   r~   rs   rt   r  ru   rv   rr   r  with_poly_entityrF  r  rP  r  r+  compile_state_clsr*  r
  r  r,  r5  r.  r:  r@  r>  s                            r9   _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	           
        |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 || j(                     }| j(                  j*                  }|j-                  |j.                  d      }|/| j1                  ||      }|j3                  |j.                  d|       |r|D cg c]  }|j4                  |    }}| j6                  r| j9                  |||||       y | j;                  |||||       y c c}w )NJ'%s' does not support object population - eager loading cannot be applied.r   r  rl  )r   r  r  r  r   rr   r   rM   rU   r4   implsupports_populationr   r   r  r2   _entity_isar   r  r   rk   r  rT   r	   rv  r   rg   r?   _create_collection_loader_create_scalar_loader)rm   r~   rs   rt   ru   r\   r   rv   r   _r  r^  r?  rl  ry   s                  r9   r   z#SubqueryLoader.create_row_processor  s      ;;	 	 #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@A'//!,AJA<<**j* &&j* Bs   4H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|   )rT   r  r4   r  )r   r  r  
collectionrl  rm   tuple_getters       r9   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 r1   r4   )r   r  r  r  rm   s      r9   &load_collection_from_subq_existing_rowzXSubqueryLoader._create_collection_loader.<locals>.load_collection_from_subq_existing_row  s     xxu$)%< %r;   r   existingeager_tuple_getterrK   r4   invoke_all_eagersr  )	rm   r~   r   rl  r?  r   r  r  r  s	   `  `   @@r9   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 )Nr1   r   LMultiple rows returned with uselist=False for eagerly-loaded attribute '%s' r   )rT   r  r   r  r  r4   r  )r   r  r  r  scalarrl  rm   r  s        r9   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 r1   r  )r   r  r  r  rm   s      r9   "load_scalar_from_subq_existing_rowzPSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subq_existing_row  s     xxu$%eUC8 %r;   r   r  r  r  )	rm   r~   r   rl  r?  r   r  r  r  s	   `  `   @@r9   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   rj   r   r  r6  rA  rL  rR  rY  rv  r  r   r  r  r   r   s   @r9   r  r    s^      I:'
/LbbH-1^4l D2 2hFPWrG.Gr;   r  joinedc                  t     e Zd ZdZdZ fdZd Z	 	 	 ddZd Zd Z	d Z
d	 Z	 dd
Zd Zd Zd Zd Z xZS )JoinedLoaderz[Provide loading behavior for a :class:`.Relationship`
    using joined eager loading.

    r  c                \    t         |   ||       | j                  j                  | _        y r1   r  rl   s      r9   rj   zJoinedLoader.__init__4  r  r;   c                X    | j                   j                  d      j                  |       y r  r  r   s     r9   r   z!JoinedLoader.init_class_attribute8  r  r;   c	                   |j                   j                  sy| 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'        j(                  || j                  |||||
| j                  |	       t*        j,                  j/                  |j0                        }|r:|t3        j4                  d      |j0                  D cg c]  }||	 c}|_        yyc c}w )	z@Add a left outer join to the statement that's being constructed.NTFr  r%   rx  )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?   multi_row_eager_loadersrk   _init_user_defined_eager_procr	   $_setup_query_on_user_defined_adapterr  r  r  r  r\   _generate_row_adaptereager_adding_joinsrT   r'   with_polymorphic_mappersr  r   _setup_entity_queryr   NONE_SETr   secondary_columnsr   r   )rm   rr   rs   rt   ru   rv   rw   r  r  rx   r  user_defined_adapterclausesadd_to_collectionr  	has_nonesry   s                    r9   rz   zJoinedLoader.setup_query=  s    ,,??\\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   GG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)
selectabler,  limit_on_entityrx  )r,  )r   rt   rM   rT   r	   r   r   r   aliasr2   
ORMAdapter_TraceAdaptRoleJOINEDLOAD_USER_DEFINED_ALIASr\   r6  r   JOINEDLOAD_PATH_WITH_POLYMORPHIC_polymorphic_adaptersr   )
rm   ru   rr   target_attributesrt   rv   r  root_mapperr6   r  s
             r9   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)rm   r~   r  rt   rv   r  r  s          r9   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 )Nrx  T)flat)r  r  r  joinedloader_ormadapterF)r,  adapt_requiredallow_label_resolveanonymize_labels	innerjoinr|   eager_row_processor)rT   r	   r'   r  r  r  r2   r$   r\   _anonymous_fromclause_memor  r  JOINEDLOAD_MEMOIZED_ADAPTERr6  r   rk   r  create_eager_joinsrK   _create_eager_joinr   r  r   )rm   rr   r  rt   ru   rv   rw   r  r  r  to_adaptinspalt_selectableto_adapt_inspr  r  r  s                    r9   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  }|rtt)        j8                  ||j                  || xs6 |j.                  j0                  xs |xr t;        |t<        j>                         j                    j                   |      }n jA                  |||||      }||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r1   )propagate_to_loaders_resolve_where_criteriar\   )r   aerm   s     r9   r   z2JoinedLoader._create_eager_join.<locals>.<genexpr>	  s1      )** **4;;7)s   14isouter
_left_memo_right_memor   )0r\   r  _should_nest_selectableeager_joinsfrom_clausesr1  #find_left_clause_that_matches_givenr  r  r   r   
setdefaultr  aliased_insp_entity_for_mapperr  rM   r  r4   rk   r2   r$   r  r   represents_outer_joinglobal_attributesrT   rW  _ORMJoinr   r)   Join_splice_nested_inner_joinstop_on_find_columnsprimaryjoinpersist_selectablery   contains_columnrg   rq   r  r/  rV  _target_adaptercopy_and_processr   r0  )rm   rr   rs   rt   rv   r  r  r  r  rk  r   should_nest_selectablequery_entity_keyindexesclausedefault_towraptowrapefmonclauseattach_on_outsideextra_join_criteriar  	eagerjoinr   s   `                       r9   r  zJoinedLoader._create_eager_joinU	  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;; KK 3
I 66fgx1D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 rt        |t        j                        sJ t        |t        j                  j
                        r | j                  ||j                  ||||      S t        |t        j                        sH|d   j                  |      r3t        j                  ||j                  |d||d   j                  |      S y | j                  ||j                  ||||j                        }|:d}| j                  ||j                  ||||j                        }||dusJ d       y d}|rm|j                  s|j                  s|j!                  |      }	nt        j                  |j                  ||j"                  |j                  |j                        }	nBt        j                  ||j                  |j"                  |j                  |j                        }	|j$                  |	_        |	S )	NFr  r  r  z9assertion failed attempting to produce joined eager loadsT)r  r  )r  r  )r   r2   r  r)   r  FromGroupingr  elementr  r  r\   rightr  leftr  r  _splice_into_centerr  r  )
rm   rt   join_objr  r  rk  splicingtarget_joinright_splicer  s
             r9   r  z&JoinedLoader._splice_nested_inner_join	  s    u h(9(9::#.."="=>11    Hh&7&78Bx||H%((((!' $R$2  44NN  
  L88##K " E)ONO L ##K,?,?$88E	$--MM%%$,,'22	 !))!! (($00I %0$?$?	!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  )rr   r  r	   compound_eager_adapterr  rT   r\   _result_has_identity_key)	rm   r~   r   rv   rt   ru   rr   r  	decorators	            r9   _create_eager_adapterz"JoinedLoader._create_eager_adapterM
  s    --  ..(:(:  	  u,,I 33	%NN!88	 55)@@	((*?I  ;;//	B r;   c	           
     `   | 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  )rM   rU   r4   r  r  r   r   r?   loaders_require_uniquingrk   r  r   _instance_processorr\   r  r  r  r   r   )rm   r~   rs   rt   ru   r\   r   rv   r   our_patheager_adapterr4   	_instances                r9   r   z!JoinedLoader.create_row_processorq
  s6    {{((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   UniqueAppenderrK   )	r   r  r  r  result_listinstr  r~   r4   s	         r9   #load_collection_from_joined_new_rowzSJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_new_row
  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  r#  r  r~   r4   s	         r9   (load_collection_from_joined_existing_rowzXJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_existing_row
  s    s|w111%00%> (==5#
 #11 6 4?""E3<0S>D""4(  r;   c                     |       y r1   r|   r   r  r  r  s      r9    load_collection_from_joined_execzPJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_exec
  
    cNr;   r   r  r  rK   r4   r  )rm   r~   r4   r  r   r$  r&  r)  s    ```    r9   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 r1   r|   )r   r  r  r  r4   s      r9   load_scalar_from_joined_new_rowzKJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_new_row
  s     #3E#Jr;   c                j     |      }|v r!||   urt        j                  dz         y y ||<   y )Nr  )r   r  )r   r  r  r  r  r4   rm   s       r9   $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 r1   r|   r(  s      r9   load_scalar_from_joined_execzHJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_exec
  r*  r;   r   r  r  r+  )rm   r~   r4   r  r   r.  r0  r2  s   ` ``    r9   r  z"JoinedLoader._create_scalar_loader
  s    	(
	&&	 	5  $((,K!LM:%%XX;<	
 $$w&&78 %r;   )NNFr   )r   r   r   r   r   rj   r   rz   r  r  r  r  r  r  r   r  r  r   r   s   @r9   r  r  )  sk    
 I:' $un7r@2MK^]@ KPWr"H8t-^#r;   r  selectinc                       e Zd ZdZ ej
                  dg d      ZdZ fdZd Z	d Z
d Zd	 Zd
 Zd Zd Zd Z xZS )SelectInLoader)r  	omit_join_parent_alias_query_info_fallback_query_info	queryinfo)load_only_childload_with_joinin_exprpk_colszero_idxchild_lookup_colsi  c                   t         |   ||       | j                  j                  | _        | j                  j                  t
        j                  u }| j                  j                  | j                  j                  | _        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)  )ri   rj   rk   r  rY   r   r=  r6  r   r  rM   r5  r   r  r6  _init_for_omit_join_m2or8  _init_for_joinr9  _init_for_omit_join)rm   rM   rn   is_m2or  ro   s        r9   rj   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)rM   r6  rT   )r   r   equivpk_to_fkrm   s      r9   r   z5SelectInLoader._init_for_omit_join.<locals>.<genexpr>;  sN      
88<<QC
  HQK 
 
s   <?r   Fr   T)rf  rk   r-  local_remote_pairsr  r7  rM   r   r  r)   tuple_
query_info)rm   r   r>  fk_colsr=  r?  rI  s   `     @r9   rD  z"SelectInLoader._init_for_omit_join7  s      00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)   rK  rk   r   r  rL  )rm   r>  r=  r?  r  rv  lookup_colss          r9   rB  z&SelectInLoader._init_for_omit_join_m2oM  s    ++))w<!jj'*GHajGH))778MN
AHI2z2226I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$   rM   rX   r7  r'   r   _adapt_elementr  r)   rK  rL  )rm   pa_inspr   r>  r=  r?  s         r9   rC  zSelectInLoader._init_for_join]  s    )$++*<*<=$,,-37;;3J3J
,/G""3'
 
 w<!jj'*GHajGHudGWhMM
s   B,c                X    | j                   j                  d      j                  |       y r  r  r   s     r9   r   z#SelectInLoader.init_class_attributek  r  r;   c	                   |j                   r| j                  ||||||||      S | 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(        j*                  j-                  ||| j                  | j                  | j.                  ||||	       y )Nr  r  r   r  rx  )r   r  r  r  rM   rU   r4   r  r  r   r   r  r2   r  r   rk   rT   r	   r'   r  r   r  r  r  )rm   r~   rs   rt   ru   r\   r   rv   r   r  r  rn  r  selectin_pathr  r  rF  s                    r9   r   z#SelectInLoader.create_row_processorp  s      ;;	 	  %%T7t & 
	

 {{((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)rs  N)rU  r	   PASSIVE_NO_FETCH)r   lkr\   r   
state_dicts     r9   r   z0SelectInLoader._load_for_path.<locals>.<genexpr>  s=      &  44" * ; ;	 5 &s   -0r   rv  rz  )compile_state_pluginplugin_subject)rx  rz  r   ry  primary_keysr~  T)r  c                    | xj                   t        t        j                  j                  j
                              z  c_         y r1   rU  rX  s    r9   rY  z?SelectInLoader._load_for_path.<locals>._setup_outermost_orderbyy  s3    #22eT%9%9%B%BC7 2r;   )7r4   r8  r;  rl  rm  r7  rM   rf  rW  r@  r   r   r9  rK   r>  r=  r<  r  rQ  r2   Bundler  r,   r  r+   r   r  r  r7  rE  r  rk   rC  filterin_r)   rA  rr   select_statementr   r  zip'_adapt_cached_option_to_uncached_optionr   r  r  r  rO  _update_compile_optionsr  rn  r/  rZ  _load_via_child_load_via_parent)"rm   r~   rt   r  r  rF  ru   r  rn  rL  
our_statesnone_statesr  related_identr   r>  r=  r   
bundle_ent
bundle_sql
entity_sqlr.  r+  r  rQ  cached_optionsuncached_optionsorig_optuncached_optrV  r9  rY  r\   rZ  s"   `             `                 @@r9   r  zSelectInLoader._load_for_path  s    2%%
%%$006JK[[F$* G y"ZZ
 % & )::& ! (99]J!%!:!:J },}-44
I6  &&z9'EF7G< )) )/$E9 1uejj)<J 
 $$$$((  00DK=@$33C8  +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2K'55N&}}:: /2"$4/	 +Hl @@\K  w..--$44W= K &+??ANAII{#%%&GH$$##d#;A((,,!%!5!5!>!>#44 %3&  )77=&N & 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   r]  rH  rn  )r?   sorted
_chunksizer   r  r?  r@  rT   r4   r  r  )rm   rh  ri  rL  r.  r~   rn  r?   our_keyschunkr4   r   rt  datarelated_objr   r  r  s                     r9   rf  zSelectInLoader._load_via_child  s    ,, *%Q1E 12H $OO33&',) # '1&9&9CFsB) '8 4 	 &(Aq 1D    #hhsD1/9# +E5)$U): NN488,@@+2	# D (3 	M#E5)U!2 NN488$88tL	M5)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   r]  rs  c                    | d   S r   r|   rf  s    r9   r:   z1SelectInLoader._load_via_parent.<locals>.<lambda>  s
    !A$ r;   c              3  &   K   | ]	  }|d      yw)r   Nr|   ri  s     r9   r   z2SelectInLoader._load_via_parent.<locals>.<genexpr>  s     1r!u1rk  r   r  )r?   ru  r?  rl  rm  r7  rp  rq  r   r  r@  rr  r4   rT   r  r   r  r  r  )rm   rh  rL  r.  r~   rn  r?   _empty_resultrw  r4   r   rZ  r  r]  rx  r   rt  r  s                     r9   rg  zSelectInLoader._load_via_parent  s    ,,%4q4??3E#DOO$56J :? 5C
I %--A36L 
 **40D!))''*L9&7 (  &( 21 Q1q112 6; 1UJ	 TXX%;!XXc=9
::*		.045
 NN488,@@z:a= NN488,@@z:') s   F
)r   r   r   r   rl  
namedtuplerL  ru  rj   rD  rB  rC  r   r   r  rf  rg  r   r   s   @r9   r5  r5     sb    I (''	

J J5<O,
 N'
K
ZQf5Mn/r;   r5  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)	r4   	hasparentr	   instance_stater   r   r2   instance_strrX   )r   rF  oldvalue	initiatorr  r6   s        r9   	_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 r1   r|   )r   rF  r  r  s      r9   rK   z'single_parent_validator.<locals>.append  s    tY77r;   c                     | |||      S r1   r|   )r   rF  r  r  r  s       r9   set_z%single_parent_validator.<locals>.set_
  s    x;;r;   rK   T)rawretvalrF   r   )r&   listen)r5   r6   rK   r  r  s    `  @r9   rL   rL     sE    8< 
LLhDd 
LLudT$Or;   )NNNNFN)Qr   
__future__r   rl  rp  typingr   r   r   r    r	   r
   r   r   r   r   r   r   r   r   r   r2   baser   r   r   r   r   r   r   r~   r   r   r   r   r   r   r   r    r   r!   r  r"   r#   r$   r&   r   r'   r(   r)   r1  r*   sql.selectabler+   r,   r-   sql.elementsr.   rb   ColumnPropertystrategy_forrf   class_loggerr   r   r   r   r   r  r
  MemoizedSlots
Identifiedr  r  r  r  r  r  r5  rL   r|   r;   r9   <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dJ 2 2CNNdJ F F ? @ < dJN1
 1
hIH+ IHX ##00k0B]j ] C]@ ##00j0A{	GZ {	G B {	G| ##00h0?##00e0<Q- Q = @ Qh ##00j0AtZ!3!3 t B tnPr;   