
    ZThH                        d dl 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 d dlmZ d dlmZmZmZ d dlmZ d dlmZmZ d dlmZ d d	lmZmZmZ d d
lmZ d dlm Z! d dlm"Z# d dlm$Z$m%Z%m&Z& d dl'm(Z( d dl)m*Z*m+Z+m,Z, d dl-m.Z. d dl/m0Z0 d dl1m2Z2 d dl3m4Z4 d dl5m6Z6 d dl7m8Z8 d dl9m:Z: d dl;m<Z< d dl=m>Z> d dl?m Z m"Z"m@Z@mAZA d dlBmCZCmDZD d dlEmFZF d dlGmHZH  G d d      ZIy)    N)defaultdict)DictIterableListOptionalSetTupleUnioncast)Any)AssetListAssetsRequestListAssetsResponse)AssetServiceStub)ExpressionChannelReferenceExpressionRequest)CalculatedChannelsServiceStub)ChannelListChannelsRequestListChannelsResponse)ChannelServiceStub)CalculatedChannelQuery)ChannelQuery)GetDataRequestGetDataResponseQuery)DataServiceStub)ListRunsRequestListRunsResponseRun)RunServiceStub)	TypeAlias)cel_in)channel_fqn)to_pb_timestamp)ChannelTimeSeries)try_deserialize_channel_data)validate_channel_reference)	DataError)r   r   	DataQueryDataQueryResult)	SiftError_component_deprecation_warning)SiftAsyncChannel)ChannelDataTypec            	       2   e Zd ZU dZdZeZeed<   eZ	eed<   eZ
eed<   eed<   eed<   eed<   eed	<   eed
<   eeef   ed<   eeee	ee   f   f   ed<   ee
ef   ed<   defdZd)dededefdZdedeee      fdZdeee      deeee   f   fdZ d Z!dedefdZ"dedee#   dee	ee   f   fdZ$dee%e#e&f      dee
ef   fdZ'dedefdZ(d e)e   dee   fd!Z*d"edee#   dee   fd#Z+d$ee,   deee,      fd%Z-d$ee,   fd&Z.de/de0e1ee2f      fd'Z3y()*DataServicez
    A service that asynchronously executes a `sift_py.data.query.DataQuery` to retrieve telemetry
    for an arbitrary amount of channels (or calculated channels) within a user-specified time-range
    and sampling rate.
       	AssetName
ChannelFqnRunName_asset_service_stub_channel_service_stub _calculated_channel_service_stub_data_service_stub_run_service_stub_cached_assets_cached_channels_cached_runschannelc                     t        |      | _        t        |      | _        t	        |      | _        t        |      | _        t        |      | _	        i | _
        i | _        i | _        y N)r   r6   r   r7   r   r8   r   r9   r!   r:   r;   r<   r=   )selfr>   s     Y/home/www/backend.miabetepe.com/venv/lib/python3.12/site-packages/sift_py/data/service.py__init__zDataService.__init__?   s[    #3G#< %7%@"0Mg0V-"1'":!/!8  "    query
bust_cachereturnc           
      	  K   |r| j                          | j                  |j                         d{   }g }|j                  D ]  }t	        |t
              r|j                  |       %t	        |t              s6|j                  D ]L  }|d   }|j                  d      }|t                t        ||      }|j                  t        |             N  | j                  ||       d{   }	| j                  |j                         d{   }
g }|j                  D ]  }t	        |t
              r|j                         }|j                  }|	j                  |      }|st!        d| d|j"                   d| d	      |D cg c]  }t%        |j&                  
       }}|:|
j                  |      }|t!        d| d      |D ]  }|j(                  |_         |D ]  }|j                  t+        |              t	        |t              rg }|j                  D ]  }t-        |d          |d   }|j                  d      }|t                t        ||      }|	j                  |      }|st!        d| d      |d   j&                  }t/        |      dkD  rY|j                  d      }|t1        d| d      |D ]2  }t3        j4                  |j6                        |k(  s&|j&                  } n |j                  t9        |d   |              t;        |j<                  |      }t?        |j@                  |      }|j                  }|3|
j                  |      }|t!        d| d      |j(                  |_        |j                  t+        |             tC        d       | jE                  |       d{    tG        |jH                        }tG        |jJ                        }|jL                  }|jN                  }g }| jQ                  |      D ]G  } tS        |||||       }!tU        jV                  | jY                  |!            }"|j                  |"       I g }#tU        jZ                  |  d{   D ]  }$|#j]                  |$        t_        | ja                  |#            S 7 7 7 c c}w 7 7 Dw)zB
        Performs the actual query to retrieve telemetry.
        Nchannel_name	component)namerJ   )rI   z0An unexpected error occurred. Expected channel 'z/' to have been loaded. Are you sure the asset 'z' has the channel 'z'?)
