o
    Šåg™i  ã                   @  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 erpd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„ ZG dd„ dƒZG dd„ dƒZG dd„ deƒZG dd„ dƒZ G dd „ d ee ƒ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%G d)d*„ d*e ƒZ&G d+d,„ d,e ƒZ'd-S ).zïThe internals for the unit of work system.

The session's flush() process passes objects to a contextual object
here, which assembles flush tasks based on mappers and their properties,
organizes them in order of dependency, and executes.

é    )Úannotations)ÚAny)ÚDict)ÚOptional)ÚSet)ÚTYPE_CHECKINGé   ©Ú
attributes)Úexc)Úutilé   )Úevent)Útopological)ÚDependencyProcessor)ÚMapperProperty)ÚMapper)ÚSession)ÚSessionTransaction)ÚInstanceStatec                   s„   |j ‰ ‡ fdd„}‡ fdd„}‡ fdd„}tj| d|ddd	� tj| d
|dddd� tj| d|dddd� tj| d|dddd� dS )z\Establish event listeners on object attributes which handle
    cascade-on-set/append.

    c                   sh   |d u rd S | j }|r2|jr| d¡ | jjjˆ  }t |¡}|jj	r2ˆ |j
kr2| |¡s2| |¡ |S )Nzcollection append)ÚsessionÚ_warn_on_eventsÚ_flush_warningÚmanagerÚmapperÚ_propsr
   Úinstance_stateÚ_cascadeÚsave_updateÚkeyÚ_contains_stateÚ_save_or_update_state©ÚstateÚitemÚ	initiatorÚkwÚsessÚpropÚ
item_state©r   © úU/var/www/html/flaskapp/venv/lib/python3.10/site-packages/sqlalchemy/orm/unitofwork.pyÚappend2   s   

ÿ
ÿ
z$track_cascade_events.<locals>.appendc                   s²   |d u rd S | j }| jjjˆ  }|r|jr| |jrdnd¡ |d urO|tjurQ|tj	urS|j
jrUt |¡}|j |¡rW|rJ||jv rJ| |¡ d S d|_d S d S d S d S d S d S )Nzcollection removezrelated attribute deleteT)r   r   r   r   r   r   Úuselistr
   Ú	NEVER_SETÚPASSIVE_NO_RESULTr   Údelete_orphanr   Ú
_is_orphanÚ_newÚexpungeÚ_orphaned_outside_of_sessionr"   r*   r+   r,   ÚremoveI   s0   
ÿý

ÿ

ðz$track_cascade_events.<locals>.removec           	        s¾   ||u r|S | j }|r]|jr| d¡ | jjjˆ  }|d ur6t |¡}|jj	r6ˆ |j
kr6| |¡s6| |¡ |d ur]|tjur]|tjur]|jjr]t |¡}||jv r]|j |¡r]| |¡ |S )Nzrelated attribute set)r   r   r   r   r   r   r
   r   r   r   r   r    r!   r/   r0   r1   r3   r2   r4   )	r#   ÚnewvalueÚoldvaluer%   r&   r'   r(   Únewvalue_stateÚoldvalue_stater*   r+   r,   Úset_k   s4   

ÿ
ÿ


ÿ
ÿ
z"track_cascade_events.<locals>.set_Úappend_wo_mutationT)ÚrawÚinclude_keyr-   )r=   Úretvalr>   r6   ÚsetN)r   r   Úlisten)Ú
descriptorr(   r-   r6   r;   r+   r*   r,   Útrack_cascade_events+   s    "$
ÿÿÿ
ÿrC   c                   @  sê   e Zd ZU ded< ded< ded< ded< d	ed
< d=dd„Zedd„ ƒZdd„ Zdd„ Zdd„ Z	dd„ Z
ejfdd„Zdd„ Zdd„ Z					d>d?d*d+„Zd,d-„ Zd.d/„ Zejd0d1„ ƒZd2d3„ Zd4d5„ Zd6d7„ Zd@d9d:„Zd@d;d<„ZdS )AÚUOWTransactionr   r   r   ÚtransactionzDict[str, Any]r
   z7util.defaultdict[Mapper[Any], Set[DependencyProcessor]]Údepsz6util.defaultdict[Mapper[Any], Set[InstanceState[Any]]]Úmappersc                 C  sR   || _ i | _t t¡| _t t¡| _i | _i | _tƒ | _	i | _
