o
    Rc@@                     @   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 )zDynamic 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   sj   d| _ | jstd| j | jjtjtjfvr t	
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.zOn 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   8D:\Flask\env\Lib\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           	         sd   t t| j||||fi | || _|rt|| _|s t| _d S t|	 v r+|| _d S 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 r   )r   SQL_OK_get_collection_historyPASSIVE_NO_INITIALIZEadded_itemsr   )r   statedict_passiver   r   r   get_   s   
zDynamicAttributeImpl.getc                 C   s:   |t j@ s| ||j}t|S | ||}|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      t | t jS r   )r   EventZ	OP_APPENDr   r   r   r   _append_tokenu      z"DynamicAttributeImpl._append_tokenc                 C   r:   r   )r   r;   Z	OP_REMOVEr<   r   r   r   _remove_tokeny   r>   z"DynamicAttributeImpl._remove_tokenc                 C   sl   |d u r
|  ||}|| | jjD ]}||||p| j}q| jr2|d ur4| t||d d S d S 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 u r
|  ||}|| | jr |d ur | t||d | jjD ]}||||p-| j q$d S )NF)	rA   add_removedrD   rE   r   rF   r(   remover?   rG   r   r   r   fire_remove_event   s   
z&DynamicAttributeImpl.fire_remove_eventc                 C   sD   | j |jvrt| ||j| j < ||| tj d|| j < |j| j  S r@   )r'   committed_stateCollectionHistoryrA   r   Z	NEVER_SET)r   r0   r1   r   r   r   rA      s
   
z$DynamicAttributeImpl._modified_eventc	                 C   s   |r
|j | j u r
d S |r|d u rd S |}	t|	}
|jr$t| ||}| ||}|js1|j}n||j}tj}|	|
}||

