o
    ˳i Y                     @  s,  d dl mZ d dl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mZmZ d dlmZmZmZmZmZ d dlmZ d dlmZm Z  d d	l!m"Z" ej#d
krhd dlm$Z$ nd dl%m$Z$ zd dlm&Z& W n e'y   d dlm(Z& Y nw ddl)m*Z* ddl+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 ddl2m3Z3 G dd deZ4edeeZ5G dd dee5 Z6dFddZ7dGdd Z8ddd!dHd&d'Z9d(d)dId0d1Z:d2d(d3dJd6d7Z;dKd8d9Z<dLd:d;Z=G d<d= d=eZ>G d>d? d?e>Z?G d@dA dAee5 Z@G dBdC dCe@e5 ZAG dDdE dEeAZBdS )M    )annotationsN)JSONDecodeError)search)Any	AwaitableDictGenericIterableListLiteral
NamedTupleOptionalTupleTypeTypeVarUnionoverload)AsyncClient	BasicAuthClientHeadersQueryParams)Response)	BaseModelValidationError)URL)      )Self)field_validator)	validator   )BasePostgrestClient)JSONCountMethodFiltersJSONAdapterRequestMethodReturnMethod)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   headersr#   jsonN)__name__
__module____qualname____annotations__ r3   r3   R/home/ubuntu/.local/lib/python3.10/site-packages/postgrest/base_request_builder.pyr*   .   s
   
 r*   Cc                   @  s<   e Zd ZdddZedddZed ddZd!ddZdS )"RequestConfigsessionr5   pathr   http_methodstrr-   r   r,   r   authBasicAuth | Noner.   r#   returnNonec                 C  s:   || _ || _|| _|| _|| _|dv rd n|| _|| _d S )N>   GETHEAD)r7   r8   r9   r-   r,   r.   r;   )selfr7   r8   r9   r-   r,   r;   r.   r3   r3   r4   __init__:   s   

zRequestConfig.__init__rA   RequestConfig[Client]RequestResponsec                 C     d S Nr3   rA   r3   r3   r4   sendL      zRequestConfig.sendRequestConfig[AsyncClient]Awaitable[RequestResponse]c                 C  rE   rF   r3   rG   r3   r3   r4   rH   N   rI   RequestConfig[C]c                 C  s(   | j j| jt| j| j| j| j| jdS )N)r.   r,   r-   r;   )	r7   requestr9   r:   r8   r.   r,   r-   r;   rG   r3   r3   r4   rH   Q   s   N)r7   r5   r8   r   r9   r:   r-   r   r,   r   r;   r<   r.   r#   r=   r>   )rA   rC   r=   rD   )rA   rJ   r=   rK   )rA   rL   )r/   r0   r1   rB   r   rH   r3   r3   r3   r4   r6   9   s    
r6   r.   List[Dict[str, JSON]]c                 C  s&   dd | D }d dd |D }|S )Nc                 S  s   h | ]}|  D ]}|qqS r3   )keys).0rowkeyr3   r3   r4   	<setcomp>]   s    z"_unique_columns.<locals>.<setcomp>,c                 S  s   g | ]}d | d qS )"r3   )rP   kr3   r3   r4   
<listcomp>^   s    z#_unique_columns.<locals>.<listcomp>)join)r.   unique_keyscolumnsr3   r3   r4   _unique_columns\   s   r[   rZ   Tuple[str, ...]r=   r:   c                 C  sX   d}g }| D ] }d}|D ]}|  r|sq|dkr| }||7 }q|| qd|S )NF rU   rT   )isspaceappendrX   )rZ   quotedcleanedcolumnclean_columncharr3   r3   r4   _cleaned_columnsb   s   

re   )countheadrf   Optional[CountMethod]rg   Optional[bool]c                 G  sR   |rt jnt j}t|pd}td|i}| rtdd|  int }t|||i S )N)*selectPrefercount=)r'   r@   r?   re   r   r   r*   )rf   rg   rZ   r+   cleaned_columnsr,   r-   r3   r3   r4   
pre_selects   s
   ro   T)default_to_nullr#   	returningr(   upsertboolrp   c                C  s|   d| g}|r| d|  |r| d |s| d tdd|i}i }t| tr4dt| i}ttjt	||| S )Nreturn=rm   zresolution=merge-duplicatesmissing=defaultrl   rT   rZ   
