o
    bi$                     @   s  d dl Z d dl mZmZ d dlmZmZmZ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mZmZmZmZmZmZmZmZ d dlmZ d dlmZ d	ed
edefddZ deegee f de	j!j"fddZ#de	j!j"deeeeef  fddZ$de	j!j"defddZ%de	j!j"defddZ&deegef de	j!j"fddZ'deeeeef  dedeeeeef  fddZ(d ee) d!eeeeef  d"ed#edee) f
d$d%Z*dS )&    N)asdictfields)	AwaitableCallableListTuple)rest_response)HTTPStatusCode)DEFAULT_LIMITDEFAULT_RPC_TIMEOUTRAY_MAX_LIMIT_FROM_API_SERVERListApiOptionsListApiResponsePredicateTypeStateSchemaSummaryApiOptionsSummaryApiResponseSupportedFilterTypefilter_fields)DataSourceUnavailable)convert_string_to_typesuccesserror_messageresultc                 K   s$   t d| rtjntj||dd|S )NF)status_codemessager   convert_google_style )r   r	   OKINTERNAL_ERROR)r   r   r   kwargsr   r   Q/home/ubuntu/.local/lib/python3.10/site-packages/ray/dashboard/state_api_utils.pydo_reply   s   r"   list_api_fnreqc              
      sb   z| t |dI d H }tddt|dW S  ty0 } ztdt|d dW  Y d }~S d }~ww )NoptionT r   r   r   F)options_from_reqr"   r   r   str)r#   r$   r   er   r   r!   handle_list_api$   s   r,   returnc                 C   sn   | j dg }| j dg }| j dg }t|t|ksJ g }t|||D ]\}}}||||f q'|S )Nfilter_keysfilter_predicatesfilter_values)querygetalllenzipappend)r$   r.   r/   r0   filterskey	predicatevalr   r   r!   _get_filters_from_req3   s   r:   c                 C   s   t | jddur| jdnt}|tkr!td| dt dt | jdd}t| }t| jdd	t}t| jd
dt}t	|||||dS )z1Obtain `ListApiOptions` from the aiohttp request.limitNzGiven limit z exceeds the supported limit z. Use a lower limit.timeout   detailFexclude_driverT)r;   r<   r6   r>   r?   )
intr1   getr
   r   
ValueErrorr:   r   boolr   )r$   r;   r<   r6   r>   r?   r   r   r!   r)   @   s(   r)   c                 C   s6   t | jdt}t| }| jdd }t|||dS )Nr<   
summary_by)r<   r6   rD   )r@   r1   rA   r   r:   r   )r$   r<   r6   rD   r   r   r!   summary_options_from_reqZ   s   rE   
summary_fnc                    s(   | t |dI d H }tddt|dS )Nr%   Tr'   r(   )rE   r"   r   )rF   r$   r   r   r   r!   handle_summary_apia   s   rG   filterschemac                 C   sp  g }t |rdd t|D }n| }| D ]\}}}||v r|| }zt|| W n	 ty4   Y nyw t||r;nr|tu sC|dkr`zt|t}W nb ty_   td| d| d| dw |t	u sh|dkrzt|t	}W n= ty   td| d| d	| d
w |t
u s|dkrzt|t
}W n ty   td| d| d| d| d	w ||||f q|S )a  Convert the given filter's type to SupportedFilterType.

    This method is necessary because click can only accept a single type
    for its tuple (which is string in this case).

    Args:
        filter: A list of filter which is a tuple of (key, val).
        schema: The state schema. It is used to infer the type of the column for filter.

    Returns:
        A new list of filters with correct types that match the schema.
    c                 S   s   i | ]}|j |jqS r   )nametype).0fieldr   r   r!   
<dictcomp>   s    z(convert_filters_type.<locals>.<dictcomp>integerzInvalid filter `--filter  zD` for a int type column. Please provide an integer filter `--filter z [int]`numberzF` for a float type column. Please provide an integer filter `--filter z	 [float]`booleanz6` for a boolean type column. Please provide `--filter z& [True|true|1]` for True or `--filter z [False|false|0]` for False.)dataclassesis_dataclassr   schema_dict
isinstance	TypeErrorr@   r   rB   floatrC   r5   )rH   rI   
new_filtercolr8   r9   column_typer   r   r!   convert_filters_typem   sf   

r\   datar6   state_dataclassr>   c                 C   sx  t ||}g }| D ]}d}|D ]\}}}	| }
| }||
vr*td| d|
 ||vr1d}nx|dkrt|	trLt|| trL||  |	 k}n]t|	trbt|| trb|| t|	tk}nGt|	trxt|| trx|| t|	tk}n1|| |	k}n*|dkrt|	trt|| tr||  |	 k}n|| |	k}ntd| d|s nq|r|	t
||| q	|S )	a  Return the filtered data given filters.

    Args:
        data: A list of state data.
        filters: A list of KV tuple to filter data (key, val). The data is filtered
            if data[key] != val.
        state_dataclass: The state schema.

    Returns:
        A list of filtered state data in dictionary. Each state data's
        unnecessary columns are filtered by the given state_dataclass schema.
    TzThe given filter column un    is not supported. Enter filters with –-filter key=value or –-filter key!=value Supported filter columns: F=z!=zUnsupported filter predicate z' is given. Available predicates: =, !=.)r\   filterable_columnslowerrB   rV   r*   rC   r   r@   r5   r   )r]   r6   r^   r>   r   datummatchfilter_columnfilter_predicatefilter_valuer`   r   r   r!   	do_filter   sb   

rg   )+rS   r   r   typingr   r   r   r   aiohttp.webaiohttpray.dashboard.optional_utilsr   ray.dashboard.utilsr	   ray.util.state.commonr
   r   r   r   r   r   r   r   r   r   r   ray.util.state.exceptionr   ray.util.state.utilr   rC   r*   r"   webRequestr,   r:   r)   rE   rG   r\   dictrg   r   r   r   r!   <module>   sZ    4




F