a
    ~g                     @  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 G dd dZG dd deZG dd deZG dd deZG dd deZeeeeeeiZdS )zRelationship dependencies.

    )annotations   )
attributes)exc)sync)
unitofwork)util)
MANYTOMANY)	MANYTOONE)	ONETOMANY   )sqlc                   @  s   e Zd Zdd Zedd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zd%ddZd d! Zd"d# Zd$S )&DependencyProcessorc                 C  s   || _ |j| _|j| _|j| _|j| _|j| _|j| _|j| _|j| _|j	| _	| jr^t
j| _nt
j| _| jrvt
j| _nt
j| _d| jj|jf | _|j| _| j jstd| j  d S )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$   ^/var/www/html/emsaiapi.evdpl.com/venv/lib/python3.9/site-packages/sqlalchemy/orm/dependency.py__init__   s0    

zDependencyProcessor.__init__c                 C  s   t |j |S N)_direction_to_processorr   )clsr   r$   r$   r%   from_relationship;   s    z%DependencyProcessor.from_relationshipc                 C  s   | j j| j|S )zreturn 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-   ?   s    zDependencyProcessor.hasparentc                 C  s   | | d dS )zestablish 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_preprocessorsG   s    z.DependencyProcessor.per_property_preprocessorsc              	   C  sz   t || dd}t || dd}t || jj}t || jj}t || jj}t || jj}| ||||||| d S 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_actionsP   s.    z.DependencyProcessor.per_property_flush_actionsc                 C  s  | j j}t||}t||}|r<t|| dd}d|_nt|| dd}d|_||jvr||jvsjJ |df|dfg}	d}
nd}
|st|| jj	}d }}||jv rd}n&t|| jj	}d }}||jv rd}|D ]}|j
| j j||j|r| jntj}|sq|r8t|| d|}|rZt||}n"t|| d|}|rZt||}|
rg }	|D ]\\}}||jvrd}n6|j| \}}|rt||df}nt||df}|	| qh|	D ]"\}}| |||||||| qqdS )zestablish 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)r   r7   r   r6   r8   r5   disabledcyclesr   base_mappermanagerr   implget_all_pendingdictr   r   r   ProcessStateDeleteStateSaveUpdateStatestatesappendper_state_dependencies)r#   r2   rK   isdeleteZchild_base_mapperr=   r?   r;   r:   Zchild_actionsZchild_in_cyclesr<   r>   Zparent_in_cyclesr/   Zsum_child_statechildchild_actiondeletedlistonlychildisdeleter$   r$   r%   per_state_flush_actionsl   s    	






z+DependencyProcessor.per_state_flush_actionsc                 C  s   dS NFr$   r#   	uowcommitrK   r$   r$   r%   presort_deletes   s    z#DependencyProcessor.presort_deletesc                 C  s   dS rV   r$   rW   r$   r$   r%   presort_saves   s    z!DependencyProcessor.presort_savesc                 C  s   d S r'   r$   rW   r$   r$   r%   process_deletes   s    z#DependencyProcessor.process_deletesc                 C  s   d S r'   r$   rW   r$   r$   r%   process_saves   s    z!DependencyProcessor.process_savesc                 C  s|   |r
| j rtjtjB }n| jtu r*tj}ntjtjB }|D ]&}||| j	|}|r:|
 s: dS q:|oz| jj oz| j|jv S )NT)r   r   r   INCLUDE_PENDING_MUTATIONSr   r
   PASSIVE_NO_FETCH_RELATEDr   get_attribute_historyr   emptyr   _is_self_referentialr   mappers)r#   rX   rK   rN   passiveshistoryr$   r$   r%   prop_has_changes   s$    



z$DependencyProcessor.prop_has_changesc                 C  s   | j jr$|d u r$td| j f nn|d ur| jj|| j ds| jj|ddrttd|j| j | jj| jd ntd|j| j | jjd d S )Nz-Can't flush None value found in collection %s)allow_subtypesTaE  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. 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zZzmzAttempting 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.)rh   ri   rj   )r   uselistr   
FlushErrorr   _canloadr   class_r.   r$   r$   r%   _verify_canload
  s6    
