3
Oษ6bป  ใ               @   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 }x|D ]}|jtjkr|}P qW t||j |j|S )N)ฺknown_serversฺserver_typer   Z	RSPrimaryr   ฺcommon_wire_version)ฺclsฺtopology_descriptionr   ฺprimaryฺsdฉ r   ๚W/var/www/html/sandeepIITI/myenv/lib/python3.6/site-packages/pymongo/server_selectors.pyฺfrom_topology_description   s    
z#Selection.from_topology_descriptionc             C   s   || _ || _|| _|| _d S )N)r   ฺserver_descriptionsr	   r   )ฺselfr   r   r   r	   r   r   r   ฺ__init__%   s    zSelection.__init__c             C   s   t | j|| j| jS )N)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 )N)Z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   Z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 }| j|S )N)r	   r   )r   Z	primariesr   r   r   ฺprimary_selection;   s    zSelection.primary_selectionc             C   s   | j jS )N)r   ฺheartbeat_frequency)r   r   r   r   r   @   s    zSelection.heartbeat_frequencyc             C   s   | j jS )N)r   ฺtopology_type)r   r   r   r   r   D   s    zSelection.topology_typec             C   s
   t | jS )N)ฺboolr   )r   r   r   r   ฺ__bool__H   s    zSelection.__bool__c             C   s
   | j | S )N)r   )r   ฺitemr   r   r   ฺ__getitem__M   s    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 )Nr   )ฺ	selectionr   r   r   ฺany_server_selectorQ   s    r&   c             C   s   | j dd | jD S )Nc             S   s   g | ]}|j r|qS r   )Zis_readable)ฺ.0ฺsr   r   r   ๚
<listcomp>W   s    z,readable_server_selector.<locals>.<listcomp>)r   r   )r%   r   r   r   ฺreadable_server_selectorU   s    r*   c             C   s   | j dd | jD S )Nc             S   s   g | ]}|j r|qS r   )ฺis_writable)r'   r(   r   r   r   r)   \   s    z,writable_server_selector.<locals>.<listcomp>)r   r   )r%   r   r   r   ฺwritable_server_selectorZ   s    r,   c             C   s   | j dd | jD S )Nc             S   s   g | ]}|j tjkr|qS r   )r   r   ZRSSecondary)r'   r(   r   r   r   r)   a   s    z-secondary_server_selector.<locals>.<listcomp>)r   r   )r%   r   r   r   r   _   s    r   c             C   s   | j dd | jD S )Nc             S   s   g | ]}|j tjkr|qS r   )r   r   Z	RSArbiter)r'   r(   r   r   r   r)   g   s    z+arbiter_server_selector.<locals>.<listcomp>)r   r   )r%   r   r   r   ฺarbiter_server_selectore   s    r-   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    r.   c                s&    fdd|j 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                s2   x, j  D ] \}}|| ks&| | |kr
dS q
W dS )NFT)ฺitems)Zserver_tagsr   ฺvalue)ฺtag_setr   r   ฺ
tags_matchy   s    z(apply_single_tag_set.<locals>.tags_matchc                s   g | ]} |j r|qS r   )ฺtags)r'   r(   )r2   r   r   r)      s    z(apply_single_tag_set.<locals>.<listcomp>)r   r   )r1   r%   r   )r1   r2   r   ฺapply_single_tag_setq   s    r4   c             C   s*   x| D ]}t ||}|r|S qW |j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.
    )r4   r   )ฺtag_setsr%   r1   Zwith_tag_setr   r   r   ฺapply_tag_sets   s
    	

r6   c             C   s   t | t|S )z2All near-enough secondaries matching the tag sets.)r6   r   )r5   r%   r   r   r   ฺ#secondary_with_tags_server_selector   s    r7   c             C   s   t | t|S )z.All near-enough members matching the tag sets.)r6   r*   )r5   r%   r   r   r   ฺ member_with_tags_server_selector   s    r8   N)r!   Zpymongo.server_typer   ฺobjectr   r&   r*   r,   r   r-   r.   r4   r6   r7   r8   r   r   r   r   ฺ<module>   s   =