r_   r   rX   
isinstancelistr[   r*   r'   POSTr   )r.   rf   rq   rr   rp   prefer_headersr-   query_paramsr3   r3   r4   
pre_insert   s   


r|   r]   )on_conflictrp   ignore_duplicatesr}   c          
      C  s   i }d| g}|r| d|  |rdnd}| d| d |s(| d tdd	|i}	|r7||d
< t| trBt| |d< ttjt	||	| S )Nrt   rm   ignoremergezresolution=z-duplicatesru   rl   rT   r}   rZ   rv   )
r.   rf   rq   r~   r}   rp   r{   rz   
resolutionr-   r3   r3   r4   
pre_upsert   s   	

r   c                C  sD   d| g}|r| d|  tdd|i}ttjt || S Nrt   rm   rl   rT   )r_   r   rX   r*   r'   PATCHr   )r.   rf   rq   rz   r-   r3   r3   r4   
pre_update   s
   r   c                 C  sD   d| g}| r| d|   tdd|i}ttjt |i S r   )r_   r   rX   r*   r'   DELETEr   )rf   rq   rz   r-   r3   r3   r4   
pre_delete   s
   r   c                   @  st   e Zd ZU ded< 	 dZded< 	 ededddZedddZ	edddZ
edddZedddZdS ) APIResponsez
List[JSON]dataNOptional[int]rf   cls
Type[Self]valuer   r=   c                 C  s    t |tr|drtd|S )Nmessagez/You are passing an API error to the data field.)rw   dictget
ValueError)r   r   r3   r3   r4   raise_when_api_error   s   z APIResponse.raise_when_api_errorcontent_range_headerr:   c                 C  s&   |  d}t|dk rd S t|d S )N/   r!   )splitlenint)r   content_ranger3   r3   r4   $_get_count_from_content_range_header   s   
z0APIResponse._get_count_from_content_range_headerprefer_headerrs   c                 C  s*   dd dd tD  d}tt|| S )Nzcount=(|c                 S  s   g | ]}|j qS r3   )r   )rP   cmr3   r3   r4   rW      s    z:APIResponse._is_count_in_prefer_header.<locals>.<listcomp>))rX   r$   rs   r   )r   patternr3   r3   r4   _is_count_in_prefer_header   s   z&APIResponse._is_count_in_prefer_headerrequest_responserD   c                 C  sB   | j jd}|sd S t|}| jd}|r|rt|S d S )Npreferzcontent-range)rM   r-   r   r   r   r   )r   r   is_count_in_prefer_headerr   r3   r3   r4   %_get_count_from_http_request_response   s   z1APIResponse._get_count_from_http_request_responsec                 C  sR   t | }zt| j}W n ty"   t| jdkr| jng }Y nw t ||dS Nr   )r   rf   )r   r   r&   validate_jsoncontentr   r   textr   rf   r   r3   r3   r4   from_http_request_response   s   
z&APIResponse.from_http_request_response)r   r   r   r   r=   r   )r   r:   r=   r   )r   r:   r=   rs   )r   rD   r=   r   )r   rD   r=   r   )r/   r0   r1   r2   rf   r   classmethodr   staticmethodr   r   r   r   r3   r3   r3   r4   r      s    
 r   c                   @  s&   e Zd ZU ded< 	 ed	ddZdS )
SingleAPIResponser#   r   r   rD   r=   c                 C  sN   t | }z|  }W n ty    t| jdkr| jng }Y nw t||dS r   )r   r   r.   r   r   r   r   r   r3   r3   r4   r     s   
z,SingleAPIResponse.from_http_request_responseN)r   rD   r=   r   )r/   r0   r1   r2   r   r   r3   r3   r3   r4   r      s
   
 r   c                   @  s  e Zd ZdjddZedkd	d
