o
    y¬´\ì}  ã                   @   sL  d Z ddlm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 e ¡ Zdd„ Ze d¡d-dd„ƒZdd„ Z	d.dd„Z				d/dd„Z			d.dd„Z				d/dd„Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Z d'd(„ Z!G d)d*„ d*e"ƒZ#d+d,„ Z$dS )0zß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.

é    )Úabsolute_importNé   )Ú
attributes)Úexc)Úpath_registry)Ústrategy_options)Ú_DEFER_FOR_STATE)Ú_SET_DEFERRED_EXPIRED)Ú	_none_set)Ú	state_stré   )Úutilc              
   #   sp  � t ƒ ˆ _i ˆ _ˆj}ˆj otˆjƒdkoˆjd j}|r)|r#t}n‡fdd„}zrt	t
‡ ‡‡fdd„ˆjD ƒŽ ƒ\‰}|sDt d|¡‰	 i ˆ _ˆjrWˆ ˆj¡}|sVW dS nˆ ¡ }|rkˆd ‰‡fd	d„|D ƒ}n
‡‡fd
d„|D ƒ}ˆ j ¡ D ]
\}	}
|
 ˆ |	¡ qz|r�t ||¡}|D ]}|V  q�ˆjs›W dS qE ty· } zˆ ¡  t |¡ W Y d}~dS d}~ww )z$Return an ORM result as an iterator.r   r   c                    s   t dd„ tˆ j| ƒD ƒƒS )Nc                 s   s&   � | ]\}}|j rt|ƒn|V  qd S ©N)Úuse_id_for_hashÚid)Ú.0ÚentÚitem© r   úH/var/www/html/env/lib/python3.10/site-packages/sqlalchemy/orm/loading.pyÚ	<genexpr>7   s
   € ÿ
ÿz/instances.<locals>.filter_fn.<locals>.<genexpr>)ÚtupleÚzipÚ	_entities©Úrow)Úqueryr   r   Ú	filter_fn6   s   
þzinstances.<locals>.filter_fnc                    s   g | ]	}|  ˆˆ ˆ¡‘qS r   )Úrow_processor)r   Úquery_entity)ÚcontextÚcursorr   r   r   Ú
<listcomp>?   s    ÿÿzinstances.<locals>.<listcomp>ÚresultTc                    s   g | ]}ˆ |ƒ‘qS r   r   )r   r   )Úprocr   r   r"   U   ó    c                    s"   g | ]‰ ˆ‡ fd d„ˆD ƒƒ‘qS )c                    s   g | ]}|ˆ ƒ‘qS r   r   )r   r$   r   r   r   r"   X   r%   z(instances.<locals>.<listcomp>.<listcomp>r   )r   )Úkeyed_tupleÚprocessr   r   r"   W   s    ÿÿN)Ú
_new_runidÚrunidÚpost_load_pathsÚ_has_mapper_entitiesÚ_only_return_tuplesÚlenr   Úsupports_single_entityr   Úlistr   r   Úlightweight_named_tupleÚpartialsÚ
_yield_perÚ	fetchmanyÚfetchallÚitemsÚinvokeÚunique_listÚ	ExceptionÚcloseÚraise_from_cause)r   r!   r    ÚfilteredÚsingle_entityr   ÚlabelsÚfetchÚrowsÚpathÚ	post_loadr   Úerrr   )r    r!   r&   r$   r'   r   r   Ú	instances#   sf   €ÿ
ýþÿÿ	ÿþã€þrC   zsqlalchemy.orm.queryTc              	      s  |j ‰ˆ r	ˆ ¡  ˆj}zzdˆ_t|jƒdk}|r2t|jd ˆjƒr-‡ ‡fdd„|D ƒ}nRt|ƒ}nM‡fdd„t|jƒD ƒ}g }dd„ |jD ƒ}t	 
d|¡}	|D ].}
t|
ƒ}|D ]}|| d	urvˆjt || ¡t || ¡ˆ i i d
�||< qX| |	|ƒ¡ qPt|ƒW |ˆ_S |ˆ_w )z:Merge a result into this :class:`.Query` object's Session.Fr   r   c              	      s,   g | ]}ˆj t |¡t |¡ˆ i i d �‘qS )©ÚloadÚ
_recursiveÚ_resolve_conflict_map)Ú_merger   Úinstance_stateÚinstance_dict)r   Úinstance)rE   Úsessionr   r   r"   {   s    ùûÿz merge_result.<locals>.<listcomp>c                    s    g | ]\}}t |ˆ jƒr|‘qS r   )Ú
isinstanceÚ_MapperEntity)r   ÚiÚe)Úquerylibr   r   r"   ˆ   s    
ýÿc                 S   s   g | ]}|j ‘qS r   )Ú_label_name)r   r   r   r   r   r"   Ž   s    r#   NrD   )rL   Ú
_autoflushÚ	autoflushr-   r   rM   rN   r/   Ú	enumerater   r0   rH   r   rI   rJ   ÚappendÚiter)rQ   r   ÚiteratorrE   rT   r<   r#   Úmapped_entitiesÚkeysr&   r   ÚnewrowrO   r   )rE   rQ   rL   r   Úmerge_resultl   sD   ø

