o
    wiYb                     @  s  U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlmZm	Z	 d dl
mZmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZ d dlmZmZmZ d d	lmZ d d
lmZ ddlm Z  ddl!m"Z" ddl#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/m0Z0 erddl1m2Z3 ddl4m5Z5 e6e7Z8de9d< ede:f Z;e<e=e>fZ?de9d< i ddddddddddddd dd!dd"dd#dd$d%d&d%d'd%d(d%d)d%d*d%d+d%Z@d,e9d-< i dd.dd/dd0dd1dd2dd2d d3d!d4d"d5d#d6d$d7d&d8d'd9d(d:d)d;d*d<d+d=ZAd>e9d?< eB ZCed@ ZDG dAdB dBZEdzdKdLZFd{dNdOZGd|dRdSZHG dTd deZIG dUdV dVeIZJG dWdX dXeJZKG dYdZ dZeJZLG d[d\ d\eJZMG d]d^ d^eJZNG d_d` d`eJZOG dadb dbeJZPG dcdd ddeIZQed}dhdiZReRSejd~dldmZTeRSe jUddodpZVeRSe jWddrdsZXeRSejYddudvZZddxdyZ[dS )    )annotationsN)ABCabstractmethod)TYPE_CHECKINGAnyUnionMappingIterable
ForwardRefcast)timezone)indent)singledispatch)Literal	TypeGuardoverride)	BaseModel)	FieldInfo   )fields)PrismaMethod)InvalidModelErrorUnknownModelErrorUnknownRelationalFieldError)get_argsis_union
get_originmodel_fieldsmodel_field_type)is_list_type)QUERY_BUILDER_ALIASES_PrismaModel)Serializablezlogging.LoggerlogAbstractNodeztuple[type[Any], ...]	ITERABLEScreatemutationdeleteupdateZupsert	query_rawquery_firstZcreate_manyexecute_rawZdelete_manyZupdate_manycountqueryZgroup_byZ	find_manyZ
find_firstZfind_first_or_raiseZfind_uniqueZfind_unique_or_raisezdict[PrismaMethod, Operation]METHOD_OPERATION_MAPPINGzcreateOne{model}zdeleteOne{model}zupdateOne{model}zupsertOne{model}ZqueryRawzcreateMany{model}Z
executeRawzdeleteMany{model}zupdateMany{model}zaggregate{model}zgroupBy{model}zfindMany{model}zfindFirst{model}zfindFirst{model}OrThrowzfindUnique{model}zfindUnique{model}OrThrowzdict[PrismaMethod, str]METHOD_FORMAT_MAPPING)r/   r(   c                   @  s   e Zd ZU ded< 	 ded< 	 ded< 	 ded< 	 d	ed
< 	 ded< 	 ded< 	 ded< 	 ded< 	 dZdddd,ddZd-ddZd-ddZd.d d!Zd/d$d%Z	d0d(d)Z
d1d*d+ZdS )2QueryBuilderr   methodstrmethod_format	Operation	operationtype[PrismaModel] | Nonemodeldict[str, Any] | Noneincludedict[str, Any]	argumentslist[str] | Noneroot_selectionset[str]prisma_modelsdict[str, dict[str, str]]relational_field_mappings)	r3   r5   r7   r9   r;   r=   r?   rA   rC   N)r9   r?   type[BaseModel] | NonereturnNonec                C  s   || _ t| | _t| | _|| _|| _|| _| | | _	}|
dd | _|d u s-|dv r2d | _d S t|r;t|ds?t||| _d S )Nr;      r-   r,   r+   __prisma_model__)r3   r1   r5   r0   r7   r?   rA   rC   _transform_aliasesr=   popr;   r9   _is_prisma_model_typehasattrr   )selfr3   r=   rA   rC   r9   r?   args rO   F/home/app/Keep/.python/lib/python3.10/site-packages/prisma/_builder.py__init__~   s   




zQueryBuilder.__init__c                 C  s   i | j |  d}t|S )z8Build the payload that should be sent to the QueryEngine)	variablesZoperation_namer/   )r7   build_querydumps)rM   datarO   rO   rP   build   s
   zQueryBuilder.buildc                 C  s   |    }td| |S )ar  Build the GraphQL query

        Example query:

        query {
          result: findUniqueUser
          (
            where: {
              id: "ckq23ky3003510r8zll5m2hma"
            }
          )
          {
            id
            name
            profile {
              id
              user_id
              bio
            }
          }
        }
        zGenerated query: 