ZdlddZdmddZdmddZdmddZ	dmddZ
dmddZdmddZdmdd Zdnd"d#Zdnd$d%Zdnd&d'Zdnd(d)Zdnd*d+Zdnd,d-Zdodpd2d3Zdqd5d6Zdqd7d8Zdqd9d:Zdqd;d<Zdrd?d@ZdrdAdBZdrdCdDZdsdFdGZdsdHdIZdtdJdKZdudNdOZdudPdQZ dudRdSZ!dudTdUZ"dudVdWZ#dudXdYZ$dudZd[Z%dud\d]Z&dud^d_Z'dud`daZ(drdbdcZ)dvdedfZ*dwdhdiZ+d.S )xBaseFilterRequestBuilderrM   rL   r=   r>   c                 C  s   || _ d| _d S )NF)rM   negate_next)rA   rM   r3   r3   r4   rB     s   
z!BaseFilterRequestBuilder.__init__rA   r   c                 C  s
   d| _ | S )z2Whether the filter applied next should be negated.T)r   rG   r3   r3   r4   not_  s   zBaseFilterRequestBuilder.not_rb   r:   operatorcriteriac                 C  sP   | j du rd| _ tj d| }t|| d| }}| jj||| 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)   rM   r,   add)rA   rb   r   r   rR   valr3   r3   r4   filter  s   
