
    ,iYb                       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rddl1m2Z3 ddl4m5Z5  ejl                  e7      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@   ZD G dA dB      ZE	 	 	 	 	 	 	 	 d]dCZFd^dDZGd_dEZH G dF de      ZI G dG dHeI      ZJ G dI dJeJ      ZK G dK dLeJ      ZL G dM dNeJ      ZM G dO dPeJ      ZN G dQ dReJ      ZO G dS dTeJ      ZP G dU dVeI      ZQed`dW       ZReRj                  ej                        dadX       ZTeRj                  e j                        dbdY       ZVeRj                  e j                        dcdZ       ZXeRj                  ej                        ddd[       ZZded\Z[y)f    )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updateupsert	query_rawquery_firstcreate_manyexecute_rawdelete_manyupdate_manycountquerygroup_by	find_many
find_firstfind_first_or_raisefind_uniquefind_unique_or_raisezdict[PrismaMethod, Operation]METHOD_OPERATION_MAPPINGzcreateOne{model}zdeleteOne{model}zupdateOne{model}zupsertOne{model}queryRawzcreateMany{model}
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)r4   r)   c                      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ZddZddZddZd dZ	d!dZ
d"dZy)#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)	rA   rC   rE   rG   rI   rK   rM   rO   rQ   N)rG   rM   c               @   || _         t        |   | _        t        |   | _        || _        || _        || _        | j                  |      x| _	        }|j                  dd       | _        ||dv rd | _        y t        |      rt        |d      st        |      || _        y )NrI      r-   r0   r.   __prisma_model__)rA   r>   rC   r;   rE   rM   rO   rQ   _transform_aliasesrK   poprI   rG   _is_prisma_model_typehasattrr   )selfrA   rK   rO   rQ   rG   rM   argss           T/var/www/html/langgraph-service/venv/lib/python3.12/site-packages/prisma/_builder.py__init__zQueryBuilder.__init__~   s     26:1&9,*)B& $ 7 7	 BBxx	40
 =F&QQDJ(/wuFX7Y'..DJ    c                T    i | j                   | j                         d}t        |      S )z8Build the payload that should be sent to the QueryEngine)	variablesoperation_namer4   )rE   build_querydumps)rY   datas     r[   buildzQueryBuilder.build   s-     "nn%%'#

 T{r]   c                n    | j                         j                         }t        j                  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)rY   r4   s     r[   ra   zQueryBuilder.build_query   s/    . &&(//1		)51r]   c                    t        |       }|j                  t        j                  |              |j                  t        j                  | | j
                  | j                  | j                               |S )N)builderrG   rI   rM   )RootNodeadd
ResultNoder(   	SelectionrG   rI   rM   )rY   roots     r[   rf   zQueryBuilder._create_root_node   sc    %""4()jj#22	  	
 r]   c           	        t        |dt              }|t        u rt        |      |j                  }|| j                  vrt        |      t        |      j                         D cg c]  \  }}t        |||      s| c}}S c c}}w )zReturns a list of all the scalar fields of a model

        Raises UnknownModelError if the current model cannot be found.
        rT   nameparent)	getattrMISSINGr   rT   rO   r   r   items_field_is_prisma_model)rY   rG   rs   fieldinfos        r[   get_default_fieldszQueryBuilder.get_default_fields   s    
 u0':7?#E**%%t)))#D))  ,E288:
t)$U5I 
 	
 
s   &Bc                   t        |dt              }|t        u rt        |      t        t        |      }	 | j
                  |   }||vrt        |j                  |      	 t        |      |   }t        |||      }|st        d| ddz         |S # t        $ r}t        |      |d}~ww xY w# t        $ r}t        |j                  |      |d}~ww xY w)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.
        rT   N)rG   ry   rr   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?)ru   rv   r   r   rB   rQ   KeyErrorr   r   __name__r   _prisma_model_for_fieldRuntimeError)rY   current_modelry   rs   mappingsexcrz   rG   s           r[   get_relational_modelz!QueryBuilder.get_relational_model   s     }&8'B7?#M22C	355d;H  -M4J4JRWXX	b.u5D (5OwPQpq 
 %  	3#D)s2	3  	b-M4J4JRWX^aa	bs/   B !B0 	B-B((B-0	C9CCc                `   t               }|j                         D ]  \  }}t        j                  ||      }t	        |t               r| j                  |      ||<   Bt	        |t              r5|D cg c]%  }t	        |t               r| j                  |      n|' c}||<   |||<    |S c c}w )zVTransform dict keys to match global aliases

        e.g. order_by -> orderBy
        rK   )dictrw   r!   get
