HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/__pycache__/dependency.cpython-310.pyc
o

���g��@s�dZddlmZddlmZddlmZddlmZddlmZddlmZ	dd	l
mZdd
l
mZddl
m
Z
ddlmZdd
lmZddlmZGdd�d�ZGdd�de�ZGdd�de�ZGdd�de�ZGdd�de�Ze
eeeeeiZdS)zRelationship dependencies.

�)�annotations�)�
attributes)�exc)�sync)�
unitofwork)�util)�
MANYTOMANY)�	MANYTOONE)�	ONETOMANY�)�sqlc@s�eZdZdd�Zedd��Zdd�Zdd�Zd	d
�Zdd�Z	d
d�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zd%dd�Zd d!�Zd"d#�Zd$S)&�DependencyProcessorcCs�||_|j|_|j|_|j|_|j|_|j|_|j|_|j|_|j|_|j	|_	|jr/t
j|_nt
j
|_|jr;t
j|_nt
j
|_d|jj|jf|_|j|_|jjsYt�d|j��dS)Nz%s_%sz|Can't build a DependencyProcessor for relationship %s. No target attributes to populate between parent and child are present)�prop�cascade�mapper�parent�	secondary�	direction�post_update�passive_deletes�passive_updates�enable_typechecksr�PASSIVE_NO_INITIALIZE�_passive_delete_flag�PASSIVE_OFF�_passive_update_flag�	_sort_key�key�sort_key�synchronize_pairs�sa_exc�
ArgumentError)�selfr�r$�D/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/dependency.py�__init__s2

���zDependencyProcessor.__init__cCst|j|�S�N)�_direction_to_processorr)�clsrr$r$r%�from_relationship;sz%DependencyProcessor.from_relationshipcCs|jj�|j��|�S)z�return True if the given object instance has a parent,
        according to the ``InstrumentedAttribute`` handled by this
        ``DependencyProcessor``.

        )r�
class_manager�get_implr�	hasparent�r#�stater$r$r%r-?szDependencyProcessor.hasparentcCs|�|d�dS)z�establish actions and dependencies related to a flush.

        These actions will operate on all relevant states in
        the aggregate.

        TN)�register_preprocessor�r#�uowr$r$r%�per_property_preprocessorsGsz.DependencyProcessor.per_property_preprocessorsc	Cszt�||dd�}t�||dd�}t�||jj�}t�||jj�}t�||jj�}t�||jj�}|�|||||||�dS�NFT)r�
ProcessAll�
SaveUpdateAllr�primary_base_mapperr�	DeleteAll�per_property_dependencies)r#r2�
after_save�
before_delete�parent_saves�child_saves�parent_deletes�
child_deletesr$r$r%�per_property_flush_actionsPs.�����z.DependencyProcessor.per_property_flush_actionscCs�|jj}t�||�}t�||�}|rt�||dd�}d|_nt�||dd�}d|_||jvr@||jvs5J�|df|dfg}	d}
nd}
|sXt�||jj	�}d}}||jvrWd}
nt�||jj	�}d}}||jvrkd}
|D]�}|j
|jj�
||j|r~|jntj�}|s�qm|r�t�||d|�}|
r�t�||�}nt�||d|�}|
r�t�||�}|
r�g}	|D]+\}}||jvr�d}n|j|\}}|r�t�||�df}nt�||�df}|	�|�q�|	D]\}}|�||||||||�q�qmdS)z�establish actions and dependencies related to a flush.

        These actions will operate on all relevant states
        individually.    This occurs only if there are cycles
        in the 'aggregated' version of events.

        TFN)NN)rr7rr6r8r5�disabled�cyclesr�base_mapper�managerr�impl�get_all_pending�dictrrr�ProcessState�DeleteState�SaveUpdateState�states�append�per_state_dependencies)r#r2rK�isdelete�child_base_mapperr=r?r;r:�
child_actions�child_in_cyclesr<r>�parent_in_cyclesr/�sum_�child_state�child�child_action�deleted�listonly�
childisdeleter$r$r%�per_state_flush_actionsls�	
�
�
��
�

