From 4e78db35381dd1974880fc6e62866be0dcf9856f Mon Sep 17 00:00:00 2001 From: Ashish Kolhe <35160958+oasisk@users.noreply.github.com> Date: Thu, 25 Jul 2024 19:47:24 +0530 Subject: [PATCH] fix:result caching issue (#4065) ## Summary by CodeRabbit - **New Features** - Improved sorting logic for search responses, enhancing clarity and maintainability. - **Bug Fixes** - Simplified conditional logic for cache checks, improving efficiency and reducing complexity. --- src/service/search/cache/cacher.rs | 11 +++++------ src/service/search/cache/mod.rs | 26 ++++++++++++++++---------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/service/search/cache/cacher.rs b/src/service/search/cache/cacher.rs index 6ff4e792c8..38c66bd19d 100644 --- a/src/service/search/cache/cacher.rs +++ b/src/service/search/cache/cacher.rs @@ -71,12 +71,11 @@ pub async fn check_cache( // skip the count queries & queries first order by is not _timestamp field let order_by = meta.meta.order_by; if (sql_mode.eq(&SqlMode::Full) && req.query.track_total_hits) - || (order_by.is_empty() - || (order_by.first().as_ref().unwrap().0 != cfg.common.column_timestamp - && (result_ts_col.is_none() - || (result_ts_col.is_some() - && result_ts_col.as_ref().unwrap() - != &order_by.first().as_ref().unwrap().0)))) + || (!order_by.is_empty() + && order_by.first().as_ref().unwrap().0 != cfg.common.column_timestamp + && (result_ts_col.is_none() + || (result_ts_col.is_some() + && result_ts_col.as_ref().unwrap() != &order_by.first().as_ref().unwrap().0))) { return CachedQueryResponse::default(); } diff --git a/src/service/search/cache/mod.rs b/src/service/search/cache/mod.rs index 08c4bd1852..99c7288d59 100644 --- a/src/service/search/cache/mod.rs +++ b/src/service/search/cache/mod.rs @@ -231,7 +231,9 @@ pub async fn search( ); c_resp.cached_response } else { - results[0].clone() + let mut reps = results[0].clone(); + sort_response(c_resp.is_descending, &mut reps, &c_resp.ts_column); + reps } }; @@ -343,15 +345,7 @@ fn merge_response( } cache_response.hits.extend(res.hits.clone()); } - if is_descending { - cache_response - .hits - .sort_by_key(|b| std::cmp::Reverse(get_ts_value(ts_column, b))); - } else { - cache_response - .hits - .sort_by_key(|a| get_ts_value(ts_column, a)); - } + sort_response(is_descending, cache_response, ts_column); if cache_response.hits.len() > limit as usize { cache_response.hits.truncate(limit as usize); @@ -366,6 +360,18 @@ fn merge_response( (cache_hits_len as f64 * 100_f64 / (result_cache_len + cache_hits_len) as f64) as usize; } +fn sort_response(is_descending: bool, cache_response: &mut search::Response, ts_column: &str) { + if is_descending { + cache_response + .hits + .sort_by_key(|b| std::cmp::Reverse(get_ts_value(ts_column, b))); + } else { + cache_response + .hits + .sort_by_key(|a| get_ts_value(ts_column, a)); + } +} + #[allow(clippy::too_many_arguments)] async fn write_results( trace_id: &str,