z#DependencyProcessor._verify_canloadc                 C  s
   t  d S r'   NotImplementedError)r#   r/   rP   associationrow	clearkeysrX   r$   r$   r%   _synchronize3  s    z DependencyProcessor._synchronizec                 C  s>   | j jsd S tt| jgdd | j jD  }|d|ftS )Nc                 S  s   g | ]
}|j qS r$   )r   ).0pr$   r$   r%   
<listcomp>;      zCDependencyProcessor._get_reversed_processed_set.<locals>.<listcomp>Zreverse_key)r   _reverse_propertytuplesortedr   memoset)r#   r2   Zprocess_keyr$   r$   r%   _get_reversed_processed_set6  s    z/DependencyProcessor._get_reversed_processed_setFc                 C  s8   |D ].}|r|d ur| |dd | jjD   q4qd S )Nc                 S  s   g | ]\}}|qS r$   r$   )ru   lrr$   r$   r%   rw   C  rx   z4DependencyProcessor._post_update.<locals>.<listcomp>)register_post_updater   r    )r#   r/   rX   relatedis_m2o_deleterh   r$   r$   r%   _post_update?  s    z DependencyProcessor._post_updatec                 C  s
   t  d S r'   rp   r#   rX   r/   r$   r$   r%   _pks_changedG  s    z DependencyProcessor._pks_changedc                 C  s   d| j j| jf S )Nz%s(%s))	__class____name__r   )r#   r$   r$   r%   __repr__J  s    zDependencyProcessor.__repr__N)F)r   
__module____qualname__r&   classmethodr*   r-   r3   r@   rU   rY   rZ   r[   r\   rf   ro   rt   r~   r   r   r   r$   r$   r$   r%   r      s$   
	r )	
r   c                   @  sL   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )OneToManyDPc           
   
   C  s   | j r\t|| jjd}t|| jjd}	|j||f||f||f||	f|	|f|	|fg n6|j||f||f||f||f||f||f||fg d S r4   r   r   PostUpdateAllr   r7   dependenciesupdate)
r#   r2   r<   r=   r>   r?   r:   r;   child_post_updateschild_pre_updatesr$   r$   r%   r9   O  s4    


z%OneToManyDP.per_property_dependenciesc	                 C  s   | j rt|| jjd}	t|| jjd}
|sl|rL|j||f||	fg q|j||f||f||	fg q|r|j||
f|
|fg q|j||
f|
|fg n<|s|j||f||f||fg n|j||f||fg d S r4   r   )r#   r2   save_parentdelete_parentrQ   r:   r;   rN   rT   r   r   r$   r$   r%   rM   x  sR    

z"OneToManyDP.per_state_dependenciesc                 C  s   | j j o| jdk }|D ]}||| j| j}|r|jD ]<}|d ur:| |du r:| j jrl|j	|dd q:|	| q:|r|j
D ]}|d ur|j	|d| jd qqd S )NallFTrN   delete	operationr   )r   r   r   r_   r   r   rR   r-   delete_orphanregister_object	unchangedr   r#   rX   rK   should_null_fksr/   re   rP   r$   r$   r%   rY     s$    


zOneToManyDP.presort_deletesc              	   C  sd  | d| ft}| jj o$| jdk }|D ]2}| ||}|rF| jrTtjtj	B }ntj
tj	B }||| j|}|r&|jD ] }	|	d ur||j|	dd| jd q|||j |jD ]t}	| jjs|r|j|	dd| jd q| |	du r|j|	dd| jd | jd|	D ]\}
}}}|j|dd	 qq|r*|r*|jD ](}	|	d ur4|j|	d| jd
| jd q4q*d S )Nchildren_addedr   Tadd)cancel_deleter   r   Fr   rN   r   r   r   z	pk changer   )r|   r}   r   r   r   r   r   r   r   r]   r   r_   r   addedr   r   r   rR   r-   r   cascade_iteratorr   )r#   rX   rK   r   r   r/   pks_changedrc   re   rP   cmst_dct_r$   r$   r%   rZ     sr    







zOneToManyDP.presort_savesc              
   C  s   | j s| jdks|d| ft}|D ]}||| j| j}|r$|jD ]H}|d urD| |du rD| 	||d d|d | j rD|rD| 