�
����z+DependencyProcessor.per_state_flush_actionscC�dS�NFr$�r#�	uowcommitrKr$r$r%�presort_deletes��z#DependencyProcessor.presort_deletescCr[r\r$r]r$r$r%�
presort_saves�r`z!DependencyProcessor.presort_savescC�dSr'r$r]r$r$r%�process_deletes�r`z#DependencyProcessor.process_deletescCrbr'r$r]r$r$r%�
process_saves�r`z!DependencyProcessor.process_savescCs||r|jrtjtjB}n|jturtj}ntjtjB}|D]}|�||j	|�}|r0|�
�s0dSq|o=|jjo=|j
|jvS)NT)rrr�INCLUDE_PENDING_MUTATIONSrr
�PASSIVE_NO_FETCH_RELATEDr�get_attribute_historyr�emptyr�_is_self_referentialr�mappers)r#r^rKrN�passive�s�historyr$r$r%�prop_has_changes�s&
��

���
�z$DependencyProcessor.prop_has_changescCs�|jjr|durt�d|jf��|durG|jj||jd�sI|jj|dd�r8t�d|j|j|jj|jd���t�d|j|j|jjd���dSdS)Nz-Can't flush None value found in collection %s)�allow_subtypesTaEAttempting to flush an item of type %(x)s as a member of collection "%(y)s". Expected an object of type %(z)s or a polymorphic subclass of this type. If %(x)s is a subclass of %(z)s, configure mapper "%(zm)s" to load this subtype polymorphically, or set enable_typechecks=False to allow any subtype to be accepted for flush. )�x�y�z�zmz�Attempting to flush an item of type %(x)s as a member of collection "%(y)s". Expected an object of type %(z)s or a polymorphic subclass of this type.)rprqrr)r�uselistr�
FlushErrorr�_canloadr�class_r.r$r$r%�_verify_canload
s8���
�������z#DependencyProcessor._verify_canloadcC�t��r'��NotImplementedError)r#r/rU�associationrow�	clearkeysr^r$r$r%�_synchronize3�z DependencyProcessor._synchronizecCs>|jjsdStt|jgdd�|jjD���}|�d|ft�S)NcSsg|]}|j�qSr$)r)�.0�pr$r$r%�
<listcomp>;szCDependencyProcessor._get_reversed_processed_set.<locals>.<listcomp>�reverse_key)r�_reverse_property�tuple�sortedr�memo�set)r#r2�process_keyr$r$r%�_get_reversed_processed_set6s�z/DependencyProcessor._get_reversed_processed_setFcCs:|D]}|r
|dur|�|dd�|jjD��dSqdS)NcSsg|]\}}|�qSr$r$)r��l�rr$r$r%r�Csz4DependencyProcessor._post_update.<locals>.<listcomp>)�register_post_updaterr )r#r/r^�related�
is_m2o_deleterpr$r$r%�_post_update?s���z DependencyProcessor._post_updatecCryr'rz�r#r^r/r$r$r%�_pks_changedGrz DependencyProcessor._pks_changedcCsd|jj|jfS)Nz%s(%s))�	__class__�__name__r)r#r$r$r%�__repr__JszDependencyProcessor.__repr__N)F)r��
__module__�__qualname__r&�classmethodr*r-r3r@rZr_rarcrdrnrxr~r�r�r�r�r$r$r$r%rs&
	r )
	rc@sLeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dS)�OneToManyDPc

Cs�|jr/t�||jjd�}t�||jjd�}	|j�||f||f||f||	f|	|f|	|fg�dS|j�||f||f||f||f||f||f||fg�dSr4�rr�
PostUpdateAllrr7�dependencies�update)
r#r2r<r=r>r?r:r;�child_post_updates�child_pre_updatesr$r$r%r9Os4

�
�����z%OneToManyDP.per_property_dependenciesc	Cs�|jrVt�||jjd�}	t�||jjd�}
|s8|r'|j�||f||	fg�dS|j�||f||f||	fg�dS|rH|j�||
f|
|fg�dS|j�||
f|
|fg�dS|si|j�||f||f||fg�dS|j�||f||fg�dSr4r�)r#r2�save_parent�
delete_parentrVr:r;rNrYr�r�r$r$r%rMxsR
�
������������z"OneToManyDP.per_state_dependenciescCs�|jjo
|jdk}|D]D}|�||j|j�}|rQ|jD]}|dur;|�|�dur;|jjr6|j	|dd�q|�	|�q|rQ|j
D]}|durP|j	|d|jd�qAq
dS)N�allFT�rN�delete��	operationr)rr�rrgrrrWr-�
delete_orphan�register_object�	unchangedr�r#r^rK�should_null_fksr/rmrUr$r$r%r_�s*�
�

�
���zOneToManyDP.presort_deletesc	CsZ|�d|ft�}|jjo|jdk}|D]�}|�||�}|r"|jr)tjtj	B}ntj
tj	B}|�||j|�}|r�|j
D]}	|	durL|j|	dd|jd�q<|�|j
�|jD]9}	|jjsi|rh|j|	dd|jd�qV|�|	�dur�|j|	dd|jd�|j�d|	�D]
\}
}}}
|j|dd	�q�qV|r�|r�|jD]}	|	dur�|j|	d|jd
|jd�q�qdS)N�children_addedr�T�add)�
cancel_deleter�rFr��rNr�rr�z	pk changer�)r�r�rr�rr�rrrrerrgr�addedr�rr�rWr-r�cascade_iteratorr�)r#r^rKr�r�r/�pks_changedrkrmrU�c�m�st_�dct_r$r$r%ra�s|

�
����
��
�����
���zOneToManyDP.presort_savesc
Cs�|js|jdksu|�d|ft�}|D]d}|�||j|j�}|rt|jD]$}|durF|�|�durF|�	||dd|d�|jrF|rF|�
|||g�q"|jsN|jjstt|j
��|�D]}|durs|�	||dd|d�|jrs|rs|�
|||g�qVqdSdS)Nr�r�FT)rrr�r�rgrrrWr-r~r�rr�r��
difference)r#r^rKr�r/rmrUr$r$r%rcs>
�
�
�
��
���zOneToManyDP.process_deletesc
Cs�|jjo
|jdk}|D]]}|�||jtj�}|rj|jD]}|�||dd|d�|dur8|j	r8|�
|||g�q|jD]}|rS|jjsS|�|�sS|�||dd|d�q<|�
||�rj|jD]}|�||dd|d�q]q
dS)Nr�FT)rr�rrgrrrr�r~rr�rWr-r�r�r�r$r$r%rdDsB

�
�
��
�����
���zOneToManyDP.process_savesc		Csr|}|}|�|�|dus|js|�|�rdS|r%t�||j|jj�dSt�||j	||j|jj||j
o5|�dSr')rxr�
is_deletedr�clearrrr �populaterr)	r#r/rUr|r}r^r��source�destr$r$r%r~fs(
���zOneToManyDP._synchronizecC�t�|||j|jj�Sr'�r�source_modifiedrrr r�r$r$r%r�}��zOneToManyDP._pks_changedN)r�r�r�r9rMr_rarcrdr~r�r$r$r$r%r�Ns)AD,"r�c@sPeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z		ddd�Z
dS)�ManyToOneDPcCs.t�||�|jjD]
}|j�t|��q
dSr')rr&r�self_and_descendants�_dependency_processorsrL�DetectKeySwitch)r#rrr$r$r%r&�s�zManyToOneDP.__init__c

Cs�|jr2t�||jjd�}t�||jjd�}	|j�||f||f||f||	f||	f|	|f|	|fg�dS|j�||f||f||f||fg�dSr4�rrr�rr7r�r�)
r#r2r<r=r>r?r:r;�parent_post_updates�parent_pre_updatesr$r$r%r9�s0

�
�����z%ManyToOneDP.per_property_dependenciesc	Cs�|jrI|s/t�||jjd�}	|r|j�||	f|	|fg�dS|j�||f||f||	fg�dSt�||jjd�}
|j�||
f|
|f|
|fg�dS|sf|s[|j�||f||fg�dS|j�||fg�dS|rs|j�||fg�dSdSr4r�)r#r2r�r�rVr:r;rNrYr�r�r$r$r%rM�sF
�����
�����z"ManyToOneDP.per_state_dependenciescCs�|jjs|jjrP|D]G}|�||j|j�}|rO|jjr |��}n|��}|D](}|dur-q&|j|dd|j	d�|j
�d|�}|D]
\}}	}
}|j|
dd�q@q&q
dSdS)NTr�r�r�)rr�r�rgrr�sum�non_deletedr�rrr�)r#r^rKr/rm�todeleterU�tr�r�r�r�r$r$r%r_�s2
�
����zManyToOneDP.presort_deletescCs�|D]H}|j|d|jd�|jjrJ|�||j|j�}|rJ|jD]*}|�|�durI|j|dd|jd�|j	�
d|�}|D]
\}}}	}
|j|	dd�q;qqdS)Nr�r�FTr�r�r�)r�rrr�rgrrrWr-rr�)r#r^rKr/rmrUr�r�r�r�r�r$r$r%ras(
�
���zManyToOneDP.presort_savescCsz|jr5|jjs7|jdks9|D],}|�|ddd|�|r4|jr4|�||j|j�}|r4|j|||�	�dd�qdSdSdSdS)Nr�T)r�)
rrr�rr~rgrrr�r�)r#r^rKr/rmr$r$r%rcs&��


����zManyToOneDP.process_deletesc
Cs~|D]:}|�||jtj�}|r<|jr#|jD]}|�||dd|d�qn
|jr0|�|ddd|d�|jr<|�|||�	��qdS)NFr�Tr�)
rgrrrr�r~rWrr�r�)r#r^rKr/rmrUr$r$r%rd)s&
�
�����zManyToOneDP.process_savesNc	Cs�|dus|js|�|�rdS|dur,|dur,|j�|�s,t�dt�|�||jf�dS|s2|dur>t	�
||j|jj�dS|�
|�t	�||j||j|jj|d�dS)N�GObject of type %s not in session, %s operation along '%s' won't proceedF)rr��session�_contains_stater�warn�
mapperutil�state_class_strrrr�rr rxr�r�r#r/rUr|r}r^r�r$r$r%r~;s8	��
���
�zManyToOneDP._synchronizer')r�r�r�r&r9rMr_rarcrdr~r$r$r$r%r��s'8�r�c@sheZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�Zdd�Z
dd�ZdS)r�a�For many-to-one relationships with no one-to-many backref,
    searches for parents through the unit of work when a primary
    key has changed and updates them.

    Theoretically, this approach could be expanded to support transparent
    deletion of objects referenced via many-to-one as well, although
    the current attribute system doesn't do enough bookkeeping for this
    to be efficient.

    cCs<|jjr|jr	dSddd�|jjD�vrdS|�|d�dS)NFcss�|]}|jVqdSr')r)r�rr$r$r%�	<genexpr>us
��
�z=DetectKeySwitch.per_property_preprocessors.<locals>.<genexpr>)rr�rr0r1r$r$r%r3ps�z*DetectKeySwitch.per_property_preprocessorscCs6t�||jj�}t�||dd�}|j�||fg�dSr\)rr6rrCr5r�r�)r#r2r<r:r$r$r%r@}sz*DetectKeySwitch.per_property_flush_actionscCrbr'r$)r#r2rKrNr$r$r%rZ�r`z'DetectKeySwitch.per_state_flush_actionscCrbr'r$r]r$r$r%r_�r`zDetectKeySwitch.presort_deletescCs|js|�||�dSdSr'�r�_process_key_switches)r#r2rKr$r$r%ra�s�zDetectKeySwitch.presort_savescCs"|s|jr|�||�}t|�SdSr\)r�_key_switchers�bool)r#r2rKrN�dr$r$r%rn�s
z DetectKeySwitch.prop_has_changescCsJ�r'r$r]r$r$r%rc�r`zDetectKeySwitch.process_deletescCs|jsJ�|�||�dSr'r�r]r$r$r%rd�s
zDetectKeySwitch.process_savescCsZ|�d|fdd��\}}|�|�}|D]}||vr*|�||�r%|�|�q|�|�q|S)N�pk_switcherscSst�t�fSr')r�r$r$r$r%�<lambda>�sz0DetectKeySwitch._key_switchers.<locals>.<lambda>)r��unionr�r�)r#r2rK�switched�notswitched�	allstatesrlr$r$r%r��s�

