@@ -34,11 +34,13 @@ use crate::event::error::EventError;
3434use crate :: handlers:: http:: fetch_schema;
3535
3636use crate :: event:: commit_schema;
37+ use crate :: localcache:: CacheError ;
3738use crate :: metrics:: QUERY_EXECUTE_TIME ;
3839use crate :: option:: { Mode , CONFIG } ;
3940use crate :: query:: error:: ExecuteError ;
4041use crate :: query:: Query as LogicalQuery ;
4142use crate :: query:: { TableScanVisitor , QUERY_SESSION } ;
43+ use crate :: querycache:: QueryCacheManager ;
4244use crate :: rbac:: role:: { Action , Permission } ;
4345use crate :: rbac:: Users ;
4446use crate :: response:: QueryResponse ;
@@ -50,7 +52,7 @@ use crate::utils::actix::extract_session_key_from_req;
5052#[ derive( Debug , serde:: Deserialize , serde:: Serialize ) ]
5153#[ serde( rename_all = "camelCase" ) ]
5254pub struct Query {
53- pub query : String ,
55+ pub pub query : String ,
5456 pub start_time : String ,
5557 pub end_time : String ,
5658 #[ serde( default ) ]
@@ -72,6 +74,36 @@ pub async fn query(req: HttpRequest, query_request: Query) -> Result<impl Respon
7274 // create a visitor to extract the table name
7375 let mut visitor = TableScanVisitor :: default ( ) ;
7476 let _ = raw_logical_plan. visit ( & mut visitor) ;
77+ let stream = visitor. top ( ) ;
78+ let query_cache_manager = QueryCacheManager :: global ( CONFIG . parseable . query_cache_size )
79+ . await
80+ . unwrap_or ( None ) ;
81+
82+ if let Some ( query_cache_manager) = query_cache_manager {
83+ let mut query_cache = query_cache_manager. get_cache ( stream) . await ?;
84+
85+ let ( start, end) = parse_human_time ( & query_request. start_time , & query_request. end_time ) ?;
86+ let key = format ! (
87+ "{}-{}-{}" ,
88+ start. to_rfc3339( ) ,
89+ end. to_rfc3339( ) ,
90+ query_request. query. clone( )
91+ ) ;
92+
93+ let file_path = query_cache. get_file ( key) ;
94+ if let Some ( file_path) = file_path {
95+ let ( records, fields) = query_cache. get_cached_records ( & file_path) . await ?;
96+ let response = QueryResponse {
97+ records,
98+ fields,
99+ fill_null : query_request. send_null ,
100+ with_fields : query_request. fields ,
101+ }
102+ . to_http ( ) ?;
103+
104+ return Ok ( response) ;
105+ }
106+ } ;
75107
76108 let tables = visitor. into_inner ( ) ;
77109
@@ -99,6 +131,18 @@ pub async fn query(req: HttpRequest, query_request: Query) -> Result<impl Respon
99131 let time = Instant :: now ( ) ;
100132
101133 let ( records, fields) = query. execute ( table_name. clone ( ) ) . await ?;
134+ // put the rbs to parquet
135+ if let Some ( query_cache_manager) = query_cache_manager {
136+ query_cache_manager
137+ . create_parquet_cache (
138+ & table_name,
139+ & records,
140+ query. start . to_rfc3339 ( ) ,
141+ query. end . to_rfc3339 ( ) ,
142+ query_request. query ,
143+ )
144+ . await ?;
145+ }
102146
103147 let response = QueryResponse {
104148 records,
0 commit comments