o
    Lj                     @   s   d dl mZ dd Zdd Zdd Zdd	 Zd
d Zdd Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zd#ddZdd  Zd!d" ZdS )$   	nativestrc                        fddt t D S )Nc                    s*   i | ]}t  | d  t  | d qS        r   .0iaList ]/home/djax/ivt_ai_plugin/venv/lib/python3.10/site-packages/redis/commands/timeseries/utils.py
<dictcomp>      * z list_to_dict.<locals>.<dictcomp>rangelenr   r   r   r   list_to_dict   s   r   c                    r   )zCConvert a list of [key, value] pairs to a dict without forcing str.c                    s"   i | ]} | d   | d qS r   r   r   pairsr   r   r   
   s   " z"_pairs_to_dict.<locals>.<dictcomp>r   r   r   r   r   _pairs_to_dict   s   r   c                 C   s   dd |   D S )zApply ``nativestr`` to every key and string-typed value of ``d``.

    Used by the RESP3-to-RESP2-legacy adapters so labels coming from a
    RESP3 native map match today's RESP2 ``list_to_dict`` semantics.
    c                 S   s0   i | ]\}}t |t|ttfrt |n|qS r   )r   
isinstancebytesstr)r	   kvr   r   r   r      s    z#_nativestr_dict.<locals>.<dictcomp>)itemsdr   r   r   _nativestr_dict   s   r    c                 K   s   | du rt  S t | S )a  Normalize the TS.QUERYLABELS reply to a ``set`` of unique strings.

    The reply is a flat array under RESP2 and a set under RESP3; both are
    surfaced as a Python ``set`` so the collection type is identical across
    protocols and reflects that the server returns a unique, unordered
    collection. Elements are kept byte-exact (never coerced or normalized) and
    the server already deduplicates them. A missing reply maps to an empty
    ``set`` so an empty result is a normal success rather than an error.
    N)setresponsekwargsr   r   r   parse_query_labels   s   
r%   c                 K   4   | sg S t | d dkrdd | D S dd | D S )zFParse range response. Used by TS.RANGE and TS.REVRANGE (legacy shape).r   r   c                 S   s0   g | ]}t |d  gdd |dd D  qS )r   c                 S      g | ]}t |qS r   floatr	   r   r   r   r   
<listcomp>.       z*parse_range.<locals>.<listcomp>.<listcomp>r   N)tupler	   rr   r   r   r+   .   s   0 zparse_range.<locals>.<listcomp>c                 S   s$   g | ]}t |d  t|d fqS r   )r-   r)   r.   r   r   r   r+   /   s   $ r   r"   r   r   r   parse_range(   s
   r1   c                 K   r&   )zUnified parser for TS.RANGE / TS.REVRANGE.

    Returns ``list[list]`` rather than ``list[tuple]`` so the unified
    shape is symmetric with the RESP3 wire format.
    r   r   c                 S   s,   g | ]}|d  gdd |dd D  qS )r   c                 S   r'   r   r(   r*   r   r   r   r+   ;   r,   z2parse_range_unified.<locals>.<listcomp>.<listcomp>r   Nr   r.   r   r   r   r+   ;   s   , z'parse_range_unified.<locals>.<listcomp>c                 S   s    g | ]}|d  t |d gqS r   r(   r.   r   r   r   r+   <   s     r0   r"   r   r   r   parse_range_unified2   s
   r2   c                 K   s   | sg S dd | D S )aQ  Parse the TS.NRANGE / TS.NREVRANGE response.

    The wire shape is ``[[timestamp, [value_0, value_1, ...]], ...]`` where the
    value array preserves input key order. Its length equals the number of
    queried keys, except when a per-key AGGREGATION spec lists multiple
    aggregators: each such key then contributes one value per aggregator (in
    spec order), concatenated in key order. Rows are returned in server order
    (never re-sorted or reversed), and a missing raw sample or missing
    aggregation bucket is kept as ``float('nan')`` rather than converted to
    ``None``.
    c                 S   s*   g | ]}t |d  dd |d D gqS )r   c                 S   r'   r   r(   r*   r   r   r   r+   M   r,   z,parse_n_range.<locals>.<listcomp>.<listcomp>r   )int)r	   rowr   r   r   r+   M   r   z!parse_n_range.<locals>.<listcomp>r   r"   r   r   r   parse_n_range?   s   r5   c                 C   s    | sdS t | d t| d fS )z2Parse get response. Used by TS.GET (legacy shape).Nr   r   r3   r)   )r#   r   r   r   	parse_getP      r7   c                 K   s    | sdS t | d t| d gS )z4Unified parser for TS.GET. Returns ``[int, float]``.Nr   r   r6   r"   r   r   r   parse_get_unifiedW   r8   r9   c              	   C   s   g }| D ]7}|d s| t|d t|d ddgi q| t|d t|d t|d d t|d d gi qt|dd dS )z&Parse multi get response (RESP2 wire).r   r   r   Nc                 S      t |  S Nlistkeysr   r   r   r   <lambda>n       zparse_m_get.<locals>.<lambda>key)appendr   r   r3   r)   sorted)r#   resitemr   r   r   parse_m_get^   s   &

	rG   c                 K   s   t | tr;i }|  D ]-\}}t|dkr|d ng }|s&|d g g||< q|d t|d t|d gg||< q|S i }| D ]-}|d sRt|d g g||d < q?t|d t|d d t|d d gg||d < q?|S )a.  Unified parser for TS.MGET.

    Emits ``{key: [labels_dict, sample]}`` where ``sample`` is
    ``[int, float]`` or ``[]`` when no sample exists. Handles both wire
    formats: the RESP2 wire arrives as a list of ``[key, label_pairs,
    sample]`` triples; the RESP3 wire is already keyed by name.
    r   r   r   )r   dictr   r   r3   r)   r   )r#   r$   rE   rB   rF   sampler   r   r   parse_m_get_unifiedq   s    