zBaseFilterRequestBuilder.filterr   r   c                 C     |  |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%   EQrA   rb   r   r3   r3   r4   eq*     zBaseFilterRequestBuilder.eqc                 C  r   )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%   NEQr   r3   r3   r4   neq3  r   zBaseFilterRequestBuilder.neqc                 C  r   )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   r3   r3   r4   gt<  r   zBaseFilterRequestBuilder.gtc                 C  r   )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%   GTEr   r3   r3   r4   gteE  r   zBaseFilterRequestBuilder.gtec                 C  r   )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   r3   r3   r4   ltN  r   zBaseFilterRequestBuilder.ltc                 C  r   )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%   LTEr   r3   r3   r4   lteW  r   zBaseFilterRequestBuilder.ltec                 C  s   |du 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%   ISr   r3   r3   r4   is_`  s   zBaseFilterRequestBuilder.is_r   c                 C  r   )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%   LIKErA   rb   r   r3   r3   r4   likek  r   zBaseFilterRequestBuilder.likec                 C     |  |tjd| dS r   {})r   r%   LIKE_ALLr   r3   r3   r4   like_all_oft     z$BaseFilterRequestBuilder.like_all_ofc                 C  r   r   )r   r%   LIKE_ANYr   r3   r3   r4   like_any_of~  r   z$BaseFilterRequestBuilder.like_any_ofc                 C  r   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%   	ILIKE_ALLr   r3   r3   r4   ilike_all_of  r   z%BaseFilterRequestBuilder.ilike_all_ofc                 C  r   r   )r   r%   	ILIKE_ANYr   r3   r3   r4   ilike_any_of  r   z%BaseFilterRequestBuilder.ilike_any_ofc                 C  r   )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%   ILIKEr   r3   r3   r4   ilike  r   zBaseFilterRequestBuilder.ilikeNfiltersreference_tableOptional[str]c                 C  s6   |r	t | dnd}| jj|d| d| j_| 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(r   )r)   rM   r,   r   )rA   r   r   rR   r3   r3   r4   or_  s   zBaseFilterRequestBuilder.or_queryc                 C  r   rF   )r   r%   FTSrA   rb   r   r3   r3   r4   fts     zBaseFilterRequestBuilder.ftsc                 C  r   rF   )r   r%   PLFTSr   r3   r3   r4   plfts  r   zBaseFilterRequestBuilder.plftsc                 C  r   rF   )r   r%   PHFTSr   r3   r3   r4   phfts  r   zBaseFilterRequestBuilder.phftsc                 C  r   rF   )r   r%   WFTSr   r3   r3   r4   wfts  r   zBaseFilterRequestBuilder.wftsvaluesIterable[Any]c                 C  s,   t t|}d|}| |tjd| dS )NrT   r   r   )mapr)   rX   r   r%   INrA   rb   r   r3   r3   r4   in_  s   

zBaseFilterRequestBuilder.in_c                 C  "   d |}| |tjd| dS NrT   r   r   )rX   r   r%   CSr   r3   r3   r4   cs     
zBaseFilterRequestBuilder.csc                 C  r   r   )rX   r   r%   CDr   r3   r3   r4   cd  r   zBaseFilterRequestBuilder.cd)Union[Iterable[Any], str, Dict[Any, Any]]c                 C  f   t |tr| |tj|S t |ts(t |tr(d|}| |tjd| dS | |tjt	|S r   )
rw   r:   r   r%   r   r   r	   rX   r.   dumpsrA   rb   r   stringified_valuesr3   r3   r4   contains  s   

z!BaseFilterRequestBuilder.containsc                 C  r   r   )
rw   r:   r   r%   r   r   r	   rX   r.   r   r   r3   r3   r4   contained_by  s   

z%BaseFilterRequestBuilder.contained_byc                 C  r   r   )
rw   r:   r   r%   OVr   r	   rX   r.   r   r   r3   r3   r4   ov  s   

zBaseFilterRequestBuilder.ovrangeTuple[int, int]c              	   C  &   |  |tjd|d  d|d  dS Nr   r   rT   r!   r   )r   r%   SLrA   rb   r  r3   r3   r4   sl     &zBaseFilterRequestBuilder.slc              	   C  r  r  )r   r%   SRr
  r3   r3   r4   sr  r  zBaseFilterRequestBuilder.src              	   C  r  r  )r   r%   NXLr
  r3   r3   r4   nxl  r  zBaseFilterRequestBuilder.nxlc              	   C  r  r  )r   r%   NXRr
  r3   r3   r4   nxr  r  zBaseFilterRequestBuilder.nxrc              	   C  r  r  )r   r%   ADJr
  r3   r3   r4   adj  r  zBaseFilterRequestBuilder.adjc                 C     |  ||S rF   )r  r
  r3   r3   r4   range_gt     z!BaseFilterRequestBuilder.range_gtc                 C  r  rF   )r  r
  r3   r3   r4   	range_gte  r  z"BaseFilterRequestBuilder.range_gtec                 C  r  rF   )r  r
  r3   r3   r4   range_lt  r  z!BaseFilterRequestBuilder.range_ltc                 C  r  rF   )r  r
  r3   r3   r4   	range_lte  r  z"BaseFilterRequestBuilder.range_ltec                 C  r  rF   )r  r
  r3   r3   r4   range_adjacent  r  z'BaseFilterRequestBuilder.range_adjacentc                 C  r  rF   )r  r   r3   r3   r4   overlaps  r  z!BaseFilterRequestBuilder.overlapsDict[str, Any]c                 C  s2   | }|st d| D ]
\}}| ||}q|S )Nz;query dictionary should contain at least one key-value pair)r   itemsr   )rA   r   updated_queryrR   r   r3   r3   r4   match  s   zBaseFilterRequestBuilder.matchr   c                 C  sH   | j jdd}|rd|vr|d7 }nd}|d| 7 }|| j jd< | S )zSet the maximum number of rows that can be affected by the query.

        Only available in PostgREST v13+ and only works with PATCH and DELETE methods.

        Args:
            value: The maximum number of rows that can be affected
        rl   r]   zhandling=strictz,handling=strictz,max-affected=)rM   r-   r   )rA   r   r   r3   r3   r4   max_affected  s   z%BaseFilterRequestBuilder.max_affected)rM   rL   r=   r>   )rA   r   r=   r   )
rA   r   rb   r:   r   r:   r   r:   r=   r   )rA   r   rb   r:   r   r   r=   r   )rA   r   rb   r:   r   r:   r=   r   rF   )rA   r   r   r:   r   r   r=   r   )rA   r   rb   r:   r   r   r=   r   )rA   r   rb   r:   r   r   r=   r   )rA   r   rb   r:   r   r   r=   r   )rA   r   rb   r:   r   r   r=   r   )rA   r   rb   r:   r  r  r=   r   )rA   r   r   r  r=   r   )rA   r   r   r   r=   r   ),r/   r0   r1   rB   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!  r3   r3   r3   r4   r     sT    



	
	
	
	
	
	

	







	





















r   c                   @  sH   e Zd ZdddddddZdddddZdddZ	dd ddZdS )!BaseSelectRequestBuilderFN)desc
nullsfirstforeign_tablerA   r   rb   r:   r$  rs   r%  ri   r&  r   r=   c                C  sz   |r| dnd}| j j|}| j j||r|d nd | d|r$dnd  |dur5d|r1d	nd
 nd | j _| 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.
        z.orderorderrT   r]   r   r$  ascNr%  	nullslast)rM   r,   r   set)rA   rb   r$  r%  r&  rR   existing_orderr3   r3   r4   r'  1  s   
zBaseSelectRequestBuilder.order)r&  sizer   c                C  s&   | j j|r| dnd|| j _| 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rM   r,   r   )rA   r,  r&  r3   r3   r4   r.  R  s
   	zBaseSelectRequestBuilder.limitc                 C  s   | j jd|| j _| S )zzSet the starting row index returned by a query.
        Args:
            size: The number of the row to start at
        offsetr/  )rA   r,  r3   r3   r4   r0  a  s
   zBaseSelectRequestBuilder.offsetstartendc                 C  sP   | j j|r| dnd|| j _| j j|r| dnd|| d | j _| S )Nz.offsetr0  r-  r.  r!   r/  )rA   r1  r2  r&  r3   r3   r4   r  l  s   
zBaseSelectRequestBuilder.range)rA   r   rb   r:   r$  rs   r%  ri   r&  r   r=   r   )rA   r   r,  r   r&  r   r=   r   )rA   r   r,  r   r=   r   rF   )
rA   r   r1  r   r2  r   r&  r   r=   r   )r/   r0   r1   r'  r.  r0  r  r3   r3   r3   r4   r#  0  s    !
r#  c                   @  s4   e Zd ZdddZdddZdd	d
ZdddZdS )BaseRPCRequestBuilderrZ   r:   r=   r   c                 G  sf   t |ddi\}}}}| jjd|d| j_| jjdr+| jjd  d7  < | S d| jjd< | S )zRun a SELECT query.

        Args:
            *columns: The names of the columns to fetch.
        Returns:
            :class:`BaseSelectRequestBuilder`
        rf   Nrk   rl   z,return=representationzreturn=representation)ro   rM   r,   r   r   r-   )rA   rZ   r+   r,   r-   r.   r3   r3   r4   rk   z  s   zBaseRPCRequestBuilder.selectc                 C     d| j 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+jsonAcceptrM   r-   rG   r3   r3   r4   single  s   zBaseRPCRequestBuilder.singlec                 C  r4  )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.r5  r6  r7  rG   r3   r3   r4   maybe_single     z"BaseRPCRequestBuilder.maybe_singlec                 C  r4  )zASpecify that the query must retrieve data as a single CSV string.ztext/csvr6  r7  rG   r3   r3   r4   csv  r:  zBaseRPCRequestBuilder.csvN)rZ   r:   r=   r   )r=   r   )r/   r0   r1   rk   r8  r9  r;  r3   r3   r3   r4   r3  y  s
    


	r3  )r.   rN   )rZ   r\   r=   r:   )rZ   r:   rf   rh   rg   ri   r=   r*   )r.   r#   rf   rh   rq   r(   rr   rs   rp   rs   r=   r*   )r.   r#   rf   rh   rq   r(   r~   rs   r}   r:   rp   rs   r=   r*   )r.   r#   rf   rh   rq   r(   r=   r*   )rf   rh   rq   r(   r=   r*   )C
__future__r   r.   sysr   rer   typingr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   httpxr   r   r   r   r   r   rD   pydanticr   r   yarlr   version_infor   typing_extensionsr   ImportErrorr    base_clientr"   typesr#   r$   r%   r&   r'   r(   utilsr)   r*   r5   r6   r[   re   ro   r|   r   r   r   r   r   r   r#  r3  r3   r3   r3   r4   <module>   sV    @
 
#


6  "I