%s)_create_root_noderenderr$   debug)rM   r/   rO   rO   rP   rS      s   zQueryBuilder.build_query
'RootNode'c                 C  s<   t | d}|t|  |tj| | j| j| jd |S )N)builderr9   r;   r?   )RootNodeadd
ResultNoder'   	Selectionr9   r;   r?   )rM   rootrO   rO   rP   rW      s   
zQueryBuilder._create_root_nodetype[PrismaModel]	list[str]c                   sN   t  dt}|tu rt  j}|| jvrt| fddt  D S )zReturns a list of all the scalar fields of a model

        Raises UnknownModelError if the current model cannot be found.
        rH   c                   s"   g | ]\}}t || d s|qS )nameparent)_field_is_prisma_model).0fieldinfor9   rO   rP   
<listcomp>   s    z3QueryBuilder.get_default_fields.<locals>.<listcomp>)getattrMISSINGr   rH   rA   r   r   items)rM   r9   re   rO   rk   rP   get_default_fields   s   


zQueryBuilder.get_default_fieldscurrent_modelri   c              
   C  s   t |dt}|tu rt|tt|}z| j| }W n ty+ } zt||d}~ww ||vr7t|j	|dzt
|| }W n tyS } zt|j	|d|d}~ww t|||d}|sgtd| dd |S )zReturns the model that the field is related to.

        Raises UnknownModelError if the current model is invalid.
        Raises UnknownRelationalFieldError if the field does not exist.
        rH   N)r9   ri   rd   zThe `z2` field doesn't appear to be a Prisma Model type. z\Is the field a pydantic.BaseModel type and does it have a `__prisma_model__` class variable?)rm   rn   r   r   r4   rC   KeyErrorr   r   __name__r   _prisma_model_for_fieldRuntimeError)rM   rq   ri   re   Zmappingsexcrj   r9   rO   rO   rP   get_relational_model   s4   


z!QueryBuilder.get_relational_modelc                   sn   t  }| D ]-\}}t||}t|t r j|d||< qt|tr0 fdd|D ||< q|||< q|S )zVTransform dict keys to match global aliases

        e.g. order_by -> orderBy
        r=   c                   s$   g | ]}t |tr |n|qS rO   )
isinstancedictrI   )rh   rU   rM   rO   rP   rl     s    z3QueryBuilder._transform_aliases.<locals>.<listcomp>)rz   ro   r    getry   rI   r&   )rM   r=   ZtransformedkeyvaluealiasrO   r{   rP   rI     s   



zQueryBuilder._transform_aliases)r3   r   r=   r<   rA   r@   rC   rB   r9   rD   r?   r>   rE   rF   rE   r4   )rE   rZ   )r9   rb   rE   rc   )rq   rb   ri   r4   rE   rb   )r=   r<   rE   r<   )rs   
__module____qualname____annotations__	__slots__rQ   rV   rS   rW   rp   rw   rI   rO   rO   rO   rP   r2   P   s:   
 

	


"r2   ri   r   re   r4   rf   type[BaseModel]rE   r8   c             	   C  s   |j }t| }|d u rtd| d| tt|r t|}n|g}|D ],}t|tr:td| d| d| dt|rH|d urHt|d }t	|drQ|  S q%d S )Nz"Unexpected field type is None for .z"Encountered forward reference for z-; Forward references must be evaluated using z.update_forward_refs()r   rH   )
rs   r   ru   r   r   r   ry   r
   r   rL   )ri   re   rf   cls_nametype_typesrO   rO   rP   rt     s$   


rt   boolc                C  s   t | ||dduS )zWhether or not the given field info represents a model at the database level.

    This will return `True` for cases where the field represents a list of models or a single model.
    rd   N)rt   )ri   re   rf   rO   rO   rP   rg   :  s   rg   r   TypeGuard[type[PrismaModel]]c                 C  s   ddl m} t| |S )Nr   r!   )basesr"   
issubclass)r   r"   rO   rO   rP   rK   B  s   
rK   c                   @  s(   e Zd ZdZed
ddZdddZd	S )r%   rO   rE   
str | Nonec                 C     dS )zbRender the node to a string

        None is returned if the node should not be rendered.
        NrO   r{   rO   rO   rP   rX   K     zAbstractNode.renderr   c                 C  r   )zIf True, rendering of the node is skipped

        Useful for some nodes as they should only actually
        be rendered if they have any children.
        TrO   r{   rO   rO   rP   should_renderS  r   zAbstractNode.should_renderNrE   r   rE   r   )rs   r   r   r   r   rX   r   rO   rO   rO   rP   r%   H  s
    c                   @  s   e Zd ZU dZded< ded< ded< ded< d	Zd
