U
    ÌZj¥À  ã                   @   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 e ¡ Zdd„ Ze  d¡d?dd„ƒZ!ej"dddd�e  d¡d@dd „ƒƒZ#d!d"„ Z$d#d#d#d#d$ej%ej%fd%d&„Z&d#d#d#d#d#d$ej%ej%fd'd(„Z'dAd)d*„Z(dBd+d,„Z)d-d.„ Z*dCd/d0„Z+d1d2„ Z,d3d4„ Z-d5d6„ Z.d7d8„ Z/d9d:„ Z0G d;d<„ d<e1ƒZ2d=d>„ Z3d#S )Dzß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_importé   )Ú
attributes)Úexc)Úpath_registry)Ústrategy_options)Ú_DEFER_FOR_STATE)Ú_RAISE_FOR_STATE)Ú_SET_DEFERRED_EXPIRED)Ú	_none_set)Ú	state_stré   )Úfuture)Úutil)Úresult_tuple)ÚChunkedIteratorResult)ÚFrozenResult)ÚSimpleResultMetaData)ÚLABEL_STYLE_TABLENAME_PLUS_COL)ÚSelectStatec                    sª  t ƒ ˆ_i ˆ_ˆj}|j}ˆjj o<t|jƒdko<|jd j	‰zFt
t‡‡fdd„ˆjjD ƒŽ ƒ\‰}}ˆjr‚ˆjsxˆjr‚t d¡‚W n0 tk
r´   t ¡ � ˆ ¡  W 5 Q R X Y nX dd„ ‰ dd	„ ‰ˆjjrè‡ ‡fd
d„ˆjjD ƒ}n‡ ‡‡fdd„ˆjjD ƒ}t|||d�}‡‡‡‡fdd„}ˆj dd¡�rJt
|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.

    r   r   c                    s   g | ]}|  ˆ ˆ¡‘qS © )Zrow_processor)Ú.0Úquery_entity)ÚcontextÚcursorr   úY/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/sqlalchemy/orm/loading.pyÚ
