
    ؄_/                     ~   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j                    Zd Z ej        d          d!d            Zd Z	 d"dZ	 	 	 	 d#dZ	 	 	 d"dZd Z	 	 	 	 d#dZd Zd Zd Z d Z!d Z" G d de#          Z$d  Z%dS )$zprivate 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              #   B   K   t                      _        i _         j        } j        }|r|rt
          }n fd}	 t          t           fd j        D                        \  }|st          j
        d|          	 i _         j        r                     j                  }|sdS n                                }|rd         fd|D             }nfd|D             }j                                        D ]\  }	}
|
                    |	           |rt          j        ||          }|D ]}|V   j        sdS # t$          $ rE t          j                    5                                   ddd           Y dS # 1 swxY w Y   Y dS w xY w)	z$Return an ORM result as an iterator.c                 \    t          d t          j        |           D                       S )Nc              3   L   K   | ]\  }}|j         rt          |          n|V   d S N)use_id_for_hashid).0entitems      [/var/www/book.euthymeo.com/html/venv/lib/python3.11/site-packages/sqlalchemy/orm/loading.py	<genexpr>z/instances.<locals>.filter_fn.<locals>.<genexpr>2   sL        !T !$ 3=BtHHH         )tuplezip	_entities)rowquerys    r   	filter_fnzinstances.<locals>.filter_fn1   s=      %(#%>%>     r   c                 >    g | ]}|                               S  )row_processor)r   query_entitycontextcursorr   s     r   
<listcomp>zinstances.<locals>.<listcomp>:   s;       $ !..ugvFF  r   resultTr   c                 &    g | ]} |          S r"   r"   )r   r   procs     r   r'   zinstances.<locals>.<listcomp>P   s!    333cS		333r   c                 @    g | ] fd D                       S )c                 &    g | ]} |          S r"   r"   )r   r*   r   s     r   r'   z(instances.<locals>.<listcomp>.<listcomp>S   s!     ? ? ?tc ? ? ?r   r"   )r   r   keyed_tupleprocesss    @r   r'   zinstances.<locals>.<listcomp>R   sI         K ? ? ? ?w ? ? ?@@  r   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.   s   ```         @@@r   	instancesrG   "   s      LLGM G)H*M 	 	II    -      (-  
 
&  	I6xHHK	!G *(()9:: E )) qz3333U333    $  
 $+#:#@#@#B#B 0 0i  $//// 9'i88  				# ;	<       	 	LLNNN	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	sD   A.E 3BE E F,FFF	FF	FFzsqlalchemy.orm.queryTc           	           |j         r                                 j        }	 d_        t          |j                  dk    }|r@t          |j        d          j                  rfd|D             }nt          |          }nԈ fdt          |j                  D             }g }d |j        D             }t          j
        d|          }	|D ]}
t          |
          }|D ]W}||         M                    t          j        ||                   t          j        ||                   i i 	          ||<   X|                     |	|                     t!          |          |_        S # |_        w xY w)
