o
    ?8¾\»  ã                   @   st   d Z ddlmZ G dd„ deƒ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 )zFCriteria to select some ServerDescriptions from a TopologyDescription.é    )ÚSERVER_TYPEc                   @   sl   e Zd ZdZedd„ ƒZdd„ Zdd„ Zdd	„ Ze	d
d„ ƒZ
e	dd„ ƒZe	dd„ ƒZdd„ ZeZdd„ ZdS )Ú	Selectionz.Input or output of a server selector function.c                 C   s:   |j }d }|D ]}|jtjkr|} nqt||j |j|ƒS ©N)Úknown_serversÚserver_typer   Ú	RSPrimaryr   Úcommon_wire_version)ÚclsÚtopology_descriptionr   ÚprimaryÚsd© r   úJ/var/www/html/env/lib/python3.10/site-packages/pymongo/server_selectors.pyÚfrom_topology_description   s   þýz#Selection.from_topology_descriptionc                 C   s   || _ || _|| _|| _d S r   )r
   Úserver_descriptionsr   r   )Úselfr
   r   r   r   r   r   r   Ú__init__%   s   
zSelection.__init__c                 C   s   t | j|| j| jƒS r   )r   r
   r   r   )r   r   r   r   r   Úwith_server_descriptions/   s
   ýz"Selection.with_server_descriptionsc                 C   s$   t | ƒ}|jrt|jdd„ d�S d S )Nc                 S   s   | j S r   )Úlast_write_date)r   r   r   r   Ú<lambda>9   s    z>Selection.secondary_with_max_last_write_date.<locals>.<lambda>)Úkey)Úsecondary_server_selectorr   Úmax)r   Úsecondariesr   r   r   Ú"secondary_with_max_last_write_date5   s   ÿÿz,Selection.secondary_with_max_last_write_datec                 C   s   | j r| j gng }|  |¡S r   )r   r   )r   Ú	primariesr   r   r   Úprimary_selection;   s   
zSelection.primary_selectionc                 C   ó   | j jS r   )r
   Úheartbeat_frequency©r   r   r   r   r   @   ó   zSelection.heartbeat_frequencyc                 C   r   r   )r
   Útopology_typer   r   r   r   r!   D   r    zSelection.topology_typec                 C   s
   t | jƒS r   )Úboolr   r   r   r   r   Ú__bool__H   ó   
zSelection.__bool__c                 C   s
   | j | S r   )r   )r   Úitemr   r   r   Ú__getitem__M   r$   zSelection.__getitem__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úclassmethodr   r   r   r   Úpropertyr   r   r!   r#   Ú__nonzero__r&   r   r   r   r   r      s     




r   c                 C   s   | S r   r   ©Ú	selectionr   r   r   Úany_server_selectorQ   s   r0   c                 C   ó   |   dd„ | jD ƒ¡S )Nc                 S   ó   g | ]}|j r|‘qS r   )Úis_readable©Ú.0Úsr   r   r   Ú
<listcomp>W   ó    z,readable_server_selector.<locals>.<listcomp>©r   r   r.   r   r   r   Úreadable_server_selectorU   ó   ÿr:   c                 C   r1   )Nc                 S   r2   r   )Úis_writabler4   r   r   r   r7   \   r8   z,writable_server_selector.<locals>.<listcomp>r9   r.   r   r   r   Úwritable_server_selectorZ   r;   r=   c                 C   r1   )Nc                 S   ó   g | ]
}|j tjkr|‘qS r   )r   r   ÚRSSecondaryr4   r   r   r   r7   a   ó    ÿz-secondary_server_selector.<locals>.<listcomp>r9   r.   r   r   r   r   _   r;   r   c                 C   r1   )Nc                 S   r>   r   )r   r   Ú	RSArbiterr4   r   r   r   r7   g   r@   z+arbiter_server_selector.<locals>.<listcomp>r9   r.   r   r   r   Úarbiter_server_selectore   r;   rB   c                 C   s   t | ƒpt| ƒS )z6Like PrimaryPreferred but doesn't use tags or latency.)r=   r   r.   r   r   r   Ú"writable_preferred_server_selectork   s   ÿrC   c                    s&   ‡ fdd„‰|  ‡fdd„|jD ƒ¡S )zäAll servers matching one tag set.

    A tag set is a dict. A server matches if its tags are a superset:
    A server tagged {'a': '1', 'b': '2'} matches the tag set {'a': '1'}.

    The empty tag set {} matches any server.
    c                    s0   ˆ   ¡ D ]\}}|| vs| | |kr dS qdS )NFT)Úitems)Úserver_tagsr   Úvalue)Útag_setr   r   Ú
tags_matchy   s
   ÿz(apply_single_tag_set.<locals>.tags_matchc                    s   g | ]	}ˆ |j ƒr|‘qS r   )Útagsr4   )rH   r   r   r7   �   s    z(apply_single_tag_set.<locals>.<listcomp>r9   )rG   r/   r   )rG   rH   r   Úapply_single_tag_setq   s   ÿrJ   c                 C   s*   | D ]}t ||ƒ}|r|  S q| g ¡S )aN  All servers match a list of tag sets.

    tag_sets is a list of dicts. The empty tag set {} matches any server,
    and may be provided at the end of the list as a fallback. So
    [{'a': 'value'}, {}] expresses a preference for servers tagged
    {'a': 'value'}, but accepts any server if none matches the first
    preference.
    )rJ   r   )Útag_setsr/   rG   Úwith_tag_setr   r   r   Úapply_tag_sets„   s   	
ÿ
rM   c                 C   ó   t | t|ƒƒS )z2All near-enough secondaries matching the tag sets.)rM   r   ©rK   r/   r   r   r   Ú#secondary_with_tags_server_selector•   ó   rP   c                 C   rN   )z.All near-enough members matching the tag sets.)rM   r:   rO   r   r   r   Ú member_with_tags_server_selectorš   rQ   rR   N)r*   Úpymongo.server_typer   Úobjectr   r0   r:   r=   r   rB   rC   rJ   rM   rP   rR   r   r   r   r   Ú<module>   s   =