
    +h                        d 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  ej:                         Zd Z ej@                  d      d/d       Z! ejD                  ddd       ej@                  d      d/d              Z#d Z$ddddd ejJ                  ejJ                  fd!Z&dddddd ejJ                  ejJ                  fd"Z'	 	 	 	 	 d0d#Z(	 	 	 d1d$Z)d% Z*	 	 	 	 d2d&Z+d' Z,d( Z-d) Z.d* Z/d+ Z0 G d, d-e1      Z2d. Z3y)3zprivate module containing functions used to convert database
rows into object instances and associated state.

the functions here are called primarily by Query, Mapper,
as well as some of the attribute loading strategies.

    )absolute_import   )
attributes)exc)path_registry)strategy_options)_DEFER_FOR_STATE)_RAISE_FOR_STATE)_SET_DEFERRED_EXPIRED)	_none_set)	state_str   )future)util)result_tuple)ChunkedIteratorResult)FrozenResult)SimpleResultMetaData)LABEL_STYLE_TABLENAME_PLUS_COL)SelectStatec                 V    t               _        i _        j                  }|j                  }j
                  j                   xr3 t        |j                        dk(  xr |j                  d   j                  	 t        t        j                  j                  D cg c]  }|j                          c}       \  }}j                  r-j                  sj                  rt!        j"                  d      d }d }j
                  j,                  r\j                  j                  D 	cg c]<  }	j                  r|n+|	j.                  s|	j0                  s|	j2                  rt4        nd> }
}	nwj                  j                  D 	cg c]X  }	j                  r|nG|	j.                  s(|	j0                  r ||	j6                  j8                        n|	j.                  rt4        ndZ }
}	t;        |
      } fd}j<                  j?                  d	d
      rt         |d            fd}tA        ||  jB                  jD                        }|jF                  jI                  tK        |            |_#        j                  jL                  rd }d|f|_'        j                  r|j                  j                         |S c c}w # t$        $ r> t'        j(                         5   j+                          ddd       n# 1 sw Y   nxY wY w xY wc c}	w c c}	w )a  Return a :class:`.Result` given an ORM query context.

    :param cursor: a :class:`.CursorResult`, generated by a statement
     which came from :class:`.ORMCompileState`

    :param context: a :class:`.QueryContext` object

    :return: a :class:`.Result` object representing ORM results

    .. versionchanged:: 1.4 The instances() function now uses
       :class:`.Result` objects and has an all new interface.

    r   r   zCan't use yield_per with eager loaders that require uniquing or row buffering, e.g. joinedload() against collections or subqueryload().  Consider the selectinload() strategy for better flexibility in loading objects.Nc                 ,    t        j                  d      )Nz@Can't use the ORM yield_per feature in conjunction with unique()sa_excInvalidRequestError)entrys    I/var/www/html/venv/lib/python3.12/site-packages/sqlalchemy/orm/loading.py
_no_uniquezinstances.<locals>._no_unique[   s    ((N
 	
    c                       fd}|S )Nc                 4    t        j                  dz        )NzkCan't apply uniqueness to row tuple containing value of type %r; this datatype produces non-hashable valuesr   )objdatatypes    r   goz,instances.<locals>._not_hashable.<locals>.goa   s$    ,,F r    )r#   r$   s   ` r   _not_hashablez instances.<locals>._not_hashable`   s    	 	r   )_unique_filtersc              3     K   	 | }i _         |r	j                  |      }|sy 	j                         }r
d   }|D cg c]
  } ||       }}n.|D cg c]!  }t        
