o
    Jjgg                  	   @   s2  d dl Z d dlZd dlmZmZmZmZmZ d dlm	Z	 d dl
mZ ze	ddd d dlmZmZmZ W n eyL   d	ed
edefddZeZeZY nw d dlmZmZmZmZmZ dZG dd deZG dd deZeddG dd deZ			ddeee  deee  deee  defddZdS )    N)AnyLiteralOptionalSequenceUnion)check_package_version)	TypedDictlarkz1.1.5)gte_version)LarkTransformerv_argsargskwargsreturnc                  O   s   dd S )z/Dummy decorator for when lark is not installed.c                 S   s   d S N )_r   r   a/var/www/html/zoom/venv/lib/python3.10/site-packages/langchain/chains/query_constructor/parser.py<lambda>   s    zv_args.<locals>.<lambda>r   )r   r   r   r   r   r      s   r   )
Comparator
ComparisonFilterDirective	OperationOperatora  
    ?program: func_call
    ?expr: func_call
        | value

    func_call: CNAME "(" [args] ")"

    ?value: SIGNED_INT -> int
        | SIGNED_FLOAT -> float
        | DATE -> date
        | DATETIME -> datetime
        | list
        | string
        | ("false" | "False" | "FALSE") -> false
        | ("true" | "True" | "TRUE") -> true

    args: expr ("," expr)*
    DATE.2: /["']?(\d{4}-[01]\d-[0-3]\d)["']?/
    DATETIME.2: /["']?\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d[Zz]?["']?/
    string: /'[^']*'/ | ESCAPED_STRING
    list: "[" [args] "]"

    %import common.CNAME
    %import common.ESCAPED_STRING
    %import common.SIGNED_FLOAT
    %import common.SIGNED_INT
    %import common.WS
    %ignore WS
c                   @   &   e Zd ZU dZeed< ed ed< dS )ISO8601Datez'A date in ISO 8601 format (YYYY-MM-DD).datetypeN__name__
__module____qualname____doc__str__annotations__r   r   r   r   r   r   ;      
 r   c                   @   r   )ISO8601DateTimez4A datetime in ISO 8601 format (YYYY-MM-DDTHH:MM:SS).datetimer   Nr   r   r   r   r   r'   B   r&   r'   T)inlinec                       s4  e Zd ZdZdddddedeee  deee  deee	  def
 fd	d
Z
dedefddZdededefddZde	deeef fddZdedefddZdefddZdefddZdedefddZdedefddZdedefdd Zdedefd!d"Zdedefd#d$Zdede	fd%d&Z  ZS )'QueryTransformerz=Transform a query string into an intermediate representation.Nallowed_comparatorsallowed_operatorsallowed_attributesr   r,   r-   r.   r   c                   s(   t  j|i | || _|| _|| _d S r   )super__init__r,   r-   r.   )selfr,   r-   r.   r   r   	__class__r   r   r0   M   s   
zQueryTransformer.__init__itemsr   c                 G      |S r   r   r1   r4   r   r   r   programZ      zQueryTransformer.program	func_namec                 C   s   |  t|}t|tr.| jr#|d | jvr#td|d  d| j t||d |d dS t|dkr@|tj	tj
fv r@|d S t||dS )Nr   zReceived invalid attributes z. Allowed attributes are    )
comparator	attributevalue)operator	arguments)_match_func_namer$   
isinstancer   r.   
ValueErrorr   lenr   ANDORr   )r1   r9   r   funcr   r   r   	func_call]   s   
zQueryTransformer.func_callc                 C   s   |t tv r| jd ur|| jvrtd| d| j t|S |t tv r>| jd ur:|| jvr:td| d| j t|S td| dtttt  )NzReceived disallowed comparator z. Allowed comparators are zReceived disallowed operator z. Allowed operators are zReceived unrecognized function z. Valid functions are )setr   r,   rB   r   r-   list)r1   r9   r   r   r   r@   k   s.   



z!QueryTransformer._match_func_namec                 G   r5   r   r   r6   r   r   r   r      r8   zQueryTransformer.argsc                 C      dS )NFr   r1   r   r   r   false   r8   zQueryTransformer.falsec                 C   rJ   )NTr   rK   r   r   r   true   r8   zQueryTransformer.trueitemc                 C   s   |d u rg S t |S r   )rI   r1   rN   r   r   r   rI      s   zQueryTransformer.listc                 C      t |S r   )intrO   r   r   r   rQ         zQueryTransformer.intc                 C   rP   r   )floatrO   r   r   r   rS      rR   zQueryTransformer.floatc                 C   sH   t |d}z	tj|d W n ty   td Y nw |ddS )N"'z%Y-%m-%dzGDates are expected to be provided in ISO 8601 date format (YYYY-MM-DD).r   )r   r   )r$   stripr(   strptimerB   warningswarnrO   r   r   r   r      s   
zQueryTransformer.datec                 C   sh   t |d}z	tj|d W n ty.   z	tj|d W n ty+   tdw Y nw |ddS )NrT   z%Y-%m-%dT%H:%M:%S%zz%Y-%m-%dT%H:%M:%Sz6Datetime values are expected to be in ISO 8601 format.r(   )r(   r   )r$   rU   r(   rV   rB   rO   r   r   r   r(      s   
zQueryTransformer.datetimec                 C   s   t |dS )NrT   )r$   rU   rO   r   r   r   string   s   zQueryTransformer.string)r    r!   r"   r#   r   r   r   r   r   r$   r0   tupler7   rI   r   rG   r   r@   r   boolrL   rM   rQ   rS   r   r   r'   r(   rY   __classcell__r   r   r2   r   r*   I   s8    


r*   r,   r-   r.   c                 C   s.   t du rtdt | ||d}ttd|ddS )zReturn a parser for the query language.

    Args:
        allowed_comparators: Optional[Sequence[Comparator]]
        allowed_operators: Optional[Sequence[Operator]]

    Returns:
        Lark parser for the query language.
    Nz>Cannot import lark, please install it with 'pip install lark'.r+   lalrr7   )parsertransformerstart)r*   ImportErrorr   GRAMMAR)r,   r-   r.   r_   r   r   r   
get_parser   s   rc   )NNN)r(   rW   typingr   r   r   r   r   langchain_core.utilsr   typing_extensionsr   r	   r   r   r   ra   objectlangchain_core.structured_queryr   r   r   r   r   rb   r   r'   r*   r$   rc   r   r   r   r   <module>   s>    	k


