o
    Zh                     @   s   d Z ddlmZmZ ddlmZmZmZmZm	Z	m
Z
 ejdejdejdejdejdejd	ejd
iZejgZdeeeef dedefddZG dd de
ZdS )zELogic for converting internal query language to a valid Milvus query.    )TupleUnion)
Comparator
Comparison	OperationOperatorStructuredQueryVisitorz==>z>=<z<=inlikevalue
comparatorreturnc                 C   s4   t | tr|tju rd|  dS d|  dS t| S )a  Convert a value to a string and add double quotes if it is a string.

    It required for comparators involving strings.

    Args:
        value: The value to convert.
        comparator: The comparator.

    Returns:
        The converted value as a string.
    "z%")
isinstancestrr   LIKE)r   r    r   d/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/query_constructors/milvus.pyprocess_value   s
   

r   c                   @   s   e Zd ZdZ	 ejejejgZ	 e	j
e	je	je	je	je	je	jgZdeee	f 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eef fddZdS )MilvusTranslatorzCTranslate Milvus internal query language elements to valid filters.funcr   c                 C   s(   |  | |j}t|trt| }| S )N)Z_validate_funcr   r   r   COMPARATOR_TO_BER)selfr   r   r   r   r   _format_funcF   s
   

zMilvusTranslator._format_func	operationc                    s   |j tv r t|jdkr  |j }|d |jd   d S |j tv r/td|j j d fdd|jD } |j }dd	| d	 | d S )
N   (r   )r   z&" can have only one argument in Milvusc                    s   g | ]}|  qS r   )accept).0argr   r   r   
<listcomp>V   s    z4MilvusTranslator.visit_operation.<locals>.<listcomp> )	operatorUNARY_OPERATORSlen	argumentsr   r!   
ValueErrorr   join)r   r   r'   argsr   r$   r   visit_operationM   s   
z MilvusTranslator.visit_operation
comparisonc                 C   s<   |  |j}t|j|j}|j}d| d | d | d S )Nz( r&   z ))r   r   r   r   	attribute)r   r/   r   Zprocessed_valuer0   r   r   r   visit_comparisonZ   s   z!MilvusTranslator.visit_comparisonstructured_queryc                 C   s*   |j d u ri }nd|j | i}|j|fS )Nexpr)filterr!   query)r   r2   kwargsr   r   r   visit_structured_querya   s   

z'MilvusTranslator.visit_structured_queryN)__name__
__module____qualname____doc__r   ANDNOTORZallowed_operatorsr   EQGTGTELTLTEINr   Zallowed_comparatorsr   r   r   r   r.   r   r1   r   r   dictr7   r   r   r   r   r   5   s*    

r   N)r;   typingr   r   Zlangchain_core.structured_queryr   r   r   r   r   r	   r?   r@   rA   rB   rC   rD   r   r   r=   r(   intfloatr   r   r   r   r   r   r   <module>   s     

 