@@ -71,6 +71,52 @@ pub struct Query {
7171 pub filter_tags : Option < Vec < String > > ,
7272}
7373
74+ /// A function to execute the query and fetch QueryResponse
75+ /// This won't look in the cache
76+ /// TODO: Improve this function and make this a part of the query API
77+ pub async fn get_records_and_fields (
78+ query_request : & Query ,
79+ req : & HttpRequest
80+ ) -> Result < ( Option < Vec < RecordBatch > > , Option < Vec < String > > ) , QueryError > {
81+ let session_state = QUERY_SESSION . state ( ) ;
82+
83+ // get the logical plan and extract the table name
84+ let raw_logical_plan = session_state
85+ . create_logical_plan ( & query_request. query )
86+ . await ?;
87+
88+ let time_range = TimeRange :: parse_human_time ( & query_request. start_time , & query_request. end_time ) ?;
89+ // create a visitor to extract the table name
90+ let mut visitor = TableScanVisitor :: default ( ) ;
91+ let _ = raw_logical_plan. visit ( & mut visitor) ;
92+
93+ let tables = visitor. into_inner ( ) ;
94+ update_schema_when_distributed ( & tables) . await ?;
95+ let query: LogicalQuery = into_query ( & query_request, & session_state, time_range) . await ?;
96+
97+ let creds = extract_session_key_from_req ( & req) ?;
98+ let permissions = Users . get_permissions ( & creds) ;
99+
100+ let table_name = query
101+ . first_table_name ( )
102+ . ok_or_else ( || QueryError :: MalformedQuery ( "No table name found in query" ) ) ?;
103+
104+ user_auth_for_datasets ( & permissions, & tables) ?;
105+
106+ let ( records, fields) = execute ( query, & table_name, false ) . await ?;
107+
108+ let records = match records {
109+ Either :: Left ( vec_rb) => {
110+ vec_rb
111+ } ,
112+ Either :: Right ( _) => {
113+ return Err ( QueryError :: CustomError ( "Reject streaming response" . into ( ) ) )
114+ } ,
115+ } ;
116+
117+ Ok ( ( Some ( records) , Some ( fields) ) )
118+ }
119+
74120pub async fn query ( req : HttpRequest , query_request : Query ) -> Result < HttpResponse , QueryError > {
75121 let session_state = QUERY_SESSION . state ( ) ;
76122 let raw_logical_plan = match session_state
0 commit comments