diff --git a/src/service/search/datafusion/distributed_plan/node.rs b/src/service/search/datafusion/distributed_plan/node.rs index 2eb2dfc67f..c31aebd596 100644 --- a/src/service/search/datafusion/distributed_plan/node.rs +++ b/src/service/search/datafusion/distributed_plan/node.rs @@ -23,6 +23,8 @@ use datafusion::common::TableReference; use hashbrown::HashMap; use proto::cluster_rpc::{IndexInfo, KvItem, QueryIdentifier, SearchInfo, SuperClusterInfo}; +use crate::service::search::sql::histogram::histogram_bucket_start; + #[derive(Debug, Clone)] pub struct RemoteScanNodes { pub req: Request, @@ -73,7 +75,14 @@ impl RemoteScanNodes { .get(table_name) .unwrap_or(&vec![]) .clone(), - start_time: self.req.time_range.as_ref().map(|x| x.0).unwrap_or(0), + start_time: { + let t = self.req.time_range.as_ref().map(|x| x.0).unwrap_or(0); + if self.req.histogram_interval > 0 { + histogram_bucket_start(t, self.req.histogram_interval * 1_000_000) + } else { + t + } + }, end_time: self.req.time_range.as_ref().map(|x| x.1).unwrap_or(0), timeout: self.req.timeout as u64, use_cache: self.req.use_cache, diff --git a/src/service/search/sql/histogram.rs b/src/service/search/sql/histogram.rs index 0c725ff9e9..6e6d8ec0c7 100644 --- a/src/service/search/sql/histogram.rs +++ b/src/service/search/sql/histogram.rs @@ -190,6 +190,13 @@ fn extract_where_clause(statement: &Statement) -> Result { } } +/// Snaps `timestamp_us` down to the nearest histogram bucket boundary. +/// Both arguments are in microseconds. Used to ensure the first bucket +/// returned by date_bin() is fully populated rather than partial. +pub fn histogram_bucket_start(timestamp_us: i64, interval_us: i64) -> i64 { + timestamp_us - timestamp_us % interval_us +} + #[cfg(test)] mod tests { use super::*;