t dd„ ¡| _d S )Nc                   S  s   t ƒ t ƒ fS ©N)r@   r+   r+   r+   r,   Ú<lambda>Ï   s    z)UOWTransaction.__init__.<locals>.<lambda>)r   r
   r   Údefaultdictr@   rF   rG   Úpresort_actionsÚpostsort_actionsÚdependenciesÚstatesÚpost_update_states)Úselfr   r+   r+   r,   Ú__init__¤   s   zUOWTransaction.__init__c                 C  s
   t | jƒS rH   )ÚboolrN   ©rP   r+   r+   r,   Úhas_workÑ   s   
zUOWTransaction.has_workc                 C  sD   |j r z
| |tj¡ W dS  tjy   | j |g¡ Y dS w dS )zZReturn ``True`` if the given state is expired and was deleted
        previously.
        TF)ÚexpiredÚ_load_expiredr
   ÚPASSIVE_OFFÚorm_excÚObjectDeletedErrorr   Ú_remove_newly_deleted©rP   r#   r+   r+   r,   Úwas_already_deletedÕ   s   ýþz"UOWTransaction.was_already_deletedc                 C  s   || j v o| j | d S )z[Return ``True`` if the given state is marked as deleted
        within this uowtransaction.r   ©rN   r[   r+   r+   r,   Ú
is_deletedá   s   zUOWTransaction.is_deletedc                 C  s(   || j v r
| j | S |ƒ  | j |< }|S rH   r	   )rP   r   Ú	callable_Úretr+   r+   r,   Úmemoç   s   

zUOWTransaction.memoc                 C  s    | j | d }|df| j |< dS )z;Remove pending actions for a state from the uowtransaction.r   TNr]   )rP   r#   Úisdeleter+   r+   r,   Úremove_state_actionsî   s   z#UOWTransaction.remove_state_actionsc           	      C  sâ   d||f}|| j v rG| j | \}}}|t j@ sE|t j@ rE|j| j}| ||jt jt jB t jB ¡}|r;|j	r;| 
¡ }n|}|||f| j |< |S |j| j}| ||j|t jB t jB ¡}|re|j	re| 
¡ }n|}|||f| j |< |S )zOFacade to attributes.get_state_history(), including
        caching of results.Úhistory)r
   ÚSQL_OKr   ÚimplÚget_historyÚdictrW   ÚLOAD_AGAINST_COMMITTEDÚNO_RAISEÚuses_objectsÚas_state)	rP   r#   r   ÚpassiveÚhashkeyrd   Ústate_historyÚcached_passiverf   r+   r+   r,   Úget_attribute_historyõ   sJ   

ÿþÿþý

ðÿþý

z$UOWTransaction.get_attribute_historyc                 C  s   |df| j v S )NT)rK   )rP   Ú	processorr+   r+   r,   Úhas_dep*  ó   zUOWTransaction.has_depc                 C  s*   ||f}|| j vrt||ƒ| j |< d S d S rH   )rK   Ú
Preprocess)rP   rr   Ú
fromparentr   r+   r+   r,   Úregister_preprocessor-  s   
ÿz$UOWTransaction.register_preprocessorFNr#   úInstanceState[Any]rb   rR   ÚlistonlyÚcancel_deleteÚ	operationúOptional[str]r(   úOptional[MapperProperty]Úreturnc                 C  sž   | j  |¡s|js|d urt dt |¡||f ¡ dS || jvr@|jj	}|| j
vr/|  |¡ | j
|  |¡ ||f| j|< dS |sM|sF|rM|df| j|< dS )NzJObject of type %s not in session, %s operation along '%s' will not proceedFT)r   r    Údeletedr   ÚwarnÚorm_utilÚstate_class_strrN   r   r   rG   Ú_per_mapper_flush_actionsÚadd)rP   r#   rb   ry   rz   r{   r(   r   r+   r+   r,   Úregister_object2  s$   	þÿ


þzUOWTransaction.register_objectc                 C  s0   |j jj}| j| \}}| |¡ | |¡ d S rH   )r   r   Úbase_mapperrO   r„   Úupdate)rP   r#   Úpost_update_colsr   rN   Úcolsr+   r+   r,   Úregister_post_updateT  s   