isinstancerU   r'   )rY   rK   transformedkeyvaluealiasrc   s          r[   rU   zQueryBuilder._transform_aliases  s    
 f#//+ 	+JC)--c37E%&%)%<%<u%<%ME"E9-
 !&& 6@d5KD++D1QUU&E"
 &+E"	+ &s   1*B+)rA   r   rK   rJ   rO   rN   rQ   rP   rG   ztype[BaseModel] | NonerM   rL   returnNoner   rB   )r   z
'RootNode')rG   type[PrismaModel]r   z	list[str])r   r   ry   rB   r   r   )rK   rJ   r   rJ   )r~   
__module____qualname____annotations__	__slots__r\   rd   ra   rf   r{   r   rU    r]   r[   r@   r@   P   s    Sh8##
 #"?($$">88

I& )-+/  "	
   $= & ) 
<6
* Dr]   r@   c          
     L   |j                   }t        |       }|t        d| d|       t        t	        |            rt        |      }n|g}|D ]R  }t        |t              rt        d| d| d| d      t        |      r|t        |      d   }t        |d      sP|c S  y )Nz"Unexpected field type is None for .z"Encountered forward reference for z-; Forward references must be evaluated using z.update_forward_refs()r   rT   )
r~   r   r   r   r   r   r   r   r    rX   )ry   rs   rt   cls_nametype_typess         r[   r   r     s     HU#E}?z4&QRR 
5!" 
eZ(4XJavErs{r|  }S  T  5#4UOA&E5,-L
 r]   c               "    t        | ||      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.
    rr   N)r   )ry   rs   rt   s      r[   rx   rx   :  s    
 #5tFC4OOr]   c                &    ddl m} t        | |      S )Nr   r"   )basesr#   
issubclass)r   r#   s     r[   rW   rW   B  s    #e\**r]   c                  *    e Zd ZdZedd       ZddZy)r&   r   c                     y)zbRender the node to a string

        None is returned if the node should not be rendered.
        Nr   rY   s    r[   rg   zAbstractNode.renderK  s     	r]   c                     y)zIf True, rendering of the node is skipped

        Useful for some nodes as they should only actually
        be rendered if they have any children.
        Tr   r   s    r[   should_renderzAbstractNode.should_renderS  s     r]   Nr   z
str | Noner   bool)r~   r   r   r   r   rg   r   r   r]   r[   r&   r&   H  s    I r]   c                      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ZddZddZe	dd       Z
ddZddZeddd       Zy)Nodez+Base node handling rendering of child nodesrB   joinerr   r@   rj   list[ChildType]children)r   r   rj   r   
z  N)r   r   r   c               P    || _         || _        || _        ||| _        y g | _        y N)rj   r   r   r   )rY   rj   r   r   r   s        r[   r\   zNode.__init__k  s+     $,$8br]   c                     y)zlGet the string used to enter the node.

        This string will be rendered *before* the children.
        Nr   r   s    r[   enterz
Node.enters      
 r]   c                     y)zlGet the string used to depart the node.

        This string will be rendered *after* the children.
        Nr   r   s    r[   departzNode.departz  r   r]   c                   | j                         syg }| j                         }||j                  |       | j                  D ]O  }d}t	        |t
              r|}n|j                         }|s+|j                  t        || j                               Q | j                         }||j                  |       | j                  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   r   rB   rg   r   r   r   join)rY   stringsenteredchildcontentdeparteds         r[   rg   zNode.render  s     !!#**,NN7#]] 		=E"&G%%,,.vgt{{;<		= ;;=NN8${{((r]   c                :    | j                   j                  |       y)zAdd a childN)r   r   )rY   r   s     r[   rm   zNode.add  s    U#r]   c                    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.
        r   r   s    r[   create_childrenzNode.create_children  s	     	r]   c                    |j                  d|        | di |}|j                  j                  |j                                |S )zvCreate the node and its children

        This is useful for subclasses that add extra attributes in __init__
        rj   r   )