|}|
|}|
D ]}||v r]| j|||d |d qM|D ]}| j|||d |d q`d S )N)rJ   )Zparent_tokenlisthas_identityr	   ZIdentitySetr3   rA   r/   unionintersection
differencerL   rO   )r   r0   r1   rH   rI   r2   Z	check_oldpopZ_adaptiterable
new_valuesZold_collectionrJ   Zidset	constants	additionsZremovalsmemberr   r   r   set   sJ   

zDynamicAttributeImpl.setc                 O   s   t  r   NotImplementedError)r   argskwargsr   r   r   delete   s   zDynamicAttributeImpl.deletec                 C   s   t d)Nz7Dynamic attributes don't support collection population.r^   )r   r0   r1   rH   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   rF   ).0xr   r   r   
<listcomp>   s    z8DynamicAttributeImpl.get_all_pending.<locals>.<listcomp>)r-   	all_itemsre   r   r   r   get_all_pending   s   z$DynamicAttributeImpl.get_all_pendingc                 C   sF   | j |jv r|j| j  }nt| |}|jr!|tj@ r!t| ||dS |S )N)apply_to)r'   rP   rQ   rS   r   ZINIT_OK)r   r0   r2   rf   r   r   r   r-      s   
z,DynamicAttributeImpl._get_collection_historyc                 C       || ur|  |||| d S d S r   )rL   r   r0   r1   rH   rI   r2   r   r   r   rC         zDynamicAttributeImpl.appendc                 C   rn   r   )rO   ro   r   r   r   rN      rp   zDynamicAttributeImpl.removec                 C   s   | j |||||d d S )N)r2   )rN   ro   r   r   r   rW     s   zDynamicAttributeImpl.popr   ) 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?   rL   rO   rA   r]   rb   rc   rg   rl   r-   rC   rN   rW   __classcell__r   r   r*   r   r   ?   sP    






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         
z!DynamicCollectionAdapter.__init__c                 C   
   t | jS r   )iterr7   r<   r   r   r   __iter__  rr   z!DynamicCollectionAdapter.__iter__c                 C      d S r   r   r<   r   r   r   _reset_empty     z%DynamicCollectionAdapter._reset_emptyc                 C   rs   r   )lenr7   r<   r   r   r   __len__  rr   z DynamicCollectionAdapter.__len__c                 C   s   dS r@   r   r<   r   r   r   __bool__  rx   z!DynamicCollectionAdapter.__bool__N)
r   r   r   __doc__r    ru   rw   rz   r{   __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 ur-|j |j
f| _|j|ddf| _| jjrA| jj| _d S 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   r   r0   r   r   propr*   r   r   r    "  s   

zAppenderMixin.__init__c                 C   sD   t | j}|d ur| jr|jr| j|v r|  t| js d S |S r   )r   r   	autoflushflushorm_utilrS   r   sessr   r   r   session=  s   
zAppenderMixin.sessionc                 C   rv   r   r   )sri   r   r   r   <lambda>K  s    zAppenderMixin.<lambda>c                 C   sz   | j }|d u r6t| j}|jrtdt|  t	j
t	| jjjg| jt| jtjjdd S | | S )NzInstance %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   rF   r   Zdetachedr	   r   r   	state_strr   ZIteratorResultZSimpleResultMetaDatar   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 u r| jt| jtj|S | |	|S r   )
r   r   r-   r   rF   r   r.   indexedr   __getitem__)r   indexr   r   r   r   r   d  s   
zAppenderMixin.__getitem__c                 C   s:   | j }|d u rt| jt| jtjjS | 	|
 S r   )r   ry   r   r-   r   rF   r   r.   r/   r   countr   r   r   r   r   n  s   
zAppenderMixin.countc                 C   s~   | j }|d u rt|}|d u rtdt|| jjf | jr*| j| jj	|d}n|
| jj	}| j|_| j|_| j|_|S )NzParent instance %s is not bound to a Session, and no contextual session is established; lazy load operation of attribute '%s' cannot proceed)r   )r   r   orm_excZDetachedInstanceErrorr   Zinstance_strr   r'   r   r   queryr   r   r   )r   r   r   r   r   r   r   r   z  s    zAppenderMixin._generatec                 C   s0   |D ]}| j t| jt| j|d  qd S r   r   rC   r   rF   r   instance_dict)r   iteratoritemr   r   r   extend  s   

zAppenderMixin.extendc                 C   &   | j t| jt| j|d  d S r   r   r   r   r   r   r   rC        

zAppenderMixin.appendc                 C   r   r   )r   rN   r   rF   r   r   r   r   r   r   rN     r   zAppenderMixin.remover   )r   r   r   r   r    r   propertyr   r   r   r   r   rC   rN   rq   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   r|   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 )rQ   zDOverrides AttributeHistory to receive append/remove events directly.Nc                 C   sb   |rt ||d}t|| _|j| _|j| _d| _d S t | _t | _t | _d| _d S )NFT)r"   r   r	   ZOrderedIdentitySetunchanged_itemsr/   deleted_items_reconcile_collection)r   r   r0   rm   Zcollr   r   r   r      s   




zCollectionHistory.__init__c                 C   s   t | j| jS r   )rR   r/   rT   r   r<   r   r   r   r4     s   z&CollectionHistory.added_plus_unchangedc                 C   s   t | j| j| jS r   )rR   r/   rT   r   r   r<   r   r   r   rk     s
   zCollectionHistory.all_itemsc                 C   s`   | j r| j| j}| j| j}| j|}n| j| j| j}}}tt|t|t|S r   )	r   r/   rV   r   r   rU   r   ZHistoryrR   )r   addedZdeletedZ	unchangedr   r   r   rd     s   
zCollectionHistory.as_historyc                 C   s   t | j| S r   )rR   r/   )r   r   r   r   r   r     s   zCollectionHistory.indexedc                 C   s   | j | d S r   )r/   addr   rH   r   r   r   rB     s   zCollectionHistory.add_addedc                 C   s*   || j v r| j | d S | j| d S r   )r/   rN   r   r   r   r   r   r   rM     s   
zCollectionHistory.add_removedr   )r   r   r   r|   r    r   r4   rk   rd   r   rB   rM   r   r   r   r   rQ     s    


rQ   N)r|    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%   rQ   r   r   r   r   <module>   s2    L 