a
    bg%                     @   s2  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
rd 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edddZeG dd dZ eG dd dZ!dee"ef e dddZ#de"dee"ef e!dddZ$ed ed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120r   )function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   }/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/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< ed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	truncated)r   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       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'   boolr4   r   r   r   r   r!   &   s   
r!   )r   json_paramsr   c                 C   s  ddl m} ddlm} g }g }t| r>|d| j d n|d| j d | jd u sh| jjd u rx|rtJ dn2g }d}| jjD ]}|j	|vr|j
d urd	}ntd
|j	 dqd}	|r|	|j	 d7 }	||j	 }
|j|j|j|jfv r0t|
}|	d|j	 d|j d7 }	|||j	|d n^|j|jkrf|	d|j	 d7 }	|||j	|
d n(|	d|j	 7 }	|||j	|
|jd ||	 q|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(:):)r:   r&   type,)r   r   )r   r   databricks.sdk.service.sqlr   r   appendZ	full_nameinput_paramsr   r:   Zparameter_default
ValueError	type_nameZARRAYZMAPZSTRUCTr0   r1   Z	type_textBINARYjoinr   )r   r7   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   sf    






rI   r
   )wswarehouse_idr   r   r   c              
   C   s  zddl }W n. ty: } ztd|W Y d}~n
d}~0 0 ddlm} |jr|jjrtdd |jjD rtdt dt d	i t	}t
| jjj}td
d | D st }	|ti }
|
 D ]$\}}||v r|||< q|	| q|	rtd|	 d|  d	t||}| jjf |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sq||7 }|d7 }qx|jr(t|jjr(t&d| dt dt ddS |jdusBJ d| |jj|j'kr|jj(}|dusrJ d| t&|j) d|j* dS |j+}|dusJ |j,}|j-}|dusJ d|j.}t/|rd}|rt0|dkrt0|d dkrt1|d d }t&d||dS |j2}|dur0|j3dus8J ddd |j3D }|du rVg }|j4j5||d }t6 }|j7|d!d" t&d#|8 |dS 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(   )r:   EXECUTE_FUNCTION_ARG_NAMEr)   rH   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_KEYWORDrN   r   r   r   rO      s   z,Invalid parameters for executing functions: z. Allowed parameters are: )r   rK   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   )r:   )r)   cr   r   r   
<listcomp>   r-   z$execute_function.<locals>.<listcomp>)columnsF)indexr$   )9ZpandasImportErrorr?   r   rA   r   anyrB   rM   DEFAULT_EXECUTE_FUNCTION_ARGSinspect	signatureZstatement_executionZexecute_statementvaluessetpopr/   addkeysrI   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   schemarX   Z	DataFrameZfrom_recordsr   Zto_csvgetvalue)rJ   rK   r   r   pder   Zexecute_statement_argsZallowed_execute_statement_argsZinvalid_paramsZpassed_execute_statement_argsr*   r+   Zparametrized_statementresponserg   Z	wait_timeZ	retry_cntZclient_execution_timeoutwaitr"   rs   r'   rt   ru   r&   rw   rX   ZpdfZ
csv_bufferr   r   r   execute_functiony   s    	





&

r}   r   )rf   r   c                 C   s   ddl m} | |j|jfv S )Nr   rL   )r?   r   PENDINGRUNNING)rf   r   r   r   r   re      s    re   )&r]   r0   loggingri   rp   dataclassesr   ior   typingr   r   r   r   r   r	   Zdatabricks.sdkr
   r   r   r?   r   r   rM   r\   r   rl   	getLoggerr   rn   r6   r   r   r!   r   rI   r}   re   r   r   r   r   <module>   sF    
C
 