dddd&ddZd'ddZd'ddZe	d'ddZ
d(ddZd)ddZed*d+d$d%ZdS ),Nodez+Base node handling rendering of child nodesr4   joinerr   r2   r[   list[ChildType]children)r   r   r[   r   
z  N)r   r   r   list[ChildType] | NonerE   rF   c                C  s.   || _ || _|| _|d ur|| _d S g | _d S N)r[   r   r   r   )rM   r[   r   r   r   rO   rO   rP   rQ   k  s   zNode.__init__r   c                 C  r   )zlGet the string used to enter the node.

        This string will be rendered *before* the children.
        NrO   r{   rO   rO   rP   enters     z
Node.enterc                 C  r   )zlGet the string used to depart the node.

        This string will be rendered *after* the children.
        NrO   r{   rO   rO   rP   departz  r   zNode.departc                 C  s   |   sdS g }|  }|dur|| | jD ]}d}t|tr$|}n| }|r3|t|| j q|  }|durA|| | j	
|S )a  Render the node and it's children and to string.

        Rendering a node involves 4 steps:

        1. Entering the node
        2. Rendering it's children
        3. Departing the node
        4. Joining the previous steps together into a single string
        N)r   r   appendr   ry   r4   rX   r   r   r   join)rM   stringsZenteredchildcontentZdepartedrO   rO   rP   rX     s$   



zNode.renderr   	ChildTypec                 C  s   | j | dS )zAdd a childN)r   r   )rM   r   rO   rO   rP   r^     s   zNode.addc                 C  s   g S )zCreate the node's children

        If children are passed to the constructor, the children
        returned from this method are used to extend the already
        set children.
        rO   r{   rO   rO   rP   create_children  s   zNode.create_childrenQueryBuilder | Nonekwargsr   'Node'c                 K  s.   | d| | di |}|j|  |S )zvCreate the node and its children

        This is useful for subclasses that add extra attributes in __init__
        r[   NrO   )
setdefaultr   extendr   )clsr[   r   noderO   rO   rP   r'     s   zNode.create)
r[   r2   r   r4   r   r4   r   r   rE   rF   r   )r   r   rE   rF   rE   r   r   )r[   r   r   r   rE   r   )rs   r   r   __doc__r   r   rQ   r   r   r   rX   r^   r   classmethodr'   rO   rO   rO   rP   r   \  s"   
 


#
	r   c                      sF   e Zd ZdZdZedddZedddZed fd	d
Z  Z	S )r]   zsRendered node examples:

    query {
        <children>
    }

    or

    mutation {
        <children>
    }
    rO   rE   r4   c                 C  s   | j j dS )Nz {)r[   r7   r{   rO   rO   rP   r     s   zRootNode.enterc                 C  r   N}rO   r{   rO   rO   rP   r        zRootNode.departc                   s   t   }|std|S )NzCould not generate query.)superrX   ru   rM   r   	__class__rO   rP   rX     s   
zRootNode.renderr   )
rs   r   r   r   r   r   r   r   rX   __classcell__rO   rO   r   rP   r]     s    r]   c                      sR   e Zd ZdZdZdd fd
dZedddZedddZedddZ	  Z
S )r_   z~Rendered node examples:

    result: findUniqueUser
        <children>

    or

    result: executeRaw
        <children>
    rO    r   r4   r   r   rE   rF   c                   s   t  jdd|i| d S )Nr   rO   )r   rQ   )rM   r   r   r   rO   rP   rQ     s   zResultNode.__init__c                 C  s6   | j j}|d ur|j}nd}| j jj|d}d| S )Nr   rk   zresult: )r[   r9   rH   r5   format)rM   r9   Z
model_namer3   rO   rO   rP   r     s   
zResultNode.enterr   c                 C  s   d S r   rO   r{   rO   rO   rP   r     r   zResultNode.departr   c                 C  s   t j| j| jjdgS )Nrx   )	Argumentsr'   r[   r=   r{   rO   rO   rP   r     s
   zResultNode.create_children)r   )r   r4   r   r   rE   rF   r   r   r   )rs   r   r   r   r   rQ   r   r   r   r   r   rO   rO   r   rP   r_     s    
