o
    Šåg¥ã  ã                   @  s�  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 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�rdd&l/m0Z0 dd'lm1Z1 dd(l2m3Z3 dd)l4m5Z5 dd*l6m7Z7 dd+l8m9Z9 dd,l:m;Z; dd-l<m=Z= dd.l>m?Z? dd/l#m@Z@ dd0l'mAZA ed1ed2�ZBed3eCd2�ZDe E¡ ZFeeGeeeGef  f ZHd‹d:d;„ZIe Jd<¡dŒd>d?„ƒZKejLd@dAdB�e Jd<¡	=dŒd�dJdK„ƒƒZMdŽdUdV„ZNdWdWdWdWdXej.ej.dXdXdYœ	d�dldm„ZOdWdWdWdWdWdXej.ej.dXdXdnœ
d�dsdt„ZP	W	W	W	W	W	Wd‘dudv„ZQ	W	W	Wd’dwdx„ZRdydz„ ZS	W	W	W	Wd“d{d|„ZTd}d~„ ZUdd€„ ZVd�d‚„ ZWdƒd„„ ZXd…d†„ ZYG d‡dˆ„ dˆƒZZd‰dŠ„ Z[dWS )”zßprivate 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.

é    )Úannotations)ÚAny)ÚDict)ÚIterable)ÚList)ÚMapping)ÚOptional)ÚSequence)ÚTuple)ÚTYPE_CHECKING)ÚTypeVar)ÚUnioné   )Ú
attributes)Úexc)Úpath_registry)Ú_DEFER_FOR_STATE)Ú_RAISE_FOR_STATE)Ú_SET_DEFERRED_EXPIRED)ÚPassiveFlag)ÚFromStatement)ÚORMCompileState)ÚQueryContext)Ú	_none_set)Ú	state_stré   )Úutil)Úresult_tuple)ÚChunkedIteratorResult)ÚFrozenResult)ÚSimpleResultMetaData)Úselect)ÚForUpdateArg)ÚLABEL_STYLE_TABLENAME_PLUS_COL)ÚSelectState)Ú
EMPTY_DICT)Ú_IdentityKeyType)ÚLoaderCallableStatus)Ú	ORMOption)ÚMapper)ÚQuery)ÚSession)ÚInstanceState)ÚCursorResult)Ú_ExecuteOptions)ÚResult)ÚSelectÚ_T)ÚboundÚ_OÚcursorúCursorResult[Any]Úcontextr   ÚreturnúResult[Any]c                   s¸  t ƒ ˆ_ˆjrd‰ˆjjˆ_nd‰i ˆ_ˆj}|j}ˆjj o+t|j	ƒdko+|j	d j
‰z#tt‡‡fdd„ˆjj	D ƒŽ ƒ\‰}}ˆjrNˆjsIˆjrNt d¡‚W n! typ   t ¡ � ˆ ¡  W d  ƒ n1 siw   Y  Y nw d	d
„ ‰ dddœdd„‰‡ ‡‡fdd„ˆjj	D ƒ}t|||d�}‡‡‡‡‡fdd„}ˆj dd¡r®t|dƒƒ‰‡fdd„}t||ˆˆˆjjd�}	|	j t|ˆd�¡|	_ˆjjrÑdd„ }
d|
f|	_ ˆjrÚ|	 ˆj¡ |	S )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.

    FTr   r   c                   s   g | ]}|  ˆ ˆ¡‘qS © )Úrow_processor)Ú.0Úquery_entity)r6   r4   r9   úR/var/www/html/flaskapp/venv/lib/python3.10/site-packages/sqlalchemy/orm/loading.pyÚ
<listcomp>q   s    
ÿÿzinstances.<locals>.<listcomp>zØCan'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                 S  ó
   t  d¡‚)Nz@Can't use the ORM yield_per feature in conjunction with unique()©Úsa_excÚInvalidRequestError)Úentryr9   r9   r=   Ú