þ
û€r\   c                 C   s€   | j  |¡}|dur>t |¡}|jr<|tj@ stjS |tj@ s!|S z	| ||¡ W |S  t	j
y;   |  |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_mapÚgetr   rI   ÚexpiredÚSQL_OKÚPASSIVE_NO_RESULTÚRELATED_OBJECT_OKÚ_load_expiredÚorm_excÚObjectDeletedErrorÚ_remove_newly_deleted)rL   ÚkeyÚpassiverK   Ústater   r   r   Úget_from_identity¢   s"   


ýþrj   c                 C   s6   |dur|d }|d }nd }}t | |||||d�S )z.Load the given identity key from the database.Nr   r   )Úrefresh_stateÚwith_for_updateÚonly_load_propsÚidentity_token)Úload_on_pk_identity)r   rg   rk   rl   rm   Úidentrn   r   r   r   Úload_on_ident¿   s   
úrq   c                    s  |du r|   ¡ }| ¡  n|   ¡ }|durS|  ¡ }|j\}‰ d|v r7t‡ fdd„t|j|ƒD ƒƒ}	t ||	¡}| 	|dd¡}||_
t‡ fdd„t||jƒD ƒƒ}
|
|_|dur]d}||_n| jdurid}| j|_nd}|jt|ƒ||||d� d|_z| ¡ W S  tjyŠ   Y dS w )z6Load the given primary key identity from the database.Nc                    s"   g | ]\}}|d u rˆ | j ‘qS r   ©rg   )r   ÚcolÚvalue©Ú_get_paramsr   r   r"   î   s
    üz'load_on_pk_identity.<locals>.<listcomp>TFc                    s   g | ]\}}ˆ | j |f‘qS r   rr   )r   Úid_valÚprimary_keyru   r   r   r"   ü   s    ÿÿ)Úpopulate_existingÚversion_checkrm   rk   rn   )Ú_cloneÚ_get_conditionÚ_mapper_zeroÚ_get_clauseÚsetr   rx   Úsql_utilÚadapt_criterion_to_nullÚ_adapt_clauseÚ
_criterionÚdictÚ_paramsÚ_for_update_argÚ_get_optionsÚboolÚ	_order_byÚonerd   ÚNoResultFound)r   Úprimary_key_identityrk   rl   rm   rn   ÚqÚmapperr~   ÚnonesÚparamsrz   r   ru   r   ro   Ô   s\   


ÿþÿ	
ÿþÿ	

û
ÿro   c	                 K   s    |r|  |¡}
n|j}
i }| | jd|¡ |
D ]}|r!|j|vr!q|j| |||f|||dœ|	¤Ž q|d urL||jurN|rC|j| }n|}| |¡ d S d S d S )NÚmemoized_setups)rm   Úcolumn_collectionÚmemoized_populators)	Ú_iterate_polymorphic_propertiesÚ_polymorphic_propertiesr   r   rg   ÚsetupÚpolymorphic_onÚcolumnsrV   )r    rŽ   r   r@   Úadapterr’   Úwith_polymorphicrm   Úpolymorphic_discriminatorÚkwÚpoly_propertiesÚquick_populatorsrt   Úpdr   r   r   Ú_setup_entity_query  s<   ÿüùø
ør    c	                    s  ˆ
j ‰ˆ r‡ fdd„ˆD ƒ‰ˆ
j‰t t¡‰ˆ
j}	ˆdur)|	 ‡
fdd„ˆD ƒ¡}	| ˆjdt	¡}
|	D ]f}||
v r�|
| }|t
u rMˆd  |j|jf¡ q3|tu r\ˆd  |jd	f¡ q3d}ˆ roˆ j| }|duro| |d	¡}|sw| |d	¡}|r„ˆd
  |j|f¡ q3| ˆ|ˆ