r_   c                      sj   e Zd ZU dZded< dZd fd	d
ZedddZedddZ	edddZ
eddddZ  ZS )r   zRendered node example:

    (
        key1: "1"
        key2: "["John","123"]"
        key3: true
        key4: {
            data: true
        }
    )
    r<   r=   rx   r   r   rE   rF   c                      t  jdi | || _d S NrO   )r   rQ   r=   )rM   r=   r   r   rO   rP   rQ        
zArguments.__init__r   c                 C  
   t | jS r   r   r   r{   rO   rO   rP   r   "     
zArguments.should_renderr4   c                 C  r   )N(rO   r{   rO   rO   rP   r   &  r   zArguments.enterc                 C  r   )N)rO   r{   rO   rO   rP   r   *  r   zArguments.departNr:   r   c              	   C  s   g }| j  D ]T\}}|d u rqt|tr%|t|tj| j|dd qt|t	rO| jj
dv r?|| dtt|  q|t|tj| j|dd q|| dt|  q|S )NrU   r   rG   : )r=   ro   ry   rz   r   KeyDatar'   r[   r&   r3   rT   ListNode)rM   r=   r   argr~   rO   rO   rP   r   .  s   
 
 zArguments.create_children)r=   r<   r   r   rE   rF   r   r   r   )r=   r:   rE   r   rs   r   r   r   r   r   rQ   r   r   r   r   r   r   rO   rO   r   rP   r     s   
 r   c                      sZ   e Zd ZU dZded< dZd fd	d
ZedddZedddZ	edddZ
  ZS )r   zwRendered node example:

    {
        key1: "a"
        key2: 3
        key3: [
            "name"
        ]
    }
    Mapping[str, Any]rU   r   r   r   rE   rF   c                   r   r   r   rQ   rU   )rM   rU   r   r   rO   rP   rQ   X  r   zData.__init__r4   c                 C  r   N{rO   r{   rO   rO   rP   r   \  r   z
Data.enterc                 C  r   r   rO   r{   rO   rO   rP   r   `  r   zData.departr   c              	   C  s   g }| j  D ]=\}}t|tr |t|tj| j|dd qt|t	t
tfr8|t|tj| j|dd q|| dt|  q|S )Nr   r   r   )rU   ro   ry   rz   r   r   r   r'   r[   listtuplesetr   rT   )rM   r   r}   r~   rO   rO   rP   r   d  s   
  zData.create_children)rU   r   r   r   rE   rF   r   r   )rs   r   r   r   r   r   rQ   r   r   r   r   r   rO   rO   r   rP   r   H  s   
 r   c                      sX   e Zd ZU ded< dZdd fddZedddZedddZedddZ	  Z
S )r   Iterable[Any]rU   r   ,
r   r4   r   r   rE   rF   c                   s    t  jdd|i| || _d S )Nr   rO   r   )rM   rU   r   r   r   rO   rP   rQ   x  s   
zListNode.__init__c                 C  r   )N[rO   r{   rO   rO   rP   r   |  r   zListNode.enterc                 C  r   )N]rO   r{   rO   rO   rP   r     r   zListNode.departr   c                 C  sD   g }| j D ]}t|tr|tj| j|d q|t| q|S )Nr   )rU   ry   rz   r   r   r'   r[   rT   )rM   r   itemrO   rO   rP   r     s   

zListNode.create_children)r   )rU   r   r   r4   r   r   rE   rF   r   r   )rs   r   r   r   r   rQ   r   r   r   r   r   rO   rO   r   rP   r   s  s   
 r   c                      s   e Zd ZU dZded< ded< ded< dZ						dd fddZedddZedddZ	edddZ
edddZ  ZS ) r`   a  Represents field selections

    Example no include:

    {
        id
        name
    }

    Example include={'posts': True}

    {
        id
        name
        posts {
            id
            title
        }
    }

    Example include={'posts': {'where': {'title': {'contains': 'Test'}}}}

    {
        id
        name
        posts(
            where: {
                title: {
                    contains: 'Test'
                }
            }
        )
        {
            id
            title
        }
    }
    r8   r9   r:   r;   r>   r?   r\   Nr   r   rE   rF   c                   s(   t  jdi | || _|| _|| _d S r   )r   rQ   r9   r;   r?   )rM   r9   r;   r?   r   r   rO   rP   rQ     s   
zSelection.__init__r   c                 C  r   r   r   r{   rO   rO   rP   r     r   zSelection.should_renderr4   c                 C  r   r   rO   r{   rO   rO   rP   r     r   zSelection.enterc                 C  r   r   rO   r{   rO   rO   rP   r     r   zSelection.departr   c           
      C  s  | j }| j}| j}g }| j}|d ur|| n|d ur$||| |d ur|d u r0td| D ]X\}}|du rR|t	|dt