_no_unique‡   ó   ÿzinstances.<locals>._no_unique©ÚlegacyÚ	uncertainc                  s2   |s‡‡fdd„}|S ˆst S d‰ ‡ fdd„}|S )Nc                   s8   ˆrzt | ƒW S    Y t dˆ ›dˆrdnd› d�¡‚)Nz=Can't apply uniqueness to row tuple containing value of type z; z the values returned appear to bezthis datatype producesz non-hashable values)ÚhashrA   rB   ©Úobj)ÚdatatyperH   r9   r=   Úgo�   s   
ÿÿüÿz,instances.<locals>._not_hashable.<locals>.goFc                   s$   ˆ szt | ƒW S    Y d‰ t| ƒS )NT)rI   ÚidrJ   )Ú_use_idr9   r=   rM   ¥   s   
)rN   )rL   rG   rH   rM   r9   )rO   rL   rH   r=   Ú_not_hashableŒ   s   z instances.<locals>._not_hashablec                   sN   g | ]#}ˆj r	ˆ n|js|js|jrˆ|jjˆjj|jd �n|jr#tnd‘qS )rF   N)	Ú	yield_perÚuse_id_for_hashÚ_non_hashable_valueÚ_null_column_typeÚcolumnÚtypeÚload_optionsÚ_legacy_uniquingrN   ©r;   Úent)rD   rP   r6   r9   r=   r>   ·   s     òÿ	úùùý	ò)Ú_unique_filtersc                 3  sÞ   � 	 | }i ˆ_ |rˆ |¡}|sd S nˆ ¡ }ˆr'ˆd ‰ ‡ fdd„|D ƒ}n	‡fdd„|D ƒ}ˆrg|r;tˆj ¡ ƒ}ˆjrZtˆj ¡ ƒ}ˆj ¡  |D ]
\}}| ˆ|¡ qLˆjs>|rgˆj ¡  ˆj |¡ |V  |snd S q)NTr   c                   s   g | ]}ˆ |ƒ‘qS r9   r9   )r;   Úrow©Úprocr9   r=   r>   ß   ó    z-instances.<locals>.chunks.<locals>.<listcomp>c                   s"   g | ]‰ t ‡ fd d„ˆD ƒƒ‘qS )c                   s   g | ]}|ˆ ƒ‘qS r9   r9   )r;   r^   ©r\   r9   r=   r>   â   r_   z8instances.<locals>.chunks.<locals>.<listcomp>.<listcomp>)Útuple)r;   )Úprocessr`   r=   r>   á   s    ÿ)	ÚpartialsÚ	fetchmanyÚ_raw_all_rowsÚlistÚpost_load_pathsÚitemsÚclearÚinvokeÚupdate)ÚsizerQ   ÚfetchÚrowsÚtop_level_post_loadsÚ
post_loadsÚpathÚ	post_load)r6   r4   Úis_top_levelrb   Úsingle_entityr]   r=   ÚchunksÏ   sD   €
ÿ
ÿ	ÿ
ü
Ñzinstances.<locals>.chunksÚprebuffer_rowsc                   s   t ˆ ƒS ©N)Úiter)rl   )Ú_prebufferedr9   r=   ru     s   )Úsource_supports_scalarsÚrawÚdynamic_yield_per)ÚfilteredÚis_single_entityc                 S  r?   )Nz~The unique() method must be invoked on this Result, as it contains results that include joined eager loads against collectionsr@   rJ   r9   r9   r=   Úrequire_unique  rE   z!instances.<locals>.require_unique)!Ú
_new_runidÚrunidÚtop_level_contextrg   Úcompile_stateÚ_has_mapper_entitiesrW   Ú_only_return_tuplesÚlenÚ	_entitiesÚsupports_single_entityrf   ÚziprQ   Úloaders_require_bufferingÚloaders_require_uniquingrA   rB   Ú	Exceptionr   Úsafe_reraiseÚcloser    Úexecution_optionsÚgetr   r6   Ú_is_server_sideÚ_attributesÚunionÚdictÚmulti_row_eager_loadersÚ_unique_filter_state)r4   r6   rƒ   r}   ÚlabelsÚextraÚunique_filtersÚrow_metadataru   Úresultr   r9   )rD   rP   ry   r6   r4   rs   rb   rt   r=   Ú	instancesN   s€   
ÿ
ýþÿ
ÿ	ÿþÿ€