|ˆ ˆ¡ q3| ˆ|ˆ
|ˆ ˆ¡ q3ˆ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ƒ‰ˆrÐˆjjj‰	tj ‰tj!‰ˆjj"‰ˆj#‰ˆj$‰ˆj%‰ˆ�s2|du�r2d|jf}|ˆjv �rˆj| j&dk�rˆ
 'ˆj| j(d |¡}nˆ
 'd|¡}|�r2||u�r2ˆdu �s!J ‚t)ˆ||ƒ}t* +ˆˆ|j,|||¡ t* -ˆˆˆ¡‰ˆ�rJˆj‰ˆdu �rIˆ
 .ˆ¡‰nd‰ˆ
j/�rTt	j0‰nt	j‰‡ ‡‡‡‡‡‡‡‡‡	‡
‡‡‡‡‡‡‡‡‡‡‡‡‡‡fdd„}ˆ
j1�r‰|�s‰ˆ�s‰t2|ˆˆ
|||ˆ ƒ}|S )z`Produce a mapper level row processor callable
       which processes rows into mapped instances.c                    s   g | ]}ˆ j | ‘qS r   )r˜   )r   Úc)r™   r   r   r"   h  s    z'_instance_processor.<locals>.<listcomp>Nc                 3   s   � | ]}ˆ j | V  qd S r   )Ú_props)r   Úk©rŽ   r   r   r   p  s   € z&_instance_processor.<locals>.<genexpr>r‘   ÚnewÚexpireFÚquickÚloader))Úselectinload_polymorphicTÚentitiesc           
   
      s,  ˆrˆ}|  ¡ }ˆ|ƒ}|jˆk}d}d}n`ˆt‡ fdd„ˆD ƒƒˆf}ˆ |¡}|d urLˆ|ƒ}ˆ|ƒ}|jˆk}| }d}ˆrK|sKtˆ||ˆ ˆƒ n*ˆ|d ƒrTd S d}d}d}ˆj ¡ }ˆ|ƒ}ˆ|ƒ}||_ˆ|_ˆ|_	ˆ 
||¡ |szˆrÖ|r†ˆs€ˆs†ˆ|_ˆ	|_tˆˆ |||ˆ	|ˆˆƒ	 |rÌ|r«ˆr |jj |ˆ¡ ˆrªˆ
ˆj|  ¡ ƒ nˆr¶|jj |ˆˆ¡ ˆs»|jrÌˆrÆˆrÆ| |ˆ¡ n| |ˆ¡ ˆrÔˆ |d¡ |S |j}|ˆjv}|rç|sçˆd �rtˆˆ |||ˆ	|ˆƒ}	|�rˆ�r|jj |ˆ|	¡ | ||	¡ ˆ�rˆj�rˆ |d¡ |S )NTFc                    s   g | ]}ˆ | ‘qS r   r   )r   Úcolumnr   r   r   r"   ü  r%   z:_instance_processor.<locals>._instance.<locals>.<listcomp>r   Úeager)Úobjr)   r   r^   Ú_validate_version_idÚclass_managerÚnew_instancerg   rn   Ú
session_idÚ_add_unpresentÚload_optionsÚ	load_pathÚ_populate_fullÚmanagerÚdispatchrE   rL   ÚrefreshÚmodifiedÚ_commitÚ_commit_allÚ	add_stateÚunloadedr1   Ú_populate_partialÚinvoke_all_eagers)
r   ri   rK   Údict_ÚisnewÚcurrentloadÚloaded_instanceÚidentitykeyr½   Úto_load©r™   r    Úidentity_classrn   rJ   rI   Úis_not_primary_keyÚload_evtr´   Úloaded_as_persistentrŽ   rm   Úpersistent_evtÚpk_colsry   Ú
populatorsrA   Úpropagate_optionsÚrefresh_evtÚrefresh_identity_keyrk   r)   r±   Úsession_identity_maprz   r   r   Ú	_instanceì  s¬   
ý

€
÷€ÿ
"ä
øz&_instance_processor.<locals>._instance)3rx   Ú_identity_classÚcollectionsÚdefaultdictr/   Ú	_prop_setÚintersectionr^   r   r
   r   rV   rg   Ú_deferred_column_loaderr	   r˜   Ú_getterÚcreate_row_processorrÎ   r   Ú_current_pathr@   rL   r]   ry   Úalways_refreshrˆ   r¯   r·   rE   r¸   rÊ   rI   rJ   Úhash_keyrz   r)   rn   Ú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)rŽ   r    r#   r@   r™   rm   rk   r›   Ú_polymorphic_fromÚpropsrž   Úproprs   ÚgetterÚadapted_colrg   Úselectin_load_viaÚ	callable_rÒ   r   rÆ   r   Ú_instance_processorQ  sÆ   