channel_idz,An unexpected error occurred. Expected run 'z' to have been loaded.)r>   	referencer   r2   	data_typez7Found multiple channels with the fully qualified name 'zB'. A 'data_type' must be provided in `ExpressionChannelReference`.)channel_referencerL   )
expressionexpression_channel_references)channel_keyrP   )calculated_channelzUnknown channel query type.)
start_timeend_time	sample_ms	page_sizequeries)1_bust_cache_load_asset
asset_namechannels
isinstancer   appendr   rQ   getr-   r$   _load_channels
_load_runsfqnrun_namer,   rK   ChannelQueryPbrL   run_idr   r(   len
ValueErrorr/   from_pbrN   r   r   rP   CalculatedChannelQueryPbrR   r)   _validate_queriesr%   rT   rU   rV   rW   _batch_queriesr   asynciocreate_task	_get_datagatherextendr+   _merge_and_sort_pages)%rA   rE   rF   assetchannel_queriescrefrI   rJ   r\   runsrX   channel_queryrb   rc   targetsr>   cqueriesruncqueryrQ   expr_refrL   target_data_typetargetexpression_requestcalculated_cqueryrT   rU   rV   rW   tasksbatchreqtask
data_pagespagess%                                        rB   executezDataService.executeJ   s"    
 &&u'7'788.0 	TA!\*&&q)A56:: 	TC#&~#6L !$ 4I ,68'2PY'Z#**<\+RS	T		T ,,UODD__U^^44!"^^ [	?M-6#'')(11",,s+#J3%O~  @E  @J  @J  K  K^  _b  ^c  ce  f  ZaagNg6H6HIaa'((8,C{'J8*Tjk  #+ 3(+

3 ' :FNN5#89: M+AB02- - K K #H.x/DE#+N#;L ([ 9I ,68'2PY'Z&ll<8G"'N|n\rs  ")!6!6J7|a'+3<<+D(+3","YZfYg  hj  !k#  '. &F.66v7G7GHL\\-3->->
 %&
 2882.6{.CPZ?#J &7,772O&"
 %= - 9 91%!
 )11'((8,C{'J8*Tjk  03zz%,u8IJK   =>>w[	?z $$W---$U%5%56
"5>>2OO	OO	((1 		E %!##C &&t~~c':;DLL		 +-
">>511 	%Ee$	% t99*EFF] 9$ E4 bf 	., 2su   1SR<AS<A2S.R?/"SSA8S
S'ES0CSS
B:SS5S?SSSSr   c                   K   g }|j                   }|j                  }|j                  }|j                  }|j                  }d}	 t        ||||||      }	t        t        | j                  j                  |	       d {         }
|j                  |
j                         |
j                  }t        |      dk(  r	 |S {7 Aw)N )rT   rU   rV   rW   rX   
page_tokenr   )rT   rU   rV   rW   rX   r   r   r   r9   GetDatar^   datanext_page_tokenrf   )rA   r   r   rT   rU   rV   rW   rX   r   next_page_reqresponses              rB   rn   zDataService._get_data   s     %'^^
<<MM	MM	++*%!##*M O43J3J3R3RS`3a-abHLL'&66O?#q(#  .bs   A;C=B?
>ACr   c           
         t        |      dk(  ri S i }|D ]B  }|D ]9  }t        t        t        |            }|D ]  \  }}|j                  }|j
                  xs |j                  }	|j                  |	      }