&
rJ   c              	   K   s   g }|   D ]?\}}|d rt|d ni }t|dkr |d ng }|s1|t||ddgi q|t||t|d t|d gi qt|dd dS )u6   RESP3 wire → today's RESP2 legacy shape for TS.MGET.r   r   Nc                 S   r:   r;   r<   r   r   r   r   r?      r@   z3parse_m_get_resp3_to_resp2_legacy.<locals>.<lambda>rA   )r   r    r   rC   r   r3   r)   rD   )r#   r$   rE   rB   rF   labelsrI   r   r   r   !parse_m_get_resp3_to_resp2_legacy   s   *rL   c                 K   sH   g }| D ]}| t|d t|d t|d gi qt|dd dS )z(Parse multi range response (RESP2 wire).r   r   r   c                 S   r:   r;   r<   r   r   r   r   r?      r@   zparse_m_range.<locals>.<lambda>rA   )rC   r   r   r1   rD   )r#   r$   rE   rF   r   r   r   parse_m_range   s   ,rM   Nc                 C   s8   | d u rdg iS t | tr| }n| g}ddd |D iS )Naggregatorsc                 S   s   g | ]}t | qS r   )r   lower)r	   aggr   r   r   r+      s    z%_m_range_metadata.<locals>.<listcomp>)r   r=   )aggregation_typerN   r   r   r   _m_range_metadata   s   
rR   c                 K   s   t | tr+i }|  D ]\}}t|dkr|d ng }|d |t|d g||< q|S i }t|d}| D ]}t|d |t|d g||d < q6|S )a(  Unified parser for TS.MRANGE / TS.MREVRANGE.

    Emits ``{key: [labels_dict, metadata, samples]}`` regardless of wire
    format. RESP2 has no metadata element on the wire, so the command options
    are used to synthesize the same ``{"aggregators": ...}`` structure that
    RESP3 returns.
    r   r   r   rQ   )r   rH   r   r   r2   rR   getr   )r#   r$   rE   rB   rF   metadatar   r   r   parse_m_range_unified   s   


rV   c                 K   s`   g }|   D ]!\}}|d rt|d ni }|d }|t||t|gi qt|dd dS )uG   RESP3 wire → today's RESP2 legacy shape for TS.MRANGE / TS.MREVRANGE.r   rS   c                 S   r:   r;   r<   r   r   r   r   r?      r@   z5parse_m_range_resp3_to_resp2_legacy.<locals>.<lambda>rA   )r   r    rC   r   r1   rD   )r#   r$   rE   rB   rF   rK   samplesr   r   r   #parse_m_range_resp3_to_resp2_legacy   s   rX   r;   )helpersr   r   r   r    r%   r1   r2   r5   r7   r9   rG   rJ   rL   rM   rR   rV   rX   r   r   r   r   <module>   s"    

