o
    /.]d                     @   sb   d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlZddlmZ e	 Z
G dd	 d	e	ZdS )
z Module to prepare the resultset.    )absolute_import)division)print_function)unicode_literalsN)InfluxDBClientErrorc                   @   s   e Zd ZdZd!ddZedd Zejdd Zedd	 Zd
d Z	d"ddZ
dd Zdd Zedd Zdd Zdd Zdd Zdd Zdd Zedd  ZdS )#	ResultSetz0A wrapper around a single InfluxDB query result.Tc                 C   s:   || _ | j dd| _| jdur|du rt| jdS dS )zInitialize the ResultSet.errorNT)_rawget_errorr   r   )selfseriesZraise_errors r   4/usr/lib/python3/dist-packages/influxdb/resultset.py__init__   s
   
zResultSet.__init__c                 C      | j S )zRaw JSON from InfluxDB.r	   r   r   r   r   raw      zResultSet.rawc                 C   s
   || _ d S )Nr   )r   valuer   r   r   r       s   
c                 C   r   )zError returned by InfluxDB.)r   r   r   r   r   r   $   r   zResultSet.errorc                 C   s~   t dt t|tr+t|dkrtd|d }|d }t|ts*|dur*tdnt|tr5d}|}n|}d}| ||S )a  Retrieve the series name or specific set based on key.

        :param key: Either a series name, or a tags_dict, or
                    a 2-tuple(series_name, tags_dict).
                    If the series name is None (or not given) then any serie
                    matching the eventual given tags will be given its points
                    one after the other.
                    To get the points of every series in this resultset then
                    you have to provide None as key.
        :return: A generator yielding `Point`s matching the given key.
        NB:
        The order in which the points are yielded is actually undefined but
        it might change..
        zQResultSet's ``__getitem__`` method will be deprecated. Use``get_points`` instead.   zonly 2-tuples allowedr      Nztags should be a dict)	warningswarnDeprecationWarning
isinstancetuplelen	TypeErrordict
get_points)r   keynametagsr   r   r   __getitem__)   s$   

zResultSet.__getitem__Nc                 c   s    t |ttd tdfstd|  D ]G}|d|dd}|du r7|du r6| |D ]}|V  q0q|d|fv r^|di }| |D ]}|du sZ| ||sZ| ||r]|V  qHqdS )a   Return a generator for all the points that match the given filters.

        :param measurement: The measurement name
        :type measurement: str

        :param tags: Tags to look for
        :type tags: dict

        :return: Points generator
            Nz"measurement must be an str or Nonemeasurementr#   resultsr$   )	r   bytestypedecoder   _get_seriesr
   _get_points_for_series_tag_matches)r   r'   r$   r   Zseries_nameitemZseries_tagsr   r   r   r!   P   s2   


zResultSet.get_pointsc                 C   s>   g }|   D ]}|d|d t|d f  qdd| S )z#Representation of ResultSet object.z'%s': %sr   r   zResultSet({%s})z, )itemsappendlistjoin)r   r0   r/   r   r   r   __repr__u   s    zResultSet.__repr__c                 c   s$    |   D ]
}t| |V  qdS )z*Yield one dict instance per series result.N)keysr2   r%   )r   r"   r   r   r   __iter__~   s   zResultSet.__iter__c                 C   s0   |  D ]\}}| |t}||kr dS qdS )z0Check if all key/values in filter match in tags.FT)r0   r
   	_sentinel)r$   filterZtag_nameZ	tag_valueZseries_tag_valuer   r   r   r.      s   zResultSet._tag_matchesc                 C   s   | j dg S )zReturn all series.r   )r   r
   r   r   r   r   r,      s   zResultSet._get_seriesc                 C   s   t |  S )z,Return the len of the keys in the ResultSet.)r   r5   r   r   r   r   __len__   s   zResultSet.__len__c              
   C   s<   g }|   D ]}||d|dd|ddf q|S )zvReturn the list of keys in the ResultSet.

        :return: List of keys. Keys are tuples (series_name, tags)
        r'   r#   r(   r$   N)r,   r1   r
   )r   r5   r   r   r   r   r5      s   

zResultSet.keysc                 C   sJ   g }|   D ]}|d|dd|ddf}||| |f q|S )zgReturn the set of items from the ResultSet.

        :return: List of tuples, (key, generator)
        r'   r#   r(   r$   N)r,   r
   r1   r-   )r   r0   r   Z
series_keyr   r   r   r0      s   

zResultSet.itemsc                 c   s*    | dg D ]}| |d |V  qdS )zReturn generator of dict from columns and values of a series.

        :param series: One series
        :return: Generator of dicts
        valuescolumnsN)r
   point_from_cols_vals)r   r   pointr   r   r   r-      s   z ResultSet._get_points_for_seriesc                 C   s&   i }t | D ]
\}}|| ||< q|S )zCreate a dict from columns and values lists.

        :param cols: List of columns
        :param vals: List of values
        :return: Dict where keys are columns.
        )	enumerate)ZcolsZvalsr=   Z	col_indexZcol_namer   r   r   r<      s   zResultSet.point_from_cols_vals)T)NN)__name__
__module____qualname____doc__r   propertyr   setterr   r%   r!   r4   r6   staticmethodr.   r,   r9   r5   r0   r-   r<   r   r   r   r   r      s,    




'%	
r   )rB   Z
__future__r   r   r   r   r   Zinfluxdb.exceptionsr   objectr7   r   r   r   r   r   <module>   s   