1919use actix_web:: http:: header:: ContentType ;
2020use actix_web:: web:: { self , Json } ;
2121use actix_web:: { FromRequest , HttpRequest , Responder } ;
22- use chrono:: { DateTime , Utc } ;
22+ use chrono:: { DateTime , Timelike , Utc } ;
2323use datafusion:: error:: DataFusionError ;
2424use datafusion:: execution:: context:: SessionState ;
2525use futures_util:: Future ;
@@ -36,8 +36,10 @@ use crate::rbac::Users;
3636use crate :: response:: QueryResponse ;
3737use crate :: utils:: actix:: extract_session_key_from_req;
3838
39+ use super :: send_query_request_to_ingestor;
40+
3941/// Query Request through http endpoint.
40- #[ derive( Debug , serde:: Deserialize ) ]
42+ #[ derive( Debug , serde:: Deserialize , serde :: Serialize ) ]
4143#[ serde( rename_all = "camelCase" ) ]
4244pub struct Query {
4345 query : String ,
@@ -52,6 +54,15 @@ pub struct Query {
5254}
5355
5456pub async fn query ( req : HttpRequest , query_request : Query ) -> Result < impl Responder , QueryError > {
57+ // create a new query to send to the ingestors
58+ let mut mmem= vec ! [ ] ;
59+ if let Some ( query) = transform_query_for_ingestor ( & query_request) {
60+ mmem = send_query_request_to_ingestor ( & query)
61+ . await
62+ . map_err ( |err| QueryError :: Custom ( err. to_string ( ) ) ) ?;
63+ }
64+
65+ // let rbj = arrow_json::ReaderBuilder::new();
5566 let creds = extract_session_key_from_req ( & req) . expect ( "expects basic auth" ) ;
5667 let permissions = Users . get_permissions ( & creds) ;
5768 let session_state = QUERY_SESSION . state ( ) ;
@@ -94,7 +105,7 @@ pub async fn query(req: HttpRequest, query_request: Query) -> Result<impl Respon
94105
95106 let time = Instant :: now ( ) ;
96107
97- let ( records, fields) = query. execute ( ) . await ?;
108+ let ( records, fields) = query. execute ( Some ( mmem ) ) . await ?;
98109 let response = QueryResponse {
99110 records,
100111 fields,
@@ -183,6 +194,24 @@ async fn into_query(
183194 } )
184195}
185196
197+ fn transform_query_for_ingestor ( query : & Query ) -> Option < Query > {
198+ let end_time = DateTime :: parse_from_rfc3339 ( & query. end_time ) . ok ( ) ?;
199+ let start_time = end_time - chrono:: Duration :: minutes ( 1 ) ;
200+
201+ dbg ! ( start_time. minute( ) ) ;
202+
203+ let q = Query {
204+ query : query. query . clone ( ) ,
205+ fields : query. fields ,
206+ filter_tags : query. filter_tags . clone ( ) ,
207+ send_null : query. send_null ,
208+ start_time : start_time. to_rfc3339 ( ) ,
209+ end_time : end_time. to_rfc3339 ( ) ,
210+ } ;
211+
212+ Some ( q)
213+ }
214+
186215#[ derive( Debug , thiserror:: Error ) ]
187216pub enum QueryError {
188217 #[ error( "Query cannot be empty" ) ]
@@ -207,6 +236,8 @@ pub enum QueryError {
207236 Datafusion ( #[ from] DataFusionError ) ,
208237 #[ error( "Execution Error: {0}" ) ]
209238 Execute ( #[ from] ExecuteError ) ,
239+ #[ error( "Query Error: {0}" ) ]
240+ Custom ( String ) ,
210241}
211242
212243impl actix_web:: ResponseError for QueryError {
0 commit comments