ÿ
ÿ
ÿÿÿý

þÿú	
ÿ€< 
ù
rñ   c                    sP   |j }t|jjƒdk‰|jr| |¡\‰‰‰ n|j\‰‰‰ ‡ ‡‡‡fdd„}|S )Nr   c                    sb   | j }ˆjˆf|j ˆ f |j|d�}|jr| dd„ ¡ || jƒj‡fdd„|D ƒd� ¡  d S )N)Ú
cache_pathc                 S   s   |   ¡ S r   )ry   )r�   r   r   r   Ú<lambda>™  s    z8_load_subclass_via_in.<locals>.do_load.<locals>.<lambda>c                    s,   g | ]\}}ˆ r|j d  d n|j d  ‘qS )r   r   rr   )r   ri   Ú
load_attrs)Úzero_idxr   r   r"   œ  s    ÿÿz:_load_subclass_via_in.<locals>.do_load.<locals>.<listcomp>)Úprimary_keys)	r   Ú_with_lazyload_optionsÚ_with_optionsÚparentÚ_populate_existingÚadd_criteriarL   r�   Úall)r    r@   ÚstatesÚ	load_onlyÚeffective_entityÚ
orig_queryÚq2©Údisable_optÚ
enable_optr�   rõ   r   r   Údo_load�  s   ý

þÿ
z&_load_subclass_via_in.<locals>.do_load)rŽ   r-   Úbase_mapperrx   Úis_aliased_classÚ_subclass_load_via_inÚ_subclass_load_via_in_mapper)r    r@   ÚentityrŽ   r  r   r  r   rá   …  s   rá   c	                 C   s:  |r`| j |_ |d D ]
\}	}
|
|ƒ||	< q
|r/|d D ]\}	}| |	d ¡ |r-|j |	¡ qn|d D ]\}	}|r?|j |	¡ q3|d D ]
\}	}||||ƒ qD|d D ]
\}	}||||ƒ qSd S ||jkrŒ||_|d D ]\}	}
|	|vrz|
|ƒ||	< ql|d D ]
\}	}||||ƒ qd S |d D ]
\}	}||||ƒ q�d S )Nr§   r¦   r¥   ÚdelayedÚexisting)r)   ÚpopÚexpired_attributesÚaddr´   )r    r   ri   rÀ   rÁ   r´   rÃ   ry   rÍ   rg   rí   Úset_callableÚ	populatorr   r   r   rµ   ¥  s@   €ý€ÿ
€ÿÿrµ   c                 C   s  |s| j | }|d D ]\}	}
|	|v r|
|||ƒ qn[|}|| j |< |d D ]\}	}|	|v r4||ƒ||	< q&|d D ]\}	}|	|v rO| |	d ¡ |rO|j |	¡ q9|d D ]\}	}
|	|v rb|
|||ƒ qT|d D ]\}	}
|	|v ru|
|||ƒ qg|d D ]\}	}
|	|vrˆ|
|||ƒ qz|S )Nr  r§   r¦   r¥   r  r¬   )r1   r  r  r  )r    r   ri   rÀ   rÁ   r´   r½   rÍ   rÅ   rg   r  rí   r  r   r   r   r¾   Þ  s@   
€þ
€€€€€r¾   c              	   C   sd   | j }|d u r	d S |r|j| }|  ||| j ¡|| kr0t dt|ƒ|  ||| j ¡|| f ¡‚d S )NzWInstance '%s' has version id '%s' which does not match database-loaded version id '%s'.)Úversion_id_colr˜   Ú_get_state_attr_by_columnrd   ÚStaleDataErrorr   )rŽ   ri   rÀ   r   r™   r  r   r   r   r®      s&   
ÿÿûþÿýr®   c           	         s`   |d ur|‰nˆj ‰ˆd u rˆS ˆ rˆ jˆ ‰‡ ‡‡‡‡fdd„}t |¡‰‡‡‡fdd„}|S )Nc                    sJ   zˆj |  }W n ty   td|  ƒ‚w |ˆu rd S t|ˆˆˆˆ ˆd�S )Nz*No such polymorphic_identity %r is defined)rê   )rè   ÚKeyErrorÚAssertionErrorrñ   )ÚdiscriminatorÚ
sub_mapper)r™   r    rŽ   r@   r#   r   r   Úconfigure_subclass_mapper.  s"   ÿÿúz?_decorate_polymorphic_switch.<locals>.configure_subclass_mapperc                    s,   | ˆ }|d urˆ| }|r|| ƒS ˆ | ƒS r   r   )r   r  rÒ   )Úinstance_fnÚpolymorphic_instancesr—   r   r   Úpolymorphic_instanceD  s   z:_decorate_polymorphic_switch.<locals>.polymorphic_instance)r—   r˜   r   ÚPopulateDict)	r  r    rŽ   r#   r@   r›   r™   r  r  r   )r™   r    r  rŽ   r@   r  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â   z:Track loaders and states for "post load" operations.

    )Úloadersrý   Ú	load_keysc                 C   s   i | _ t ¡ | _d | _d S r   )r  r   ÚOrderedDictrý   r  )Úselfr   r   r   Ú__init__V  s   