D cg c]
  } ||       c}      # }}}j                  j                         D ]  \  }}|j                  |        | |sy c c}w c c}w c c}}w w)Nr   )partials	fetchmany_raw_all_rowstuplepost_load_pathsitemsinvoke)size	yield_perfetchprocrowrowspath	post_loadcontextcursorprocesssingle_entitys           r   chunkszinstances.<locals>.chunks   s     I!G((3,,.qz-23cS	33 GL?BE9499:  $+#:#:#@#@#B 0i  $/0 J7  4 :s5   <CB;CC$C 3	C<AC CCprebuffer_rowsFc                     t              S N)iter)r0   _prebuffereds    r   r<   zinstances.<locals>.chunks   s    %%r   )source_supports_scalarsrawdynamic_yield_per)filteredis_single_entityc                 ,    t        j                  d      )Nz~The unique() method must be invoked on this Result, as it contains results that include joined eager loads against collectionsr   )r"   s    r   require_uniquez!instances.<locals>.require_unique   s    ,,& r   )(
_new_runidrunidr-   compile_state_has_mapper_entitiesload_options_only_return_tupleslen	_entitiessupports_single_entitylistziprow_processorr1   loaders_require_bufferingloaders_require_uniquingr   r   	Exceptionr   safe_reraiseclose_legacy_uniquinguse_id_for_hash_non_hashable_value_null_column_typeidcolumntyper   execution_optionsgetr   r8   _is_server_side_attributesuniondictmulti_row_eager_loaders_unique_filter_state)r9   r8   rK   rE   query_entitylabelsextrar   r&   entunique_filtersrow_metadatar<   resultrH   rA   r:   r;   s   ``             @@@r   	instancesrp   (   s    LGM G))M11H  444 	>''(A-	>##A&== #' )0(=(=(G(G$ !..w?$
 &% --//,,= 

 ,, ,,66
      ##**((	  
 
* ,,66	
      ''C,C,C szz/ "" 	
 	
 (~L<   $$%5u= F4L)	& # - ..88F  ++11h?F
 44	 (,^&<#**+MO$    	LLN	 	 	(
	
sK   "K #K<AK 5AL!AL&K L4L	LL	LLzsqlalchemy.orm.contextTc           	      @   t         j                  j                  }|r| j                          |j                  j                  |d      }| j                  }	 d| _        t        |j                        D cg c]  \  }}t        ||j                        r| }	}}|j                  D 
cg c]  }
|
j                   }}
t        ||j                  D 
cg c]  }
|
j                   c}
      }g }|j                         D ]k  }|	D ]M  }||   	| j                  t!        j"                  ||         t!        j$                  ||         |i i       ||<   O |j'                   ||             m |j)                  |      || _        S c c}}w c c}
w c c}
w # || _        w xY w)az  Merge a :class:`_engine.FrozenResult` back into a :class:`_orm.Session`,
    returning a new :class:`_engine.Result` object with :term:`persistent`
    objects.

    See the section :ref:`do_orm_execute_re_executing` for an example.

    .. seealso::

        :ref:`do_orm_execute_re_executing`

        :meth:`_engine.Result.freeze`

        :class:`_engine.FrozenResult`

    Flegacyload
_recursive_resolve_conflict_map)r   	preloadedorm_context
_autoflushORMSelectCompileState_create_entities_collection	autoflush	enumeraterP   
isinstance_MapperEntity_label_namer   _extra_entitiesrewrite_rows_merger   instance_stateinstance_dictappendwith_new_rows)session	statementfrozen_resultru   querycontextctxr}   iemapped_entitiesrl   keyskeyed_tuplero   newrows                  r   merge_frozen_resultr      s   " >>--L

,
,
H
H% I C !!I&! "#--0
1!\778 
 

 ,/==9C99"#--@33&&@
 #002 	/F$ !9( '"11&)<"00;!#%.0 !/ !F1I MM+f-.	/ **62%7

 : A& &s=   F 6"FF )F