setdefaultr   extendr   )clsrj   kwargsnodes       r[   r(   zNode.create  s?     	)W-}V}T1134r]   )
rj   r@   r   rB   r   rB   r   zlist[ChildType] | Noner   r   r   )r   	ChildTyper   r   r   r   r   )rj   zQueryBuilder | Noner   r   r   z'Node')r~   r   r   __doc__r   r   r\   r   r   r   rg   rm   r   classmethodr(   r   r]   r[   r   r   \  s    5KKI 7;$swA#A03ADGAZpA	A !) !)F$  r]   r   c                  V     e Zd ZdZdZedd       Zedd       Zed fd       Z xZ	S )rl   zsRendered node examples:

    query {
        <children>
    }

    or

    mutation {
        <children>
    }
    r   c                4    | j                   j                   dS )Nz {)rj   rE   r   s    r[   r   zRootNode.enter  s    ,,(()--r]   c                     yN}r   r   s    r[   r   zRootNode.depart      r]   c                >    t         |          }|st        d      |S )NzCould not generate query.)superrg   r   )rY   r   	__class__s     r[   rg   zRootNode.render  s%    '." :;;r]   r   )
r~   r   r   r   r   r   r   r   rg   __classcell__r   s   @r[   rl   rl     sI     I. .   	 	r]   rl   c                  `     e Zd ZdZdZdd fdZed	d       Zed
d       Zedd       Z	 xZ
S )rn   z~Rendered node examples:

    result: findUniqueUser
        <children>

    or

    result: executeRaw
        <children>
    r   c                (    t        |   dd|i| y )Nr   r   )r   r\   )rY   r   r   r   s      r[   r\   zResultNode.__init__  s    11&1r]   c                    | j                   j                  }||j                  }nd}| j                   j                  j	                  |      }d| S )N )rG   zresult: )rj   rG   rT   rC   format)rY   rG   
model_namerA   s       r[   r   zResultNode.enter  sQ    ""//JJ++222D&""r]   c                     y r   r   r   s    r[   r   zResultNode.depart  s    r]   c                n    t         j                  | j                  | j                  j                        gS )Nr   )	Argumentsr(   rj   rK   r   s    r[   r   zResultNode.create_children  s5     ,,00  
 	
r]   )r   )r   rB   r   r   r   r   r   r   r   )r~   r   r   r   r   r\   r   r   r   r   r   r   s   @r[   rn   rn     sP    	 I2 # #   
 
r]   rn   c                  ~     e Zd ZU dZded<   dZd
 fdZedd       Zedd       Z	edd       Z
eddd	       Z xZS )r   zRendered node example:

    (
        key1: "1"
        key2: "["John","123"]"
        key3: true
        key4: {
            data: true
        }
    )
    rJ   rK   r   c                2    t        |   di | || _        y Nr   )r   r\   rK   )rY   rK   r   r   s      r[   r\   zArguments.__init__  s    "6""r]   c                ,    t        | j                        S r   r   r   r   s    r[   r   zArguments.should_render"      DMM""r]   c                     y)N(r   r   s    r[   r   zArguments.enter&  r   r]   c                     y)N)r   r   s    r[   r   zArguments.depart*  r   r]   c           
     H   g }| j                   j                         D ]  \  }}|
t        |t              r<|j	                  t        |t        j                  | j                  |                   Vt        |t              r}| j                  j                  dv r)|j	                  | dt        t        |                    |j	                  t        |t        j                  | j                  |                   |j	                  | dt        |               |S )Nrc   r   rS   : )rK   rw   r   r   r   KeyDatar(   rj   r'   rA   rb   ListNode)rY   rK   r   argr   s        r[   r   zArguments.create_children.  s    $&....0 	:JC}%&Cdkk$,,Uk.S TUE9-
 <<&&*UUOOse2eE%L.A-B$CDOOC(//$,,UZ/2[$\]3%r%, 89#	:& r]   )rK   rJ   r   r   r   r   r   r   r   )rK   rH   r   r   r~   r   r   r   r   r   r\   r   r   r   r   r   r   r   s   @r[   r   r     sj    
 I# # #      r]   r   c                  j     e Zd ZU dZded<   dZd	 fdZed
d       Zed
d       Z	edd       Z
 xZS )r   zwRendered node example:

    {
        key1: "a"
        key2: 3
        key3: [
            "name"
        ]
    }
    Mapping[str, Any]rc   r   c                2    t        |   di | || _        y r   r   r\   rc   )rY   rc   r   r   s      r[   r\   zData.__init__X  s    "6"	r]   c                     yN{r   r   s    r[   r   z
Data.enter\  r   r]   c                     yr   r   r   s    r[   r   zData.depart`  r   r]   c           
        g }| j                   j                         D ]  \  }}t        |t              r<|j	                  t        |t        j                  | j                  |                   Rt        |t        t        t        f      r<|j	                  t        |t        j                  | j                  |                   |j	                  | dt        |               |S )Nr   r   r   )rc   rw   r   r   r   r   r   r(   rj   listtuplesetr   rb   )rY   r   r   r   s       r[   r   zData.create_childrend  s    $&))//+ 	:JC%&Cdkk$,,Uk.S TUED%#56ChoodllQVo.W XY3%r%, 89	: r]   )rc   r   r   r   r   r   r   r   )r~   r   r   r   r   r   r\   r   r   r   r   r   r   s   @r[   r   r   H  sV    	 I      r]   r   c                  h     e Zd ZU ded<   dZdd	 fdZed
