U
    >i!                     @   s   d dl Z d dlmZ d dlmZ d dlmZ d dlmZ G dd deZej	d ej
dejd	ejd
ejdejdejdejdejdejdejdiZG dd deZdS )    N)Enum)Any)decode_value)GeoPointc                   @   sN   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZeedddZdS )	TypeOrderzVThe supported Data Type.

    Note: The Enum value does not imply the sort order.
    r                           	   
   returnc                 C   s   | j d}tjtjtjtjtjtjtjtj	tj
tjtjd}||krTtd| |dkrd| jjkr| jjd jdkrtjS || S )NZ
value_type)Z
null_valueboolean_valueZinteger_valueZdouble_valuetimestamp_valuestring_valuebytes_valuereference_valueZgeo_point_valuearray_value	map_valuez Could not detect value type for r   Z__type__Z
__vector__)_pbZ
WhichOneofr   NULLBOOLEANNUMBER	TIMESTAMPSTRINGBLOBREF	GEO_POINTARRAYOBJECT
ValueErrorr   fieldsr   VECTOR)valuevZlut r*   C/tmp/pip-unpacked-wheel-599y42ri/google/cloud/firestore_v1/order.py
from_value)   s,    
zTypeOrder.from_valueN)__name__
__module____qualname____doc__r   r   r   r   r   r    r!   r"   r#   r$   r'   staticmethodr   r,   r*   r*   r*   r+   r      s   r   r   r   r	   r
   r   r   r   r   r   r   c                   @   s   e Zd ZdZeedddZeedddZee	dddZ
ee	dd	d
ZeedddZeedddZeedddZeedddZeedddZeedddZeedddZdS )OrderzA
    Order implements the ordering semantics of the backend.
    r   c                 C   s>  t |}t |}||kr4t| t| k r0dS dS |t jkrBdS |t jkr\| |j|jS |t jkrr| ||S |t j	kr| 
||S |t jkr| |j|jS |t jkr| ||S |t jkr| ||S |t jkr| ||S |t jk r| ||S |t jkr| ||S |t jkr,| ||S td| dS )z
        Main comparison function for all Firestore types.
        @return -1 is left < right, 0 if left == right, otherwise 1
        r   r   zUnknown TypeOrder N)r   r,   _TYPE_ORDER_MAPr   r   _compare_tor   r   compare_numbersr   compare_timestampsr   r   r    compare_blobsr!   compare_resource_pathsr"   compare_geo_pointsr#   compare_arraysr'   compare_vectorsr$   compare_objectsr%   )clsleftrightZleftTypeZ	rightTyper*   r*   r+   compare[   s:    









zOrder.comparec                 C   s   | j }|j }t||S N)r   r2   r5   )r?   r@   Z
left_bytesZright_bytesr*   r*   r+   r8      s    zOrder.compare_blobsc                 C   sL   | j j} |j j}t| jpd|jp$d}|dkr4|S t| jp@d|jpHdS Nr   )r   r   r2   r5   secondsZnanos)r?   r@   rD   r*   r*   r+   r7      s    zOrder.compare_timestampsc                 C   sl   t | d }t |d }t|tr(t|ts0td|j|jk|j|jk  }|dkrT|S |j|jk|j|jk  S )Nzinvalid geopoint encounteredr   )r   
isinstancer   AttributeErrorZlatitudeZ	longitude)r?   r@   
left_valueright_valuecmpr*   r*   r+   r:      s    

 



zOrder.compare_geo_pointsc                 C   s   | j } |j }| d}|d}tt|t|}t|D ]0}|| || k rT dS || || kr: dS q:t| }t|}||k||k  S )N/r3   r   )r   splitminlenrange)r?   r@   Zleft_segmentsZright_segmentsZshorterileft_lengthright_lengthr*   r*   r+   r9      s    

zOrder.compare_resource_pathsc                 C   sh   | j j}|j j}tt|t|}t|D ](}t|| || }|dkr*|  S q*tt|t|S rC   )r   valuesrL   rM   rN   r2   rA   r5   )r?   r@   l_valuesr_valueslengthrO   rI   r*   r*   r+   r;      s    
zOrder.compare_arraysc                 C   sP   | j jd }|j jd }t|jj}t|jj}||krDt||S t||S )Nr(   )r   r&   rM   r   rR   r2   r5   r;   )r?   r@   rS   rT   rP   rQ   r*   r*   r+   r<      s    zOrder.compare_vectorsc                 C   s   | j j}|j j}tt|t|D ]H\}}t||}|dkrF|  S t|| || }|dkr"|  S q"tt|t|S rC   )r   r&   zipsortedr2   r5   rA   rM   )r?   r@   Zleft_fieldsZright_fieldsZleft_keyZ	right_keyZ
keyCompareZvalue_comparer*   r*   r+   r=      s     
zOrder.compare_objectsc                 C   s    t | d }t |d }t||S rB   )r   r2   compare_doubles)r?   r@   rG   rH   r*   r*   r+   r6      s    

zOrder.compare_numbersc                 C   s6   t | rt |rdS dS t |r*dS t| |S )Nr   r3   r   )mathisnanr2   r5   r?   r@   r*   r*   r+   rX      s    


zOrder.compare_doublesc                 C   s   | |k| |k  S rB   r*   r[   r*   r*   r+   r5      s    zOrder._compare_toN)r-   r.   r/   r0   classmethodintrA   r1   r8   r   r7   r:   r9   r;   r<   r=   r6   rX   r5   r*   r*   r*   r+   r2   V   s.   (

r2   )rY   enumr   typingr   Z"google.cloud.firestore_v1._helpersr   r   r   r   r   r   r   r   r    r!   r"   r#   r'   r$   r4   objectr2   r*   r*   r*   r+   <module>   s:   1           