ÿ€ÿ+ïÿ2û
ÿ
rœ   zsqlalchemy.orm.contextTc              	     sì   t jj‰ |r
|  ¡  ˆ jj|dd�}| j}z\d| _‡ fdd„t|jƒD ƒ}dd„ |jD ƒ}t	|dd„ |jD ƒƒ}g }	| 
¡ D ]*}
|D ]}|
| dur`| jt |
| ¡t |
| ¡|i i d�|
|< qB|	 ||
ƒ¡ q>| |	¡W || _S || _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©rG   c                   ó    g | ]\}}t |ˆ jƒr|‘qS r9   ©Ú
isinstanceÚ_MapperEntity©r;   ÚiÚe©Úquerycontextr9   r=   r>   I  ó    
ýÿz'merge_frozen_result.<locals>.<listcomp>c                 S  ó   g | ]}|j ‘qS r9   ©Ú_label_namerY   r9   r9   r=   r>   N  ó    c                 S  r¨   r9   ©Ú_extra_entitiesrY   r9   r9   r=   r>   Q  r«   N©ÚloadÚ
_recursiveÚ_resolve_conflict_map)r   Ú	preloadedÚorm_contextÚ
_autoflushÚORMSelectCompileStateÚ_create_entities_collectionÚ	autoflushÚ	enumerater‡   r   Úrewrite_rowsÚ_merger   Úinstance_stateÚinstance_dictÚappendÚwith_new_rows)ÚsessionÚ	statementÚfrozen_resultr¯   Úctxr·   Úmapped_entitiesÚkeysÚkeyed_tupler›   Únewrowr£   r9   r¥   r=   Úmerge_frozen_result+  s>   ÿ
þÿ
û€
rÇ   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Úqueryú
Query[Any]Úiteratorú>Union[FrozenResult, Iterable[Sequence[Any]], Iterable[object]]r¯   Úboolú"Union[FrozenResult, Iterable[Any]]c              	     sr  t jj‰| j‰ˆ rˆ ¡  t|tƒr|}t|jƒ}nd}ˆj	j
| dd�}ˆj}z�dˆ_| o4t|jƒdk}|rPt|jd ˆjƒrK‡ ‡fdd„|D ƒ}nWt|ƒ}nR‡fd	d„t|jƒD ƒ}g }d
d„ |jD ƒ}	t|	dd„ |jD ƒƒ}
|D ].}t|ƒ}|D ]}|| dur™ˆjt || ¡t || ¡ˆ i i d�||< q{| |
|ƒ¡ qs|r­| |¡W |ˆ_S t|ƒW |ˆ_S |ˆ_w )z Merge a result into the given :class:`.Query` object's Session.

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

    NTr�   Fr   r   c              	     s,   g | ]}ˆj t |¡t |¡ˆ i i d �‘qS )r®   )rº   r   r»   r¼   )r;   Úinstance)r¯   r¿   r9   r=   r>   “  s    ùûÿz merge_result.<locals>.<listcomp>c                   rž   r9   rŸ   r¢   r¥   r9   r=   r>      r§   c                 S  r¨   r9   r©   rY   r9   r9   r=   r>   ¦  r«   c                 S  r¨   r9   r¬   rY   r9   r9   r=   r>   ©  r«   r®   )r   r²   r³   r¿   r´   r    r   rx   Údatarµ   r¶   r·   r†   r‡   r¡   rf   r¸   r   rº   r   r»   r¼   r½   r¾   )rÉ   rË   r¯   rÁ   rÂ   r·   rt   r›   rÃ   rÄ   rÅ   r\   rÆ   r£   r9   )r¯   r¦   r¿   r=   Úmerge_resultg  s^   
ÿø

þÿ
û€
þrÑ   r¿   r+   Úmapperú
Mapper[_O]Úkeyú_IdentityKeyType[_O]Úpassiver   ú)Union[LoaderCallableStatus, Optional[_O]]c                 C  s˜   | j  |¡}|durJt |¡}|jr|j |¡stjS |jrH|tj	@ s&tj
S |tj@ s-|S z	| ||¡ W |S  tjyG   |  |g¡ Y dS w |S dS )zqLook up the given key in the given session's identity map,
    check the object for expired state if found.

    N)Úidentity_mapr�   r   r»   ÚinheritsrÒ   ÚisaÚPASSIVE_CLASS_MISMATCHÚexpiredÚSQL_OKÚPASSIVE_NO_RESULTÚRELATED_OBJECT_OKÚ_load_expiredÚorm_excÚObjectDeletedErrorÚ_remove_newly_deleted)r¿   rÒ   rÔ   rÖ   rÏ   Ústater9   r9   r=   Úget_from_identityÁ  s&   



ýþrå   NF)	rW   Úrefresh_stateÚwith_for_updateÚonly_load_propsÚno_autoflushÚbind_argumentsr�   Úrequire_pk_colsÚis_user_refreshrÀ   úUnion[Select, FromStatement]úOptional[_IdentityKeyType]rW   úOptional[Sequence[ORMOption]]ræ   úOptional[InstanceState[Any]]rç   úOptional[ForUpdateArg]rè   úOptional[Iterable[str]]ré   rê   úMapping[str, Any]r�   r.   rë   rì   c       	         C  sD   |dur|d }|d }nd }}t | ||||||||||	|
|d�S )z.Load the given identity key from the database.Nr   r   ©
rW   ræ   rç   rè   Úidentity_tokenré   rê   r�   rë   rì   )Úload_on_pk_identity)r¿   rÀ   rÔ   rW   ræ   rç   rè   ré   rê   r�   rë   rì   Úidentrõ   r9   r9   r=   Úload_on_identç  s&   
órø   rô   Úprimary_key_identityúOptional[Tuple[Any, ...]]rõ   úOptional[Any]c       
      	     s0  |}|  ¡ }|jrJ ‚|du rtj}|jtju rtj}n|j}|duri|j	d }|j
\}‰ d|v rQ‡ fdd„t|j|ƒD ƒ}t ||¡}t|ƒt|ƒkrQt d¡ t |ddi¡f|_‡ fdd	„t||jƒD ƒ}nd}|durud}||_n|jdur�d}|j|_nd
}|rÂ|rÂˆsŽt d¡‚ˆjj}‡fdd„| |¡D ƒ}|r­t d|› dˆj› d�¡‚ˆjj}|D ]}|| jrÁ| |¡} nq³ˆrÕˆjrÕ|dˆjj i7 }|j!ˆjŽ }t"||||ˆ||d�\}}||_d|_#|rð|dd
i7 }tj$ %|
d|i¡}
| j&|||
|	d� '¡  (¡ }z| )¡ W S  t*j+�y   Y dS w )z6Load the given primary key identity from the database.NÚplugin_subjectc                   s"   h | ]\}}|d u rˆ | j ’qS rw   ©rÔ   )r;   ÚcolÚvalue©Ú_get_paramsr9   r=   Ú	<setcomp>8  s
    þz&load_on_pk_identity.<locals>.<setcomp>zofully NULL primary key identity cannot load any object.  This condition may raise an error in a future release.Ú
_orm_adaptTc                   s   i | ]
\}}ˆ | j |“qS r9   rý   )r;   Úid_valÚprimary_keyr   r9   r=   Ú
<dictcomp>K  s    
ÿÿz'load_on_pk_identity.<locals>.<dictcomp>Fz9refresh_state is required when require_pk_cols is presentc                   s    h | ]}ˆ j | j ¡ r|’qS r9   )ÚattrsÚhistoryÚhas_changes)r;   rÔ   )ræ   r9   r=   r  d  s    ýÿz7Please flush pending primary key changes on attributes z for mapper z! before proceeding with a refreshÚ_current_path)Úversion_checkrè   ræ   rõ   rì   r´   Ú_sa_orm_load_options)Úparamsr�   rê   ),Ú_cloneÚ_is_lambda_elementr   Údefault_load_optionsÚ_compile_optionsr$   Údefault_select_compile_optionsr   Údefault_compile_optionsÚ_propagate_attrsÚ_get_clauser‰   r  Úsql_utilÚadapt_criterion_to_nullr†   r   ÚwarnÚ_deep_annotateÚ_where_criteriaÚ_for_update_argrA   ÚArgumentErrorrÒ   Ú_primary_key_propkeysÚ
differencerB   Ú_propsÚ_is_relationshipr“   rW   Ú	load_pathÚparentÚoptionsÚ_set_get_optionsÚ	_order_byr%   Ú
merge_withÚexecuteÚuniqueÚscalarsÚonerá   ÚNoResultFound)r¿   rÀ   rù   rW   ræ   rç   rè   rõ   ré   rê   r�   rë   rì   rÉ   ÚqÚcompile_optionsrÒ   r  Únonesr  r  Úrefresh_state_prokeysr	  ÚmpÚpÚnew_compile_optionsr›   r9   )r  ræ   r=   rö     sº   
ÿ



þÿÿ
ÿþ

ÿ
þþþÿ"

þ

ù
ÿüø
ÿrö   c           
      C  s|   i }i }	|r
||	d< |r||	d< |r||	d< d|d< |r"t |ƒ|d< |r(||	d< |r.||	d< |	r4||	7 }|r:| |7 } | |fS )	NÚ_version_checkÚ_populate_existingÚ_refresh_stateTÚ_for_refresh_stateÚ_only_load_propsÚ_identity_tokenÚ_is_user_refresh)Ú	frozenset)
Úcompile_optÚload_optÚpopulate_existingr  rè   ræ   rõ   rì   r-  rW   r9   r9   r=   r$  Æ  s(   
r$  c	                 K  s¼   |r|  |¡}
n|j}
i }| | jd|¡ |o!t|ƒdko!|d j}|
D ]}|r.|j|vr.q$|j| |||f||||dœ|	¤Ž q$|d urZ||jur\|rQ|j	| }n|}| 
|¡ d S d S d S )NÚmemoized_setupsr   éÿÿÿÿ)rè   Úcolumn_collectionÚmemoized_populatorsÚcheck_for_adapt)Ú_iterate_polymorphic_propertiesÚ_polymorphic_propertiesÚsetr   r†   Úis_aliased_classrÔ   ÚsetupÚpolymorphic_onÚcolumnsr½   )rƒ   rÒ   r<   rq   Úadapterr@  Úwith_polymorphicrè   Úpolymorphic_discriminatorÚkwÚpoly_propertiesÚquick_populatorsrB  rÿ   Úpdr9   r9   r=   Ú_setup_entity_queryè  s@   ÿüø	÷
ùrQ  c                 C  s   t  dt| ƒf ¡ d S )Nam  Loading context for %s 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ä   r9   r9   r=   Ú_warn_for_runid_changed  s
   úÿrR  c
                    s”  ˆ
j ‰ˆj}
dˆ
f}| |
j|d¡}|du rÙˆ
j}ˆdur)| ‡
fdd„ˆD ƒ¡}| ˆjdt¡}g }g g g g g g dœ}ˆdu rTˆ
j}ˆ rN‡ fdd„|D ƒ}| |¡‰nd‰||ˆd	œ}|D ]r}||v rË|| }|t	u rx|d
  
|j|jf¡ q^|tu r‡|d  
|jdf¡ q^|tu r—|d
  
|j|jf¡ q^d}ˆ rªˆ j| }|durª| |d¡}|s²| |d¡}|r¿|d  
|j|f¡ q^| ˆ| |ˆ
|ˆ |¡ q^| 
|¡ q^| |
j||¡ |d }dd„ | ¡ D ƒ‰|d D ]}| ˆ| |ˆ
|ˆ ˆ¡ qêˆj‰ˆjjj�rˆjj| n|‰ˆjj‰ˆj�pˆ
j‰tˆ
jjjƒ‰tˆ
jjj ƒ‰tˆjjj!ƒ‰ˆ�r1ˆjjj!‰	tj"‰tj#‰ˆjj$‰ˆj%‰ˆj&‰ˆj'‰ˆ�r_ˆ
j(}|du�r]ˆ �rWˆ j| }| |¡‰nd‰ˆ�sâ|	du�râd|jf}|ˆjv �r„ˆj| j)dk�r„ˆj| j*d }nd}ˆ
 +||	¡}|�râ||	u�râˆdu �s›J ‚|j,�r¼g }|}|�r»||	u�r»| 
|¡ |j-}|�r»||	u�s«n|g}|D ] }t. /ˆˆ|¡�rÍ�qÁt0ˆ|||	|ƒ}t. 1ˆˆ|j2|||¡ �qÁt. 3ˆˆˆ¡‰ˆ�rúˆj‰ˆdu �rùˆ
 4ˆ¡‰nd‰|d ‰ˆ
j5�rt6j7‰nt6j‰‡‡‡‡‡‡‡‡‡	‡
‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡fdd„}ˆ
j8�rH|	�sHˆ�sH‡‡‡‡fdd„}t9|ˆ| ˆ
|||ˆ |ƒ	}|S )z]Produce a mapper level row processor callable
    which processes rows into mapped instances.ÚgettersNc                 3  s   � | ]}ˆ j | V  qd S rw   )r  )r;   Úk©rÒ   r9   r=   Ú	<genexpr>U  s   € 

ÿz&_instance_processor.<locals>.<genexpr>r>  )ÚnewÚquickÚdeferredÚexpireÚexistingÚeagerc                   s   g | ]}ˆ j | ‘qS r9   )rI  )r;   Úc)rJ  r9   r=   r>   l  s    z'_instance_processor.<locals>.<listcomp>)Úcached_populatorsÚtodoÚprimary_key_getterrW  rZ  FrX  r^  c                 S  s   i | ]	\}}|t |ƒ“qS r9   )rf   )r;   rÔ   rÿ   r9   r9   r=   r  ¼  s    z'_instance_processor.<locals>.<dictcomp>r_  Úloader))Úselectinload_polymorphicTÚentitiesr`  c              
     sˆ  ˆrˆ}|  ¡ }ˆ|ƒ}|jˆk}d}d}n[ˆˆ| ƒˆf}ˆ |¡}|d urGˆ|ƒ}ˆ|ƒ}|jˆk}| }d}ˆrFˆrF|sFtˆ	||| ˆƒ n*ˆ|d ƒrOd S d}d}d}ˆ	j ¡ }ˆ|ƒ}ˆ|ƒ}||_ˆ|_ˆ|_ˆ 	||¡ ˆ}ˆ|u ryd}|s}|rõ|r‰ˆsƒ|s‰ˆ|_