z@Merge a result into this :class:`_query.Query` object's Session.Fr   r   c           	          g | ]@}                     t          j        |          t          j        |          i i            AS )load
_recursive_resolve_conflict_map)_merger   instance_stateinstance_dict)r   instancerK   sessions     r   r'   z merge_result.<locals>.<listcomp>v   sc     	 	 	 ! NN"1(;;"0::!#%.0 #  	 	 	r   c                 D    g | ]\  }}t          |j                  |S r"   )
isinstance_MapperEntity)r   iequerylibs      r   r'   z merge_result.<locals>.<listcomp>   s@       Aqa!788  r   c                     g | ]	}|j         
S r"   )_label_name)r   r   s     r   r'   z merge_result.<locals>.<listcomp>   s    ???CO???r   r(   NrJ   )rR   
_autoflush	autoflushlenr   rT   rU   r4   	enumerater   r5   rN   r   rO   rP   appenditer)rX   r   iteratorrK   r\   rA   r(   mapped_entitieskeysr-   r   newrowrV   rR   s   `  `         @r   merge_resultre   g   s    mG !I)&!EO,,1 "	3%/!,h.DEE (	 	 	 	 	 %-	 	 	 h   %eo66  O
 F??u???D6xFFK 3 3c(  Aay,$+NN&5fQi@@&4VAY??!%')24 %3 % %q	 kk&112222F||%I%%%%s   EE4 4	E=c                    | j                             |          }|t          j        |          }|j        r&|j                            |          st          j        S |j        rp|t          j	        z  st          j
        S |t          j        z  s|S 	 |                    ||           n,# t          j        $ r |                     |g           Y dS w xY 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   rO   inheritsmapperisaPASSIVE_CLASS_MISMATCHexpiredSQL_OKPASSIVE_NO_RESULTRELATED_OBJECT_OK_load_expiredorm_excObjectDeletedError_remove_newly_deleted)rR   rj   keypassiverQ   states         r   get_from_identityrx      s    
 #'',,H)(33? 	55<#3#3F#;#; 	544 = 	Z..  !33z;;    ##E73333-   --ug666tt ts   B) )%CCc                 Z    ||d         }|d         }ndx}}t          | |||||          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   ru   rz   r{   r|   identr}   s          r   load_on_identr      sP    
 AQ!%%#''%   r   c                 X   |)|                                  }|                                 n|                                  }||                                 }|j        \  }d|v rwt	          fdt          |j        |          D                       }	t          j        ||	          }t          |	          t          |          k    rt          j        d           |                    |dd          }||_        t          fdt          ||j                  D                       }
|
|_        |
d}||_        n| j        d}| j        |_        nd}|                    t%          |          ||||           d|_        	 |                                S # t*          j        $ r Y dS w xY w)z6Load the given primary key identity from the database.Nc                 4    g | ]\  }}||         j         S r   ru   )r   colvalue_get_paramss      r   r'   z'load_on_pk_identity.<locals>.<listcomp>   s6       "U }	  $( %}}r   zofully NULL primary key identity cannot load any object.  This condition may raise an error in a future release.TFc                 4    g | ]\  }}|         j         |fS r"   r   )r   id_valprimary_keyr   s      r   r'   z'load_on_pk_identity.<locals>.<listcomp>   s:       'FK [)-v6  r   )populate_existingversion_checkr|   rz   r}   )_clone_get_condition_mapper_zero_get_clausesetr   r   sql_utiladapt_criterion_to_nullr]   r   warn_adapt_clause
_criteriondict_params_for_update_arg_get_optionsbool	_order_byonerr   NoResultFound)r   primary_key_identityrz   r{   r|   r}   qrj   r   nonesparamsr   r   s               @r   r~   r~      s    LLNN	LLNN'##%%%+%7"k '''   &)*,@' '   E #:;NNK5zzS!56666	  
 ook4??"   +.(&*<, ,  
 
 	 "+			*!1NN}--#'#%     AKuuww    tts   F F)(F)c	                 8   |r|                     |          }
n|j        }
i }|                    | j        d|           |
D ]#}|r
|j        |vr |j        | |||f|||d|	 $|2||j        ur+|r|j        |         }n|}|                    |           d S d S d S )Nmemoized_setups)r|   column_collectionmemoized_populators)	_iterate_polymorphic_properties_polymorphic_propertiesr   r   ru   setuppolymorphic_oncolumnsr_   )r%   rj   r$   rE   adapterr   with_polymorphicr|   polymorphic_discriminatorkwpoly_propertiesquick_populatorsr   pds                 r   _setup_entity_queryr   #  s     9 @@
 
 !8HHW!24DEEE  
 
 	uy??			

 ,/ 0		
 		
 		
 		
 		
 		
 	"-%V-BBB  	+!:;BB*B  $$$$$ 	.-BBr   c                 P    t          j        dt          |           d           d S )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   )rw   s    r   _warn_for_runid_changedr   U  s:    II !*% 0 0 0 0	3    r   c	                     !"#$%&  j         rfdD              j        t          j        t                     j        }	!|	                     fdD                       }	|                    j        dt                    }