z#UOWTransaction.register_post_updatec                 C  sf   t | |jƒ}t| |jƒ}| j ||f¡ |jD ]}| | ¡ q|jD ]}|jr(q"|j	}| | ¡ q"d S rH   )
ÚSaveUpdateAllr†   Ú	DeleteAllrM   r„   Ú_dependency_processorsÚper_property_preprocessorsÚrelationshipsÚviewonlyÚ_dependency_processor)rP   r   ÚsavesÚdeletesÚdepr(   r+   r+   r,   rƒ   Z  s   

üz(UOWTransaction._per_mapper_flush_actionsc                 C  s   t  dd„ ¡S )a  return a dynamic mapping of (Mapper, DependencyProcessor) to
        True or False, indicating if the DependencyProcessor operates
        on objects of that Mapper.

        The result is stored in the dictionary persistently once
        calculated.

        c                 S  s    | d j  | d j¡| d ju S )Nr   r   )r   Úgetr   r(   )Útupr+   r+   r,   rI   s  ó     z0UOWTransaction._mapper_for_dep.<locals>.<lambda>)r   ÚPopulateDictrS   r+   r+   r,   Ú_mapper_for_deph  s   
ÿzUOWTransaction._mapper_for_depc                   s   | j ‰‡ ‡fdd„|D ƒS )zmFilter the given list of InstanceStates to those relevant to the
        given DependencyProcessor.

        c                   s    g | ]}ˆ|j jˆ f r|‘qS r+   )r   r   ©Ú.0Ús©r”   Úmapper_for_depr+   r,   Ú
<listcomp>|  r—   z8UOWTransaction.filter_states_for_dep.<locals>.<listcomp>)r™   )rP   r”   rN   r+   r�   r,   Úfilter_states_for_depv  s   z$UOWTransaction.filter_states_for_depc                 c  s@   � ||f}|j jD ]}| j| D ]}| j| |kr|V  qq	d S rH   )r†   Úself_and_descendantsrG   rN   )rP   r   rb   ry   Úchecktupr#   r+   r+   r,   Ústates_for_mapper_hierarchy~  s   €€þÿz*UOWTransaction.states_for_mapper_hierarchyc                   s@  	 d}t ˆ j ¡ ƒD ]	}| ˆ ¡rd}q
|snqt ˆ jt ˆ j ¡ ƒ¡ ˆ _}|r“‡ fdd„|D ƒ}t ˆ jƒD ][}d|v sL|d j	sL|d j	sL| 
|¡rSˆ j |¡ q7|d |v rsˆ j |¡ ||d  D ]}ˆ j ||d f¡ qeq7|d |v r’ˆ j |¡ ||d  D ]}ˆ j |d |f¡ q…q7dd	„ ˆ j ¡ D ƒ |¡S )
z}Generate the full, unsorted collection of PostSortRecs as
        well as dependency pairs for this UOWTransaction.

        TFc                   s   i | ]
}|t | ˆ ¡ƒ“qS r+   )r@   Úper_state_flush_actions)r›   ÚrecrS   r+   r,   Ú
<dictcomp>�  s    ÿz4UOWTransaction._generate_actions.<locals>.<dictcomp>Nr   r   c                 S  s   h | ]}|j s|’qS r+   ©Údisabled)r›   Úar+   r+   r,   Ú	<setcomp>µ  s
    ÿÿz3UOWTransaction._generate_actions.<locals>.<setcomp>)ÚlistrK   ÚvaluesÚexecuter   Úfind_cyclesrM   rL   Úcyclesr¨   Ú
