o
    /hZ                     @  s  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y]   d d	lmZ Y nw zd d
lmZ W n eyu   d dlmZ Y nw 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Z*ddd>ddZ+ddd?d%d&Z,d'dd(d@d+d,Z-dAd.d/Z.dBd0d1Z/ed2Z0G d3d4 d4ee	e0 Z1G d5d6 d6e1e0 e	e0 Z2G d7d8 d8e	e0 Z3G d9d: d:e3e0 Z4G d;d< d<e4e0 Z5dS )C    )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*   W/var/www/html/govbot/env/lib/python3.10/site-packages/postgrest/base_request_builder.pyr!   )   s
   
 r!   r%   
List[Dict]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%   unique_keyscolumnsr*   r*   r+   _unique_columns1   s   r9   )countr8   strr:   Optional[CountMethod]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selectr2   Prefercount=)r   GETr   r6   HEADr   r!   )r:   r8   r"   r#   r$   r*   r*   r+   
pre_select7   s   rC   T)default_to_nullUnion[dict, list]	returningr   upsertboolrD   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=r@   zresolution=merge-duplicatesmissing=defaultr?   r2   r8   
appendr   r6   
isinstancelistr9   r!   r   POSTr   )r%   r:   rF   rG   rD   prefer_headersr$   query_paramsr*   r*   r+   
pre_insertE   s   


rR    )on_conflictrD   ignore_duplicatesrT   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 )NrI   r@   ignoremergezresolution=z-duplicatesrJ   r?   r2   rT   r8   rK   )
r%   r:   rF   rU   rT   rD   rQ   rP   
resolutionr$   r*   r*   r+   
pre_upsert\   s   	

rY   dictc                C  sD   d| g}|r| d|  tdd|i}ttjt || S NrI   r@   r?   r2   )rL   r   r6   r!   r   PATCHr   )r%   r:   rF   rP   r$   r*   r*   r+   
pre_updatev   s
   r]   c                 C  sD   d| g}| r| d|   tdd|i}ttjt |i S r[   )rL   r   r6   r!   r   DELETEr   )r:   rF   rP   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Z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[_ReturnT]dataNOptional[int]r:   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.)rM   rZ   get
ValueError)rd   rf   r*   r*   r+   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)rk   content_ranger*   r*   r+   $_get_count_from_content_range_header   s   
z0APIResponse._get_count_from_content_range_headerprefer_headerrH   c                 C  s*   dd dd tD  d}tt|| S )Nzcount=(|c                 S  s   g | ]}|j qS r*   )rf   )r.   cmr*   r*   r+   r5      s    z:APIResponse._is_count_in_prefer_header.<locals>.<listcomp>))r6   r   rH   r   )rs   patternr*   r*   r+   _is_count_in_prefer_header   s   z&APIResponse._is_count_in_prefer_headerrequest_responseRequestResponsec                 C  sB   |j jd}|sd S | |}|jd}|r|r| |S d S )Npreferzcontent-range)requestr$   rh   rx   rr   )rd   ry   rs   is_count_in_prefer_headerrk   r*   r*   r+   %_get_count_from_http_request_response   s   

z1APIResponse._get_count_from_http_request_responser   c                 C  sF   z|  }W n ty   | g dd Y S w | |}| t ||dS Nr   )rb   r:   )r%   r   r~   r`   )rd   ry   rb   r:   r*   r*   r+   from_http_request_response   s   
z&APIResponse.from_http_request_responserZ   Dict[str, Any]c                 C  T   |  }t|dkrd|v rd|v rd|v sJ | t |d|d|ddS N   rb   r:   error)rb   r:   r   r-   ro   r`   rh   rd   rZ   r-   r*   r*   r+   	from_dict   
   (zAPIResponse.from_dict)rd   re   rf   r   r=   r   )rk   r;   r=   rc   )rs   r;   r=   rH   )rd   re   ry   rz   r=   rc   rd   re   ry   rz   r=   r   rd   re   rZ   r   r=   r   )r&   r'   r(   r)   r:   r   classmethodrj   staticmethodrr   rx   r~   r   r   r*   r*   r*   r+   ra      s$   
 ra   c                   @  s4   e Zd ZU ded< 	 edd	d
ZedddZdS )SingleAPIResponser`   rb   rd   re   ry   rz   r=   r   c                 C  sR   |  |}z| }W n ty    t|jdkr|jng }Y nw | t ||dS r   )r~   r%   r   ro   textr`   )rd   ry   r:   rb   r*   r*   r+   r      s   
z,SingleAPIResponse.from_http_request_responserZ   r   c                 C  r   r   r   r   r*   r*   r+   r      r   zSingleAPIResponse.from_dictNr   r   )r&   r'   r(   r)   r   r   r   r*   r*   r*   r+   r      s   
 