|	D ]}||
v r|
|         }|t          u r(d                             |j        |j        f           @|t          u r#d                             |j        df           ld}r%j        |         }||                    |d          }|s|                    |d          }|r#d                             |j        |f           |                    | |           |                    | |           	j         j        j        j        rj        j        |z   n|j        j        %j        p j        t5           j        j        j                  t5           j        j        j                  !t5          j        j        j                  rj        j        j        t          j         t          j!        j        j"        $j#        &j$        #j%        s|d	|j        f}|j        v rCj        |         j&        d
k    r- '                    j        |         j(        d         |          }n '                    d|          }|r=||ur9J tS          ||          }tT          +                    |j,        |||           tT          -                              rj        "" .                              "nd" j/        rt          j0        nt          j          !"#$%&fd} j1        r|sste          | |||          }|S )z]Produce a mapper level row processor callable
    which processes rows into mapped instances.c                 *    g | ]}j         |         S r"   )r   )r   cr   s     r   r'   z'_instance_processor.<locals>.<listcomp>x  s     777!7?1%777r   Nc              3   2   K   | ]}j         |         V  d S r   )_props)r   krj   s     r   r   z&_instance_processor.<locals>.<genexpr>  s*      "M"M6=#3"M"M"M"M"M"Mr   r   newexpireFquickloader))selectinload_polymorphicTentitiesc                      r1}|                                 } |          }|j         k    }d}d}nt           fdD                       f}"                    |          }|> |          } |          }|j         k    }| }d}#r|st	          ||            ns |d                   rd S d}d}d}j                                        } |          } |          }||_        |_        !|_	        "
                    ||           |sr0|rss|_        |_        t           ||||	  	         |r|j        }|rjr:|j        j                            |           |j        |k    rt#          |           r+ j        |           |j        |k    rt#          |           n=r;|j        j                            |           |j         k    rt#          |           s|j        r1rr|                    |           n|                    |"           r                    |d           n|j        }	|j        v}|r
