U
    ÌZjU>  ã                   @   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 ejejjdd�G dd„ de	jƒƒƒZG dd„ dejƒZG dd„ deƒZG dd„ deƒZG dd„ deeƒZdd„ ZG dd„ deƒZdS )z‚Dynamic collection API.

Dynamic collections act like Query() objects for read operations and support
basic add/delete mutation.

é   )Ú
attributes)Úexc)Ú
interfaces)Úobject_mapper)Úobject_session)Úrelationships)Ú
strategies)Úutil)ÚQueryé   )Úlog)ÚresultÚdynamic)Zlazyc                   @   s   e Zd Zdd„ ZdS )Ú
DynaLoaderc              	   C   sl   d| _ | jst d| j ¡‚n$| jjtjtjfkrBt	 
d| j ¡ tj| j|dt| jj| jj| jjd� d S )NTztOn relationship %s, 'dynamic' loaders cannot be used with many-to-one/one-to-one relationships and/or uselist=False.z¬On relationship %s, 'dynamic' loaders cannot be used with many-to-one/one-to-one relationships and/or uselist=False.  This warning will be an exception in a future release.)Z	useobjectZ
impl_classÚtarget_mapperÚorder_byÚquery_class)Zis_class_levelZuselistr   ZInvalidRequestErrorZparent_propertyÚ	directionr   Z	ONETOMANYZ
MANYTOMANYr	   Úwarnr   Z_register_attributeÚDynamicAttributeImplÚmapperr   r   )Úselfr   © r   úY/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/sqlalchemy/orm/dynamic.pyÚinit_class_attribute!   s2    þÿþýÿùzDynaLoader.init_class_attributeN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r      s   r   c                       s  e Zd ZdZdZdZdZdZdZd'‡ fdd„	Z	e
jfdd„Zde
jfd	d
„Zejdd„ ƒZejdd„ ƒZd(dd„Zd)dd„Zdd„ Zde
jdddfdd„Zdd„ Zdd„ Ze
jfdd„Ze
jfdd„Ze
jfdd „Ze
jfd!d"„Ze
jfd#d$„Ze
jfd%d&„Z‡  ZS )*r   TFr   Nc           	         s\   t t| ƒj||||f|Ž || _|r.t|ƒ| _|s:t| _nt| 	¡ krN|| _n
t
|ƒ| _d S ©N)Úsuperr   Ú__init__r   Útupler   ÚAppenderQueryr   ÚAppenderMixinÚmroÚmixin_user_query)	r   Úclass_ÚkeyZtypecallableÚdispatchr   r   r   Úkw©Ú	__class__r   r   r    G   s     
   ÿÿ
zDynamicAttributeImpl.__init__c                 C   s*   |t j@ s|  |t j¡jS |  | |¡S d S r   )r   ÚSQL_OKÚ_get_collection_historyÚPASSIVE_NO_INITIALIZEÚadded_itemsr   )r   ÚstateÚdict_Úpassiver   r   r   Úget_   s    
 ÿzDynamicAttributeImpl.getc                 C   s4   |t j@ s|  ||¡j}n|  ||¡}|j}t|ƒS r   )r   r,   r-   r/   Úadded_plus_unchangedÚDynamicCollectionAdapter)r   r0   r1   Ú	user_datar2   ÚdataÚhistoryr   r   r   Úget_collectiong   s
    