issupersetr6   r„   Ú
difference)rP   r`   Úactionr¯   ÚconvertÚedger”   r+   rS   r,   Ú_generate_actions…  sP   
€ú	
ÿ
ÿÿþýÿ€ÿþz UOWTransaction._generate_actionsÚNonec                 C  s|   |   ¡ }t|dd„ d�}| jr-t | j|¡D ]}t|ƒ}|r*| ¡ }| | |¡ |sqd S t 	| j|¡D ]}| 
| ¡ q4d S )Nc                 S  s   | j S rH   )Úsort_key)r$   r+   r+   r,   rI   ¾  s    z(UOWTransaction.execute.<locals>.<lambda>r*   )rµ   Úsortedr¯   r   Úsort_as_subsetsrM   r@   ÚpopÚexecute_aggregateÚsortr­   )rP   rL   Úsubsetr;   Únr¥   r+   r+   r,   r­   ¹  s&   þÿþ€üÿzUOWTransaction.executec                 C  sZ   | j sdS t| j ƒ}dd„ | j  ¡ D ƒ}| |¡}|r!| j |¡ |r+| j |¡ dS dS )zéMark processed objects as clean / deleted after a successful
        flush().

        This method is called within the flush() method after the
        execute() method has succeeded and the transaction has been committed.

        Nc                 S  s   h | ]
\}\}}|r|’qS r+   r+   )r›   rœ   rb   ry   r+   r+   r,   rª   à  s
    ÿÿz8UOWTransaction.finalize_flush_changes.<locals>.<setcomp>)rN   r@   Úitemsr±   r   rZ   Ú_register_persistent)rP   rN   ÚisdelÚotherr+   r+   r,   Úfinalize_flush_changesÔ  s   
ÿ
ÿz%UOWTransaction.finalize_flush_changes)r   r   )FFFNN)r#   rx   rb   rR   ry   rR   rz   rR   r{   r|   r(   r}   r~   rR   )r~   r¶   )Ú__name__Ú
__module__Ú__qualname__Ú__annotations__rQ   ÚpropertyrT   r\   r^   ra   rc   r
   ÚPASSIVE_NO_INITIALIZErq   rs   rw   r…   rŠ   rƒ   r   Úmemoized_propertyr™   r    r£   rµ   r­   rÃ   r+   r+   r+   r,   rD   �   s@   
 
-

ÿ5ù"

4rD   c                   @  s   e Zd ZdZdd„ ZdS )ÚIterateMappersMixinr+   c                   s.   ˆ j rt‡ ‡fdd„ˆ jjjD ƒƒS ˆ jjjS )Nc                 3  s$   � | ]}ˆj |ˆ jf r|V  qd S rH   )r™   Údependency_processor)r›   Úm©rP   Úuowr+   r,   Ú	<genexpr>ï  s   € ý
ÿz/IterateMappersMixin._mappers.<locals>.<genexpr>)rv   ÚiterrÌ   Úparentr¡   r   rÎ   r+   rÎ   r,   Ú_mappersí  s
   þ
zIterateMappersMixin._mappersN)rÄ   rÅ   rÆ   Ú	__slots__rÓ   r+   r+   r+   r,   rË   ê  s    rË   c                   @  ó    e Zd ZdZdd„ Zdd„ ZdS )ru   )rÌ   rv   Ú	processedÚsetup_flush_actionsc                 C  s   || _ || _tƒ | _d| _d S ©NF)rÌ   rv   r@   rÖ   r×   )rP   rÌ   rv   r+   r+   r,   rQ      s   
zPreprocess.__init__c                 C  sä   t ƒ }t ƒ }|  |¡D ]$}|j|  | j¡D ]}|j| \}}|s.|r)| |¡ q| |¡ qq|r?| j ||¡ | j 	|¡ |rN| j 
||¡ | j 	|¡ |sR|rp| jsn| j ||d¡se| j ||d¡rn| j |¡ d| _dS dS ©NTF)r@   rÓ   rG   r±   rÖ   rN   r„   rÌ   Úpresort_deletesr‡   Úpresort_savesr×   Úprop_has_changesÚper_property_flush_actions)rP   rÏ   Údelete_statesÚsave_statesr   r#   rb   ry   r+   r+   r,   r­     s>   
€úÿÿÿüzPreprocess.executeN)rÄ   rÅ   rÆ   rÔ   rQ   r­   r+   r+   r+   r,   ru   ø  s    ru   c                   @  rÕ   )ÚPostSortRecr§   c                 G  s<   | f| }||j v r|j | S t | ¡ |j |< }d|_|S rØ   )rL   ÚobjectÚ__new__r¨   )ÚclsrÏ   Úargsr   r`   r+   r+   r,   râ   -  s   


