o
     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def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}||vr*td| |dkr@d| jjv r@| jjd jdkr@tjS || S )N
value_type)
null_valueboolean_valueinteger_valuedouble_valuetimestamp_valuestring_valuebytes_valuereference_valuegeo_point_valuearray_value	map_valuez Could not detect value type for r   __type__
__vector__)_pb
WhichOneofr   NULLBOOLEANNUMBER	TIMESTAMPSTRINGBLOBREF	GEO_POINTARRAYOBJECT
ValueErrorr   fieldsr   VECTOR)valuevlut r2   /var/www/snowflake_co_dev_github/snow_flake_back_end_deploy/env/lib/python3.10/site-packages/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   r4   r2   r2   r2   r3   r      s    r   r   r   r	   r
   r   r   r   r   r   r   c                   @   s   e Zd ZdZedefddZedefddZede	fddZ
ede	fd	d
ZedefddZedefddZedefddZedefddZedefddZedefddZedefddZdS )OrderzA
    Order implements the ordering semantics of the backend.
    r   c                 C   s4  t |}t |}||krt| t| k rdS dS |t jkr!dS |t jkr.| |j|jS |t jkr9| ||S |t j	krD| 
||S |t jkrQ| |j|jS |t jkr\| ||S |t jkrg| ||S |t jkrr| ||S |t jkr}| ||S |t jkr| ||S |t jkr| ||S td| )z
        Main comparison function for all Firestore types.
        @return -1 is left < right, 0 if left == right, otherwise 1
        r   r   zUnknown TypeOrder )r   r4   _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rightleftType	rightTyper2   r2   r3   compare[   s:   












zOrder.comparec                 C   s   | j }|j }t||S N)r   r:   r=   )rG   rH   
left_bytesright_bytesr2   r2   r3   r@      s   zOrder.compare_blobsc                 C   sL   | j j} |j j}t| jpd|jpd}|dkr|S t| jp d|jp$dS Nr   )r    r   r:   r=   secondsnanos)rG   rH   rP   r2   r2   r3   r?      s   zOrder.compare_timestampsc                 C   sl   t | d }t |d }t|trt|tstd|j|jk|j|jk  }|dkr*|S |j|jk|j|jk  S )Nzinvalid geopoint encounteredr   )r   
isinstancer   AttributeErrorlatitude	longitude)rG   rH   
left_valueright_valuecmpr2   r2   r3   rB      s   





zOrder.compare_geo_pointsc                 C   s   | j } |j }| d}|d}tt|t|}t|D ]}|| || k r* dS || || kr5 dS qt| }t|}||k||k  S )N/r;   r   )r   splitminlenrange)rG   rH   left_segmentsright_segmentsshorterileft_lengthright_lengthr2   r2   r3   rA      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 rO   )r   valuesr[   r\   r]   r:   rK   r=   )rG   rH   l_valuesr_valueslengthra   rX   r2   r2   r3   rC      s   zOrder.compare_arraysc                 C   sP   | j jd }|j jd }t|jj}t|jj}||kr"t||S t||S )Nr/   )r   r-   r\   r   rd   r:   r=   rC   )rG   rH   re   rf   rb   rc   r2   r2   r3   rD      s   zOrder.compare_vectorsc                 C   s   | j j}|j j}tt|t|D ]$\}}t||}|dkr#|  S t|| || }|dkr5|  S qtt|t|S rO   )r   r-   zipsortedr:   r=   rK   r\   )rG   rH   left_fieldsright_fieldsleft_key	right_key
keyComparevalue_comparer2   r2   r3   rE      s   zOrder.compare_objectsc                 C   s    t | d }t |d }t||S rL   )r   r:   compare_doubles)rG   rH   rV   rW   r2   r2   r3   r>      s   

zOrder.compare_numbersc                 C   s6   t | rt |rdS dS t |rdS t| |S )Nr   r;   r   )mathisnanr:   r=   rG   rH   r2   r2   r3   rp      s   


zOrder.compare_doublesc                 C   s   | |k| |k  S rL   r2   rs   r2   r2   r3   r=      s   zOrder._compare_toN)r5   r6   r7   r8   classmethodintrK   r9   r@   r   r?   rB   rA   rC   rD   rE   r>   rp   r=   r2   r2   r2   r3   r:   V   s0    (

r:   )rq   enumr   typingr   "google.cloud.firestore_v1._helpersr   r   r   r"   r#   r$   r%   r&   r'   r(   r)   r*   r.   r+   r<   objectr:   r2   r2   r2   r3   <module>   s&   1