|
1t        |j                  |j                  |j                        g||	<   q|
D ]g  }|j                  |j                  k(  s|j                  j                  |j                         |j                  j                  |j                           |
j                  t        |j                  |j                  |j                                < E |j                         D ]  }|D ]  }|j                            |S )Nr   )rN   time_columnvalue_column)rf   r'   r   r   r>   rK   rL   r_   r&   rN   r   r   rp   r^   valuessort_time_series)rA   r   merged_values_by_channelpageraw_channel_valuesparsed_channel_datametadatacvaluesr>   rI   time_seriesseriesr   channel_datas                 rB   rq   z!DataService._merge_and_sort_pages   s    u:?IGI  !	D&*  "&B4M_C`&a#)< %Hg&..G#*<<#E73E3EL":">">|"LK"*-*1*;*;,3,?,?-4-A-AB0> '2 F%//73D3DD & 2 2 9 9':M:M N & 3 3 : :7;O;O P %	 (.. 1.5.?.?070C0C181E1E!"/ !	F -335 	0D $ 0--/0	0 ('rD   c                     | j                   j                          | j                  j                          | j                  j                          y r@   )r;   clearr<   r=   )rA   s    rB   rY   zDataService._bust_cache0  s8    !!###%!rD   r[   c                    K   | j                   j                  |      }|2| j                  |       d {   }|| j                   |j                  <   |S 7 wr@   )r;   r_   _get_asset_by_namerK   )rA   r[   rr   s      rB   rZ   zDataService._load_asset5  sR     ##''
3=11*==E.3D

+ >s   2AA Arr   rs   c                 ~  K   | j                   j                  |j                        | j                  |j                  |       d {   }t        t              }|D ]   }||j                     j                  |       " || j                   |j                  <   | j                   |j                     S | j                   |j                     }g }|D ]/  }|j                  |j                        |j                  |       1 g }t        |      dkD  r$| j                  |j                  |       d {   }t        t              }|D ]   }||j                     j                  |       " t        |      dkD  r(| j                   |j                     j                  |       | j                   |j                     S 7 q7 wNr   )r<   r_   rK   _get_channels_by_asset_idasset_idr   listr^   rI   rf   update)	rA   rr   rs   sift_channelsr\   rt   cached_channelschannels_to_retrieverE   s	            rB   r`   zDataService._load_channels>  s    
   $$UZZ08"&"@"@Q`"aaM"4(H" + ''*+ 19D!!%**-((44//

;35$ 	3E""5#5#56>$++E2	3 #$q("&"@"@ 4# M t$ 	'AQVV##A&	' x=1!!%**-44X>$$UZZ00= b$s-   AF=F8B%F=.AF=0F;1BF=;F=c                   K   t               }|D ]1  }|j                  }|t        |      dkD  s!|j                  |       3 i }t               }|D ]@  }| j                  j                  |      }||||j                  <   0|j                  |       B | j                  |       d {   D ]*  }|| j                  |j                  <   |||j                  <   , |S 7 3wr   )setrc   rf   addr=   r_   rK   _get_runs_by_names)rA   rs   	run_namesrw   rc   rv   run_names_to_fetchrz   s           rB   ra   zDataService._load_runsd  s      "e	, 	(M$--H#H(9h'		(  U! 	1H##''1C!$SXX"&&x0	1 001CDD 	!C*-Dchh' DN	! 	 Es   CCA8C(C)4Cc                   K   t        d| dd      }t        t        | j                  j	                  |       d {         }|j
                  }t        |      dk(  rt        d| d      |j
                  d   S 7 @w)Nzname==""r2   )filterrW   r   zAsset of name '' does not exist.)r   r   r   r6   
ListAssetsassetsrf   r)   )rA   r[   r   resr   s        rB   r   zDataService._get_asset_by_name  s     ZL*
 %T-E-E-P-PQT-U'UVv;!oj\9JKLLzz!} (Vs   :A?A=
AA?r   c                   K   t        |      dk(  rg S g }t        d|      }d}d}	 t        |||      }t        t        | j
                  j                  |       d {         }|j                  |j                         |j                  }t        |      dk(  rnvt               }|D ]  }	|j                  |	j                          |D ]  }
|
|vst        d|
 d       |S 7 w)Nr   rK     r   r   rW   r   zRun of name 'r   )rf   r#   r   r   r   r:   ListRunsrp   rv   r   r   r   rK   r)   )rA   r   rv   r   rW   r   r   r   seen_sift_runssift_runrc   s              rB   r   zDataService._get_runs_by_names  s    y>QI	*	!#*C
 't/E/E/N/Ns/S)STCKK!!11O?#q(   	.Hx}}-	. " 	MH~--z9J KLL	M # *Ts   AC&C$