<F F
%&F A0F F 	Fz:func:`_orm.merge_result`zyThe function as well as the method on :class:`_orm.Query` is superseded by the :func:`_orm.merge_frozen_result` function.)alternativebecomes_legacyc           
         t         j                  j                  }| j                  }|r|j	                          t        |t              r|}t        |j                        }nd}|j                  j                  | d      }|j                  }	 d|_        | xr t        |j                        dk(  }|r{t        |j                  d   |j                        rK|D 	cg c]>  }	|j                  t!        j"                  |	      t!        j$                  |	      |i i       @ }
}	nt'        |      }
nt)        |j                        D cg c]  \  }}t        ||j                        r| }}}g }
|j                  D cg c]  }|j*                   }}t-        ||j                  D cg c]  }|j.                   c}      }|D ]v  }t'        |      }|D ]M  }||   	|j                  t!        j"                  ||         t!        j$                  ||         |i i       ||<   O |
j1                   ||             x |r|j3                  |
      ||_        S t        |
      ||_        S c c}	w c c}}w c c}w c c}w # ||_        w xY w)zMerge a result into the given :class:`.Query` object's Session.

    See :meth:`_orm.Query.merge_result` for top-level documentation on this
    function.

    NTrr   Fr   r   rt   )r   rx   ry   r   rz   r   r   r@   datar{   r|   r}   rO   rP   r   r   r   r   r   rR   r~   r   r   r   r   	with_data)queryiteratorru   r   r   r   r   r}   r;   instancero   r   r   r   rl   r   r   r4   r   s                      r   merge_resultr     s~    >>--LmmG (L) **+

,
,
H
Hd I C !!I1&!))Ec#--.@A.E#--*L,F,FG %-	 ! NN"11(;"00:!#%.0 # 	 	 h &cmm4Aqa!;!;< O 
 F/2}}=COO=D=&cmmDss**DK   3c( Aay,$+NN&55fQi@&44VAY?!%')24 %3 %q	 k&123  **62 & <%W	 > E* &sQ   AI: AI%)I: "I*(I: ;I0I: $I5
7!I: A2I: 
I: %I: :	Jc                    | j                   j                  |      }|t        j                  |      }|j                  r+|j
                  j                  |      st        j                  S |j                  rM|t        j                  z  st        j                  S |t        j                  z  s|S 	 |j                  ||       |S |S y# t        j                  $ r | j                  |g       Y yw xY w)zqLook up the given key in the given session's identity map,
    check the object for expired state if found.

    N)identity_maprb   r   r   inheritsmapperisaPASSIVE_CLASS_MISMATCHexpiredSQL_OKPASSIVE_NO_RESULTRELATED_OBJECT_OK_load_expiredorm_excObjectDeletedError_remove_newly_deleted)r   r   keypassiver   states         r   get_from_identityr   b  s    
 ##'',H))(3??5<<#3#3F#;444 ==Z...!333z;;;
  ##E73 x -- --ug6s   /C %C.-C.NFc
                 P    ||d   }
|d   }ndx}
}t        | ||
||||||||	      S )z.Load the given identity key from the database.Nr   r   )rM   refresh_statewith_for_updateonly_load_propsidentity_tokenno_autoflushbind_argumentsra   )load_on_pk_identity)r   r   r   rM   r   r   r   r   r   ra   identr   s               r   load_on_identr     sS     AQ!%%!#''%!%+ r   c                 4   |}|j                         }|j                  rJ ddlm}m} ||j
                  }|j                  t        j                  u r|j                  }n|j                  }||j                  d   }|j                  \  }}d|v rt        t        |j                  |      D cg c]  \  }}|||   j                   c}}      }t!        j"                  ||      }t%        |      t%        |      k(  rt'        j(                  d       t!        j*                  |ddi      f|_        t/        t        ||j                        D cg c]  \  }}||   j                  |f c}}      }nd}|
d}||_        n"|j0                  d}|j0                  |_        nd}|r@|j2                  r4|d	|j4                  j6                  iz  } |j8                  |j2                   }t;        ||||||
      \  }}||_        d|_        |r|ddiz  }t&        j>                  jA                  |
