diff --git a/src/handler/http/request/search/mod.rs b/src/handler/http/request/search/mod.rs index 2797979de7..45fc76d305 100644 --- a/src/handler/http/request/search/mod.rs +++ b/src/handler/http/request/search/mod.rs @@ -134,9 +134,20 @@ pub async fn search( let mut rpc_req: crate::handler::grpc::cluster_rpc::SearchRequest = req.to_owned().into(); rpc_req.org_id = org_id.to_string(); rpc_req.stream_type = stream_type.to_string(); - let resp: SearchService::sql::Sql = crate::service::search::sql::Sql::new(&rpc_req) - .await - .unwrap(); + let resp: SearchService::sql::Sql = match crate::service::search::sql::Sql::new(&rpc_req).await + { + Ok(v) => v, + Err(e) => { + return Ok(match e { + errors::Error::ErrorCode(code) => HttpResponse::InternalServerError() + .json(meta::http::HttpResponse::error_code(code)), + _ => HttpResponse::InternalServerError().json(meta::http::HttpResponse::error( + StatusCode::INTERNAL_SERVER_ERROR.into(), + e.to_string(), + )), + }); + } + }; // Check permissions on stream #[cfg(feature = "enterprise")] diff --git a/src/service/search/datafusion/exec.rs b/src/service/search/datafusion/exec.rs index 89101e0a71..5e03c572ab 100644 --- a/src/service/search/datafusion/exec.rs +++ b/src/service/search/datafusion/exec.rs @@ -421,11 +421,12 @@ async fn get_fast_mode_ctx( file_type: FileType, ) -> Result<(SessionContext, Arc)> { let mut files = files.to_vec(); - if !sql.meta.order_by.is_empty() && !sql.meta.order_by[0].1 { - files.sort_by(|a, b| b.meta.min_ts.cmp(&a.meta.min_ts)); - } else { + let desc = sql.meta.order_by.is_empty() || sql.meta.order_by[0].1; + if desc { files.sort_by(|a, b| a.meta.min_ts.cmp(&b.meta.min_ts)); - } + } else { + files.sort_by(|a, b| b.meta.min_ts.cmp(&a.meta.min_ts)); + }; let mut loaded_records = 0; let mut new_files = Vec::new(); @@ -433,7 +434,7 @@ async fn get_fast_mode_ctx( for i in (0..files.len()).rev() { loaded_records += files.get(i).unwrap().meta.records as usize; new_files.push(files[i].clone()); - if loaded_records >= needs { + if loaded_records >= needs && (desc || new_files.len() > 1) { break; } } diff --git a/src/service/search/sql.rs b/src/service/search/sql.rs index 7bb100325e..dca49252c3 100644 --- a/src/service/search/sql.rs +++ b/src/service/search/sql.rs @@ -324,8 +324,20 @@ impl Sql { } origin_sql = if meta.order_by.is_empty() && !sql_mode.eq(&SqlMode::Full) { let sort_by = if req_query.sort_by.is_empty() { + meta.order_by = vec![(CONFIG.common.column_timestamp.to_string(), true)]; format!("{} DESC", CONFIG.common.column_timestamp) } else { + if req_query.sort_by.to_uppercase().ends_with(" DESC") { + meta.order_by = vec![( + req_query.sort_by[0..req_query.sort_by.len() - 5].to_string(), + true, + )]; + } else if req_query.sort_by.to_uppercase().ends_with(" ASC") { + meta.order_by = vec![( + req_query.sort_by[0..req_query.sort_by.len() - 4].to_string(), + false, + )]; + } req_query.sort_by.clone() }; format!(