Skip to content

Commit 33ff480

Browse files
committed
WIP - compatibility with GAT in backend::DataService
Means we don't need to clone so many things or connect to the database as many times.
1 parent 234848b commit 33ff480

File tree

1 file changed

+44
-50
lines changed

1 file changed

+44
-50
lines changed

backend/src/data.rs

+44-50
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
1-
use std::{collections::HashMap, sync::Arc};
1+
use std::sync::Arc;
22

33
use 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

97
use 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

Comments
 (0)