o
    8Di                     @  s   U 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 ejr0d dlmZ d dlmZ G dd deZddddZejdd ejdd ejdd ejdd ejdd ejdd ejdd ejdd ejdd ejdd i
Zded< e eZ!dS )     )annotationsN
ParseError)Token	Tokenizer	TokenType)Lit)DialectTypec                   @  s`   e Zd Zejejejejejej	ej
ejejejejejejejdZdejiZdgZdgZdS )JSONPathTokenizer)()[]:,-.?@'"$*..\N)__name__
__module____qualname__r   L_PARENR_PAREN	L_BRACKET	R_BRACKETCOLONCOMMADASHDOTPLACEHOLDER	PARAMETERQUOTEDOLLARSTARSINGLE_TOKENSKEYWORDSIDENTIFIER_ESCAPESSTRING_ESCAPES r/   r/   I/var/www/Datamplify/venv/lib/python3.10/site-packages/sqlglot/jsonpath.pyr
      s(    
r
   pathstrdialectr	   returnexp.JSONPathc              	     sR  ddl m} || }|	t
dd,
fddd-fdd	d-fd
d d.	fddtjd/d0ddtjd1d2ddd1 fdd	d3 	fddd3fdd d4fd"d#d5	fd$d%}tj	 t
 g} r#tjstjr؈ jd&k}tjr| }ntjr j}ntjrt
 }nd'}|r|t
j|d( nZ|r|t
j|d( nNtd)tjr|  n<tjr|t
j| d( n,tjr|t
j jd( ntjr|t
  ntd* j  st
j|d+S )6zETakes in a JSON path string and parses it into a JSONPath expression.r   )Dialectr4   t.Optional[TokenType]c                     s    k r	  j S d S N)
token_typer/   )isizetokensr/   r0   _curr2   s   zparse.<locals>._currr   c                     s    d  S N   r/   r/   )r:   r<   r/   r0   _prev5   s   zparse.<locals>._prevc                     s   d7   S r>   r/   r/   )r@   r:   r/   r0   _advance8   s   zparse.<locals>._advancemsgr2   c                   s   |  d  d S )Nz
 at index z: r/   )rB   )r:   r1   r/   r0   _error=   s   zparse.<locals>._errorTr9   r   raise_unmatched	Lit[True]c                 S     d S r8   r/   r9   rD   r/   r/   r0   _match@      zparse.<locals>._matchF
Lit[False]t.Optional[Token]c                 S  rF   r8   r/   rG   r/   r/   r0   rH   D   rI   c                   s*    | kr  S |rt d|  d S )Nz	Expected r   rG   )rA   r=   rC   r/   r0   rH   H   s
   
t.Anyc                    s   t jp	t j} | r| jS t jrt S t js"t jrW jdk}}	 t j	r3   t j
d fv r<n   q+|rEtjntj}|| j j dS t jr^dnd}t j} | rl|| j7 }|rrt|S dS )Nr   Tthisr    F)r   STRING
IDENTIFIERtextr*   expJSONPathWildcardr&   r   r    r!   JSONPathScriptJSONPathFilterstartendr$   NUMBERint)tokenscriptrW   	expr_typenumber)rA   r=   rH   _parse_bracketr@   r:   r1   r<   r/   r0   _parse_literalO   s0   



zparse.<locals>._parse_literalc                    sR    }  t jr nd } t jr nd }|d u r!|d u r!| S tj| ||dS )NrW   rX   step)r   r"   rS   JSONPathSlicera   )rH   r`   r/   r0   _parse_slicen   s   zparse.<locals>._parse_sliceexp.JSONPathPartc                    s    } t | ts| dur_| g}tjr# } | r||  tjst|dkrXt | tr7tj|d d}n.t | tjrOt | tj	tj
frOtj|d d}ntj|d d}ntj|d}nt dtjdd |S )	NFr?   r   rM   expressionszCannot have empty segmentT)rD   )
isinstancer2   r   r#   appendlenrS   JSONPathKeyJSONPathPartrU   rV   JSONPathSelectorJSONPathSubscriptJSONPathUnionr   r!   )literalindexesnode)rC   rH   rd   r/   r0   r_   x   s(   



zparse.<locals>._parse_bracketc                    sj   d }  t jr	  t js	| dk rdn|  jd }tkr*|d }|S | j }|S )aU  
        Consumes & returns the text for a var. In BigQuery it's valid to have a key with spaces
        in it, e.g JSON_QUERY(..., '$. a b c ') should produce a single JSONPathKey(' a b c ').
        This is done by merging "consecutive" vars until a key separator is found (dot, colon etc)
        or the path string is exhausted.
           r   r?   N)r   VARrX   rj   rW   )
prev_indexrW   rR   )rH   r:   r1   r<   r/   r0   _parse_var_text   s   

zparse.<locals>._parse_var_textr   NrM   z Expected key name or * after DOTzUnexpected rf   )r4   r7   )r4   r   )rB   r2   r4   r2   )T)r9   r   rD   rE   r4   r   )F)r9   r   rD   rJ   r4   rK   )r4   rL   )r4   re   )r4   r2   )sqlglot.dialectsr6   get_or_raisejsonpath_tokenizertokenizerj   toverloadr   r)   rS   JSONPathRootr%   r"   rR   rt   rQ   r*   rT   ri   JSONPathRecursiverk   r   r    r9   JSONPath)r1   r3   r6   ry   rv   rg   	recursivevaluer/   )rA   r=   rC   rH   r_   r`   rd   r@   r:   r1   r;   r<   r0   parse(   s\   










r   c                 C     d|j  S )Nr   rM   _er/   r/   r0   <lambda>       r   c                 C  
   |  |S r8   )_jsonpathkey_sqlselfr   r/   r/   r0   r         
 c                 C  s   d|j pd S )Nr   rO   rM   r   r/   r/   r0   r      s    c                  G     dS )Nr   r/   r   r/   r/   r0   r          c                 C  r   )Nr   rM   r   r/   r/   r0   r      r   c                 C  s   d|  |j dS )Nr   r   )json_path_partrN   r   r/   r/   r0   r      s    c                   s6   d  fdd|jd|jd|jdfD S )Nr   c                 3  s.    | ]}|d ur|du rdn  |V  qd S )NFrO   r   .0pr   r/   r0   	<genexpr>   s    <lambda>.<locals>.<genexpr>rW   rX   rb   )joinargsgetr   r/   r   r0   r      s     c                 C  r   r8   )_jsonpathsubscript_sqlr   r/   r/   r0   r      r   c                   s"   dd  fdd|jD  dS )Nr   r   c                 3  s    | ]}  |V  qd S r8   r   r   r   r/   r0   r      s    r   r   )r   rg   r   r/   r   r0   r      s   "c                  G  r   )Nr   r/   r   r/   r/   r0   r      r   z4t.Dict[t.Type[exp.Expression], t.Callable[..., str]]JSON_PATH_PART_TRANSFORMSr8   )r1   r2   r3   r	   r4   r5   )"
__future__r   typingr{   sqlglot.expressionsrg   rS   sqlglot.errorsr   sqlglot.tokensr   r   r   TYPE_CHECKINGsqlglot._typingr   sqlglot.dialects.dialectr	   r
   r   rV   rk   r~   r}   rU   rm   rc   rn   ro   rT   r   __annotations__setALL_JSON_PATH_PARTSr/   r/   r/   r0   <module>   s.     
+








