o
    i7                     @   sT  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	d0ddZ				d1ddZ			d0ddZdd Z				d1d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 )2zprivate 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                 #   sd   t   _i  _j}j}|r|rt}nfdd}zrtt fddjD  \}|s6t	
d|	 i  _jrIj}|sHW d
S n }|r]d fdd|D }n
fd	d|D } j D ]
\}	}
|
 |	 ql|rt	||}|D ]}|V  qjsW d
S q7 ty   t	    W d
   Y d
S 1 sw   Y  Y d
S w )z$Return an ORM result as an iterator.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   Q/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/sqlalchemy/orm/loading.py	<genexpr>3   s
    
z/instances.<locals>.filter_fn.<locals>.<genexpr>)tuplezip	_entitiesrow)queryr   r   	filter_fn2   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>resultTr   c                    s   g | ]} |qS r   r   )r   r   )procr   r   r"   Q       c                    s"   g | ]  fd dD qS )c                    s   g | ]}| qS r   r   )r   r$   r   r   r   r"   T   r%   z(instances.<locals>.<listcomp>.<listcomp>r   )r   )keyed_tupleprocessr   r   r"   S   s    N)
_new_runidrunidpost_load_paths_has_mapper_entitiesis_single_entityr   listr   r   r   lightweight_named_tuplepartials
_yield_per	fetchmanyfetchallitemsinvokeunique_list	Exceptionsafe_reraiseclose)r   r!   r    filteredsingle_entityr   labelsfetchrowspath	post_loadr   r   )r    r!   r&   r$   r'   r   r   	instances#   s^   	

&r@   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.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)rB   sessionr   r   r"   w   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#   NrA   )rI   
_autoflush	autoflushlenr   rJ   rK   r-   	enumerater   r.   rE   r   rF   rG   appenditer)rN   r   iteratorrB   rQ   r:   r#   mapped_entitieskeysr&   r   newrowrL   r   )rB   rN   rI   r   merge_resulth   sD   


rZ   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_mapgetr   rF   inheritsmapperisaPASSIVE_CLASS_MISMATCHexpiredSQL_OKPASSIVE_NO_RESULTRELATED_OBJECT_OK_load_expiredorm_excObjectDeletedError_remove_newly_deleted)rI   r^   keypassiverH   stater   r   r   get_from_identity   s&   


