U
    WiZ                  	   @  s4  d dl mZ d dlZd dlmZ d dlmZ d dlmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZ d dlmZmZ d dlmZ d dlmZ zd d	lmZ W n  ek
r   d d	lmZ Y nX zd d
lmZ W n  ek
r   d dlmZ Y nX ddlm Z m!Z!m"Z"m#Z# ddl$m%Z%m&Z&m'Z'm(Z( G dd deZ)ddddZ*ddddddddZ+ddddddddd d!d"Z,d#dd$dddddddd%d&d'Z-d(dddd)d*d+Z.dddd,d-d.Z/ed/Z0G d0d1 d1ee	e0 Z1G d2d3 d3e1e0 e	e0 Z2G d4d5 d5e	e0 Z3G d6d7 d7e3e0 Z4G d8d9 d9e4e0 Z5dS ):    )annotationsN)JSONDecodeError)search)AnyDictGenericIterableListLiteral
NamedTupleOptionalTupleTypeTypeVarUnion)HeadersQueryParams)Response)	BaseModel)Self)field_validator)	validator   )CountMethodFiltersRequestMethodReturnMethod)AsyncClient
SyncClientget_origin_and_castsanitize_paramc                   @  s.   e Zd ZU ded< ded< ded< ded< d	S )
	QueryArgsr   methodr   paramsr   headerszDict[Any, Any]jsonN)__name__
__module____qualname____annotations__ r*   r*   d/home/afrizal/public_html/fastapi/venv/lib/python3.8/site-packages/postgrest/base_request_builder.pyr!   )   s   
r!   z
List[Dict])r%   c                 C  s&   dd | D }d dd |D }|S )Nc                 S  s   h | ]}|  D ]}|qqS r*   )keys).0rowkeyr*   r*   r+   	<setcomp>2   s     
  z"_unique_columns.<locals>.<setcomp>,c                 S  s   g | ]}d | d qS )"r*   )r-   kr*   r*   r+   
<listcomp>3   s     z#_unique_columns.<locals>.<listcomp>)join)r%   Zunique_keyscolumnsr*   r*   r+   _unique_columns1   s    r7   )countstrzOptional[CountMethod])r6   r8   returnc                 G  sT   |rt j}tdd|i}nt j}t }| r@tdd|  int }t|||i S )Nselectr1   Prefercount=)r   GETr   r5   HEADr   r!   )r8   r6   r"   r#   r$   r*   r*   r+   
pre_select7   s    r@   T)default_to_nullzUnion[dict, list]r   bool)r%   r8   	returningupsertrA   r:   c                C  s|   d| g}|r | d|  |r.| d |s<| d tdd|i}i }t| trhdt| i}ttjt	||| S )Nreturn=r=   zresolution=merge-duplicatesmissing=defaultr<   r1   r6   
appendr   r5   
isinstancelistr7   r!   r   POSTr   )r%   r8   rC   rD   rA   prefer_headersr$   query_paramsr*   r*   r+   
pre_insertE   s    


rN    )on_conflictrA   )r%   r8   rC   ignore_duplicatesrP   rA   r:   c          
      C  s   i }d| g}|r$| d|  |r,dnd}| d| d |sP| d tdd	|i}	|rn||d
< t| trt| |d< ttjt	||	| S )NrE   r=   ignoremergezresolution=z-duplicatesrF   r<   r1   rP   r6   rG   )
r%   r8   rC   rQ   rP   rA   rM   rL   
resolutionr$   r*   r*   r+   
pre_upsert\   s    	

rU   dict)r%   r8   rC   r:   c                C  sD   d| g}|r | d|  tdd|i}ttjt || S NrE   r=   r<   r1   )rH   r   r5   r!   r   PATCHr   )r%   r8   rC   rL   r$   r*   r*   r+   
pre_updatev   s
    rY   )r8   rC   r:   c                 C  sD   d| g}| r | d|   tdd|i}ttjt |i S rW   )rH   r   r5   r!   r   DELETEr   )r8   rC   rL   r$   r*   r*   r+   