d|i      }
| jC                  |||
|	      jE                         jG                         }	 |jI                         S c c}}w c c}}w # tJ        jL                  $ r Y yw xY w)z6Load the given primary key identity from the database.r   )QueryContextORMCompileStateNplugin_subjectzofully NULL primary key identity cannot load any object.  This condition may raise an error in a future release.
_orm_adaptTF_current_path)version_checkr   r   r   rz   _sa_orm_load_options)paramsra   r   )'_clone_is_lambda_elementr8   r   r   default_load_options_compile_optionsr   default_select_compile_optionsdefault_compile_options_propagate_attrs_get_clausesetrS   primary_keyr   sql_utiladapt_criterion_to_nullrO   r   warn_deep_annotate_where_criteriarf   _for_update_argrM   	load_pathparentoptions_set_get_options	_order_by
EMPTY_DICT
merge_withexecuteuniquescalarsoner   NoResultFound)r   r   primary_key_identityrM   r   r   r   r   r   r   ra   r   qr   r   compile_optionsr   r   _get_paramscolvaluenonesid_valr   r   r   new_compile_optionsro   s                               r   r   r     s     EA#### 7#88 	""55	6 *AA#44'''(89%+%7%7"k '' '***,@'"U }	  $((E #::;NK5zS!566		 ##K,1EF
  ,/(&*<*<,'FK [)--v6
 "+				*!1133O]-D-D-K-KLLAII}112(8#'#%)% -AAKu--222LA 	/)	 	 	
 
	 zz|W.j    s   /I5
I;
%J JJc                     i }i }|r||d<   |r||d<   |r
||d<   d|d<   |rt        |      |d<   |r||d<   |r||z  }|r| |z  } | |fS )N_version_check_populate_existing_refresh_stateT_for_refresh_state_only_load_props_refresh_identity_token)	frozenset)	compile_optload_optpopulate_existingr   r   r   r   r   rM   s	            r   r   r   "  s     OL)6%&->)*)6%&04,-.7.H*+2@./L &  r   c	           	         |r|j                  |      }
n|j                  }
i }|j                  | j                  d|       |xr t	        |      dk(  xr |d   j
                  }|
D ].  }|r|j                  |vr |j                  | |||f||||d|	 0 |5||j                  ur&|r|j                  |   }n|}|j                  |       y y y )Nmemoized_setupsr   )r   column_collectionmemoized_populatorscheck_for_adapt)_iterate_polymorphic_properties_polymorphic_propertiesr   r   rO   is_aliased_classr   setuppolymorphic_oncolumnsr   )rK   r   ri   r6   adapterr   with_polymorphicr   polymorphic_discriminatorkwpoly_propertiesquick_populatorsr   r   pds                  r   _setup_entity_queryr  B  s     @@
 !88HH]%%'8:JK N#d)q.NT"X5N5NO  
uyy?	
	

 ,/ 0+
	
 
	
	
" 	"-%V-B-BB !:;B*B  $ C 	.r   c                 H    t        j                  dt        |       d       y )NzLoading context for aW   has changed within a load/refresh handler, suggesting a row refresh operation took place. If this event handler is expected to be emitting row refresh operations within an existing load or refresh operation, set restore_load_context=True when establishing the listener to ensure the context remains unchanged when the event handler completes.)r   r   r   )r   s    r   _warn_for_runid_changedr  |  s    II !*% 0	3r   c
                 L   !"#$%&'()*+,-./012 j                   j                  }
df}|j                  |
j                  |d      }|j                  }|j                  fdD              }|j                  j                  dt              }g }g g g g g g g d}<j                  }|r|D cg c]  }|j                  |    }}|j                  |      *nd*||*d}|D ]$  }||v r||   }|t        u r+|d   j                  |j                  |j                  f       A|t        u r!|d   j                  |j                  d	f       j|t        u r+|d   j                  |j                  |j                   f       d}|r#|j                  |   }||j#                  |d	      }|s|j#                  |d	      }|r!|d
   j                  |j                  |f       |j%                  | ||||       |j                  |       ' |j'                  |