zPostLoad.__init__c                 C   s   || j |< d S r   )rý   )r!  ri   Ú	overwriter   r   r   r¼   [  s   zPostLoad.add_statec                    sx   | j sd S tj |¡}| j ¡ D ]$\}‰ }}}‡ fdd„| j  ¡ D ƒ}|r4||||| jg|¢R i |¤Ž q| j  ¡  d S )Nc                    s&   g | ]\}}|j j ˆ ¡r||f‘qS r   )r¶   rŽ   Úisa)r   ri   r#  ©Úlimit_to_mapperr   r   r"   g  s    ýÿz#PostLoad.invoke.<locals>.<listcomp>)	rý   r   ÚPathRegistryÚcoercer  Úvaluesr5   r  Úclear)r!  r    r@   Útokenr¨   Úargrœ   rý   r   r%  r   r6   b  s   
þ€zPostLoad.invokec                 C   s$   |j  |j¡}|d ur|r||_|S r   )r*   r^   r@   r  )Úclsr    r@   rm   Úplr   r   r   rä   p  s   zPostLoad.for_contextc                 C   s   |j |jv o||j|j  jv S r   )r@   r*   r  )r!  r    r@   rg   r   r   r   Úpath_existsw  s   þzPostLoad.path_existsc           	      O   sD   |j |jv r|j|j  }n	tƒ  }|j|j < |||||f|j|< d S r   )r@   r*   râ   r  )	r-  r    r@   r&  r+  Úloader_callabler,  rœ   r.  r   r   r   rã   ~  s   zPostLoad.callable_for_pathN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r"  r¼   r6   Úclassmethodrä   r/  rã   r   r   r   r   râ   O  s    

râ   c           	         s>  |j }|st dt|ƒ ¡‚t|jƒ}d}|r| ˆ j ¡ ¡}ˆ j	rFˆ j
sFˆ  ||¡}|durFt| ˆ ¡ t ˆ ¡ d¡¡ |¡d||d�}|du r�|rP|j}n‡ fdd„ˆ jD ƒ}|j |¡rit dt|ƒ ¡‚ˆ  |¡}t |¡rvˆ jr{t |¡r…t d	t|ƒ¡ dS 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 proceedFNÚ*)rm   rk   c                    s   g | ]}ˆ j | j‘qS r   )Ú_columntopropertyrg   )r   rs   r¤   r   r   r"   ¹  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).)rk   rm   )rL   rd   ÚDetachedInstanceErrorr   rˆ   rg   r×   ÚattrsrZ   ÚinheritsÚconcreteÚ_optimized_get_statementrq   r   Úoptionsr   ÚLoadÚundeferÚfrom_statementrx   r  Úsa_excÚInvalidRequestErrorrå   r
   Úissubsetræ   rç   r   Úwarn_limitedre   )	rŽ   ri   Úattribute_namesrL   Úhas_keyr#   Ú	statementÚidentity_keyÚpk_attrsr   r¤   r   Úload_scalar_attributes‰  sn   ÿÿ
ú	
ÿþÿ
ÿÿþüü	
ÿrK  )T)NNN)NNNN)%r4  Ú
__future__r   rÔ   Ú r   r   rd   r   r   Úbaser   r	   r   r
   r   rB  Úsqlr€   Úcounterr(   rC   Údependenciesr\   rj   rq   ro   r    rñ   rá   rµ   r¾   r®   ré   Úobjectrâ   rK  r   r   r   r   Ú<module>   sX   I5
ÿ
úR
÷8
÷  6 9"4: