o
    Zh%                  
   @   sB  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 d dlmZ d dl	m
Z
mZmZmZmZmZ e
rFd dlmZ d dlmZ d dlmZmZ dZd	d
ddZdZdZeeZdddefddZeG dd dZ eG dd dZ!dddee"ef de fddZ#ddde"dddee"ef de!f
dd Z$d!ed" defd#d$Z%dS )%    N)	dataclass)StringIO)TYPE_CHECKINGAnyDictListLiteralOptional)WorkspaceClient)FunctionInfo)StatementParameterListItemStatementStateZ__execution_args__Z30sd   i   )wait_timeoutZ	row_limitZ
byte_limit UC_TOOL_CLIENT_EXECUTION_TIMEOUTZ120functionr   returnc                 C   s   ddl m} | j|jkS )Nr   ColumnTypeName)databricks.sdk.service.catalogr   Z	data_typeZ
TABLE_TYPE)r   r    r   f/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/tools/databricks/_execution.py	is_scalar   s   r   c                   @   s"   e Zd ZU eed< ed ed< dS )ParameterizedStatement	statementr   
parametersN)__name__
__module____qualname__str__annotations__r   r   r   r   r   r       s   
 r   c                   @   sd   e Zd ZU dZdZee ed< dZee	d  ed< dZ
ee ed< dZee ed< defd	d
ZdS )FunctionExecutionResultzy
    Result of executing a function.
    We always use a string to present the result value for AI model to consume.
    Nerror)SCALARCSVformatvalue	truncatedr   c                 C   s   dd | j  D }t|S )Nc                 S   s   i | ]\}}|d ur||qS Nr   ).0kvr   r   r   
<dictcomp>3   s    z3FunctionExecutionResult.to_json.<locals>.<dictcomp>)__dict__itemsjsondumps)selfdatar   r   r   to_json2   s   
zFunctionExecutionResult.to_json)r   r   r   __doc__r"   r	   r   r    r%   r   r&   r'   boolr3   r   r   r   r   r!   &   s   
 r!   json_paramsc                 C   s  ddl m} ddlm} g }g }t| r|d| j d n
|d| j d | jd u s4| jjd u r;|r:J dng }d}| jjD ]}|j	|vr[|j
d urRd	}qCtd
|j	 dd}	|rg|	|j	 d7 }	||j	 }
|j|j|j|jfv rt|
}|	d|j	 d|j d7 }	|||j	|d n.|j|jkr|	d|j	 d7 }	|||j	|
d n|	d|j	 7 }	|||j	|
|jd ||	 qC|d| |d d|}t||dS )Nr   r   )r   zSELECT (zSELECT * FROM z8Function has no parameters but parameters were provided.FTz
Parameter z is required but not provided. z => zfrom_json(:z, 'z'))namer&   z
unbase64(:):)r9   r&   type,)r   r   )r   r   databricks.sdk.service.sqlr   r   appendZ	full_nameinput_paramsr   r9   Zparameter_default
ValueError	type_nameZARRAYZMAPZSTRUCTr/   r0   Z	type_textBINARYjoinr   )r   r6   r   r   partsZoutput_paramsargsZuse_named_argspZ
arg_clauseZ
json_valueZjson_value_strr   r   r   r   get_execute_function_sql_stmt7   sd   






rH   wsr
   warehouse_idr   c              
   C   sx  zddl }W n ty } ztd|d}~ww ddlm} |jr;|jjr;tdd |jjD r;tdt dt d	i t	}t
| jjj}td
d | D st }	|ti }
|
 D ]\}}||v rl|||< q_|	| q_|	rtd|	 d|  d	t||}| jjd$|j||jd|}|jr
t|jjr
|jr
|j}d}d}ttjtt}||k rt d| || }t!"d| d| d t#$| | j%|}|jdu st|jjsn||7 }|d7 }||k s|jr
t|jjr
t&d| dt dt ddS |jdusJ d| |jj|j'kr;|jj(}|dus/J d| t&|j) d|j* dS |j+}|dusEJ |j,}|j-}|dusTJ d|j.}t/|rd}|ryt0|dkryt0|d dkryt1|d d }t&d||dS |j2}|dur|j3dusJ ddd |j3D }|du rg }|j4j5||d }t6 }|j7|d!d" t&d#|8 |dS )%zL
    Execute a function with the given arguments and return the result.
    r   NzTCould not import pandas python package. Please install it with `pip install pandas`.r   c                 s   s    | ]}|j tkV  qd S r(   )r9   EXECUTE_FUNCTION_ARG_NAMEr)   rG   r   r   r   	<genexpr>   s
    
z#execute_function.<locals>.<genexpr>zRParameter name conflicts with the reserved argument name for executing functions: z. Please rename the parameter .c                 s   s"    | ]}|j |j|jfv V  qd S r(   )kindVAR_POSITIONALVAR_KEYWORDrM   r   r   r   rN      s
    
z,Invalid parameters for executing functions: z. Allowed parameters are: )r   rJ   r      z	Retrying z. time to get statement execution status after z	 seconds.   z+Statement execution is still pending after z[ seconds. Please increase the wait_timeout argument for executing the function or increase z? environment variable for increasing retrying time, default is )r"   zStatement execution failed: z>Statement execution failed but no error message was provided: z: z9Statement execution succeeded but no result was provided.r#   )r%   r&   r'   z9Statement execution succeeded but no schema was provided.c                 S   s   g | ]}|j qS r   )r9   )r)   cr   r   r   
<listcomp>   s    z$execute_function.<locals>.<listcomp>)columnsF)indexr$   r   )9ZpandasImportErrorr>   r   r@   r   anyrA   rL   DEFAULT_EXECUTE_FUNCTION_ARGSinspect	signatureZstatement_executionZexecute_statementvaluessetpopr.   addkeysrH   r   statusjob_pendingstatestatement_idintosenvirongetr   (DEFAULT_UC_TOOL_CLIENT_EXECUTION_TIMEOUTmin_loggerdebugtimesleepZget_statementr!   Z	SUCCEEDEDr"   Z
error_codemessagemanifestr'   result
data_arrayr   lenr   schemarW   Z	DataFrameZfrom_recordsr   Zto_csvgetvalue)rI   rJ   r   r   pder   Zexecute_statement_argsZallowed_execute_statement_argsZinvalid_paramsZpassed_execute_statement_argsr*   r+   Zparametrized_statementresponserf   Z	wait_timeZ	retry_cntZclient_execution_timeoutwaitr"   rr   r'   rs   rt   r&   rv   rW   ZpdfZ
csv_bufferr   r   r   execute_functiony   s   	



&

r|   re   r   c                 C   s   ddl m} | |j|jfv S )Nr   rK   )r>   r   PENDINGRUNNING)re   r   r   r   r   rd      s   rd   )&r\   r/   loggingrh   ro   dataclassesr   ior   typingr   r   r   r   r   r	   Zdatabricks.sdkr
   r   r   r>   r   r   rL   r[   r   rk   	getLoggerr   rm   r5   r   r   r!   r   rH   r|   rd   r   r   r   r   <module>   sZ     


B

 