j                  ||       |d   }|j)                         D ci c]  \  }}|t+        |       c}}(|d   D ]  }|j%                  | |||(        j,                  +j                  j.                  j0                  rj                  j.                  |z   n|$j2                  j4                  0j6                  xs j8                  't;        j<                  j>                  j@                        #t;        j<                  j>                  jB                        ,t;        j2                  j>                  jD                        &&r j2                  j>                  jD                  %t        jF                  !t        jH                   j2                  jJ                  /jL                  .jN                  jP                  11r3jR                  }|#|r|j                  |   }|j#                  |      2nd2s|	d|j0                  f}|j                  v rIj                  |   jT                  dk(  r-jW                  j                  |   jX                  d   |	      }njW                  d|	      }|r9||	ur5J t[        ||      }t\        j_                  $|j`                  |||       t\        jc                  $      )r j                  --je                        -nd-|d   *jf                  rt        jh                  "nt        j
                  " !"#$%&'()*+,-./012fd}jj                  r|	ss"*fd}tm        || |||||	      }|S c c}w c c}}w )z]Produce a mapper level row processor callable
    which processes rows into mapped instances.gettersNc              3   <   K   | ]  }j                   |     y wr?   )_props).0kr   s     r   	<genexpr>z&_instance_processor.<locals>.<genexpr>  s      '%&a 's   r   )newquickdeferredexpiredelayedexistingeager)cached_populatorstodoprimary_key_getterr  r  Fr  r  r  loader))selectinload_polymorphicTentitiesr  c                    r.}|j                         } |      }|j                   k7  }d}d}n |       f}"j                  |      }|: |      } |      }|j                   k7  }| }d}#rw$ru|sst        ||| $       nc |d         ry d}d}d}j                  j                         } |      } |      }||_        |_        !|_        "j                  ||       }|u rd}|s|r9|rs|s|_
        |_        t        | |||||	       |r|j                  }	|rrr@|j                  j                  j                  |       |j                  |	k7  rt!        |       rq j"                  |       |j                  |	k7  rOt!        |       nCrA|j                  j                  j%                  |       |j                   k7  rt!        |       |s|j&                  r)rr|j)                  |       n|j+                  |"       rj-                  |d       |S |j.                  }
|j0                  v}|r|
sd   rut3        | ||||
      }|rarM|j                  }	|j                  j                  j%                  ||       |j                  |	k7  rt!        |       |j)                  ||       rj4                  rj-                  |d       |S )NTFr   r  )r"   rJ   rb   _validate_version_idclass_managernew_instancer   r   