ˆ|_tˆ | |||ˆ||ˆƒ	 |rë|j}	|rÁˆr¯|jj |ˆ ¡ |j|	kr¯t|ƒ ˆrÀˆˆ j|ƒ |j|	krÀt|ƒ nˆrÕ|jj |ˆ ˆ
¡ |jˆkrÕt|ƒ |sÚ|jrëˆråˆ
rå| |ˆ
¡ n| |ˆ¡ ˆróˆ |d¡ |S |j}
|ˆ jv}|�r|
�sˆd �r5tˆ | |||ˆ|
ˆƒ}|�r5ˆ�r/|j}	|jj |ˆ |¡ |j|	k�r/t|ƒ | ||¡ ˆ�rBˆ j�rBˆ |d¡ |S )NTFr   r\  )rK   r�   r�   Ú_validate_version_idÚclass_managerÚnew_instancerÔ   rõ   Ú
session_idÚ_add_unpresentrW   r!  Ú_populate_fullÚmanagerÚdispatchr¯   rR  r¿   ÚrefreshÚmodifiedÚ_commitÚ_commit_allÚ	add_stateÚunloadedrc   Ú_populate_partialÚinvoke_all_eagers)r\   rä   rÏ   Údict_ÚisnewÚcurrentloadÚloaded_instanceÚidentitykeyÚeffective_populate_existingÚexisting_runidrq  Úto_load)r6   Úidentity_classrõ   r¼   r»   Úis_not_primary_keyÚload_evtr!  Úloaded_as_persistentrÒ   rè   Úpersistent_evtr=  Ú
populatorsrr   r`  Úpropagated_loader_optionsÚrefresh_evtÚrefresh_identity_keyræ   r�   rg  Úsession_identity_mapr  Úversion_id_getterr9   r=   Ú	_instance+  sÒ   
ý


ÿ€	
ÿÿ÷

€ÿ

%á
øz&_instance_processor.<locals>._instancec                   s"   ˆ ˆ| ƒˆf}ˆ|d ƒs|S d S )Nr   r9   )r\   rx  )r|  rõ   r}  r`  r9   r=   Úensure_no_pkÎ  s   ýz)_instance_processor.<locals>.ensure_no_pk):Ú_identity_classrƒ   r�   r   Ú	_prop_setÚintersectionr%   r  Ú_tuple_getterr   r½   rÔ   Ú_deferred_column_loaderr   r   Ú_raise_column_loaderrI  Ú_getterÚcreate_row_processorrE  rh   r‚  Úcurrent_pathrq   r¿   rØ   r=  Úalways_refreshrÍ   re  rk  r¯   rl  r  r»   r¼   Úhash_keyr�   rõ   r  Úversion_id_colÚstrategyÚ
local_optsÚ_should_selectin_loadÚ	is_mapperrÙ   ÚPostLoadÚpath_existsÚ_load_subclass_via_inÚcallable_for_pathrÒ   Úfor_contextÚ_identity_key_from_stateÚallow_partial_pksr   Ú
issupersetÚpolymorphic_mapÚ_decorate_polymorphic_switch) r<   rÒ   r6   r›   rq   rJ  rè   ræ   rL  Ú_polymorphic_fromrƒ   Ú
getter_keyrS  ÚpropsrO  r_  r^  Úpk_colsÚproprþ   ÚgetterÚadapted_colr”  rÔ   Úoption_entitiesÚselectin_load_viaÚ_load_supersÚ_endmost_mapperÚ_selectinload_entityÚ	callable_r‡  rˆ  r9   )rJ  r6   r|  rõ   r¼   r»   r}  r~  r!  r  rÒ   rè   r€  r=  r�  rr   r`  r‚  rƒ  r„  ræ   r�   rg  r…  r  r†  r=   Ú_instance_processor+  sP  ÿÿú	ý
ÿ
ÿ
ùÿÿý



þÿ

üÿ
€ÿûú	
ÿ€< !÷r°  c                   sj   |j ‰|j }|jd u}tˆjjƒdk‰|js|r"ˆ ||¡\‰‰‰ nˆj\‰‰‰ ‡ ‡‡‡‡‡fdd„}|S )Nr   c           
        sÆ   ˆs‡fdd„|D ƒ}|sd S | j }|jr ˆ |¡}ˆ  |¡}nˆ}ˆ }|f|j |f }ˆj|Ž }	| jj|	_|	 jd|ji7  _| jrJ|	j	dd�}	| j
 |	t‡fdd„|D ƒd�¡ ¡  ¡  ¡  d S )Nc                   s$   g | ]\}}|j  ˆ ¡r||f‘qS r9   )rÒ   Ú+_would_selectin_load_only_from_given_mapper)r;   ÚsÚvrU  r9   r=   r>     s    
ýÿz:_load_subclass_via_in.<locals>.do_load.<locals>.<listcomp>r
  T)r=  c                   s,   g | ]\}}ˆ r|j d  d n|j d  ‘qS )r   r   rý   )r;   rä   Ú
load_attrs)Úzero_idxr9   r=   r>   #  s    ÿÿ)Úprimary_keys)rÉ   r"  Ú_prepend_pathÚ_with_optionsr#  rƒ   r  r  r=  r�   r¿   r'  r”   r(  r)  Úall)
r6   rq   ÚstatesÚ	load_onlyÚeffective_entityÚ
orig_queryÚenable_opt_lclÚdisable_opt_lclr#  Úq2©Údisable_optÚ
enable_optrÒ   rª  r,  rµ  r9   r=   Údo_loadü  s8   
þ
ÿ


þÿþz&_load_subclass_via_in.<locals>.do_load)rÒ   rÙ   r†   Úbase_mapperr  rF  Ú_subclass_load_via_inÚ_subclass_load_via_in_mapper)r6   rq   ÚentityÚpolymorphic_fromrª  Úpolymorphic_from_mapperÚnot_against_basemostrÄ  r9   rÁ  r=   r›  è  s   

ÿ.r›  c	                 C  s  |rQ| j |_ |d D ]
\}	}
|
|ƒ||	< q
|r/|d D ]\}	}| |	d ¡ |r-|j |	¡ qn|d D ]\}	}|r?|j |	¡ q3|d D ]
\}	}||||ƒ qDd S ||jkr}||_|d D ]\}	}
|	|vrk|
|ƒ||	< q]|d D ]
\}	}||||ƒ qpd S |d D ]
\}	}||||ƒ q�d S )NrX  rZ  rW  r[  )r�   ÚpopÚexpired_attributesÚaddr!  )r6   r\   rä   rt  ru  r!  rw  r=  r�  rÔ   r¨  Úset_callableÚ	populatorr9   r9   r=   ri  -  s<   €ý€ÿ
€ÿÿri  c                 C  s  |s0|r|d D ]\}}	||v r|	|ƒ||< q| j | }
|d D ]\}}||
v r.||||ƒ q nH|}
|
| j |< |d D ]\}}	||
v rI|	|ƒ||< q;|d D ]\}}||
v rd| |d ¡ |rd|j |¡ qN|d D ]\}}||
v rw||||ƒ qi|d D ]\}}||vrŠ||||ƒ q||
S )NrX  r[  rZ  rW  r\  )rc   rÌ  rÍ  rÎ  )r6   r\   rä   rt  ru  r!  rq  r�  rÔ   r¨  r{  rÐ  rÏ  r9   r9   r=   rr  f  sB   €
€þ
€€€€rr  c              	   C  sD   |   ||| j¡||ƒkr t dt|ƒ|   ||| j¡||ƒf ¡‚d S )NzWInstance '%s' has version id '%s' which does not match database-loaded version id '%s'.)Ú_get_state_attr_by_columnr”  rá   ÚStaleDataErrorr   )rÒ   rä   rt  r\   r¨  r9   r9   r=   rd  ‹  s    ÿþÿûþÿýrd  c	                   sr   |d ur|‰nˆj ‰ˆd u rˆS ˆ rˆ jˆ ‰‡ ‡‡‡‡	‡
fdd„}	t |	¡‰ˆ
 ˆ¡‰‡‡‡‡‡‡fdd„}
|
S )Nc              	     sZ   zˆj |  }W n ty   td|  ƒ‚w |ˆu rd S | ˆ¡s"dS tˆ|ˆˆˆˆ ˆd�S )Nz*No such polymorphic_identity %r is definedF)r£  )r¡  ÚKeyErrorÚAssertionErrorrÚ   r°  )ÚdiscriminatorÚ
sub_mapper)rJ  r6   rÒ   rq   r<   r›   r9   r=   Úconfigure_subclass_mapper±  s(   ÿÿ
ùz?_decorate_polymorphic_switch.<locals>.configure_subclass_mapperc                   s‚   ˆ| ƒ}|d ur0ˆ| }|r|| ƒS |du r,ˆ | ƒ}|r*t  d|ˆˆj| ˆf ¡‚d S ˆ| ƒS ˆ | ƒ}|r?t  d|ˆf ¡‚d S )NFzžRow with identity key %s can't be loaded into an object; the polymorphic discriminator column '%s' refers to %s, which is not a sub-mapper of the requested %szjRow with identity key %s can't be loaded into an object; the polymorphic discriminator column '%s' is NULL)rA   rB   r¡  )r\   rÕ  r‡  rx  )rˆ  r¨  Úinstance_fnrÒ   Úpolymorphic_instancesrH  r9   r=   Úpolymorphic_instanceÌ  s6   üüÿþÿz:_decorate_polymorphic_switch.<locals>.polymorphic_instance)rH  rI  r   ÚPopulateDictr�  )rØ  r6   r<   rÒ   r›   rq   rL  rJ  rˆ  r×  rÚ  r9   )rJ  r6   rˆ  r¨  rØ  rÒ   rq   rÙ  rH  r<   r›   r=   r¢  œ  s   


&r¢  c                   @  sP   e Zd ZdZdZdd„ Zdd„ Zdd„ Zed	d
„ ƒZ	edd„ ƒZ
edd„ ƒZdS )r™  z4Track loaders and states for "post load" operations.)Úloadersrº  Ú	load_keysc                 C  s   i | _ t ¡ | _d | _d S rw   )rÜ  r   ÚOrderedDictrº  rÝ  )Úselfr9   r9   r=   Ú__init__ú  s   

zPostLoad.__init__c                 C  s   || j |< d S rw   )rº  )rß  rä   Ú	overwriter9   r9   r=   rp  ÿ  s   zPostLoad.add_statec           	        sz   | j sd S tj |¡}| j ¡ D ]%\}}‰ }}}‡ fdd„| j  ¡ D ƒ}|r5||||| jg|¢R i |¤Ž q| j  ¡  d S )Nc                   s&   g | ]\}}|j j ˆ ¡r||f‘qS r9   )rj  rÒ   rÚ   )r;   rä   rá  ©Úlimit_to_mapperr9   r=   r>     s    ýÿz#PostLoad.invoke.<locals>.<listcomp>)	rº  r   ÚPathRegistryÚcoercerÜ  Úvaluesrh   rÝ  ri   )	rß  r6   rq   Úeffective_contextÚtokenra  ÚargrM  rº  r9   râ  r=   rj     s0   ù
þ
ÿÿÿ€zPostLoad.invokec                 C  s$   |j  |j¡}|d ur|r||_|S rw   )rg   r�   rq   rÝ  )Úclsr6   rq   rè   Úplr9   r9   r=   r�    s   zPostLoad.for_contextc                 C  s   |j |jv o||j|j  jv S rw   )rq   rg   rÜ  )rß  r6   rq   rÔ   r9   r9   r=   rš  $  s   þzPostLoad.path_existsc           	      O  sF   |j |jv r|j|j  }n	tƒ  }|j|j < ||||||f|j|< d S rw   )rq   rg   r™  rÜ  )	rê  r6   rq   rã  rè  Úloader_callableré  rM  rë  r9   r9   r=   rœ  +  s   úzPostLoad.callable_for_pathN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__rà  rp  rj   Úclassmethodr�  rš  rœ  r9   r9   r9   r=   r™  õ  s    

r™  c                   s8  |j }|st dt|ƒ ¡‚t|tj@ ƒ}|r| ˆ j 	¡ ¡}ˆ j
r>ˆ js>ˆ  ||¡}|dur>tˆ |ƒ}t||d|||d�S t|jƒ}|rI|j}	n‡ fdd„ˆ jD ƒ}
|j |
¡rbt dt|ƒ ¡‚ˆ  |¡}	t |	¡roˆ jrtt |	¡r~t dt|ƒ¡ dS t|tˆ ƒ t¡|	|||d�}|r˜|du ršt |¡‚dS dS )	z4initiate a column-based attribute refresh operation.zQInstance %s is not bound to a Session; attribute refresh operation cannot proceedN)rè   ræ   ré   c                   s   g | ]}ˆ j | j‘qS r9   )Ú_columntopropertyrÔ   )r;   rþ   rU  r9   r=   r>   p  s    ÿz*load_scalar_attributes.<locals>.<listcomp>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   rÍ   r   ÚNO_AUTOFLUSHr‹  r  rÄ   rÙ   ÚconcreteÚ_optimized_get_statementr   rø   rÔ   r  rÍ  rA   rB   rž  r   ÚissubsetrŸ  r   r   Úwarn_limitedr!   Úset_label_styler#   râ   )rÒ   rä   Úattribute_namesrÖ   r¿   ré   rÀ   ÚstmtÚhas_keyÚidentity_keyÚpk_attrsr›   r9   rU  r=   Úload_scalar_attributes=  sr   ÿÿ
ú


ÿþÿ
ÿÿþüú
ÿr   )r4   r5   r6   r   r7   r8   )T)rÉ   rÊ   rË   rÌ   r¯   rÍ   r7   rÎ   )
r¿   r+   rÒ   rÓ   rÔ   rÕ   rÖ   r   r7   r×   )r¿   r+   rÀ   rí   rÔ   rî   rW   rï   ræ   rð   rç   rñ   rè   rò   ré   rÍ   rê   ró   r�   r.   rë   rÍ   rì   rÍ   )r¿   r+   rÀ   rí   rù   rú   rW   rï   ræ   rð   rç   rñ   rè   rò   rõ   rû   ré   rÍ   rê   ró   r�   r.   rë   rÍ   rì   rÍ   )NNNNNN)NNN)NNNN)\rð  Ú
__future__r   Útypingr   r   r   r   r   r   r	   r
   r   r   r   Ú r   r   rá   r   Úbaser   r   r   r   r6   r   r   r   r   r   r   rA   Úenginer   Úengine.resultr   r   r    Úsqlr!   r  Úsql.selectabler"   r#   r$   r%   Ú_typingr&   r'   Ú
interfacesr(   rÒ   r)   rÉ   r*   r¿   r+   rä   r,   Úengine.cursorr-   Úengine.interfacesr.   r/   r0   r1   Úobjectr3   Úcounterr€   ÚstrÚ_PopulatorDictrœ   Úpreload_modulerÇ   Úbecame_legacy_20rÑ   rå   rø   rö   r$  rQ  rR  r°  r›  ri  rr  rd  r¢  r™  r   r9   r9   r9   r=   Ú<module>   sä   	
 ^;þý
T+ó,ò <
ø)
÷7
ö   @E9%YH