z#DynamicAttributeImpl.get_collectionc                 C   s   t  | t j¡S r   )r   ÚEventZ	OP_APPEND©r   r   r   r   Ú_append_tokenu   s    z"DynamicAttributeImpl._append_tokenc                 C   s   t  | t j¡S r   )r   r:   Z	OP_REMOVEr;   r   r   r   Ú_remove_tokeny   s    z"DynamicAttributeImpl._remove_tokenc                 C   sd   |d kr|   ||¡}| |¡ | jjD ]}||||p8| jƒ}q&| jr`|d k	r`|  t |¡|d¡ d S ©NT)	Ú_modified_eventÚ	add_addedr(   Úappendr<   ÚtrackparentÚsethasparentr   Úinstance_state©r   r0   r1   ÚvalueÚ	initiatorÚcollection_historyÚfnr   r   r   Úfire_append_event}   s    
z&DynamicAttributeImpl.fire_append_eventc                 C   sd   |d kr|   ||¡}| |¡ | jr@|d k	r@|  t |¡|d¡ | jjD ]}||||pZ| jƒ qHd S )NF)	r?   Úadd_removedrB   rC   r   rD   r(   Úremover=   rE   r   r   r   Úfire_remove_event‹   s    
z&DynamicAttributeImpl.fire_remove_eventc                 C   sD   | j |jkrt| |ƒ|j| j < | || tj¡ d|| j < |j| j  S r>   )r'   Úcommitted_stateÚCollectionHistoryr?   r   Z	NEVER_SET)r   r0   r1   r   r   r   r?   ™   s
    
z$DynamicAttributeImpl._modified_eventc	                 C   sÞ   |r|j | j krd S |r$|d kr$d S |}	t|	ƒ}
|jrHt |  ||¡¡}|  ||¡}|jsb|j}n| |j¡}tj}| 	|
¡}||
ƒ 
|¡}| 
|¡}|
D ] }||krš| j|||d |d� qš|D ]}| j|||d |d� qÀd S )N)rH   )Zparent_tokenÚlistÚhas_identityr	   ZIdentitySetr3   r?   r/   ÚunionÚintersectionÚ
differencerJ   rM   )r   r0   r1   rF   rG   r2   Z	check_oldÚpopZ_adaptÚiterableÚ
new_valuesZold_collectionrH   ZidsetÚ	constantsÚ	additionsZremovalsÚmemberr   r   r   Úset¥   sF    ÿ

ûûzDynamicAttributeImpl.setc                 O   s
   t ƒ ‚d S r   ©ÚNotImplementedError)r   ÚargsÚkwargsr   r   r   ÚdeleteÛ   s    zDynamicAttributeImpl.deletec                 C   s   t dƒ‚d S )Nz7Dynamic attributes don't support collection population.r\   )r   r0   r1   rF   r   r   r   Úset_committed_valueÞ   s    ÿz(DynamicAttributeImpl.set_committed_valuec                 C   s   |   ||¡}| ¡ S r   )r-   Ú