pre_delete   s
    r[   _ReturnTc                   @  s   e Zd ZU ded< dZded< ededdddd	d
ZedddddZ	edddddZ
eddddddZeddddddZeddddddZdS )APIResponsezList[_ReturnT]dataNzOptional[int]r8   
Type[Self]r   )clsvaluer:   c                 C  s    t |tr|drtd|S )Nmessagez/You are passing an API error to the data field.)rI   rV   get
ValueError)r`   ra   r*   r*   r+   raise_when_api_error   s    z APIResponse.raise_when_api_errorr9   )content_range_headerr:   c                 C  s&   |  d}t|dk rd S t|d S )N/   r   )splitlenint)rf   Zcontent_ranger*   r*   r+   $_get_count_from_content_range_header   s    
z0APIResponse._get_count_from_content_range_headerrB   )prefer_headerr:   c                 C  s*   dd dd tD  d}tt|| S )Nzcount=(|c                 S  s   g | ]
}|j qS r*   )ra   )r-   cmr*   r*   r+   r4      s     z:APIResponse._is_count_in_prefer_header.<locals>.<listcomp>))r5   r   rB   r   )rm   patternr*   r*   r+   _is_count_in_prefer_header   s    z&APIResponse._is_count_in_prefer_headerRequestResponser`   request_responser:   c                 C  sB   |j jd}|sd S | |}|jd}|r>|r>| |S d S )NZpreferzcontent-range)requestr$   rc   rr   rl   )r`   ru   rm   Zis_count_in_prefer_headerrf   r*   r*   r+   %_get_count_from_http_request_response   s    
z1APIResponse._get_count_from_http_request_responser   c                 C  sH   z|  }W n  tk
r,   | g dd Y S X | |}| t ||dS Nr   )r^   r8   )r%   r   rw   r\   )r`   ru   r^   r8   r*   r*   r+   from_http_request_response   s    
z&APIResponse.from_http_request_responseDict[str, Any]r`   rV   r:   c                 C  sT   |  }t|dkr,d|kr,d|kr,d|ks0t| t |d|d|ddS N   r^   r8   error)r^   r8   r~   r,   rj   AssertionErrorr\   rc   r`   rV   r,   r*   r*   r+   	from_dict   s    (  zAPIResponse.from_dict)r&   r'   r(   r)   r8   r   classmethodre   staticmethodrl   rr   rw   ry   r   r*   r*   r*   r+   r]      s   
r]   c                   @  sB   e Zd ZU ded< eddddddZedd	dd
ddZdS )SingleAPIResponser\   r^   r_   rs   r   rt   c                 C  sT   |  |}z| }W n, tk
rB   t|jdkr:|jng }Y nX | t ||dS rx   )rw   r%   r   rj   textr\   )r`   ru   r8   r^   r*   r*   r+   ry      s    
z,SingleAPIResponse.from_http_request_responserz   r{   c                 C  sT   |  }t|dkr,d|kr,d|kr,d|ks0t| t |d|d|ddS r|   r   r   r*   r*   r+   r      s    (  zSingleAPIResponse.from_dictN)r&   r'   r(   r)   r   ry   r   r*   r*   r*   r+   r      s
   

r   c                   @  s  e Zd ZdddddddZeddd	d
dZddddddddZdddddddZdddddddZdddddddZ	dddddddZ
dddddddZdddddddZdddddddZddddd d!d"Zddddd d#d$Zddddd d%d&Zddddd d'd(Zddddd d)d*Zddddd d+d,Zdfddd.dd/d0d1Zddddd2d3d4Zddddd2d5d6Zddddd2d7d8Zddddd2d9d:Zddd;dd<d=d>Zddd;dd<d?d@Zddd;dd<dAdBZdddCdddDdEZdddCdddFdGZddd;dddHdIZdddJddKdLdMZdddJddKdNdOZ dddJddKdPdQZ!dddJddKdRdSZ"dddJddKdTdUZ#dddJddKdVdWZ$dddJddKdXdYZ%dddJddKdZd[Z&dddJddKd\d]Z'dddJddKd^d_Z(ddd;dd<d`daZ)ddbddcdddeZ*d-S )gBaseFilterRequestBuilderUnion[AsyncClient, SyncClient]r   r   Nonesessionr$   r#   r:   c                 C  s   || _ || _|| _d| _d S )NF)r   r$   r#   negate_nextselfr   r$   r#   r*   r*   r+   __init__   s    z!BaseFilterRequestBuilder.__init__r   )r   r:   c                 C  s
   d| _ | S )z2Whether the filter applied next should be negated.T)r   r   r*   r*   r+   not_   s    zBaseFilterRequestBuilder.not_r9   )r   columnoperatorcriteriar:   c                 C  sL   | j dkr d| _ tj d| }t|| d|  }}| j||| _| S )zApply filters on a query.

        Args:
            column: The name of the column to apply a filter on
            operator: The operator to use while filtering
            criteria: The value to filter by
        TF.)r   r   NOTr    r#   add)r   r   r   r   r/   valr*   r*   r+   filter  s    