r   c                   @  s  e Zd Zdkd	d
ZedlddZdmddZdnddZdnddZdnddZ	dnddZ
dndd Zdnd!d"Zdnd#d$Zdod&d'Zdod(d)Zdod*d+Zdod,d-Zdod.d/Zdod0d1Zdpdqd6d7Zdrd9d:Zdrd;d<Zdrd=d>Zdrd?d@ZdsdCdDZdsdEdFZdsdGdHZdtdJdKZdtdLdMZdudNdOZdvdRdSZdvdTdUZ dvdVdWZ!dvdXdYZ"dvdZd[Z#dvd\d]Z$dvd^d_Z%dvd`daZ&dvdbdcZ'dvdddeZ(dsdfdgZ)dwdidjZ*d2S )xBaseFilterRequestBuildersessionUnion[AsyncClient, SyncClient]r$   r   r#   r   r=   Nonec                 C  s   || _ || _|| _d| _d S )NF)r   r$   r#   negate_nextselfr   r$   r#   r*   r*   r+   __init__   s   
z!BaseFilterRequestBuilder.__init__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_columnr;   operatorcriteriac                 C  sL   | j du 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   r0   valr*   r*   r+   filter  s   
zBaseFilterRequestBuilder.filterrf   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r   r   rf   r*   r*   r+   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   r*   r*   r+   neq  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   r*   r*   r+   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   r*   r*   r+   gte+  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   r*   r*   r+   lt4  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   r*   r*   r+   lte=  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   r*   r*   r+   is_F  s   zBaseFilterRequestBuilder.is_rw   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r   r   rw   r*   r*   r+   likeQ  r   zBaseFilterRequestBuilder.likec                 C     |  |tjd| dS r   {})r   r   LIKE_ALLr   r*   r*   r+   like_all_ofZ     z$BaseFilterRequestBuilder.like_all_ofc                 C  r   r   )r   r   LIKE_ANYr   r*   r*   r+   like_any_ofd  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   r*   r*   r+   ilike_all_ofn  r   z%BaseFilterRequestBuilder.ilike_all_ofc                 C  r   r   )r   r   	ILIKE_ANYr   r*   r*   r+   ilike_any_ofx  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   r*   r*   r+   ilike  r   zBaseFilterRequestBuilder.ilikeNfiltersreference_tableUnion[str, None]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(rv   )r    r#   r   )r   r   r   r0   r*   r*   r+   or_  s   zBaseFilterRequestBuilder.or_queryc                 C  r   N)r   r   FTSr   r   r   r*   r*   r+   fts     zBaseFilterRequestBuilder.ftsc                 C  r   r   )r   r   PLFTSr   r*   r*   r+   plfts  r   zBaseFilterRequestBuilder.plftsc                 C  r   r   )r   r   PHFTSr   r*   r*   r+   phfts  r   zBaseFilterRequestBuilder.phftsc                 C  r   r   )r   r   WFTSr   r*   r*   r+   wfts  r   zBaseFilterRequestBuilder.wftsvaluesIterable[Any]c                 C  s,   t t|}d|}| |tjd| dS )Nr2   r   rv   )mapr    r6   r   r   INr   r   r   r*   r*   r+   in_  s   

zBaseFilterRequestBuilder.in_c                 C  "   d |}| |tjd| dS Nr2   r   r   )r6   r   r   CSr   r*   r*   r+   cs     
zBaseFilterRequestBuilder.csc                 C  r   r   )r6   r   r   CDr   r*   r*   r+   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   )
rM   r;   r   r   r   rZ   r   r6   r%   dumpsr   r   rf   stringified_valuesr*   r*   r+   contains  s   

z!BaseFilterRequestBuilder.containsc                 C  r   r   )
rM   r;   r   r   r   rZ   r   r6   r%   r   r   r*   r*   r+   contained_by  s   

z%BaseFilterRequestBuilder.contained_byc                 C  r   r   )
rM   r;   r   r   OVrZ   r   r6   r%   r   r   r*   r*   r+   ov  s   

zBaseFilterRequestBuilder.ovrangeTuple[int, int]c              	   C  &   |  |tjd|d  d|d  dS Nr   r   r2   r   rv   )r   r   SLr   r   r   r*   r*   r+   sl     &zBaseFilterRequestBuilder.slc              	   C  r   r   )r   r   SRr   r*   r*   r+   sr  r   zBaseFilterRequestBuilder.src              	   C  r   r   )r   r   NXLr   r*   r*   r+   nxl  r   zBaseFilterRequestBuilder.nxlc              	   C  r   r   )r   r   NXRr   r*   r*   r+   nxr  r   zBaseFilterRequestBuilder.nxrc              	   C  r   r   )r   r   ADJr   r*   r*   r+   adj  r   zBaseFilterRequestBuilder.adjc                 C     |  ||S r   )r   r   r*   r*   r+   range_gt     z!BaseFilterRequestBuilder.range_gtc                 C  r   r   )r   r   r*   r*   r+   	range_gte  r  z"BaseFilterRequestBuilder.range_gtec                 C  r   r   )r   r   r*   r*   r+   range_lt  r  z!BaseFilterRequestBuilder.range_ltc                 C  r   r   )r   r   r*   r*   r+   	range_lte  r  z"BaseFilterRequestBuilder.range_ltec                 C  r   r   )r   r   r*   r*   r+   range_adjacent  r  z'BaseFilterRequestBuilder.range_adjacentc                 C  r   r   )r   r   r*   r*   r+   overlaps  r  z!BaseFilterRequestBuilder.overlapsr   c                 C  s2   | }|st d| D ]
\}}| ||}q|S )Nz;query dictionary should contain at least one key-value pair)ri   itemsr   )r   r   updated_queryr0   rf   r*   r*   r+   match  s   zBaseFilterRequestBuilder.match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;   rf   r   r=   r   )r   r   r   r;   rw   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;   rf   r   r=   r   )r   r   r   r;   rf   r   r=   r   )r   r   r   r;   r   r   r=   r   )r   r   r   r   r=   r   )+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      sR    



	
	
	
	
	
	

	







	




