session_id_add_unpresentrM   r   _populate_fullmanagerdispatchru   r  r   refreshmodified_commit_commit_all	add_stateunloadedr)   _populate_partialinvoke_all_eagers)%r4   r   r   dict_isnewcurrentloadloaded_instanceidentitykeyeffective_populate_existingexisting_runidr+  to_loadr8   identity_classr   r   r   is_not_primary_keyload_evtr   loaded_as_persistentr   r   persistent_evtr   
populatorsr7   r  propagated_loader_optionsrefresh_evtrefresh_identity_keyr   rJ   r!  session_identity_mapr   version_id_getters%               r   	_instancez&_instance_processor.<locals>._instances  s      !Eyy{H!(+EKK5(EK#O
 "3'K ,//<H#&x0%h/u,"'i"' %6{(uc3D &k!n5""&!//<<>%h/&x0'	'5$ $. $33E;G&7#E!*.'
 5 )1L%>""++
  "'"..33E7C ;;.83E:%,W__eD ;;.83E: MM**22w {{e+/6.%..$e_=))%1EF##E40J ? ~~H!1!11EH
7(;
 ,	 ")...66ugwO ;;.83E:MM%1W66##E51r   c                 6     |       f} |d         s|S y )Nr   r%   )r4   r2  r6  r   r7  r  s     r   ensure_no_pkz)_instance_processor.<locals>.ensure_no_pk  s/    "3'K
 &k!n5""r   )7_identity_classrK   rb   r   	_prop_setintersectionr   r   r   _tuple_getterr	   r   r   _deferred_column_loaderr   r
   _raise_column_loader_gettercreate_row_processorr   r.   rR   r<  current_pathr6   r   r   r   always_refreshboolr  r%  ru   r&  r9  r   r   hash_keyrJ   r   r   version_id_colstrategy_should_selectin_load
local_opts_load_subclass_via_inPostLoadcallable_for_pathr   for_context_identity_key_from_stateallow_partial_pks
issupersetpolymorphic_map_decorate_polymorphic_switch)3ri   r   r8   ro   r6   r   r   r   r  _polymorphic_fromrK   
getter_keyr
  propsr  r  r  pk_colscpropr   getteradapted_colr   r   rP  selectin_load_via	callable_rA  rC  r6  r   r   r   r7  r8  r   r9  r:  r   r;  r7   r  r<  r=  r>  rJ   r!  r?  r   r@  s3    ``   ``                      @@@@@@@@@@@@@@@@@@@@@r   _instance_processorrg    s   * ++N))M V$Jhh}//TBG   &&& '*9' E  88 19
 
  ((G7>?!7??1-??!'!5!5g!>!% "3"4

  @	"D''&t,**%e,334#?#?@ 11 &h/66%7HI,,%e,334#<#<= "F* '.ooc&:&2%+^^K%GF!!'U!;)'299488V:LM
 11#( ""#- D!A@	"D 	)):w? 345F5L5L5NOzsE#tE{"OJ 
!!\4*	


 !( A A   --22 	**T1  #??7711JV5J5JF((11667Hv++44<<=K'//22GGHN&77LL..N,,M))JMME++N))M..%!(!@ &~ > $.:#'$$$););C)@)I)I N
 *
 !' < <""3'22:>!!
 !' < <'! !2:K!K #***-gt=NOI&&!((!! $$WiII,00' $*#B#B$   $$%9:&11&33_ _ _ _B &7		 1%

	 I @` Ps   ?VV c                     |j                   }t        |j                  j                        dk(  |j                  r|j                  |      \  n|j                  \  fd}|S )Nr   c                 ,   | j                   }f|j                  z   
fz   } j                  | }| j                  j                  |_        |xj
                  d|j                  iz  c_        | j                  r|j                  d      }| j                  j                  |t        |D 	cg c](  \  }}	r|j                  d   d   n|j                  d   * c}	}            j                         j                         j                          y c c}	}w )Nr   T)r   r   r   )primary_keys)r   _with_optionsr   rK   r   r   r   r   ra   r   r   rf   r   r   r   all)r8   r6   states	load_onlyeffective_entity
orig_queryr   q2r   
load_attrsdisable_opt
enable_optr   zero_idxs             r   do_loadz&_load_subclass_via_in.<locals>.do_load;  s    ]]
-*":"::k^KQYY %33KK
==$$%%%=B .4)z (0EIIaLOUYYq\A	
 &(779SSUs   +-D)r   rO   base_mapperr   r   _subclass_load_via_in_subclass_load_via_in_mapper)	r8   r6   entityr   rv  rs  rt  r   ru  s	        @@@@r   rT  rT  1  se    ]]F6%%112a7H%+%A%A&%I":{%+%H%H":{#, Nr   c	                 R   |r| j                   |_         |d   D ]  \  }	}
 |
|      ||	<    |r>|d   D ]5  \  }	}|j                  |	d        |s|j                  j                  |	       7 n+|d   D ]#  \  }	}|s	|j                  j                  |	       % |d   D ]  \  }	} ||||        |d   D ]  \  }	} ||||        y ||j                  k7  r<||_        |d   D ]  \  }	}
|	|vs |
|      ||	<    |d   D ]  \  }	} ||||        y |d   D ]  \  }	} ||||        y )Nr  r  r  r  r  )rJ   popexpired_attributesaddr   )r8   r4   r   r.  r/  r   r1  r   r;  r   rc  set_callable	populators                r   r#  r#  T  s    mm%g. 	%KCE#J	%%/%9 6!\		#t$,,0056
 &0%9 6!\,,0056 )/ 	)NCeUC(	)(3 	)NCeUC(	)	eoo	% $ &g. 	)KC%#C[c
	)
 )4 	)NCeUC(	) )4 	)NCeUC(	)r   c                    |s,| j                   |   }|d   D ]  \  }	}
|	|v s |
|||        n|}|| j                   |<   |d   D ]  \  }	}|	|v s ||      ||	<    |d   D ]:  \  }	}|	|v s|j                  |	d        |s |j                  j                  |	       < |d   D ]  \  }	}
|	|v s |
|||        |d   D ]  \  }	}
|	|v s |
|||        |d   D ]  \  }	}
|	|vs |
|||        |S )Nr  r  r  r  r  r  )r)   r|  r}  r~  )r8   r4   r   r.  r/  r   r+  r;  r5  r   r  rc  r  s                r   r,  r,    s[    ""5)(4 	-NCg~%,	- ")%g. 	)KCg~#C[c
	) ",H!5 	6Cg~		#t$,,005		6
 )/ 	-NCg~%,	- )3 	-NCg~%,	- %W- )YheUC() Nr   c           
          | j                  ||| j                         ||      k7  rIt        j                  dt	        |      d| j                  ||| j                        d ||      d      y )Nz
Instance 'z' has version id 'z3' which does not match database-loaded version id 'z'.)_get_state_attr_by_columnrP  r   StaleDataErrorr   )r   r   r.  r4   rc  s        r   r  r    sv    ''uf++	 $$ % 005&"7"7 s

 
	
r   c	                      ||nj                    S rj                     fd}	t        j                  |	      j	                         fd}
|
S )Nc           	          	 j                   |    }|u ry |j                        syt        |      S # t        $ r t	        d| z        w xY w)NF)r]  z*No such polymorphic_identity %r is defined)r[  r   rg  KeyErrorAssertionError)discriminator
sub_mapperr   r8   r   r6   ri   ro   s     r   configure_subclass_mapperz?_decorate_polymorphic_switch.<locals>.configure_subclass_mapper  s|    	//>J V#^^F+&"(   	 <}L 	s	   ; Ac           
          |       }|T|   }|r ||       S |du r9 |       }|r.t        j                  d|d	dj                  |   d      y  |       S  |       }|rt        j                  d|d	d      y )NFzRow with identity key zG can't be loaded into an object; the polymorphic discriminator column 'z' refers to z-, which is not a sub-mapper of the requested z	' is NULL)r   r   r[  )
r4   r  rA  r2  rC  rc  instance_fnr   polymorphic_instancesr   s
       r   polymorphic_instancez:_decorate_polymorphic_switch.<locals>.polymorphic_instance  s    s$-m<I ~%e#*3/ 44 (*"22=A"	   "3''&s+K00 *>;  r   )r   r   r   PopulateDictrJ  )r  r8   ri   r   ro   r6   r  r   rC  r  r  rc  r  r   s   `````` ``  @@@r   r\  r\    sx     !,2.. 8 . !--.GH^^N+F$ $L  r   c                   V    e Zd ZdZdZd Zd Zd Zed        Z	ed        Z
ed        Zy	)
rU  z4Track loaders and states for "post load" operations.)loadersrm  	load_keysc                 R    i | _         t        j                         | _        d | _        y r?   )r  r   OrderedDictrm  r  )selfs    r   __init__zPostLoad.__init__   s     &&(r   c                 "    || j                   |<   y r?   )rm  )r  r   	overwrites      r   r*  zPostLoad.add_state%  s    
 'Er   c                    | j                   sy t        j                  j                  |      }| j                  j                         D ]w  \  }}}}}| j                   j                         D 	cg c].  \  }}	|j                  j                  j                  |      r||	f0 }
}}	|
s_ ||||
| j                  g|i | y | j                   j                          y c c}	}w r?   )rm  r   PathRegistrycoercer  valuesr.   r$  r   r   r  clear)r  r8   r6   tokenlimit_to_mapperr  argr  r   r  rm  s              r   r/   zPostLoad.invoke,  s    {{))0067;||7J7J7L 	J3E?FC )-(9(9(;$E9==''++O< 	"F 
 wfdnnIsIbI	J 	s   -3Cc                 f    |j                   j                  |j                        }|	|r||_        |S r?   )r-   rb   r6   r  )clsr8   r6   r   pls        r   rW  zPostLoad.for_context:  s/    $$((3>o*BL	r   c                     |j                   |j                  v xr% ||j                  |j                      j                  v S r?   )r6   r-   r  )r  r8   r6   r   s       r   path_existszPostLoad.path_existsA  s>     II000 Bw..tyy9AAA	
r   c                     |j                   |j                  v r|j                  |j                      }n#t               x}|j                  |j                   <   |||||f|j                  |<   y r?   )r6   r-   rU  r  )	r  r8   r6   r  r  loader_callabler  r  r  s	            r   rV  zPostLoad.callable_for_pathH  s^     99///((3B6>j@B((3"O_c2N

5r   N)__name__
__module____qualname____doc__	__slots__r  r*  r/   classmethodrW  r  rV  r%   r   r   rU  rU    sW    >0I
'   
 
 O Or   rU  c                    |j                   }|s!t        j                  dt        |      z        t	        |j
                        }d}t	        |t        j                  z        xs |j                   j                  }|r)|j                  | j                  j                               }| j                  rq| j                  se| j                  ||      }|Qddlm}	  |	| |      j#                  t%        j&                  |       j)                  d            }
t+        ||
d|||      }|du r|r|j
                  }n}| j,                  D cg c]  }| j.                  |   j
                   }}|j0                  j                  |      r!t3        j4                  dt        |      z        | j7                  |      }t9        j:                  |      r| j<                  rt9        j>                  |      r tA        jB                  d	t        |             yt+        |tE        jF                  |       jI                  tJ              ||||
      }|r|t        jL                  |      yyc c}w )z4initiate a column-based attribute refresh operation.zQInstance %s is not bound to a Session; attribute refresh operation cannot proceedFNr   )FromStatement*)r   r   r   z_Instance %s cannot be refreshed - it's not  persistent and does not contain a full primary key.zwInstance %s to be refreshed doesn't contain a full primary key - can't be refreshed (and shouldn't be expired, either).)r   r   r   )'r   r   DetachedInstanceErrorr   rN  r   r   NO_AUTOFLUSH
autocommitrF  attrsr   r   concrete_optimized_get_statementr   r  r   r   Loadundeferr   r   _columntopropertyr}  r   r   rX  r   issubsetrY  rZ  r   warn_limitedr   selectset_label_styler   r   )r   r   attribute_namesr   r   has_keyro   r   r   r  stmtidentity_keyr   pk_attrss                 r   load_scalar_attributesr  S  sJ    mmG++9<Ee<LN
 	

 599oGF 	Wz.../K5==3K3K  )66v||7H7H7JKv
 33E?K	  - 3;; %%f-55c:D # /#)F  99L >D=O=O69((-11H  ''44X>0024=e4DE 
 "::5AL |,V5M5M!!,/6 % 	 MM&!11. +%	
 6>((// "wGs    I)T)NNNNN)NNN)NNNN)4r  
__future__r    r   r   r   r   r   baser	   r
   r   r   r   r   r   r   enginer   engine.resultr   r   r   sqlr   sql.selectabler   r   counterrI   rp   preload_moduler   deprecated_20r   r   r   r   r   r   r  r  rg  rT  r#  r,  r  r\  objectrU  r  r%   r   r   <module>r     s   '     " " '      ! 1 ( 0 " ; (T\\^
dN -.8& /8&v F	 -.M& /M&`L ??ooL ??ooy~ !N "7%t	& "fR F4)tD
$V r5Ov 5Opf0r   