<listcomp>E   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.c                 S   s   t  d¡‚d S )Nz@Can't use the ORM yield_per feature in conjunction with unique()©Úsa_excÚInvalidRequestError)Úentryr   r   r   Ú
_no_unique[   s    ÿzinstances.<locals>._no_uniquec                    s   ‡ fdd„}|S )Nc                    s   t  dˆ  ¡‚d S )NzkCan't apply uniqueness to row tuple containing value of type %r; this datatype produces non-hashable valuesr   ©Úobj©Údatatyper   r   Úgoa   s
    þÿz,instances.<locals>._not_hashable.<locals>.gor   )r%   r&   r   r$   r   Ú_not_hashable`   s    z instances.<locals>._not_hashablec                    s0   g | ](}ˆj rˆ n|js$|js$|jr(tnd ‘qS ©N)Ú	yield_perÚuse_id_for_hashÚ_non_hashable_valueZ_null_column_typeÚid©r   Zent)r!   r   r   r   r   k   s   
øÿþýüc                    s<   g | ]4}ˆj rˆ n$|js*|jr*ˆ|jjƒn|jr4tnd ‘qS r(   )r)   r*   r+   ÚcolumnÚtyper,   r-   )r!   r'   r   r   r   r   x   s   úÿÿÿÿ)Z_unique_filtersc                 3   sŒ   | }i ˆ_ |r ˆ |¡}|s(qˆnˆ ¡ }ˆrHˆd ‰ ‡ fdd„|D ƒ}n‡fdd„|D ƒ}ˆj ¡ D ]\}}| ˆ|¡ qd|V  |s qˆq d S )Nr   c                    s   g | ]}ˆ |ƒ‘qS r   r   )r   Úrow©Úprocr   r   r   —   s     z-instances.<locals>.chunks.<locals>.<listcomp>c                    s"   g | ]‰ t ‡ fd d„ˆD ƒƒ‘qS )c                    s   g | ]}|ˆ ƒ‘qS r   r   )r   r2   ©r0   r   r   r   š   s     z8instances.<locals>.chunks.<locals>.<listcomp>.<listcomp>)Útuple)r   )Úprocessr3   r   r   ™   s    )ÚpartialsZ	fetchmanyZ_raw_all_rowsÚpost_load_pathsÚitemsÚinvoke)Úsizer)   ÚfetchÚrowsÚpathÚ	post_load)r   r   r5   Úsingle_entityr1   r   Úchunks‡   s$    

ÿzinstances.<locals>.chunksZprebuffer_rowsFNc                    s   t ˆ ƒS r(   )Úiter)r:   )Ú_prebufferedr   r   r@   «   s    )Zsource_supports_scalarsÚrawZdynamic_yield_per)ÚfilteredZis_single_entityc                 S   s   t  d¡‚d S )Nz~The unique() method must be invoked on this Result, as it contains results that include joined eager loads against collectionsr   r"   r   r   r   Úrequire_uniqueÀ   s    ÿz!instances.<locals>.require_unique)!Ú
_new_runidÚrunidr7   Úcompile_stateZ_has_mapper_entitiesÚload_optionsZ_only_return_tuplesÚlenÚ	_entitiesZsupports_single_entityÚlistÚzipr)   Zloaders_require_bufferingZloaders_require_uniquingr   r   Ú	Exceptionr   Zsafe_reraiseÚcloseZ_legacy_uniquingr   Úexecution_optionsÚgetr   r   Z_is_server_sideÚ_attributesÚunionÚdictZmulti_row_eager_loadersZ_unique_filter_state)r   r   rH   rD   ÚlabelsÚextraZunique_filtersZrow_metadatar@   ÚresultrE   r   )r!   r'   rB   r   r   r5   r?   r   Ú	instances(   s|    
ÿ
ýþÿÿ
	ÿþÿ


öø  ÿû
ÿ

rX   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 ]T}
|D ]<}|
| dk	r„| jt |
| ¡t |
| ¡|i i d�|
|< q„|	 ||
ƒ¡ q|| |	¡W ¢S || _X dS )	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©Úlegacyc                    s    g | ]\}}t |ˆ jƒr|‘qS r   ©Ú
isinstanceÚ_MapperEntity©r   ÚiÚe©Úquerycontextr   r   r   í   s   þz'merge_frozen_result.<locals>.<listcomp>c                 S   s   g | ]
}|j ‘qS r   ©Z_label_namer-   r   r   r   r   ò   s     c                 S   s   g | ]
}|j ‘qS r   ©Z_extra_entitiesr-   r   r   r   r   õ   s     N©ÚloadZ
_recursiveZ_resolve_conflict_map)r   Ú	preloadedÚorm_contextÚ
_autoflushÚORMSelectCompileStateÚ_create_entities_collectionÚ	autoflushÚ	enumeraterK   r   Zrewrite_rowsÚ_merger   Úinstance_stateÚinstance_dictÚappendZwith_new_rows)ÚsessionÚ	statementÚfrozen_resultrf   Úctxrl   Úmapped_entitiesÚkeysÚkeyed_tuplerW   Únewrowr_   r   ra   r   Úmerge_frozen_resultÏ   s@     ÿ
þ ÿûrz   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.)ÚalternativeZbecomes_legacyc              	      sv  t jj‰| j‰ˆ rˆ ¡  t|tƒr4|}t|jƒ}nd}ˆj	j
| dd�}ˆj}�zdˆ_| ojt|jƒdk}|r¢t|jd ˆjƒr˜‡ ‡fdd„|D ƒ}nt|ƒ}n¤‡fd	d„t|jƒD ƒ}g }d
d„ |jD ƒ}	t|	dd„ |jD ƒƒ}
|D ]\}t|ƒ}|D ]<}|| dk	røˆjt || ¡t || ¡ˆ i i d�||< qø| |
|ƒ¡ qè|�rZ| |¡W ¢S t|ƒW ¢S W 5 |ˆ_X dS )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.

    NTrY   Fr   r   c              	      s,   g | ]$}ˆj t |¡t |¡ˆ i i d �‘qS )re   )rn   r   ro   rp   )r   Úinstance)rf   rr   r   r   r   4  s   ùûz merge_result.<locals>.<listcomp>c                    s    g | ]\}}t |ˆ jƒr|‘qS r   r[   r^   ra   r   r   r   A  s   þc                 S   s   g | ]
}|j ‘qS r   rc   r-   r   r   r   r   G  s     c                 S   s   g | ]
}|j ‘qS r   rd   r-   r   r   r   r   J  s     re   )r   rg   rh   rr   ri   r\   r   rA   Údatarj   rk   rl   rJ   rK   r]   rL   rm   r   rn   r   ro   rp   rq   Z	with_data)ÚqueryÚiteratorrf   rt   ru   rl   r?   rW   rv   rw   rx   r0   ry   r_   r   )rf   rb   rr   r   Úmerge_result  s^    
 ÿø

þ ÿûr€   c                 C   sœ   | j  |¡}|dk	r”t |¡}|jr6|j |¡s6tjS |jr�|tj	@ sLtj
S |tj@ sZ|S z| ||¡ W n$ tjk
rŽ   |  |g¡ Y dS X |S d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_maprQ   r   ro   ÚinheritsÚmapperÚisaZPASSIVE_CLASS_MISMATCHZexpiredZSQL_OKZPASSIVE_NO_RESULTZRELATED_OBJECT_OKZ_load_expiredÚorm_excÚObjectDeletedErrorZ_remove_newly_deleted)rr   rƒ   ÚkeyÚpassiver|   Ústater   r   r   Úget_from_identityb  s"    


rŠ   NFc
                 C   s@   |dk	r|d }
|d }nd }
}t | ||
||||||||	d�S )z.Load the given identity key from the database.Nr   r   )rI   Úrefresh_stateÚwith_for_updateÚonly_load_propsÚidentity_tokenÚno_autoflushÚbind_argumentsrP   )Úload_on_pk_identity)rr   rs   r‡   rI   r‹   rŒ   r�   r�   r�   rP   ÚidentrŽ   r   r   r   Úload_on_ident„  s"    
õr“   c                    sØ  |}|  ¡ }|jrt‚ddlm}m} |dkr4|j}|jtj	krH|j
}n|j}|dk	rê|jd }|j\}‰ d|kr¶t‡ fdd„t|j|ƒD ƒƒ}t ||¡}t|ƒt|ƒkr¶t d¡ t |dd	i¡f|_t‡ fd
d„t||jƒD ƒƒ}nd}|dk	�rd	}||_n|jdk	�rd	}|j|_nd}|�rL|j�rL|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&k
�rÒ   Y dS X dS )z6Load the given primary key identity from the database.r   )ÚQueryContextÚORMCompileStateNZplugin_subjectc                    s"   g | ]\}}|d krˆ | j ‘qS r(   ©r‡   )r   ÚcolÚvalue©Z_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.Z
_orm_adaptTc                    s   g | ]\}}ˆ | j |f‘qS r   r–   )r   Zid_valÚprimary_keyr™   r   r   r   é  s   ÿFÚ_current_path)Úversion_checkr�   r‹   rŽ   ri   Z_sa_orm_load_options)ÚparamsrP   r�   )'Z_cloneZ_is_lambda_elementÚAssertionErrorr   r”   r•   Zdefault_load_optionsÚ_compile_optionsr   Zdefault_select_compile_optionsÚdefault_compile_optionsZ_propagate_attrsÚ_get_clauseÚsetrM   rš   Úsql_utilZadapt_criterion_to_nullrJ   r   ÚwarnZ_deep_annotateZ_where_criteriarT   Z_for_update_argrI   Ú	load_pathÚparentÚoptionsÚ_set_get_optionsZ	_order_byÚ
EMPTY_DICTZ
merge_withÚexecuteÚuniqueÚscalarsÚoner…   ZNoResultFound)rr   rs   Zprimary_key_identityrI   r‹   rŒ   r�   rŽ   r�   r�   rP   r~   Úqr”   r•   Úcompile_optionsrƒ   r¡   Znonesr�   rœ   Znew_compile_optionsrW   r   r™   r   r‘   ¦  sš    
ÿÿ


 ÿþÿ
ÿÿ
 ÿþÿ	

ú
 ÿüÿ
r‘   c           	      C   sp   i }i }|r||d< |r ||d< |r4||d< d|d< |rDt |ƒ|d< |rP||d< |r\||7 }|rh| |7 } | |fS )NZ_version_checkZ_populate_existingZ_refresh_stateTZ_for_refresh_stateZ_only_load_propsZ_refresh_identity_token)Ú	frozenset)	Zcompile_optZload_optÚpopulate_existingrœ   r�   r‹   rŽ   r¯   rI   r   r   r   r¨   "  s$    
r¨   c	                 K   s´   |r|  |¡}
n|j}
i }| | jd|¡ |oBt|ƒdkoB|d j}|
D ]6}|r\|j|kr\qH|j| |||f||||dœ|	—Ž qH|d k	r°||jk	r°|r¢|j	| }n|}| 
|¡ d S )NÚmemoized_setupsr   éÿÿÿÿ)r�   Úcolumn_collectionZmemoized_populatorsÚcheck_for_adapt)Z_iterate_polymorphic_propertiesZ_polymorphic_propertiesr¢   r   rJ   Úis_aliased_classr‡   ÚsetupÚpolymorphic_onÚcolumnsrq   )rH   rƒ   r   r=   Úadapterr´   Zwith_polymorphicr�   Úpolymorphic_discriminatorÚkwZpoly_propertiesÚquick_populatorsrµ   r˜   Úpdr   r   r   Ú_setup_entity_queryB  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   )r‰   r   r   r   Ú_warn_for_runid_changed|  s
    úÿrÀ   c
                    s@  ˆ
j ‰ˆj}
dˆ
f}| |
j|d¡}|dk�rÄˆ
j}ˆdk	rT| ‡
fdd„ˆD ƒ¡}| ˆjdt¡}g }g g g g g g g dœ}ˆdkr¬ˆ
j}ˆ r ‡ fdd„|D ƒ}| |¡‰nd‰||ˆd	œ}|D ]ò}||k�r¨|| }|t	krö|d
  
|j|jf¡ n°|tk�r|d  
|jdf¡ n�|tk�r8|d
  
|j|jf¡ nnd}ˆ �rbˆ j| }|dk	�rb| |d¡}|�st| |d¡}|�r�|d  
|j|f¡ n| ˆ| |ˆ
|ˆ |¡ 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!ƒ‰ˆ�rvˆjjj!‰	tj"‰tj#‰ˆjj$‰ˆj%‰ˆj&‰ˆj'‰ˆ�rÒˆ
j(}|dk	�rÎˆ �rÂˆ j| }| |¡‰nd‰ˆ�sp|	dk	�rpd|jf}|ˆjk�r$ˆj| j)dk�r$ˆ
 *ˆj| j+d |	¡}nˆ
 *d|	¡}|�rp||	k	�rpˆdk�sNt,‚t-ˆ||ƒ}t. /ˆˆ|j0|||¡ t. 1ˆˆˆ¡‰ˆ�r ˆj‰ˆdk�r¬ˆ
 2ˆ¡‰nd‰|d ‰ˆ
j3�r¼tj4‰ntj‰‡‡‡‡‡‡‡‡‡	‡
‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡fdd„}ˆ
j5�r<|	�s<ˆ�s<‡‡‡‡fdd„}t6|ˆ| ˆ
|||ˆ |ƒ	}|S )z]Produce a mapper level row processor callable
    which processes rows into mapped instances.ÚgettersNc                 3   s   | ]}ˆ j | V  qd S r(   )Z_props)r   Úk©rƒ   r   r   Ú	<genexpr>²  s    z&_instance_processor.<locals>.<genexpr>r²   )ÚnewÚquickÚdeferredÚexpireÚdelayedÚexistingÚeagerc                    s   g | ]}ˆ j | ‘qS r   )r¹   )r   Úc)rº   r   r   r   Ê  s     z'_instance_processor.<locals>.<listcomp>)Úcached_populatorsÚtodoÚprimary_key_getterrÅ   rÈ   FrÆ   rÍ   c                 S   s   i | ]\}}|t |ƒ“qS r   )rL   )r   r‡   r˜   r   r   r   Ú
<dictcomp>  s      z'_instance_processor.<locals>.<dictcomp>rÎ   Úloader))Zselectinload_polymorphicTÚentitiesrÏ   c              
      s¨  ˆr,ˆ}|  ¡ }ˆ|ƒ}|jˆk}d}d}n¶ˆˆ| ƒˆf}ˆ |¡}|d k	rŽˆ|ƒ}ˆ|ƒ}|jˆk}| }d}ˆrâˆrâ|sâtˆ	||| ˆƒ nTˆ|d ƒržd S d}d}d}ˆ	j ¡ }ˆ|ƒ}ˆ|ƒ}||_ˆ|_ˆ|_ˆ 	||¡ ˆ}ˆ|kròd}|sü|�r
|�rˆ�s|�sˆ|_
ˆ|_tˆ | |||ˆ||ˆƒ	 |�rö|j}	|�r–ˆ�rn|jj |ˆ ¡ |j|	k�rnt|ƒ ˆ�rÂˆˆ j|ƒ |j|	k�rÂt|ƒ n,ˆ�rÂ|jj |ˆ ˆ
¡ |jˆk�rÂt|ƒ |�sÐ|j�röˆ�rêˆ
�rê| |ˆ
¡ n| |ˆ¡ ˆ�r¤ˆ |d¡ nš|j}
|ˆ jk}|�r0|
�s0ˆd �rŠtˆ | |||ˆ|
ˆƒ}|�rŠˆ�r~|j}	|jj |ˆ |¡ |j|	k�r~t|ƒ | ||¡ ˆ�r¤ˆ j�r¤ˆ |d¡ |S )NTFr   rË   )r#   rG   rQ   Ú_validate_version_idÚclass_managerZnew_instancer‡   rŽ   Ú
session_idZ_add_unpresentrI   r¥   Ú_populate_fullÚmanagerÚdispatchrf   rÀ   rr   ÚrefreshÚmodifiedZ_commitZ_commit_allÚ	add_stateÚunloadedr6   Ú_populate_partialZinvoke_all_eagers)r0   r‰   r|   Údict_ÚisnewZcurrentloadÚloaded_instanceÚidentitykeyZeffective_populate_existingZexisting_runidrÜ   Úto_load)r   Úidentity_classrŽ   rp   ro   Úis_not_primary_keyÚload_evtr¥   Úloaded_as_persistentrƒ   r�   Úpersistent_evtr±   Ú
populatorsr>   rÏ   Úpropagated_loader_optionsÚrefresh_evtÚrefresh_identity_keyr‹   rG   rÕ   Úsession_identity_maprœ   Úversion_id_getterr   r   Ú	_instances  sØ    
ý

    ÿ	

ÿÿ÷
  ÿ
øz&_instance_processor.<locals>._instancec                    s&   ˆ ˆ| ƒˆf}ˆ|d ƒs|S d S d S )Nr   r   )r0   rá   )rã   rŽ   rä   rÏ   r   r   Úensure_no_pk  s    ýz)_instance_processor.<locals>.ensure_no_pk)7Z_identity_classrH   rQ   r   Z	_prop_setÚintersectionr   rš   Z_tuple_getterr   rq   r‡   Z_deferred_column_loaderr
   r	   Z_raise_column_loaderr¹   Ú_getterZcreate_row_processorr¢   r8   ré   Úcurrent_pathr=   rr   r�   r±   Zalways_refreshÚboolrÔ   rØ   rf   rÙ   ræ   ro   rp   Zhash_keyrG   rŽ   rœ   Úversion_id_colZstrategyZ_should_selectin_loadZ
local_optsrž   Ú_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   rW   r=   rº   r�   r‹   r»   Ú_polymorphic_fromrH   Z
getter_keyrÁ   Úpropsr½   rÎ   rÍ   Zpk_colsÚpropr—   ÚgetterZadapted_colrô   r‡   Zselectin_load_viaZ	callable_rî   rï   r   )rº   r   rã   rŽ   rp   ro   rä   rå   r¥   ræ   rƒ   r�   rç   r±   rè   r>   rÏ   ré   rê   rë   r‹   rG   rÕ   rì   rœ   rí   r   Ú_instance_processorˆ  s4   
ÿ  ÿù
ý

ÿ


ÿ

ù      ÿÿý



þ ÿú	
ÿ< "÷r  c                    sP   |j }t|jjƒdk‰|jr.| |¡\‰‰‰ n|j\‰‰‰ ‡ ‡‡‡fdd„}|S )Nr   c                    s„   | j }ˆf|j ˆ f }ˆj|Ž }| jj|_| jd|ji7  _| jrR|jdd�}| j	 
|t‡fdd„|D ƒd�¡ ¡  ¡  ¡  d S )Nr›   T)r±   c                    s,   g | ]$\}}ˆ r|j d  d n|j d  ‘qS )r   r   r–   )r   r‰   Z
load_attrs)Úzero_idxr   r   r   J  s   ÿz:_load_subclass_via_in.<locals>.do_load.<locals>.<listcomp>)Zprimary_keys)r~   Z_with_optionsr§   rH   r    rŸ   r¦   r±   rP   rr   rª   rT   r«   r¬   Úall)r   r=   ÚstatesÚ	load_onlyZeffective_entityZ
orig_queryr§   Úq2©Zdisable_optZ
enable_optr®   r  r   r   Údo_load;  s    


þÿþz&_load_subclass_via_in.<locals>.do_load)rƒ   rJ   Zbase_mapperrš   r¶   Z_subclass_load_via_inZ_subclass_load_via_in_mapper)r   r=   Úentityrƒ   r	  r   r  r   rõ   1  s    rõ   c	                 C   s:  |r¾| j |_ |d D ]\}	}
|
|ƒ||	< q|r^|d D ]$\}	}| |	d ¡ |r6|j |	¡ q6n"|d D ]\}	}|rf|j |	¡ qf|d D ]\}	}||||ƒ qˆ|d D ]\}	}||||ƒ q¦nx||jk�r||_|d D ]\}	}
|	|krØ|
|ƒ||	< qØ|d D ]\}	}||||ƒ qþn |d D ]\}	}||||ƒ �qd S )NrÆ   rÈ   rÅ   rÉ   rÊ   )rG   ÚpopÚexpired_attributesÚaddr¥   )r   r0   r‰   rÞ   rß   r¥   rà   r±   rè   r‡   r  Úset_callableÚ	populatorr   r   r   rÖ   T  s2    rÖ   c                 C   s  |s6| j | }|d D ]\}	}
|	|kr|
|||ƒ qn¶|}|| j |< |d D ]\}	}|	|krL||ƒ||	< qL|d D ],\}	}|	|krr| |	d ¡ |rr|j |	¡ qr|d D ]\}	}
|	|kr¨|
|||ƒ q¨|d D ]\}	}
|	|krÎ|
|||ƒ qÎ|d D ]\}	}
|	|krô|
|||ƒ qô|S )NrÊ   rÆ   rÈ   rÅ   rÉ   rË   )r6   r  r  r  )r   r0   r‰   rÞ   rß   r¥   rÜ   rè   râ   r‡   r  r  r  r   r   r   rÝ   Ž  s2    

rÝ   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'.)Z_get_state_attr_by_columnrô   r…   ZStaleDataErrorr   )rƒ   r‰   rÞ   r0   r  r   r   r   rÓ   °  s&      ÿþ  ÿûþÿrÓ   c	                    sr   |d k	r|‰nˆj ‰ˆd kr ˆS ˆ r.ˆ jˆ ‰‡ ‡‡‡‡	‡
fdd„}	t |	¡‰ˆ
 ˆ¡‰‡‡‡‡‡‡fdd„}
|
S )Nc              	      sd   zˆj |  }W n  tk
r.   td|  ƒ‚Y n2X |ˆkr<d S | ˆ¡sJdS tˆ|ˆˆˆˆ ˆd�S d S )Nz*No such polymorphic_identity %r is definedF)rþ   )rü   ÚKeyErrorrž   r„   r  )ÚdiscriminatorZ
sub_mapper)rº   r   rƒ   r=   r   rW   r   r   Úconfigure_subclass_mapper×  s&    ÿ

ùz?_decorate_polymorphic_switch.<locals>.configure_subclass_mapperc                    sŽ   ˆ| ƒ}|d k	rfˆ| }|r$|| ƒS |dkr\ˆ | ƒ}|rVt  d|ˆˆj| ˆf ¡‚qdd S qŠˆ| ƒS n$ˆ | ƒ}|r†t  d|ˆf ¡‚nd S 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)r   r   rü   )r0   r  rî   rá   )rï   r  Úinstance_fnrƒ   Úpolymorphic_instancesr¸   r   r   Úpolymorphic_instanceò  s6    üüÿ
þÿz:_decorate_polymorphic_switch.<locals>.polymorphic_instance)r¸   r¹   r   ZPopulateDictrñ   )r  r   r   rƒ   rW   r=   r»   rº   rï   r  r  r   )rº   r   rï   r  r  rƒ   r=   r  r¸   r   rW   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 r(   )r  r   ÚOrderedDictr  r  )Úselfr   r   r   Ú__init__   s    
zPostLoad.__init__c                 C   s   || j |< d S r(   )r  )r  r‰   Ú	overwriter   r   r   rÛ   %  s    zPostLoad.add_statec                    sr   | j s
d S tj |¡}| j ¡ D ]B\}‰ }}}‡ fdd„| j  ¡ D ƒ}|r ||||| jf|ž|Ž q | j  ¡  d S )Nc                    s&   g | ]\}}|j j ˆ ¡r||f‘qS r   )r×   rƒ   r„   )r   r‰   r  ©Úlimit_to_mapperr   r   r   1  s   þz#PostLoad.invoke.<locals>.<listcomp>)	r  r   ZPathRegistryZcoercer  Úvaluesr8   r  Úclear)r  r   r=   ÚtokenrÑ   Úargr¼   r  r   r  r   r9   ,  s    
þzPostLoad.invokec                 C   s$   |j  |j¡}|d k	r |r ||_|S r(   )r7   rQ   r=   r  )Úclsr   r=   r�   Úplr   r   r   rø   :  s    zPostLoad.for_contextc                 C   s   |j |jko||j|j  jkS r(   )r=   r7   r  )r  r   r=   r‡   r   r   r   Úpath_existsA  s    þzPostLoad.path_existsc           	      O   sD   |j |jkr|j|j  }ntƒ  }|j|j < |||||f|j|< d S r(   )r=   r7   rö   r  )	r"  r   r=   r  r   Zloader_callabler!  r¼   r#  r   r   r   r÷   H  s    zPostLoad.callable_for_pathN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r  rÛ   r9   Úclassmethodrø   r$  r÷   r   r   r   r   rö     s   

rö   c                    st  |j }|st dt|ƒ ¡‚t|jƒ}d}t|tj@ ƒp>|j j}|rT| 	ˆ j
 ¡ ¡}ˆ jr°ˆ js°ˆ  ||¡}|dk	r°ddlm}	 |	ˆ |ƒ t ˆ ¡ d¡¡}
t||
d|||d�}|dk�rV|rÆ|j}n<‡ fdd	„ˆ jD ƒ}|j 	|¡røt d
t|ƒ ¡‚ˆ  |¡}t |¡�rˆ j�r"t |¡�r6t  dt|ƒ¡ dS t|t! "ˆ ¡ #t$¡||||d�}|�rp|dk�rpt %|¡‚dS )z4initiate a column-based attribute refresh operation.zQInstance %s is not bound to a Session; attribute refresh operation cannot proceedFNr   )ÚFromStatementÚ*)r�   r‹   r�   c                    s   g | ]}ˆ j | j‘qS r   )Z_columntopropertyr‡   )r   r—   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).)r‹   r�   r�   )&rr   r…   ZDetachedInstanceErrorr   ró   r‡   r   ZNO_AUTOFLUSHZ
autocommitrð   Úattrsrw   r‚   ZconcreteZ_optimized_get_statementr~   r+  r§   r   ÚLoadZundeferr“   rš   r  r   r   rù   r   Úissubsetrú   rû   r   Zwarn_limitedr   ÚselectZset_label_styler   r†   )rƒ   r‰   Zattribute_namesrˆ   rr   Zhas_keyrW   r�   rs   r+  ÚstmtZidentity_keyZpk_attrsr   rÃ   r   Úload_scalar_attributesS  s€    ÿÿ
ÿ
	
ÿú	

ÿþÿ
ÿÿþü
ÿør2  )T)T)NNNNN)NNN)NNNN)4r(  Ú
__future__r   Ú r   r   r…   r   r   Úbaser   r	   r
   r   r   r   r   r   Zenginer   Zengine.resultr   r   r   Úsqlr£   Zsql.selectabler   r   ÚcounterrF   rX   Zpreload_modulerz   Zdeprecated_20r€   rŠ   r©   r“   r‘   r¨   r¿   rÀ   r  rõ   rÖ   rÝ   rÓ   rý   Úobjectrö   r2  r   r   r   r   Ú<module>   s˜    (;üP&ö
&õ
     ù
'   ÷
:    ö
   ,#:"Y8