zBaseFilterRequestBuilder.filterr   )r   r   ra   r:   c                 C  s   |  |tj|S )zAn 'equal to' filter.

        Args:
            column: The name of the column to apply a filter on
            value: The value to filter by
        )r   r   ZEQr   r   ra   r*   r*   r+   eq  s    zBaseFilterRequestBuilder.eqc                 C  s   |  |tj|S )zA 'not equal to' filter

        Args:
            column: The name of the column to apply a filter on
            value: The value to filter by
        )r   r   ZNEQr   r*   r*   r+   neq  s    zBaseFilterRequestBuilder.neqc                 C  s   |  |tj|S )zA 'greater than' filter

        Args:
            column: The name of the column to apply a filter on
            value: The value to filter by
        )r   r   GTr   r*   r*   r+   gt"  s    zBaseFilterRequestBuilder.gtc                 C  s   |  |tj|S )zA 'greater than or equal to' filter

        Args:
            column: The name of the column to apply a filter on
            value: The value to filter by
        )r   r   ZGTEr   r*   r*   r+   gte+  s    zBaseFilterRequestBuilder.gtec                 C  s   |  |tj|S )zA 'less than' filter

        Args:
            column: The name of the column to apply a filter on
            value: The value to filter by
        )r   r   LTr   r*   r*   r+   lt4  s    zBaseFilterRequestBuilder.ltc                 C  s   |  |tj|S )zA 'less than or equal to' filter

        Args:
            column: The name of the column to apply a filter on
            value: The value to filter by
        )r   r   ZLTEr   r*   r*   r+   lte=  s    zBaseFilterRequestBuilder.ltec                 C  s   |dkrd}|  |tj|S )zAn 'is' filter

        Args:
            column: The name of the column to apply a filter on
            value: The value to filter by
        Nnull)r   r   ZISr   r*   r*   r+   is_F  s    zBaseFilterRequestBuilder.is_)r   r   rq   r:   c                 C  s   |  |tj|S )A 'LIKE' filter, to use for pattern matching.

        Args:
            column: The name of the column to apply a filter on
            pattern: The pattern to filter by
        )r   r   ZLIKEr   r   rq   r*   r*   r+   likeQ  s    zBaseFilterRequestBuilder.likec                 C  s   |  |tjd| dS r   {})r   r   ZLIKE_ALLr   r*   r*   r+   like_all_ofZ  s    z$BaseFilterRequestBuilder.like_all_ofc                 C  s   |  |tjd| dS r   )r   r   ZLIKE_ANYr   r*   r*   r+   like_any_ofd  s    z$BaseFilterRequestBuilder.like_any_ofc                 C  s   |  |tjd| dS zA 'ILIKE' filter, to use for pattern matching (case insensitive).

        Args:
            column: The name of the column to apply a filter on
            pattern: The pattern to filter by
        r   r   )r   r   Z	ILIKE_ALLr   r*   r*   r+   ilike_all_ofn  s    z%BaseFilterRequestBuilder.ilike_all_ofc                 C  s   |  |tjd| dS r   )r   r   Z	ILIKE_ANYr   r*   r*   r+   ilike_any_ofx  s    z%BaseFilterRequestBuilder.ilike_any_ofc                 C  s   |  |tj|S )zAn 'ILIKE' filter, to use for pattern matching (case insensitive).

        Args:
            column: The name of the column to apply a filter on
            pattern: The pattern to filter by
        )r   r   ZILIKEr   r*   r*   r+   ilike  s    zBaseFilterRequestBuilder.ilikeNzUnion[str, None])r   filtersreference_tabler:   c                 C  s2   |rt | dnd}| j|d| d| _| S )zAn 'or' filter

        Args:
            filters: The filters to use, following PostgREST syntax
            reference_table: Set this to filter on referenced tables instead of the parent table
        z.oror(rp   )r    r#   r   )r   r   r   r/   r*   r*   r+   or_  s    zBaseFilterRequestBuilder.or_)r   r   queryr:   c                 C  s   |  |tj|S N)r   r   ZFTSr   r   r   r*   r*   r+   fts  s    zBaseFilterRequestBuilder.ftsc                 C  s   |  |tj|S r   )r   r   ZPLFTSr   r*   r*   r+   plfts  s    zBaseFilterRequestBuilder.plftsc                 C  s   |  |tj|S r   )r   r   ZPHFTSr   r*   r*   r+   phfts  s    zBaseFilterRequestBuilder.phftsc                 C  s   |  |tj|S r   )r   r   ZWFTSr   r*   r*   r+   wfts  s    zBaseFilterRequestBuilder.wftszIterable[Any])r   r   valuesr:   c                 C  s,   t t|}d|}| |tjd| dS )Nr1   r   rp   )mapr    r5   r   r   INr   r   r   r*   r*   r+   in_  s    