�zDetectKeySwitch._key_switchersc	
Cs�|�||�}|rb|jj��D]U}t|j|jj�sq|j}|�|j	�j
|||jd�}|tj
ura|dura|jjr>|s9q|d}n|}t�|�}||vra|�|d|j�t�||j||j|jj||j�qdSdS)N)rkrF)r�r��identity_map�
all_states�
issubclassrwrrGr,r�getrr�PASSIVE_NO_RESULTrrt�instance_stater�rrr�rr )	r#�deplistr^�	switchersr/�dict_r��related_obj�
related_stater$r$r%r��sB�


����z%DetectKeySwitch._process_key_switchescCs t|j�ot�|||j|jj�Sr')r�rrr�rrr r�r$r$r%r��s�zDetectKeySwitch._pks_changedN)r�r�r��__doc__r3r@rZr_rarnrcrdr�r�r�r$r$r$r%r�ds
%r�c@sTeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�ZdS)�ManyToManyDPc
Cs:|j�||f||f||f||f||f||f||fg�dSr'�r�r�)r#r2r<r=r>r?r:r;r$r$r%r9�s
��z&ManyToManyDP.per_property_dependenciesc		Cs\|s |r|j�||f||fg�dS|j�||f||fg�dS|j�||f||fg�dSr'r�)	r#r2r�r�rVr:r;rNrYr$r$r%rM�s���z#ManyToManyDP.per_state_dependenciescCs*|js|D]
}|�||j|j�qdSdSr')rrgrr)r#r^rKr/r$r$r%r_s
��zManyToManyDP.presort_deletesc
Cs�|js|D]}|�||�r|�||jtj�}q|jjsdS|D]9}|�||jtj�}|rX|j	D](}|�
|�durW|j|dd|jd�|j
�d|�D]
\}}}}	|j|dd�qIq/qdS)NFTr�r�r�)rr�rgrrrrr�rrWr-r�rrr�)
r#r^rKr/rmrUr�r�r�r�r$r$r%ras8
��
�
����zManyToManyDP.presort_savesc
s�g}g}g}|�|�}t�}|D]C�|��|j|j�}|rS|��D]#}	|	dus1|dur2�|	f|vr2q!i}
|��|	|
d|d�s?q!|�|
�q!|��fdd�|��D��q|dur]|�|�|�	||||�dS)NFr�c3��|]}|�fVqdSr'r$�r�r��r/r$r%r�[��z/ManyToManyDP.process_deletes.<locals>.<genexpr>)
r�r�rgrr�	non_addedr~rLr��	_run_crud)r#r^rK�secondary_delete�secondary_insert�secondary_update�	processed�tmprmrUr|r$r�r%rc<s@