r   c                   @  sj   e Zd Zd/d	d
Z						d0d1ddZddddd2d!d"Zdd#d3d&d'Zd4d)d*Z	d5d6d-d.ZdS )7BaseSelectRequestBuilderr   r   r$   r   r#   r   r=   r   c                 C     t tt | ||| d S r   )r   r   r`   r   r   r*   r*   r+   r        	z!BaseSelectRequestBuilder.__init__Fr   r   r   analyzerH   verbosesettingsbufferswalformatLiteral['text', 'json']c           	      C  s8   dd t   D }d|}d| d| | jd< | S )Nc                 S  s    g | ]\}}|d vr|r|qS ))r   r  r*   )r.   r0   rf   r*   r*   r+   r5     s
    z4BaseSelectRequestBuilder.explain.<locals>.<listcomp>rt   zapplication/vnd.pgrst.plan+z
; options=Accept)localsr  r6   r$   )	r   r  r  r  r  r  r  optionsoptions_strr*   r*   r+   explain  s   	
z BaseSelectRequestBuilder.explainN)desc
nullsfirstforeign_tabler   r;   r  r  r  Optional[str]c                C  s|   |r|d nd | |rdnd |rdnd |rdnd }| j d}|r4| 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   rS   rv   z.descz.nullsfirstorderr2   )r#   rh   remover   )r   r   r  r  r  new_order_parameterexisting_order_parameterr*   r*   r+   r   $  s    

zBaseSelectRequestBuilder.order)r  sizerp   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.limit_FilterTc                 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startendc                 C  sH   | j |r
| dnd|| _ | j |r| dnd|| d | _ | S )Nz.offsetr)  r%  r&  r   r'  )r   r*  r+  r  r*   r*   r+   r   a  s   
zBaseSelectRequestBuilder.ranger  )FFFFFr   )r   r   r  rH   r  rH   r  rH   r  rH   r  rH   r  r  r=   r   )r   r   r   r;   r  rH   r  rH   r  r  r=   r   )r   r   r$  rp   r  r  r=   r   )r   r(  r$  rp   r=   r(  r   )
r   r   r*  rp   r+  rp   r  r  r=   r   )	r&   r'   r(   r   r  r   r&  r)  r   r*   r*   r*   r+   r    s"    
#
r  c                   @  s>   e Zd Zdd	d
ZdddZdddZdddZdddZdS )BaseRPCRequestBuilderr   r   r$   r   r#   r   r=   r   c                 C  r  r   )r   r  r`   r   r   r*   r*   r+   r   o  r  zBaseRPCRequestBuilder.__init__r8   r;   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`
        r:   Nr>   zreturn=representationr?   )rC   r#   r   rh   r$   )r   r8   r"   r#   r$   r%   r*   r*   r+   r>   |  s   
zBaseRPCRequestBuilder.selectc                 C     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  r-  )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     
z"BaseRPCRequestBuilder.maybe_singlec                 C  r-  )zASpecify that the query must retrieve data as a single CSV string.ztext/csvr  r/  r   r*   r*   r+   csv  r2  zBaseRPCRequestBuilder.csvNr  )r8   r;   r=   r   )r=   r   )r&   r'   r(   r   r>   r0  r1  r3  r*   r*   r*   r+   r,  n  s    



	r,  )r%   r,   )r8   r;   r:   r<   r=   r!   )r%   rE   r:   r<   rF   r   rG   rH   rD   rH   r=   r!   )r%   rE   r:   r<   rF   r   rU   rH   rT   r;   rD   rH   r=   r!   )r%   rZ   r:   r<   rF   r   r=   r!   )r:   r<   rF   r   r=   r!   )6
__future__r   r%   r   rer   typingr   r   r   r   r	   r
   r   r   r   r   r   r   httpxr   r   r   rz   pydanticr   r   ImportErrortyping_extensionsr   r   typesr   r   r   r   utilsr   r   r   r    r!   r9   rC   rR   rY   r]   r_   r`   ra   r   r   r  r,  r*   r*   r*   r+   <module>   sN    8


A  l