|||g qD| j s| jjs$t|j|D ]:}|d ur| 	||d d|d | j r|r| 
|||g qq$d S )Nr   r   FT)r   r   r|   r}   r_   r   r   rR   r-   rt   r   r   r   r   
difference)r#   rX   rK   r   r/   re   rP   r$   r$   r%   r[     s:    




zOneToManyDP.process_deletesc              
   C  s   | j j o| jdk }|D ]}||| jtj}|r|jD ]6}| ||d d|d |d ur:| j	r:| 
|||g q:|jD ].}|rx| j jsx| |sx| ||d d|d qx| ||r|jD ]}| ||d d|d qqd S )Nr   FT)r   r   r   r_   r   r   r   r   rt   r   r   rR   r-   r   r   r   r$   r$   r%   r\   D  s:    





zOneToManyDP.process_savesc           	   	   C  sp   |}|}|  | |d u s*| js.||r.d S |rHt|| j| jj n$t|| j	|| j| jj|| j
oh| d S r'   )ro   r   
is_deletedr   clearr   r   r    populater   r   )	r#   r/   rP   rr   rs   rX   r   sourcedestr$   r$   r%   rt   f  s(    
zOneToManyDP._synchronizec                 C  s   t ||| j| jjS r'   r   source_modifiedr   r   r    r   r$   r$   r%   r   }  s    zOneToManyDP._pks_changedN)r   r   r   r9   rM   rY   rZ   r[   r\   rt   r   r$   r$   r$   r%   r   N  s   )AD,"r   c                   @  sN   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dddZ
dS )ManyToOneDPc                 C  s.   t | | | jjD ]}|jt| qd S r'   )r   r&   r   self_and_descendants_dependency_processorsrL   DetectKeySwitch)r#   r   r   r$   r$   r%   r&     s    zManyToOneDP.__init__c           
   
   C  s   | j rbt|| jjd}t|| jjd}	|j||f||f||f||	f||	f|	|f|	|fg n$|j||f||f||f||fg d S r4   r   r   r   r   r7   r   r   )
r#   r2   r<   r=   r>   r?   r:   r;   parent_post_updatesparent_pre_updatesr$   r$   r%   r9     s0    


z%ManyToOneDP.per_property_dependenciesc	                 C  s   | j r|sZt|| jjd}	|r:|j||	f|	|fg q|j||f||f||	fg qt|| jjd}
|j||
f|
|f|
|fg nL|s|s|j||f||fg q|j||fg n|r|j||fg d S r4   r   )r#   r2   r   r   rQ   r:   r;   rN   rT   r   r   r$   r$   r%   rM     sD    

z"ManyToOneDP.per_state_dependenciesc                 C  s   | j js| j jr|D ]}||| j| j}|r| j jr@| }n| }|D ]P}|d u rZqL|j|dd| j	d | j
d|}|D ]\}}	}
}|j|
dd qqLqd S )NTr   r   r   )r   r   r   r_   r   r   sumnon_deletedr   r   r   r   )r#   rX   rK   r/   re   ZtodeleterP   tr   r   r   r   r$   r$   r%   rY     s*    

zManyToOneDP.presort_deletesc                 C  s   |D ]}|j |d| jd | jjr||| j| j}|r|jD ]T}| |du r>|j |dd| jd | j	
d|}|D ]\}}}	}
|j |	dd qvq>qd S )Nr   r   FTr   r   r   )r   r   r   r   r_   r   r   rR   r-   r   r   )r#   rX   rK   r/   re   rP   r   r   r   r   r   r$   r$   r%   rZ      s$    

zManyToOneDP.presort_savesc                 C  sn   | j rj| jjsj| jdksj|D ]L}| |d d d| |r| j r||| j| j}|r| j|||	 dd qd S )Nr   T)r   )
r   r   r   r   rt   r_   r   r   r   r   )r#   rX   rK   r/   re   r$   r$   r%   r[     s     