zPostSortRec.__new__c                 C  s   |   |¡ d S rH   )r­   )rP   rÏ   Úrecsr+   r+   r,   r»   6  rt   zPostSortRec.execute_aggregateN)rÄ   rÅ   rÆ   rÔ   râ   r»   r+   r+   r+   r,   rà   *  s    	rà   c                   @  s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )Ú
ProcessAll)rÌ   rb   rv   r·   c                 C  s:   || _ d| j j|f| _|| _|| _|j|jj  |¡ d S )Nræ   )rÌ   r·   rb   rv   rF   rÒ   r†   r„   )rP   rÏ   rÌ   rb   rv   r+   r+   r,   rQ   =  s   ýÿzProcessAll.__init__c                 C  s4   |   |¡}| jr| j ||¡ d S | j ||¡ d S rH   )Ú	_elementsrb   rÌ   Úprocess_deletesÚprocess_saves)rP   rÏ   rN   r+   r+   r,   r­   J  s   
zProcessAll.executec                 C  s   t g ƒS rH   )rÑ   rÎ   r+   r+   r,   r¤   Q  s   z"ProcessAll.per_state_flush_actionsc                 C  s   d| j j| j| jf S )Nz%s(%s, isdelete=%s))Ú	__class__rÄ   rÌ   rb   rS   r+   r+   r,   Ú__repr__X  s
   ýzProcessAll.__repr__c                 c  sH   � |   |¡D ]}|j| D ]}|j| \}}|| jkr |s |V  qqd S rH   )rÓ   rG   rN   rb   )rP   rÏ   r   r#   rb   ry   r+   r+   r,   rç   _  s   €€ýÿzProcessAll._elementsN)	rÄ   rÅ   rÆ   rÔ   rQ   r­   r¤   rë   rç   r+   r+   r+   r,   ræ   :  s    ræ   c                   @  s*   e Zd ZdZdd„ Ze d¡dd„ ƒZdS )ÚPostUpdateAll)r   rb   r·   c                 C  s   || _ || _d|j|f| _d S )Nrì   )r   rb   Ú	_sort_keyr·   )rP   rÏ   r   rb   r+   r+   r,   rQ   j  s   zPostUpdateAll.__init__úsqlalchemy.orm.persistencec                   sB   t jj}ˆjˆ j \}}‡ ‡fdd„|D ƒ}| ˆ j|ˆ|¡ d S )Nc                   s$   g | ]}ˆj | d  ˆ jkr|‘qS ©r   )rN   rb   rš   rÎ   r+   r,   rŸ   s  s   $ z)PostUpdateAll.execute.<locals>.<listcomp>)r   Ú	preloadedÚorm_persistencerO   r   Úpost_update)rP   rÏ   ÚpersistencerN   r‰   r+   rÎ   r,   r­   o  s   zPostUpdateAll.executeN)rÄ   rÅ   rÆ   rÔ   rQ   r   Úpreload_moduler­   r+   r+   r+   r,   rì   g  s
    rì   c                   @  ó:   e Zd ZdZdd„ Ze d¡dd„ ƒZdd„ Zd	d
„ Z	dS )r‹   ©r   r·   c                 C  ó$   || _ d|jf| _||ju sJ ‚d S )Nr‹   ©r   rí   r·   r†   ©rP   rÏ   r   r+   r+   r,   rQ   {  ó   zSaveUpdateAll.__init__rî   c                 C  s$   t jj | j| | jdd¡|¡ d S rØ   )r   rð   rñ   Úsave_objr   r£   rÎ   r+   r+   r,   r­   €  ó
   ýzSaveUpdateAll.executec           	      c  s‚   � t | | jdd¡ƒ}| jj}t||ƒ}|D ]}t||ƒ}|j ||f¡ |V  q|j| j D ]}| 	||¡}| 
||d¡ q/d S rØ   )r«   r£   r   r†   rŒ   ÚSaveUpdateStaterM   r„   rF   r    r¤   )	rP   rÏ   rN   r†   Ú
delete_allr#   r²   r”   Ústates_for_propr+   r+   r,   r¤   ˆ  ó   €ÿ

þz%SaveUpdateAll.per_state_flush_actionsc                 C  ó   d| j j| jf S ©Nz%s(%s)©rê   rÄ   r   rS   r+   r+   r,   rë   ™  ó   zSaveUpdateAll.__repr__N©
rÄ   rÅ   rÆ   rÔ   rQ   r   rô   r­   r¤   rë   r+   r+   r+   r,   r‹   x  ó    
r‹   c                   @  rõ   )rŒ   rö   c                 C  r÷   )NrŒ   rø   rù   r+   r+   r,   rQ      rú   zDeleteAll.__init__rî   c                 C  s$   t jj | j| | jdd¡|¡ d S rÙ   )r   rð   rñ   Ú
delete_objr   r£   rÎ   r+   r+   r,   r­   ¥  rü   zDeleteAll.executec           	      c  s‚   � t | | jdd¡ƒ}| jj}t||ƒ}|D ]}t||ƒ}|j ||f¡ |V  q|j| j D ]}| 	||¡}| 
||d¡ q/d S rÙ   )r«   r£   r   r†   r‹   ÚDeleteStaterM   r„   rF   r    r¤   )	rP   rÏ   rN   r†   Úsave_allr#   r²   r”   rÿ   r+   r+   r,   r¤   ­  r   z!DeleteAll.per_state_flush_actionsc                 C  r  r  r  rS   r+   r+   r,   rë   ¾  r  zDeleteAll.__repr__Nr  r+   r+   r+   r,   rŒ   �  r  rŒ   c                   @  s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚProcessState)rÌ   rb   r#   r·   c                 C  s"   || _ d|jf| _|| _|| _d S ©Nr
  )rÌ   r·   rb   r#   )rP   rÏ   rÌ   rb   r#   r+   r+   r,   rQ   Å  s   