as_history©r   r0   r1   r2   Úcr   r   r   Úget_historyã   s    z DynamicAttributeImpl.get_historyc                 C   s   |   ||¡}dd„ |jD ƒS )Nc                 S   s   g | ]}t  |¡|f‘qS r   )r   rD   )Ú.0Úxr   r   r   Ú
<listcomp>ë   s     z8DynamicAttributeImpl.get_all_pending.<locals>.<listcomp>)r-   Ú	all_itemsrc   r   r   r   Úget_all_pendingç   s    z$DynamicAttributeImpl.get_all_pendingc                 C   sJ   | j |jkr|j| j  }n
t| |ƒ}|jrB|tj@ rBt| ||d�S |S d S )N)Úapply_to)r'   rN   rO   rQ   r   ZINIT_OK)r   r0   r2   rd   r   r   r   r-   í   s    
z,DynamicAttributeImpl._get_collection_historyc                 C   s   || k	r|   ||||¡ d S r   )rJ   ©r   r0   r1   rF   rG   r2   r   r   r   rA   ø   s    zDynamicAttributeImpl.appendc                 C   s   || k	r|   ||||¡ d S r   )rM   rl   r   r   r   rL   þ   s    zDynamicAttributeImpl.removec                 C   s   | j |||||d� d S )N)r2   )rL   rl   r   r   r   rU     s    zDynamicAttributeImpl.pop)N)N)N) r   r   r   Zuses_objectsZdefault_accepts_scalar_loaderZsupports_populationZ
collectionr   r   r    r   ZPASSIVE_OFFr3   r.   r9   r	   Zmemoized_propertyr<   r=   rJ   rM   r?   r[   r`   ra   re   rj   r-   rA   rL   rU   Ú__classcell__r   r   r*   r   r   ?   sN   
 øû


 ÿ
 ÿ
÷
6ÿ
ÿ
ÿ
ÿr   c                   @   s<   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZeZ	dS )r5   z9simplified CollectionAdapter for internal API consistencyc                 C   s
   || _ d S r   )r7   )r   r7   r   r   r   r      s    z!DynamicCollectionAdapter.__init__c                 C   s
   t | jƒS r   )Úiterr7   r;   r   r   r   Ú__iter__  s    z!DynamicCollectionAdapter.__iter__c                 C   s   d S r   r   r;   r   r   r   Ú_reset_empty  s    z%DynamicCollectionAdapter._reset_emptyc                 C   s
   t | jƒS r   )Úlenr7   r;   r   r   r   Ú__len__  s    z DynamicCollectionAdapter.__len__c                 C   s   dS r>   r   r;   r   r   r   Ú__bool__  s    z!DynamicCollectionAdapter.__bool__N)
r   r   r   Ú__doc__r    ro   rp   rr   rs   Ú__nonzero__r   r   r   r   r5   
  s   r5   c                       sp   e Zd ZdZ‡ fdd„Zdd„ Zeedd„ ƒZdd	„ Zd
d„ Zdd„ Z	ddd„Z
dd„ Zdd„ Zdd„ Z‡  ZS )r#   Nc                    s‚   t t| ƒ |jd ¡ | ¡  | _}|| _t|ƒ}|j| jj	 }|j
d k	rZ|j ¡ |j
f| _|j|dd�f| _| jjr~| jj| _d S )NF)Zalias_secondary)r   r#   r    r   ÚobjÚinstanceÚattrr   Z_propsr'   Z	secondaryr   Z__clause_element__Ú	_from_objZ_with_parentÚ_where_criteriar   Ú_order_by_clauses)r   rx   r0   rw   r   Úpropr*   r   r   r    "  s    

ÿzAppenderMixin.__init__c                 C   sH   t | jƒ}|d k	r0| jr0|jr0| j|kr0| ¡  t | j¡s@d S |S d S r   )r   rw   Ú	autoflushÚflushÚorm_utilrQ   ©r   Úsessr   r   r   Úsession=  s    
ÿþýüzAppenderMixin.sessionc                 C   s   d S r   r   )Úsrg   r   r   r   Ú<lambda>K  ó    zAppenderMixin.<lambda>c                 C   s~   | j }|d krlt | j¡}|jr4t dt |¡ ¡ t	j
t	 | jjjg¡| j t | j¡tj¡jdd� ¡ S |  |¡ ¡ S d S )Nz•Instance %s is detached, dynamic relationship cannot return a correct result.   This warning will become a DetachedInstanceError in a future release.T)Z_source_supports_scalars)r‚   r   rD   rw   Zdetachedr	   r   r   Z	state_strr   ZIteratorResultZSimpleResultMetaDatarx   r&   r   r-   r.   r/   ZscalarsÚ	_generateÚ_iter)r   r�   r0   r   r   r   r‡   M  s$    ýÿ
þú
	zAppenderMixin._iterc                 C   s@   | j }|d kr,| j t | j¡tj¡ |¡S |  |¡ 	|¡S d S r   )
r‚   rx   r-   r   rD   rw   r.   Úindexedr†   Ú__getitem__)r   Úindexr�   r   r   r   r‰   d  s    
þýzAppenderMixin.__getitem__c                 C   s>   | j }|d kr,t| j t | j¡tj¡jƒS |  	|¡ 
¡ S d S r   )r‚   rq   rx   r-   r   rD   rw   r.   r/   r†   Úcountr€   r   r   r   r‹   n  s    
þÿzAppenderMixin.countc                 C   s~   | j }|d kr:t|ƒ}|d kr:t dt |¡| jjf ¡‚| jrT| j| jj	|d�}n| 
| jj	¡}| j|_| j|_| j|_|S )NzŒParent instance %s is not bound to a Session, and no contextual session is established; lazy load operation of attribute '%s' cannot proceed)r‚   )rw   r   Úorm_excZDetachedInstanceErrorr   Zinstance_strrx   r'   r   r   Úqueryrz   ry   r{   )r   r�   rw   r�   r   r   r   r†   z  s     ýÿzAppenderMixin._generatec                 C   s0   |D ]&}| j  t | j¡t | j¡|d ¡ qd S r   ©rx   rA   r   rD   rw   Úinstance_dict)r   ÚiteratorÚitemr   r   r   Úextend”  s    

üzAppenderMixin.extendc                 C   s&   | j  t | j¡t | j¡|d ¡ d S r   rŽ   ©r   r‘   r   r   r   rA   �  s    

üzAppenderMixin.appendc                 C   s&   | j  t | j¡t | j¡|d ¡ d S r   )rx   rL   r   rD   rw   r�   r“   r   r   r   rL   ¥  s    

üzAppenderMixin.remove)N)r   r   r   r   r    r‚   Úpropertyr‡   r‰   r‹   r†   r’   rA   rL   rm   r   r   r*   r   r#     s   

	r#   c                   @   s   e Zd ZdZdS )r"   zBA dynamic query that supports basic collection storage operations.N)r   r   r   rt   r   r   r   r   r"   ®  s   r"   c                 C   s   d| j  }t|t| fd| iƒS )zAReturn a new class with AppenderQuery functionality layered over.ZAppenderr   )r   Útyper#   )ÚclsÚnamer   r   r   r%   ²  s    
r%   c                   @   sR   e Zd ZdZddd„Zedd„ ƒZedd„ ƒZd	d
„ Zdd„ Z	dd„ Z
dd„ ZdS )rO   zDOverrides AttributeHistory to receive append/remove events directly.Nc                 C   s`   |r8t ||ƒ d¡}t |¡| _|j| _|j| _d| _n$t ¡ | _t ¡ | _t ¡ | _d| _d S )NFT)r"   r}   r	   ZOrderedIdentitySetÚunchanged_itemsr/   Údeleted_itemsÚ_reconcile_collection)r   rx   r0   rk   Zcollr   r   r   r    »  s    