���
�zManyToManyDP.process_deletesc

s�g}g}g}|�|�}t�}|D]��|jo|�|��}|r%tjtjB}	ntjtjB}	|��|j	|	�}
|
r�|
j
D]}|durE�|f|vrEq8i}|��||d|d�sRq8|�|�q8|
j
D]}|durh�|f|vrhq[i}|��||d|d�suq[|�|�q[|��fdd�|
j
|
j
D��|r�|
jD]!}i}t��|j|d|jj�t�||j|d|jj�|�|�q�q|dur�|�|�|�||||�dS)NFr�r�c3r�r'r$r�r�r$r%r��r�z-ManyToManyDP.process_saves.<locals>.<genexpr>�old_)r�r�rr�rrrerrgrr�r~rLrWr�r�rrrr r�secondary_synchronize_pairsr�)
r#r^rKr�r�r�r�r��need_cascade_pksrkrmrUr|r$r�r%rdds�
�����
�
� 
���
�zManyToManyDP.process_savescs|j�|j�}|rA|d�|j���tj�fdd�|jjD���}|�	||�}|�
�rA|jt|�krAt
�d|jjt|�|jf��|r{|d�|j���tj�fdd�|jjD���}|�	||�}|�
�r{|jt|�kr{t
�d|jjt|�|jf��|r�|j��}|�	||�dSdS)Nrcs,g|]}|j�vr|tj|j|jd�k�qS)��type_�rr
�	bindparam�typer��r|r$r%r��s