zManyToOneDP.process_deletesc              
   C  s~   |D ]t}| || jtj}|r|jrF|jD ]}| ||d d|d q*n|jr`| |d d d|d | jr| |||	  qd S )NFr   Tr   )
r_   r   r   r   r   rt   rR   r   r   r   )r#   rX   rK   r/   re   rP   r$   r$   r%   r\   )  s     

zManyToOneDP.process_savesNc              	   C  s   |d u s| j s||rd S |d urX|d urX|j|sXtdt||| jf  d S |sd|d u rzt	
|| j| jj n(| | t	|| j|| j| jj|d d S )NGObject of type %s not in session, %s operation along '%s' won't proceedF)r   r   session_contains_stater   warn
mapperutilstate_class_strr   r   r   r   r    ro   r   r   r#   r/   rP   rr   rs   rX   r   r$   r$   r%   rt   ;  s<    	

zManyToOneDP._synchronize)N)r   r   r   r&   r9   rM   rY   rZ   r[   r\   rt   r$   r$   r$   r%   r     s   '8 r   c                   @  sh   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd ZdS )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.

    c                 C  s<   | j jr,| jrd S ddd | j jD v r,d S || d d S )NFc                 s  s   | ]}|j V  qd S r'   )r   )ru   r   r$   r$   r%   	<genexpr>u  s   z=DetectKeySwitch.per_property_preprocessors.<locals>.<genexpr>)r   ry   r   r0   r1   r$   r$   r%   r3   p  s    z*DetectKeySwitch.per_property_preprocessorsc                 C  s6   t || jj}t || dd}|j||fg d S rV   )r   r6   r   rC   r5   r   r   )r#   r2   r<   r:   r$   r$   r%   r@   }  s    z*DetectKeySwitch.per_property_flush_actionsc                 C  s   d S r'   r$   )r#   r2   rK   rN   r$   r$   r%   rU     s    z'DetectKeySwitch.per_state_flush_actionsc                 C  s   d S r'   r$   rW   r$   r$   r%   rY     s    zDetectKeySwitch.presort_deletesc                 C  s   | j s| || d S r'   r   _process_key_switches)r#   r2   rK   r$   r$   r%   rZ     s    zDetectKeySwitch.presort_savesc                 C  s"   |s| j r| ||}t|S dS rV   )r   _key_switchersbool)r#   r2   rK   rN   dr$   r$   r%   rf     s    
z DetectKeySwitch.prop_has_changesc                 C  s   dsJ d S rV   r$   rW   r$   r$   r%   r[     s    zDetectKeySwitch.process_deletesc                 C  s   | j s
J | || d S r'   r   rW   r$   r$   r%   r\     s    
zDetectKeySwitch.process_savesc                 C  sZ   | d| fdd \}}||}|D ].}||vr&| ||rJ|| q&|| q&|S )NZpk_switchersc                   S  s   t  t  fS r'   )r}   r$   r$   r$   r%   <lambda>  rx   z0DetectKeySwitch._key_switchers.<locals>.<lambda>)r|   unionr   r   )r#   r2   rK   ZswitchedZnotswitchedZ	allstatesrd   r$   r$   r%   r     s    
zDetectKeySwitch._key_switchersc           	   
   C  s   |  ||}|r|jj D ]}t|j| jjs2q|j}|| j	j
||| jd}|tjur|d ur| jjr||srq|d }n|}t|}||v r||d| j t|| j|| j| jj|| j qd S )N)rc   r   F)r   r   identity_map
all_states
issubclassrn   r   rG   r,   r   getr   r   PASSIVE_NO_RESULTr   rk   instance_stater   r   r   r   r   r    )	r#   ZdeplistrX   Z	switchersr/   dict_r   related_objZrelated_stater$   r$   r%   r     s@    

z%DetectKeySwitch._process_key_switchesc                 C  s    t |jot||| j| jjS r'   )r   r   r   r   r   r   r    r   r$   r$   r%   r     s    zDetectKeySwitch._pks_changedN)r   r   r   __doc__r3   r@   rU   rY   rZ   rf   r[   r\   r   r   r   r$   r$   r$   r%   r   d  s   %r   c                   @  sT   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd ZdS )ManyToManyDPc              
   C  s:   |j ||f||f||f||f||f||f||fg d S r'   r   r   )r#   r2   r<   r=   r>   r?   r:   r;   r$   r$   r%   r9     s    
z&ManyToManyDP.per_property_dependenciesc	           	      C  sX   |s<|r"|j ||f||fg qT|j ||f||fg n|j ||f||fg d S r'   r   )	r#   r2   r   r   rQ   r:   r;   rN   rT   r$   r$   r%   rM     s    z#ManyToManyDP.per_state_dependenciesc                 C  s&   | j s"|D ]}||| j| j q
d S r'   )r   r_   r   r   )r#   rX   rK   r/   r$   r$   r%   rY     s
    
zManyToManyDP.presort_deletesc           
      C  s   | j s.|D ]"}| ||r
||| jtj}q
| jjs:d S |D ]r}||| jtj}|r>|j	D ]P}| 
|du r^|j|dd| jd | jd|D ]\}}}}	|j|dd qq^q>d S )NFTr   r   r   )r   r   r_   r   r   r   r   r   r   rR   r-   r   r   r   r   )
r#   rX   rK   r/   re   rP   r   r   r   r   r$   r$   r%   rZ     s2    


zManyToManyDP.presort_savesc              
     s   g }g }g }|  |}t }|D ] | | j| j}|r | D ]F}	|	d u sB|d urd |	f|v rdqBi }
|  |	|
d|ds~qB||
 qB| fdd| D  q |d ur|| | 	|||| d S )NFr   c                 3  s   | ]}| fV  qd S r'   r$   ru   r   r/   r$   r%   r   [  rx   z/ManyToManyDP.process_deletes.<locals>.<genexpr>)
r~   r}   r_   r   r   	non_addedrt   rL   r   	_run_crud)r#   rX   rK   secondary_deletesecondary_insertsecondary_update	processedtmpre   rP   rr   r$   r   r%   r[   <  sD    



zManyToManyDP.process_deletesc              
     s  g }g }g }|  |}t }|D ]F | j o8| | }|rLtjtjB }	ntjtjB }	| | j	|	}
|
r |
j
D ]>}|d ur |f|v rqri }|  ||d|dsqr|| qr|
jD ]>}|d ur҈ |f|v rqi }|  ||d|dsq|| q| fdd|
j
|
j D  |r |
jD ]D}i }t | j|d| jj t|| j|d| jj || q"q |d ur~|| | |||| d S )NFr   r   c                 3  s   | ]}| fV  qd S r'   r$   r   r   r$   r%   r     rx   z-ManyToManyDP.process_saves.<locals>.<genexpr>old_)r~   r}   r   r   r   r   r]   r   r_   r   r   rt   rL   rR   r   r   r   r   r   r    r   secondary_synchronize_pairsr   )r#   rX   rK   r   r   r   r   r   Zneed_cascade_pksrc   re   rP   rr   r$   r   r%   r\   d  s    



 


zManyToManyDP.process_savesc                   s  |j | j}|r|d  | j tj fdd| jjD  }|	||}|
 r|jt|krtd| jjt||jf |r|d  | j tj fdd| jjD  }|	||}|
 r|jt|krtd| jjt||jf |r| j }|	|| d S )Nr   c                   s,   g | ]$}|j  v r|tj|j |jd kqS )type_r   r   	bindparamtyper   rr   r$   r%   rw     s   
z*ManyToManyDP._run_crud.<locals>.<listcomp>zRDELETE statement on table '%s' expected to delete %d row(s); Only %d were matched.c                   s0   g | ](}|j  v r|tjd |j  |jdkqS )r   r   r   r   r   r$   r%   rw     s   
zRUPDATE statement on table '%s' expected to update %d row(s); Only %d were matched.)transaction
connectionr   r   r   wherer   and_r   executesupports_sane_multi_rowcountrowcountlenr   StaleDataErrordescriptionr   insert)r#   rX   r   r   r   r   	statementresultr$   r   r%   r     s`    

	


	

zManyToManyDP._run_crudc                 C  s   |  | |d u rdS |d urP|j|sP|jsLtdt||| jf  dS t	
|| j|| jj t	
|| j|| jj dS )NFr   T)ro   r   r   rR   r   r   r   r   r   r   populate_dictr   r    r   r   r   r$   r$   r%   rt     s*    
zManyToManyDP._synchronizec                 C  s   t ||| j| jjS r'   r   r   r$   r$   r%   r     s    zManyToManyDP._pks_changedN)r   r   r   r9   rM   rY   rZ   r[   r\   r   rt   r   r$   r$   r$   r%   r     s   "(M= r   N)r   
__future__r    r   r   r   r   r   r   
interfacesr	   r
   r   r!   r   r   r   r   r   r   r(   r$   r$   r$   r%   <module>
   s8     3  7 bu  >