zCollectionHistory.__init__c                 C   s   t | j | j¡ƒS r   )rP   r/   rR   r˜   r;   r   r   r   r4   È  s    z&CollectionHistory.added_plus_unchangedc                 C   s   t | j | j¡ | j¡ƒS r   )rP   r/   rR   r˜   r™   r;   r   r   r   ri   Ì  s
    ÿÿzCollectionHistory.all_itemsc                 C   s`   | j r0| j | j¡}| j | j¡}| j |¡}n| j| j| j  }}}t t|ƒt|ƒt|ƒ¡S r   )	rš   r/   rT   r˜   r™   rS   r   ZHistoryrP   )r   ÚaddedZdeletedZ	unchangedr   r   r   rb   Ô  s    ý
zCollectionHistory.as_historyc                 C   s   t | jƒ| S r   )rP   r/   )r   rŠ   r   r   r   rˆ   á  s    zCollectionHistory.indexedc                 C   s   | j  |¡ d S r   )r/   Úadd©r   rF   r   r   r   r@   ä  s    zCollectionHistory.add_addedc                 C   s(   || j kr| j  |¡ n| j |¡ d S r   )r/   rL   r™   rœ   r�   r   r   r   rK   ç  s    
zCollectionHistory.add_removed)N)r   r   r   rt   r    r”   r4   ri   rb   rˆ   r@   rK   r   r   r   r   rO   ¸  s   


rO   N)rt   Ú r   r   rŒ   r   r   r   r   r   r	   r   r�   r
   r   Zenginer   Zclass_loggerZRelationshipPropertyZstrategy_forZAbstractRelationshipLoaderr   ZAttributeImplr   Úobjectr5   r#   r"   r%   rO   r   r   r   r   Ú<module>   s0    L 