d       Zed
d       Zedd       Z	 xZ
S )r   Iterable[Any]rc   r   c                6    t        |   dd|i| || _        y )Nr   r   r   )rY   rc   r   r   r   s       r[   r\   zListNode.__init__x  s    11&1	r]   c                     y)N[r   r   s    r[   r   zListNode.enter|  r   r]   c                     y)N]r   r   s    r[   r   zListNode.depart  r   r]   c                    g }| j                   D ]]  }t        |t              r1|j                  t        j                  | j                  |             D|j                  t        |             _ |S )Nr   )rc   r   r   r   r   r(   rj   rb   )rY   r   items      r[   r   zListNode.create_children  sX    $&II 	-D$%DLLt DEd,		- r]   )z,
)rc   r   r   rB   r   r   r   r   r   r   )r~   r   r   r   r   r\   r   r   r   r   r   r   s   @r[   r   r   s  sO    
I     	 	r]   r   c                       e Zd ZU dZded<   ded<   ded<   dZ	 	 	 d	 	 	 	 	 	 	 	 	 d fd	Zedd
       Zedd       Z	edd       Z
edd       Z xZS )ro   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
        }
    }
    rF   rG   rH   rI   rL   rM   rk   c                N    t        |   di | || _        || _        || _        y r   )r   r\   rG   rI   rM   )rY   rG   rI   rM   r   r   s        r[   r\   zSelection.__init__  s+     	"6"
,r]   c                ,    t        | j                        S r   r   r   s    r[   r   zSelection.should_render  r   r]   c                     yr   r   r   s    r[   r   zSelection.enter  r   r]   c                     yr   r   r   s    r[   r   zSelection.depart  r   r]   c                   | j                   }| j                  }| j                  }g }| j                  }||j	                  |       n"| |j	                  |j                  |             ||t        d      |j                         D ]  \  }}|du rE|j                  t        |dt        j                  |d |j                  ||                         Ot        |t              r~|j                         }|j!                  dd       }	|j	                  t        |dt"        j                  ||	            t        j                  ||	|j                  ||            g       |d
u rt%        dt'        |       d       |S )Nz)Cannot include fields when model is None.T )r   ry   )rI   rG   )sepr   rI   r   r   Fz0Expected `bool` or `dict` include value but got z	 instead.)rG   rI   rj   rM   r   r{   
ValueErrorrw   r   r   ro   r(   r   r   r   copyrV   r   	TypeErrortype)
rY   rG   rI   rj   r   rM   r   r   rZ   nested_includes
             r[   r   zSelection.create_children  s   

,,,,$&
 ,,%OON+OOG66u=>} !LMM%mmo $o
UD=OO #!*!1!1 '(,&-&B&BQV^a&B&b "2 "
  t, !::<D%)XXi%>NOO #$&%.%5%5g%5%N
 &,, '(6&-&B&BQV^a&B&b -  e^#&VW[\aWbVccl$mnnI$oL r]   )NNN)