|	sd         rrt5           ||||	          }
|rZrB|j        }|j        j                            ||
           |j        |k    rt#          |           |                    ||
           rj        r                    |d           |S )NTFc                      g | ]
}|         S r"   r"   )r   columnr   s     r   r'   z:_instance_processor.<locals>._instance.<locals>.<listcomp>  s    999vs6{999r   r   eager)objr0   r   rh   _validate_version_idclass_managernew_instanceru   r}   
session_id_add_unpresentload_options	load_path_populate_fullmanagerdispatchrK   r   rR   refreshmodified_commit_commit_all	add_stateunloadedr6   _populate_partialinvoke_all_eagers)$r   rw   rQ   dict_isnewcurrentloadloaded_instanceidentitykeyexisting_runidr   to_loadr   r%   identity_classr}   rP   rO   is_not_primary_keyload_evtr   loaded_as_persistentrj   r|   persistent_evtpk_colsr   
populatorsrF   propagate_optionsrefresh_evtrefresh_identity_keyrz   r0   r   session_identity_mapr   s$   `          r   	_instancez&_instance_processor.<locals>._instance  s!      4	H!Eyy{{H!M(++EK5(EK#OO
 9999999::K ,//<<H#&x00%h//u,"'i"'  M M(sGLLL &%k!n55  4""&!/<<>>%h//&x00'	'5$ $. $33E;GGG
  Y	2+ Y	2  ,+ ,3D ,%6""+!
 
 
  G "'" 7 ;.33E7CCC ;.883E:::% ;,,W_eDDD ;.883E:::  7M*22w   {e++/666$ G G$ G Ge_====))%1EFFF 1##E4000 ~H!11E 2H 2
7(; 2
 ,	 	  2" ;)..66ugwOOO ;.883E:::MM%111 2W6 2##E5111r   )3r   _identity_classcollectionsdefaultdictr4   	_prop_setintersectionrh   r   r   r	   r_   ru   _deferred_column_loaderr
   r   _gettercreate_row_processorr   r   _current_pathrE   rR   rg   r   always_refreshr   r   r   rK   r   r   rO   rP   hash_keyr   r0   r}   strategy_should_selectin_load
local_opts_load_subclass_via_inPostLoadcallable_for_pathrj   for_context_identity_key_from_stateallow_partial_pks
issupersetpolymorphic_map_decorate_polymorphic_switch)'rj   r%   r(   rE   r   r|   rz   r   _polymorphic_frompropsr   propr   getteradapted_colru   selectin_load_via	callable_r   r   r}   rP   rO   r   r   r   r   r   r   r   r   rF   r   r   r   r0   r   r   r   s'   ``  ```            @@@@@@@@@@@@@@@@@@@@r   _instance_processorr	  a  sZ   (  G 87777w777+N(..JE""""M"M"M"M_"M"M"MMMxx-y   , ,###"4(C&&&5!((Xt;<    --- 8$++TXu,=>>>>  D")/#"6K".!'U!C!C 8#^^C77F w'..&/ABBBB
 --vvw
    %%vvw
     1 =&+	#d**  #?71JV5JF(1677Hv+4<==K'/2GHHN M&7L.N,M)J)MME+N .:#'$$$);C)@)I N
 *
 *
 !' < <"3'2:>!! !
 !' < <'! !  	!2:K!K!K #***-gt=NOOI&&!(!!   $$WiIII 
$,0' $*#B#B$ $   $ 4&1&3W W W W W W W W W W W W W W W W W W W W W W W W W W W W Wr  
&7 
 
 1%
 
	 r   c                     |j         }t          |j        j                  dk    |j        r|                    |          \  n|j        \  fd}|S )Nr   c                 (   | j         }	                    f|j        z   fz   |j        |          }|j        r|                    d             || j                                      
fd|D                                                        d S )N)
cache_pathc                 *    |                                  S r   )r   )r   s    r   <lambda>z8_load_subclass_via_in.<locals>.do_load.<locals>.<lambda>  s    a&9&9&;&; r   c                 Z    g | ]'\  }}r|j         d          d         n|j         d          (S )r   r   r   )r   rw   
load_attrszero_idxs      r   r'   z:_load_subclass_via_in.<locals>.do_load.<locals>.<listcomp>  sF       %E: $,=	!Q1  r   )primary_keys)	r   _with_lazyload_options_with_optionsparent_populate_existingadd_criteriarR   r   all)r%   rE   states	load_onlyeffective_entity
orig_queryq2disable_opt
enable_optr   r  s          r   do_loadz&_load_subclass_via_in.<locals>.do_load  s    ]
%%MJ44~EK & 
 
 ( 	=OO;;<<<
7?""   )/   	# 	
 	

 #%%%%%r   )rj   r]   base_mapperr   is_aliased_class_subclass_load_via_in_subclass_load_via_in_mapper)	r%   rE   entityrj   r   r  r  r   r  s	        @@@@r   r   r     s    ]F6%122a7H I%+%A%A&%I%I":{{%+%H":{       & Nr   c	                 x   |r| j         |_         |d         D ]\  }	}
 |
|          ||	<   |rA|d         D ]7\  }	}|                    |	d            |r|j                            |	           8n*|d         D ]!\  }	}|r|j                            |	           "|d         D ]\  }	} ||||           |d         D ]\  }	} ||||           d S ||j        k    rD||_        |d         D ]\  }	}
|	|vr |
|          ||	<   |d         D ]\  }	} ||||           d S |d         D ]\  }	} ||||           d S )Nr   r   r   delayedexisting)r0   popexpired_attributesaddr   )r%   r   rw   r   r   r   r   r   r   ru   r  set_callable	populators                r   r   r     s      ))m%g. 	% 	%KCE#JJ 	6%/%9 6 6!\		#t$$$ 6,005556
 &0%9 6 6!\ 6,00555(/ 	) 	)NCIeUC(((((3 	) 	)NCIeUC((((	) 	)	eo	%	% $ &g. 	) 	)KC%#VC[[c
 )4 	) 	)NCIeUC((((	) 	) )4 	) 	)NCIeUC((((	) 	)r   c                    |s-| j         |         }|d         D ]\  }	}
|	|v r |
|||           n|}|| j         |<   |d         D ]\  }	}|	|v r ||          ||	<   |d         D ];\  }	}|	|v r2|                    |	d            |r|j                            |	           <|d         D ]\  }	}
|	|v r |
|||           |d         D ]\  }	}
|	|v r |
|||           |d         D ]\  }	}
|	|vr |
|||           |S )Nr(  r   r   r   r'  r   )r6   r)  r*  r+  )r%   r   rw   r   r   r   r   r   r   ru   r-  r  r,  s                r   r   r     s     -"5)(4 	- 	-NCg~~	%,,,	- ")%g. 	) 	)KCg~~#VC[[c
!+H!5 	6 	6Cg~~		#t$$$ 6,00555(/ 	- 	-NCg~~	%,,,(3 	- 	-NCg~~	%,,,$W- ) )YhIeUC(((Nr   c           
         | j         }|d S |r|j        |         }|                     ||| j                   ||         k    rKt          j        dt          |          d|                     ||| j                   d||         d          d S )Nz
Instance 'z' has version id 'z3' which does not match database-loaded version id 'z'.)version_id_colr   _get_state_attr_by_columnrr   StaleDataErrorr   )rj   rw   r   r   r   r0  s         r   r   r   !  s    *N 9 8 	((v7LMM~	 	 $$ %    005&"7    N###

 

 
	
	 	r   c                     	
 ||
nj         

 S rj        
         
fd}t          j        |          	 	
fd}|S )Nc                     	 j         |          }|u rd S t          |          S # t          $ r t          d| z            w xY w)N)r  z*No such polymorphic_identity %r is defined)r   r	  KeyErrorAssertionError)discriminator
sub_mapperr   r%   rj   rE   r(   s     r   configure_subclass_mapperz?_decorate_polymorphic_switch.<locals>.configure_subclass_mapperO  s    	/>J V##t&"(     	 	 	 <}L  	s	   + Ac                 X    |          }||         }|r ||           S  |           S r   r"   )r   r7  r   instance_fnpolymorphic_instancesr   s      r   polymorphic_instancez:_decorate_polymorphic_switch.<locals>.polymorphic_instancee  sC    N+$-m<I & y~~%{3r   )r   r   r   PopulateDict)r;  r%   rj   r(   rE   r   r   r9  r=  r<  r   s   ````` `  @@r   r  r  <  s     !,2. 9 8        ( !-.GHH               r   c                   j    e Zd ZdZdZd Zd Zd Zed             Z	ed             Z
ed             Zd	S )
r   z4Track loaders and states for "post load" operations.)loadersr  	load_keysc                 R    i | _         t          j                    | _        d | _        d S r   )r@  r   OrderedDictr  rA  )selfs    r   __init__zPostLoad.__init__u  s$    &((r   c                     || j         |<   d S r   )r  )rD  rw   	overwrites      r   r   zPostLoad.add_statez  s    
 'Er   c                 D   | j         sd S t          j                            |          }| j                                        D ]C\  }}}}fd| j                                         D             }|r ||||| j        g|R i | D| j                                          d S )Nc                 \    g | ](\  }}|j         j                                      $||f)S r"   )r   rj   rk   )r   rw   rG  limit_to_mappers      r   r'   z#PostLoad.invoke.<locals>.<listcomp>  sK       $E9='++O<<	"  r   )	r  r   PathRegistrycoercer@  valuesr:   rA  clear)	rD  r%   rE   tokenr   argr   r  rJ  s	           @r   r;   zPostLoad.invoke  s    { 	F)00667;|7J7J7L7L 	J 	J3E?FC   (,(9(9(;(;  F
  JwfdnIsIIIbIIIr   c                 Z    |j                             |j                  }|	|r||_        |S r   )r1   rh   rE   rA  )clsr%   rE   r|   pls        r   r   zPostLoad.for_context  s/    $((33>o>*BL	r   c                 P    |j         |j        v o||j        |j                  j        v S r   )rE   r1   r@  )rD  r%   rE   ru   s       r   path_existszPostLoad.path_exists  s1     I00 Bw.ty9AA	
r   c                     |j         |j        v r|j        |j                  }nt                      x}|j        |j         <   |||||f|j        |<   d S r   )rE   r1   r   r@  )	rR  r%   rE   rJ  rO  loader_callablerP  r   rS  s	            r   r   zPostLoad.callable_for_path  sZ     9///(3BB6>jj@B(3"O_c2N
5r   N)__name__
__module____qualname____doc__	__slots__rE  r   r;   classmethodr   rU  r   r"   r   r   r   r   p  s        >>0I  
' ' '     [ 
 
 [
 O O [O O Or   r   c                 &    |j         }|s$t          j        dt          |          z            t	          |j                  }d}|r,|                     j                                                  } j	        r j
        s                     ||          }|qt          |                                                   t          j                                       d                                        |          d||          }|du r|r|j        }nf fd j        D             }|j                            |          r$t+          j        dt          |          z                                 |          }t1          j        |          r j        rt1          j        |          r$t9          j        dt          |                     dS t          |                               |||	          }|r|t          j        |          dS dS )
z4initiate a column-based attribute refresh operation.zQInstance %s is not bound to a Session; attribute refresh operation cannot proceedFN*)r|   rz   c                 4    g | ]}j         |         j        S r"   )_columntopropertyru   )r   r   rj   s     r   r'   z*load_scalar_attributes.<locals>.<listcomp>  s1       69(-1  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).)rz   r|   )rR   rr   DetachedInstanceErrorr   r   ru   r   attrsrc   ri   concrete_optimized_get_statementr   r   optionsr   Loadundeferfrom_statementr   r*  sa_excInvalidRequestErrorr   r   issubsetr   r   r   warn_limitedrs   )	rj   rw   attribute_namesrR   has_keyr(   	statementidentity_keypk_attrss	   `        r   load_scalar_attributesrs    sn    mG 
+9<Ee<L<LN
 
 	

 59ooGF  L)66v|7H7H7J7JKK v 
 33E?KK	 "f%%).v66>>sCCDD	** /#  F  	B 9LL   =C=O  H '44X>> 024=e4D4DE  
 "::5AAL |,,		5;5M		!,//		 6 %  	   FMM&!!+	
 
 
  06>(///0 0>>r   )T)NNN)NNNN)&r[  
__future__r   r    r   r   rr   r   r   baser	   r
   r   r   r   rj  sqlr   counterr/   rG   dependenciesre   rx   r   r~   r   r   r	  r   r   r   r   r  objectr   rs  r"   r   r   <module>r{     s    ' & & & & &                             " " " " " " ' ' ' ' ' '                         " " " " " "T\^^
B B BJ )**2& 2& 2& +*2&j  B KO   0 N N N Np "/% /% /% /%d	 	 	$ "A A A AH
  @4) 4) 4)t  D
 
 
61  1  1 h5O 5O 5O 5O 5Ov 5O 5O 5OpP0 P0 P0 P0 P0r   