zProcessState.__init__c                   sl   | j ‰ | j‰| j‰‡ ‡‡fdd„|D ƒ}| |¡ | jgdd„ |D ƒ }ˆr.ˆ ||¡ d S ˆ ||¡ d S )Nc                   s.   g | ]}|j ˆ u r|jˆu r|jˆu r|‘qS r+   )rê   rÌ   rb   ©r›   Úr©Úcls_rÌ   rb   r+   r,   rŸ   Ï  s    


üz2ProcessState.execute_aggregate.<locals>.<listcomp>c                 S  ó   g | ]}|j ‘qS r+   ©r#   r  r+   r+   r,   rŸ   ×  ó    )rê   rÌ   rb   Údifference_updater#   rè   ré   )rP   rÏ   rå   Úour_recsrN   r+   r  r,   r»   Ë  s   þ
zProcessState.execute_aggregatec                 C  s    d| j j| jt | j¡| jf S )Nz%s(%s, %s, delete=%s))rê   rÄ   rÌ   r�   Ú	state_strr#   rb   rS   r+   r+   r,   rë   Ý  s   
üzProcessState.__repr__N)rÄ   rÅ   rÆ   rÔ   rQ   r»   rë   r+   r+   r+   r,   r
  Â  s
    r
  c                   @  ó2   e Zd ZdZdd„ Ze d¡dd„ ƒZdd„ Zd	S )
rý   ©r#   r   r·   c                 C  ó"   || _ |jj| _d| jjf| _d S r  ©r#   r   r†   rí   r·   ©rP   rÏ   r#   r+   r+   r,   rQ   é  ó   
zSaveUpdateState.__init__rî   c                   sV   t jj}| j‰ | j‰‡ ‡fdd„|D ƒ}| |¡ | ˆ| jgdd„ |D ƒ |¡ d S )Nc                   ó$   g | ]}|j ˆ u r|jˆu r|‘qS r+   ©rê   r   r  ©r  r   r+   r,   rŸ   ó  ó    z5SaveUpdateState.execute_aggregate.<locals>.<listcomp>c                 S  r  r+   r  r  r+   r+   r,   rŸ   ø  r  )r   rð   rñ   rê   r   r  rû   r#   )rP   rÏ   rå   ró   r  r+   r  r,   r»   î  s   ÿ
ÿz!SaveUpdateState.execute_aggregatec                 C  ó   d| j jt | j¡f S r  ©rê   rÄ   r�   r  r#   rS   r+   r+   r,   rë   û  ó   
þzSaveUpdateState.__repr__N©	rÄ   rÅ   rÆ   rÔ   rQ   r   rô   r»   rë   r+   r+   r+   r,   rý   æ  s    
rý   c                   @  r  )
r  r  c                 C  r  )Nr  r  r  r+   r+   r,   rQ     r  zDeleteState.__init__rî   c                   sh   t jj}| j‰ | j‰‡ ‡fdd„|D ƒ}| |¡ | jgdd„ |D ƒ }| ˆ‡fdd„|D ƒˆ¡ d S )Nc                   r  r+   r  r  r  r+   r,   rŸ     r  z1DeleteState.execute_aggregate.<locals>.<listcomp>c                 S  r  r+   r  r  r+   r+   r,   rŸ     r  c                   s   g | ]}ˆ j | d  r|‘qS rï   r]   rš   )rÏ   r+   r,   rŸ     s    )r   rð   rñ   rê   r   r  r#   r  )rP   rÏ   rå   ró   r  rN   r+   )r  r   rÏ   r,   r»   
  s   ÿ
ÿzDeleteState.execute_aggregatec                 C  r   r  r!  rS   r+   r+   r,   rë     r"  zDeleteState.__repr__Nr#  r+   r+   r+   r,   r    s    
r  N)(Ú__doc__Ú
__future__r   Útypingr   r   r   r   r   Ú r
   r   rX   r   r�   r   r   Ú
dependencyr   Ú
interfacesr   r   r   r   r   r   r#   r   rC   rD   rË   ru   rà   ræ   rì   r‹   rŒ   r
  rý   r  r+   r+   r+   r,   Ú<module>   sD   	r  O2-%%$