rG   rF   rI   rH   rM   rL   r   r   r   r   r   r   r   r   r   s   @r[   ro   ro     s    %N $#""$$I +/)-+/	
-'
- '
- )	
-
 
- 

- # #     9 9r]   ro   c                  P    e Zd ZU dZded<   ded<   ded<   dZdddZedd	       Zy
)r   z3Node for rendering a child node with a prefixed keyrB   r   r  r   r   )r   r  r   c                .    || _         || _        || _        y r   )r   r   r  )rY   r   r   r  s       r[   r\   zKey.__init__%  s    	r]   c                    | j                   j                         }|r| j                   | j                   | S | j                   | j                   S r   )r   rg   r   r  )rY   r   s     r[   rg   z
Key.render*  sI    ))""$hhZz'33((DHH:&&r]   N)r   )r   rB   r   r   r  rB   r   r   r   )	r~   r   r   r   r   r   r\   r   rg   r   r]   r[   r   r     s4    =	H	H
JI
 ' 'r]   r   c                f    t        j                  |       r| }nt        |       }t        d| d      )z@Single dispatch generic function for serializing objects to JSONzType z not serializable)inspectisclassr  r  )objtyps     r[   
serializerr  2  s3     s3i
eC5 12
33r]   c                J   | j                   !| j                  t        j                        } n<| j                   t        j                  k7  r| j	                  t        j                        } | j                  t        | j                  dz        dz        } | j                         S )zxFormat a datetime object to an ISO8601 string with a timezone.

    This assumes naive datetime objects are in UTC.
    )tzinfoi  )microsecond)r  replacer   utc
astimezoneintr  	isoformat)dts    r[   serialize_datetimer%  =  su     
yyZZx||Z,	hll	"]]8<<( 
BNNT$9 :T A	BB<<>r]   c                ,    t        | j                        S )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.
    )rb   rc   r  s    r[   serialize_jsonr(  N  s     ?r]   c                    t        |       S )z4Serialize a Base64 wrapper object to raw binary datarB   r'  s    r[   serialize_base64r+  [       s8Or]   c                    t        |       S )z&Serialize a Decimal object to a stringr*  r'  s    r[   serialize_decimalr.  a  r,  r]   c                ~    |j                  dt               |j                  dd       t        j                  | fi |S )Ndefaultensure_asciiF)r   r  jsonrb   )r  r   s     r[   rb   rb   g  s6    
i,
ne,::c$V$$r]   )ry   r   rs   rB   rt   type[BaseModel]r   rF   )ry   r   rs   rB   rt   r3  r   r   )r   r3  r   zTypeGuard[type[PrismaModel]])r  r   r   r$   )r$  zdatetime.datetimer   rB   )r  zfields.Jsonr   rB   )r  zfields.Base64r   rB   )r  zdecimal.Decimalr   rB   )r  r   r   r   r   rB   )\
__future__r   r2  decimalr  loggingdatetimeabcr   r   typingr   r   r   r	   r
   r   r   r   textwrapr   	functoolsr   typing_extensionsr   r   r   pydanticr   pydantic.fieldsr   r   r   _typesr   errorsr   r   r   _compatr   r   r   r   r   _typingr    
_constantsr!   r   r#   PrismaModelr   r$   	getLoggerr~   r%   r   rB   r   r   r   r   r'   r;   r>   objectrv   rD   r@   r   rx   rW   r&   r   rl   rn   r   r   r   ro   r   r  registerr%  Jsonr(  Base64r+  Decimalr.  rb   r   r]   r[   <module>rK     s   "      # Q Q Q   $ : :  %    U U S S ! -2# (g''1^ 1.#%&	$(%#5	  5;j;j; j; j	;
 ; :; :; :; :; :; W; ; ; '; 7;  7!;" G#; 7 (2 2 2  2  	2
 2 :2 &2 <2 &2 &2 2  2 "2 $2 42  &!2" 6#2 . ( ('(	G GT  	
 @P+3 (_< _D"t "J'
 '
T8 8v(4 (Vt <D DN', '4 4 4 X&&' (  V[[!	 "	 V]]# $
 W__% &
%r]   