j|d |j||ddd q4t|tr~| }|dd }	|t	|dtj||d	dt
j||	|j||ddg q4|d
u rq4tdt| d|S )Nz)Cannot include fields when model is None.T )rq   ri   )r;   r9   )sepr   r;   r   rx   Fz0Expected `bool` or `dict` include value but got z	 instead.)r9   r;   r[   r?   r   rp   
ValueErrorro   r   r   r`   r'   rw   ry   rz   copyrJ   r   	TypeErrortype)
rM   r9   r;   r[   r   r?   r}   r~   rN   Znested_includerO   rO   rP   r     sZ   
zSelection.create_children)NNN)
r9   r8   r;   r:   r?   r>   r   r   rE   rF   r   r   r   r   rO   rO   r   rP   r`     s$   
 'r`   c                   @  sH   e Zd ZU dZded< ded< ded< dZddddZedddZdS )r   z3Node for rendering a child node with a prefixed keyr4   r}   r   r   r   )r}   r   r   r   rE   rF   c                 C  s   || _ || _|| _d S r   )r}   r   r   )rM   r}   r   r   rO   rO   rP   rQ   %  s   
zKey.__init__c                 C  s2   | j  }|r| j | j | S | j | j S r   )r   rX   r}   r   r   rO   rO   rP   rX   *  s   
z
Key.renderN)r   )r}   r4   r   r   r   r4   rE   rF   r   )	rs   r   r   r   r   r   rQ   r   rX   rO   rO   rO   rP   r     s   
 r   objr   r#   c                 C  s(   t | r| }nt| }td| d)z@Single dispatch generic function for serializing objects to JSONzType z not serializable)inspectisclassr   r   )r   typrO   rO   rP   
serializer2  s   
r   dtdatetime.datetimec                 C  sT   | j du r| jtjd} n| j tjkr| tj} | jt| jd d d} |  S )zxFormat a datetime object to an ISO8601 string with a timezone.

    This assumes naive datetime objects are in UTC.
    N)tzinfoi  )microsecond)r   replacer   utc
astimezoneintr   	isoformat)r   rO   rO   rP   serialize_datetime=  s   
r   fields.Jsonc                 C  r   )aL  Serialize a Json wrapper to a json string.

    This is used as a hook to override our default behaviour when building
    queries which would treat data like {'hello': 'world'} as a Data node
    when we instead want it to be rendered as a raw json string.

    This should only be used for fields that are of the `Json` type.
    )rT   rU   r   rO   rO   rP   serialize_jsonN  s   

r   fields.Base64c                 C     t | S )z4Serialize a Base64 wrapper object to raw binary datar4   r   rO   rO   rP   serialize_base64[     r   decimal.Decimalc                 C  r   )z&Serialize a Decimal object to a stringr   r   rO   rO   rP   serialize_decimala  r   r   r   c                 K  s*   | dt | dd tj| fi |S )Ndefaultensure_asciiF)r   r   jsonrT   )r   r   rO   rO   rP   rT   g  s   rT   )ri   r   re   r4   rf   r   rE   r8   )ri   r   re   r4   rf   r   rE   r   )r   r   rE   r   )r   r   rE   r#   )r   r   rE   r4   )r   r   rE   r4   )r   r   rE   r4   )r   r   rE   r4   )r   r   r   r   rE   r4   )\
__future__r   r   decimalr   loggingdatetimeabcr   r   typingr   r   r   r   r	   r
   r   r   textwrapr   	functoolsr   Ztyping_extensionsr   r   r   Zpydanticr   Zpydantic.fieldsr   r   r   _typesr   errorsr   r   r   _compatr   r   r   r   r   Z_typingr   
_constantsr    r   r"   ZPrismaModelr   r#   	getLoggerrs   r$   r   r4   r   r   r   r   r&   r0   r1   objectrn   r6   r2   rt   rg   rK   r%   r   r]   r_   r   r   r   r`   r   r   registerr   ZJsonr   ZBase64r   Decimalr   rT   rO   rO   rO   rP   <module>   s    $	
	
 
K
 
b%*;+ 