zBaseFilterRequestBuilder.in_c                 C  s"   d |}| |tjd| dS Nr1   r   r   )r5   r   r   CSr   r*   r*   r+   cs  s    
zBaseFilterRequestBuilder.csc                 C  s"   d |}| |tjd| dS r   )r5   r   r   CDr   r*   r*   r+   cd  s    
zBaseFilterRequestBuilder.cdz)Union[Iterable[Any], str, Dict[Any, Any]]c                 C  sf   t |tr| |tj|S t |tsPt |trPd|}| |tjd| dS | |tjt	|S r   )
rI   r9   r   r   r   rV   r   r5   r%   dumpsr   r   ra   Zstringified_valuesr*   r*   r+   contains  s    

z!BaseFilterRequestBuilder.containsc                 C  sf   t |tr| |tj|S t |tsPt |trPd|}| |tjd| dS | |tjt	|S r   )
rI   r9   r   r   r   rV   r   r5   r%   r   r   r*   r*   r+   contained_by  s    

z%BaseFilterRequestBuilder.contained_byc                 C  sf   t |tr| |tj|S t |tsPt |trPd|}| |tjd| dS | |tjt	|S r   )
rI   r9   r   r   ZOVrV   r   r5   r%   r   r   r*   r*   r+   ov  s    

zBaseFilterRequestBuilder.ovzTuple[int, int])r   r   ranger:   c              	   C  s&   |  |tjd|d  d|d  dS Nr   r   r1   r   rp   )r   r   ZSLr   r   r   r*   r*   r+   sl  s    zBaseFilterRequestBuilder.slc              	   C  s&   |  |tjd|d  d|d  dS r   )r   r   ZSRr   r*   r*   r+   sr  s    zBaseFilterRequestBuilder.src              	   C  s&   |  |tjd|d  d|d  dS r   )r   r   ZNXLr   r*   r*   r+   nxl  s    zBaseFilterRequestBuilder.nxlc              	   C  s&   |  |tjd|d  d|d  dS r   )r   r   ZNXRr   r*   r*   r+   nxr  s    zBaseFilterRequestBuilder.nxrc              	   C  s&   |  |tjd|d  d|d  dS r   )r   r   ZADJr   r*   r*   r+   adj  s    zBaseFilterRequestBuilder.adjc                 C  s   |  ||S r   )r   r   r*   r*   r+   range_gt  s    z!BaseFilterRequestBuilder.range_gtc                 C  s   |  ||S r   )r   r   r*   r*   r+   	range_gte  s    z"BaseFilterRequestBuilder.range_gtec                 C  s   |  ||S r   )r   r   r*   r*   r+   range_lt  s    z!BaseFilterRequestBuilder.range_ltc                 C  s   |  ||S r   )r   r   r*   r*   r+   	range_lte  s    z"BaseFilterRequestBuilder.range_ltec                 C  s   |  ||S r   )r   r   r*   r*   r+   range_adjacent  s    z'BaseFilterRequestBuilder.range_adjacentc                 C  s   |  ||S r   )r   r   r*   r*   r+   overlaps  s    z!BaseFilterRequestBuilder.overlapsrz   )r   r   r:   c                 C  s2   | }|st d| D ]\}}| ||}q|S )Nz;query dictionary should contain at least one key-value pair)rd   itemsr   )r   r   Zupdated_queryr/   ra   r*   r*   r+   match  s    zBaseFilterRequestBuilder.match)N)+r&   r'   r(   r   propertyr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r*   r*   r*   r+   r      sP   							



	r   c                
   @  s   e Zd ZdddddddZd#d
ddddddd
dddZddddd
ddddd
dddZddd
ddd
dddZddddddZd$d
dddd
d d!d"ZdS )%BaseSelectRequestBuilderr   r   r   r   r   c                 C  s   t tt | ||| d S r   )r   r   r\   r   r   r*   r*   r+   r     s    	   z!BaseSelectRequestBuilder.__init__Fr   r   rB   zLiteral[('text', 'json')])r   analyzeverbosesettingsbufferswalformatr:   c           	      C  s8   dd t   D }d|}d| d| | jd< | S )Nc                 S  s    g | ]\}}|d kr|r|qS ))r   r   r*   )r-   r/   ra   r*   r*   r+   r4     s    z4BaseSelectRequestBuilder.explain.<locals>.<listcomp>rn   zapplication/vnd.pgrst.plan+z
; options=Accept)localsr   r5   r$   )	r   r   r   r   r   r   r   optionsoptions_strr*   r*   r+   explain  s    	
z BaseSelectRequestBuilder.explainN)desc
nullsfirstforeign_tabler9   zOptional[str])r   r   r   r   r   r:   c                C  s|   |r|d nd | |rdnd |r(dnd |r4dnd }| j d}|rh| j d| _ | d| }| j d|| _ | S )a  Sort the returned rows in some specific order.

        Args:
            column: The column to order by
            desc: Whether the rows should be ordered in descending order or not.
            nullsfirst: nullsfirst
            foreign_table: Foreign table name whose results are to be ordered.
        .. versionchanged:: 0.10.3
           Allow ordering results for foreign tables with the foreign_table parameter.
        r   rO   rp   z.descz.nullsfirstorderr1   )r#   rc   remover   )r   r   r   r   r   Znew_order_parameterZexisting_order_parameterr*   r*   r+   r   $  s    :zBaseSelectRequestBuilder.order)r   rk   )r   sizer   r:   c                C  s"   | j |r| dnd|| _ | S )a3  Limit the number of rows returned by a query.

        Args:
            size: The number of rows to be returned
            foreign_table: Foreign table name to limit
        .. versionchanged:: 0.10.3
           Allow limiting results returned for foreign tables with the foreign_table parameter.
        .limitlimitr#   r   )r   r   r   r*   r*   r+   r   G  s
    	zBaseSelectRequestBuilder.limitZ_FilterT)r   r   r:   c                 C  s   | j d|| _ | S )zzSet the starting row index returned by a query.
        Args:
            size: The number of the row to start at
        offsetr   )r   r   r*   r*   r+   r   V  s
    zBaseSelectRequestBuilder.offset)r   startendr   r:   c                 C  sH   | j |r| dnd|| _ | j |r2| dnd|| d | _ | S )Nz.offsetr   r   r   r   r   )r   r   r   r   r*   r*   r+   r   a  s     
