1- use std:: { collections :: HashMap , sync:: Arc } ;
1+ use std:: sync:: Arc ;
22
33use futures_util:: stream:: FuturesOrdered ;
44
5- use grafana_plugin_sdk:: backend;
6- use tokio:: sync:: RwLock ;
7- use tokio_postgres:: Client ;
5+ use grafana_plugin_sdk:: backend:: { self , DataSourceInstanceSettings } ;
86
97use crate :: {
10- path:: { self , PathDisplay , QueryId } ,
11- queries:: { Query , SelectStatement , TailTarget } ,
8+ path:: { PathDisplay , QueryId } ,
9+ queries:: { Query , TailTarget } ,
1210 rows_to_frame, Error , MaterializePlugin ,
1311} ;
1412
@@ -31,32 +29,37 @@ impl backend::DataQueryError for QueryError {
3129// Unfortunately this has to take all of its arguments by value until we have
3230// GATs, since the `DataService::Stream` associated type can't contain references.
3331// Ideally we'd just borrow the query/uid etc but it's really not a big deal.
34- async fn query_data_single (
35- client : & Client ,
36- uid : & str ,
37- query : backend:: DataQuery < Query > ,
38- queries : Arc < RwLock < HashMap < path:: QueryId , SelectStatement > > > ,
39- ) -> Result < backend:: DataResponse , Error > {
40- let q = query. query ;
41- let target = q. as_tail ( ) ?;
42- let rows = target. select_all ( client) . await ?;
43- let mut frame = rows_to_frame ( & rows) ;
32+ impl MaterializePlugin {
33+ async fn query_data_single (
34+ & self ,
35+ datasource_instance_settings : Arc < DataSourceInstanceSettings > ,
36+ query : backend:: DataQuery < Query > ,
37+ ) -> Result < backend:: DataResponse , Error > {
38+ let q = query. query ;
39+ let client = self . get_client ( & datasource_instance_settings) . await ?;
40+ let target = q. as_tail ( ) ?;
41+ let rows = target. select_all ( & client) . await ?;
42+ let mut frame = rows_to_frame ( & rows) ;
4443
45- if let TailTarget :: Select { statement } = target {
46- let query_id = QueryId :: from_statement ( statement) ;
47- queries. write ( ) . await . insert ( query_id, statement. clone ( ) ) ;
48- }
44+ if let TailTarget :: Select { statement } = target {
45+ let query_id = QueryId :: from_statement ( statement) ;
46+ self . sql_queries
47+ . write ( )
48+ . await
49+ . insert ( query_id, statement. clone ( ) ) ;
50+ }
4951
50- let path = q. to_path ( ) ;
51- // Set the channel of the frame, indicating to Grafana that it should switch to
52- // streaming.
53- let channel = format ! ( "ds/{}/{}" , uid, path)
54- . parse ( )
55- . map_err ( Error :: CreatingChannel ) ?;
56- frame. set_channel ( channel) ;
57- let frame = frame. check ( ) ?;
52+ let path = q. to_path ( ) ;
53+ // Set the channel of the frame, indicating to Grafana that it should switch to
54+ // streaming.
55+ let channel = format ! ( "ds/{}/{}" , datasource_instance_settings . uid, path)
56+ . parse ( )
57+ . map_err ( Error :: CreatingChannel ) ?;
58+ frame. set_channel ( channel) ;
59+ let frame = frame. check ( ) ?;
5860
59- Ok ( backend:: DataResponse :: new ( query. ref_id , vec ! [ frame] ) )
61+ Ok ( backend:: DataResponse :: new ( query. ref_id , vec ! [ frame] ) )
62+ }
6063}
6164
6265#[ backend:: async_trait]
@@ -69,36 +72,27 @@ impl backend::DataService for MaterializePlugin {
6972 & self ,
7073 request : backend:: QueryDataRequest < Self :: Query > ,
7174 ) -> Self :: Stream < ' _ > {
72- let datasource_settings = request
73- . plugin_context
74- . datasource_instance_settings
75- . clone ( )
76- . ok_or ( Error :: MissingDatasource )
77- . unwrap ( ) ;
78- // let clients: Vec<_> = request
79- // .queries
80- // .iter()
81- // .map(|_| self.get_client(&datasource_settings))
82- // .collect::<FuturesUnordered<_>>()
83- // .collect()
84- // .await;
85- let client = Arc :: new ( self . get_client ( & datasource_settings) . await . unwrap ( ) ) ;
86- let queries = self . sql_queries . clone ( ) ;
75+ let datasource_settings = Arc :: new (
76+ request
77+ . plugin_context
78+ . datasource_instance_settings
79+ . clone ( )
80+ . ok_or ( Error :: MissingDatasource )
81+ . unwrap ( ) ,
82+ ) ;
8783 Box :: pin (
8884 request
8985 . queries
9086 . into_iter ( )
9187 . map ( |x| {
92- let client = client. clone ( ) ;
93- let queries = queries. clone ( ) ;
88+ let datasource_settings = datasource_settings. clone ( ) ;
9489 let ref_id = x. ref_id . clone ( ) ;
95- let uid = datasource_settings. uid . clone ( ) ;
96- async move {
90+ async {
9791 // let client = client.map_err(|source| QueryError {
9892 // ref_id: ref_id.clone(),
9993 // source,
100- // })?;
101- query_data_single ( & client , & uid , x , queries )
94+ self . query_data_single ( datasource_settings , x )
95+ // })?;
10296 . await
10397 . map_err ( |source| QueryError { ref_id, source } )
10498 }
0 commit comments