rl   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   ri   rm   rn   ro   identrp   r   r   r   load_on_ident   s   
rs   c                    s0  |du r|   }|  n|   }|dur`|  }|j\} d|v rDt fddt|j|D }	t||	}t	|	t	|krDt
d ||dd}||_t fddt||jD }
|
|_|durjd}||_n| jdurvd}| 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   ri   )r   colvalue_get_paramsr   r   r"      s
    z'load_on_pk_identity.<locals>.<listcomp>zofully NULL primary key identity cannot load any object.  This condition may raise an error in a future release.TFc                    s   g | ]\}} | j |fqS r   rt   )r   id_valprimary_keyrw   r   r   r"     s    )populate_existingversion_checkro   rm   rp   )_clone_get_condition_mapper_zero_get_clausesetr   rz   sql_utiladapt_criterion_to_nullrR   r   warn_adapt_clause
_criteriondict_params_for_update_arg_get_optionsbool	_order_byonerf   NoResultFound)r   primary_key_identityrm   rn   ro   rp   qr^   r   nonesparamsr|   r   rw   r   rq      sd   


	
	


rq   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)ro   column_collectionmemoized_populators)	_iterate_polymorphic_properties_polymorphic_propertiesr   r   ri   setuppolymorphic_oncolumnsrT   )r    r^   r   r>   adapterr   with_polymorphicro   polymorphic_discriminatorkwpoly_propertiesquick_populatorsrv   pdr   r   r   _setup_entity_query$  s<   
r   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   )rk   r   r   r   _warn_for_runid_changedV  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st2|
||| }|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"   y  s    z'_instance_processor.<locals>.<listcomp>Nc                 3   s    | ]} j | V  qd S r   )_props)r   kr^   r   r   r     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|j}|rr|jj| |j|krt| r
j| |j|krt| nr|jj| |jkrt| s|jrrr|| n|| r|d |S |j}	|jv}|r|	sd r2t |||	|	}
|r2r,|j}|jj||
 |j|kr,t| |||
 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_instanceri   rp   
session_id_add_unpresentload_options	load_path_populate_fullmanagerdispatchrB   r   rI   refreshmodified_commit_commit_all	add_stateunloadedr/   _populate_partialinvoke_all_eagers)r   rk   rH   dict_isnewcurrentloadloaded_instanceidentitykeyexisting_runidr   to_loadr   r    identity_classrp   rG   rF   is_not_primary_keyload_evtr   loaded_as_persistentr^   ro   persistent_evtpk_colsr{   
populatorsr?   propagate_optionsrefresh_evtrefresh_identity_keyrm   r)   r   session_identity_mapr|   r   r   	_instance  s   







%
z&_instance_processor.<locals>._instance)3rz   _identity_classcollectionsdefaultdictr-   	_prop_setintersectionr\   r   r
   r   rT   ri   _deferred_column_loaderr	   r   _gettercreate_row_processorr   r   _current_pathr>   rI   r[   r{   always_refreshr   r   r   rB   r   r   rF   rG   hash_keyr|   r)   rp   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   ro   rm   r   _polymorphic_frompropsr   propru   getteradapted_colri   selectin_load_via	callable_r   r   r   r   _instance_processorb  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   )r{   )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   rt   )r   rk   
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_criteriarI   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^   rR   base_mapperrz   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 ]
\}	}|||| qd S )Nr   r   r   delayedexisting)r)   popexpired_attributesaddr   )r    r   rk   r   r   r   r   r{   r   ri   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   )r/   r  r  r  )r    r   rk   r   r   r   r   r   r   ri   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_columnrf   StaleDataErrorr   )r^   rk   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_mapperO  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_instancee  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__w  s   

zPostLoad.__init__c                 C   s   || j |< d S r   )r  )r%  rk   	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^   r_   )r   rk   r'  limit_to_mapperr   r   r"     s    z#PostLoad.invoke.<locals>.<listcomp>)	r  r   PathRegistrycoercer"  valuesr3   r#  clear)r%  r    r>   tokenr   argr   r  r   r(  r   r4     s   
zPostLoad.invokec                 C   s$   |j |j}|d ur|r||_|S r   )r*   r\   r>   r#  )clsr    r>   ro   plr   r   r   r     s   zPostLoad.for_contextc                 C   s   |j |jv o||j|j  jv S r   )r>   r*   r"  )r%  r    r>   ri   r   r   r   path_exists  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"  )	r0  r    r>   r)  r.  loader_callabler/  r   r1  r   r   r   r     s   zPostLoad.callable_for_pathN)__name__
__module____qualname____doc__	__slots__r&  r   r4   classmethodr   r2  r   r   r   r   r   r   p  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|rtd	t| dS t| |||d
}|r|du rt|dS dS )z4initiate a column-based attribute refresh operation.zQInstance %s is not bound to a Session; attribute refresh operation cannot proceedFN*)ro   rm   c                    s   g | ]} j | jqS r   )_columntopropertyri   )r   ru   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).)rm   ro   )rI   rf   DetachedInstanceErrorr   r   ri   r   attrsrX   r]   concrete_optimized_get_statementrs   r   optionsr   Loadundeferfrom_statementrz   r  sa_excInvalidRequestErrorr   r
   issubsetr   r   r   warn_limitedrg   )	r^   rk   attribute_namesrI   has_keyr#   	statementidentity_keypk_attrsr   r   r   load_scalar_attributes  sn   
	

	
rM  )T)NNN)NNNN)&r7  
__future__r   r    r   r   rf   r   r   baser   r	   r   r
   r   rD  sqlr   counterr(   r@   dependenciesrZ   rl   rs   rq   r   r   r   r   r   r   r   r   objectr   rM  r   r   r   r   <module>   sZ   E5!

X
2
  F 9"4: