Skip to content

Commit c056e50

Browse files
authored
feat: added query function in aw-client (#477)
* feat: added query function in aw-client * fix: fixed client query * fix: improved return type for client query
1 parent 1886ebe commit c056e50

File tree

4 files changed

+53
-4
lines changed

4 files changed

+53
-4
lines changed

Cargo.lock

+3-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

aw-client-rust/src/blocking.rs

+6
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,12 @@ impl AwClient {
6262
stop: Option<DateTime<Utc>>,
6363
limit: Option<u64>
6464
);
65+
proxy_method!(
66+
query,
67+
Vec<serde_json::Value>,
68+
query: &str,
69+
timeperiods: Vec<(DateTime<Utc>, DateTime<Utc>)>
70+
);
6571
proxy_method!(insert_event, (), bucketname: &str, event: &Event);
6672
proxy_method!(insert_events, (), bucketname: &str, events: Vec<Event>);
6773
proxy_method!(

aw-client-rust/src/lib.rs

+28-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use std::vec::Vec;
1111
use std::{collections::HashMap, error::Error};
1212

1313
use chrono::{DateTime, Utc};
14-
use serde_json::Map;
14+
use serde_json::{json, Map};
1515

1616
pub use aw_models::{Bucket, BucketMetadata, Event};
1717

@@ -98,6 +98,33 @@ impl AwClient {
9898
Ok(())
9999
}
100100

101+
pub async fn query(
102+
&self,
103+
query: &str,
104+
timeperiods: Vec<(DateTime<Utc>, DateTime<Utc>)>,
105+
) -> Result<Vec<serde_json::Value>, reqwest::Error> {
106+
let url = reqwest::Url::parse(format!("{}/api/0/query", self.baseurl).as_str()).unwrap();
107+
108+
// Format timeperiods as ISO8601 strings, separated by /
109+
let timeperiods_str: Vec<String> = timeperiods
110+
.iter()
111+
.map(|(start, stop)| (start.to_rfc3339(), stop.to_rfc3339()))
112+
.map(|(start, stop)| format!("{}/{}", start, stop))
113+
.collect();
114+
115+
// Result is a sequence, one element per timeperiod
116+
self.client
117+
.post(url)
118+
.json(&json!({
119+
"query": query.split('\n').collect::<Vec<&str>>(),
120+
"timeperiods": timeperiods_str,
121+
}))
122+
.send()
123+
.await?
124+
.json()
125+
.await
126+
}
127+
101128
pub async fn get_events(
102129
&self,
103130
bucketname: &str,

aw-client-rust/tests/test.rs

+16
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,22 @@ mod test {
110110
println!("Events: {events:?}");
111111
assert!(events[0].duration == Duration::seconds(1));
112112

113+
// Query
114+
let query = format!(
115+
"events = query_bucket(\"{}\");
116+
RETURN = events;",
117+
bucket.id
118+
);
119+
let start: DateTime<Utc> = DateTime::parse_from_rfc3339("1996-12-19T00:00:00-08:00")
120+
.unwrap()
121+
.into();
122+
let end: DateTime<Utc> = DateTime::parse_from_rfc3339("2020-12-19T00:00:00-08:00")
123+
.unwrap()
124+
.into();
125+
let timeperiods = (start, end);
126+
let query_result = client.query(&query, vec![timeperiods]).unwrap();
127+
println!("Query result: {query_result:?}");
128+
113129
client
114130
.delete_event(&bucketname, events[0].id.unwrap())
115131
.unwrap();

0 commit comments

Comments
 (0)