zBaseSelectRequestBuilder.range)FFFFFr   )N)	r&   r'   r(   r   r   r   r   r   r   r*   r*   r*   r+   r     s          # r   c                   @  sZ   e Zd ZdddddddZdd	d
ddZd	dddZd	dddZd	dddZdS )BaseRPCRequestBuilderr   r   r   r   r   c                 C  s   t tt | ||| d S r   )r   r   r\   r   r   r*   r*   r+   r   o  s    	   zBaseRPCRequestBuilder.__init__r9   r   )r6   r:   c                 G  s:   t |ddi\}}}}| jd|d| _d| jd< | S )zRun a SELECT query.

        Args:
            *columns: The names of the columns to fetch.
        Returns:
            :class:`BaseSelectRequestBuilder`
        r8   Nr;   zreturn=representationr<   )r@   r#   r   rc   r$   )r   r6   r"   r#   r$   r%   r*   r*   r+   r;   |  s    
zBaseRPCRequestBuilder.select)r:   c                 C  s   d| j d< | S )zSpecify that the query will only return a single row in response.

        .. caution::
            The API will raise an error if the query returned more than one row.
        !application/vnd.pgrst.object+jsonr   r$   r   r*   r*   r+   single  s    
zBaseRPCRequestBuilder.singlec                 C  s   d| j d< | S )zRetrieves at most one row from the result. Result must be at most one row (e.g. using `eq` on a UNIQUE column), otherwise this will result in an error.r   r   r   r   r*   r*   r+   maybe_single  s    
z"BaseRPCRequestBuilder.maybe_singlec                 C  s   d| j d< | S )zASpecify that the query must retrieve data as a single CSV string.ztext/csvr   r   r   r*   r*   r+   csv  s    
zBaseRPCRequestBuilder.csvN)r&   r'   r(   r   r;   r   r   r   r*   r*   r*   r+   r   n  s
   	r   )6
__future__r   r%   r   rer   typingr   r   r   r   r	   r
   r   r   r   r   r   r   Zhttpxr   r   r   rs   Zpydanticr   r   ImportErrortyping_extensionsr   r   typesr   r   r   r   utilsr   r   r   r    r!   r7   r@   rN   rU   rY   r[   r\   r]   r   r   r   r   r*   r*   r*   r+   <module>   sH   8A  l