�z*ManyToManyDP._run_crud.<locals>.<listcomp>zRDELETE statement on table '%s' expected to delete %d row(s); Only %d were matched.cs0g|]}|j�vr|tjd|j|jd�k�qS)r�r�r�r�rr$r%r��s

�zRUPDATE statement on table '%s' expected to update %d row(s); Only %d were matched.)�transaction�
connectionrrr��wherer
�and_r��execute�supports_sane_multi_rowcount�rowcount�lenr�StaleDataError�descriptionr��insert)r#r^r�r�r�r�	statement�resultr$rr%r��s^

���	����


���	����

�zManyToManyDP._run_crudcCs�|�|�|durdS|dur(|j�|�s(|js&t�dt�|�||jf�dSt	�
||j||jj�t	�
||j
||jj�dS)NFr�T)rxr�r�rWrr�r�r�rr�
populate_dictrr rr�r�r$r$r%r~�s*
����zManyToManyDP._synchronizecCr�r'r�r�r$r$r%r�r�zManyToManyDP._pks_changedN)r�r�r�r9rMr_rarcrdr�r~r�r$r$r$r%r��s"(M= r�N)r��
__future__r�rrrrrr��
interfacesr	r
rr!r
rr�r�r�r�r(r$r$r$r%�<module>s:	37bu>