A4C&C&r   c                   K   t        |      dk(  st        |      dk(  rg S g }g }|D ]  }|j                  |j                          t        d|      }d| d| }d}d}		 t	        |||	      }
t        t        | j                  j                  |
       d {         }|j                  |j                         |j                  }	t        |	      dk(  r	 |S x7 Aw)Nr   rK   zasset_id=="z" && r   r   r   )rf   r^   rI   r#   r   r   r   r7   ListChannelsrp   r\   r   )rA   r   rs   r\   channel_namesrE   name_inr   rW   r   r   r   s               rB   r   z%DataService._get_channels_by_asset_id  s      x=A_!5!:I"$$ 	5E  !3!34	5 /xjgY7	%#*C
 +43M3M3Z3Z[^3_-_`COOCLL)!11O?#q(  .`s   BCC
ACrX   c                     t        |      dk(  rg S g }| j                  j                  }t        dt        |      |      D ]  }|j	                  ||||z            |S r   )rf   	__class__REQUEST_BATCH_SIZEranger^   )rA   rX   batches
batch_sizeis        rB   rk   zDataService._batch_queries  sa    w<1I%'^^66
q#g,
3 	8ANN71q:~67	8 rD   c                   K   g }|D ]9  }|j                  d      s|j                  |j                  j                         ; t	        |      dkD  rvg }|D ]7  }t        j                  | j                  |            }|j                  |       9 t        j                  |  d {   D ]  }||\  }}	t        d| d|	        y y 7 #w)NrS   r   z#Encountered an invalid expression 'z': )
HasFieldr^   rS   rP   rf   rl   rm   _validate_expressionro   rg   )
rA   rX   queries_to_validaterE   r   to_validater   resultexprerrs
             rB   rj   zDataService._validate_queries  s     79 	PE~~23#**5+C+C+N+NO	P "#a'E2 #**4+D+D[+QRT"# !( 66 [% &ID#$'J4&PSTWSX%YZZ[ ( 7s   C
BC
$C%	C
/C
c                    K   	 | j                   j                  |       y # t        $ r}|j                  |fcY d }~S d }~ww xY wwr@   )r8   ValidateExpression	ExceptionrP   )rA   r   r   s      rB   r   z DataService._validate_expression  s@     	)11DDSI 	)NNC((	)s,   A  A	A<AAAAN)F)4__name__
__module____qualname____doc__r   strr3   r"   __annotations__r4   r5   r   r   r   r   r!   r   r   r   r   r    r.   rC   r*   boolr+   r   r   r   r   rn   r&   rq   rY   rZ   r   r`   r
   r   ra   r   r   r   r   r   rk   rj   r   r   r	   r   r    rD   rB   r1   r1   $   s+    IyJ	GY))--&CC''%%E)**9d:tG}+D&EEFFw|$$	 0 	VG9 VG$ VG? VGp> d8C=6I :/((3-(/(	c4)**	+/(b"
C E $1$1 l+$1 
j$w-'	(	$1L#E,8N*N$OP	gsl	83 5 !#c( !tCy !F  .2<.@ 	g D
d5k 
d4;6G 
[tE{ [&).? )HUSVXaSaMbDc )rD   r1   )Jrl   collectionsr   typingr   r   r   r   r   r	   r
   r   google.protobuf.any_pb2r   sift.assets.v1.assets_pb2r   r   r   sift.assets.v1.assets_pb2_grpcr   3sift.calculated_channels.v1.calculated_channels_pb2r   r   8sift.calculated_channels.v1.calculated_channels_pb2_grpcr   sift.channels.v3.channels_pb2r   r   r   "sift.channels.v3.channels_pb2_grpcr   sift.data.v2.data_pb2r   ri   r   rd   r   r   r   sift.data.v2.data_pb2_grpcr   sift.runs.v2.runs_pb2r   r   r    sift.runs.v2.runs_pb2_grpcr!   typing_extensionsr"   sift_py._internal.celr#   sift_py._internal.channelr$   #sift_py._internal.convert.timestampr%   sift_py.data._channelr&   sift_py.data._deserializer'   sift_py.data._validater(   sift_py.data.errorr)   sift_py.data.queryr*   r+   sift_py.errorr,   r-   sift_py.grpc.transportr.   sift_py.ingestion.channelr/   r1   r   rD   rB   <module>r      s     # J J J ' R R ; c \ \ A T @ H H 6 H H 5 ' ( 1 ? 3 B = ( _ _ C 3 5R) R)rD   