diff --git a/quickwit/quickwit-datetime/src/date_time_format.rs b/quickwit/quickwit-datetime/src/date_time_format.rs index b1d9af3de08..400a6c993a4 100644 --- a/quickwit/quickwit-datetime/src/date_time_format.rs +++ b/quickwit/quickwit-datetime/src/date_time_format.rs @@ -64,16 +64,6 @@ fn build_zone_offset(_: &str) -> Option { Some(OwnedFormatItem::Compound(items)) } -fn build_day_item(ptn: &str) -> Option { - let mut day = Day::default(); - if ptn.len() == 2 { - day.padding = Padding::Zero; - } else { - day.padding = Padding::None; - }; - Some(OwnedFormatItem::Component(Component::Day(day))) -} - fn build_year_item(ptn: &str) -> Option { let year_repr = if ptn.len() == 4 { YearRepr::Full @@ -95,6 +85,16 @@ fn build_month_item(ptn: &str) -> Option { Some(OwnedFormatItem::Component(Component::Month(month))) } +fn build_day_item(ptn: &str) -> Option { + let mut day = Day::default(); + if ptn.len() == 2 { + day.padding = Padding::Zero; + } else { + day.padding = Padding::None; + }; + Some(OwnedFormatItem::Component(Component::Day(day))) +} + fn build_hour_item(ptn: &str) -> Option { let mut hour = Hour::default(); if ptn.len() == 2 { @@ -167,8 +167,6 @@ fn resolve_java_datetime_format_alias(java_datetime_format: &str) -> &str { let java_datetime_format_map = JAVA_DATE_FORMAT_ALIASES.get_or_init(|| { let mut m = HashMap::new(); m.insert("date_optional_time", "yyyy-MM-dd['T'HH:mm:ss.SSSZ]"); - // m.insert("date_optional_time", "yyyy-MM-dd['T'HH:]"); - // m.insert("date_optional_time", "yyyy-MM-dd"); m.insert("strict_date_optional_time", "yyyy-MM-dd'T['HH:mm:ss.SSSZ]"); m.insert( "strict_date_optional_time_nanos", diff --git a/quickwit/quickwit-query/Cargo.toml b/quickwit/quickwit-query/Cargo.toml index e1229da8e8b..bee650198c8 100644 --- a/quickwit/quickwit-query/Cargo.toml +++ b/quickwit/quickwit-query/Cargo.toml @@ -22,6 +22,7 @@ serde = { workspace = true } serde_json = { workspace = true } serde_with = { workspace = true } tantivy = { workspace = true } +time = { workspace = true } thiserror = { workspace = true } whichlang = { workspace = true, optional = true } diff --git a/quickwit/quickwit-query/src/elastic_query_dsl/range_query.rs b/quickwit/quickwit-query/src/elastic_query_dsl/range_query.rs index 109855dd7e5..2345510cce0 100644 --- a/quickwit/quickwit-query/src/elastic_query_dsl/range_query.rs +++ b/quickwit/quickwit-query/src/elastic_query_dsl/range_query.rs @@ -21,6 +21,7 @@ use std::ops::Bound; use quickwit_datetime::StrptimeParser; use serde::Deserialize; +use time::format_description::well_known::Rfc3339; use crate::elastic_query_dsl::one_field_map::OneFieldMap; use crate::elastic_query_dsl::ConvertableToQueryAst; @@ -100,8 +101,45 @@ fn parse_and_convert(literal: JsonLiteral, parser: &StrptimeParser) -> anyhow::R let parsed_date_time = parser .parse_date_time(&date_time_str) .map_err(|reason| anyhow::anyhow!("Failed to parse date time: {}", reason))?; - Ok(JsonLiteral::String(parsed_date_time.to_string())) + let parsed_date_time_rfc3339 = parsed_date_time.format(&Rfc3339)?; + Ok(JsonLiteral::String(parsed_date_time_rfc3339)) } else { Ok(literal) } } + +#[cfg(test)] +mod tests { + use std::ops::Bound; + + use super::{RangeQuery as ElasticRangeQuery, RangeQueryParams as ElasticRangeQueryParams}; + use crate::elastic_query_dsl::ConvertableToQueryAst; + use crate::query_ast::{QueryAst, RangeQuery}; + use crate::JsonLiteral; + + #[test] + fn test_date_range_query_with_format() { + let range_query_params = ElasticRangeQueryParams { + gt: Some(JsonLiteral::String("2021-01-03T13:32:43".to_string())), + gte: None, + lt: None, + lte: None, + boost: None, + format: JsonLiteral::String("yyyy-MM-dd['T'HH:mm:ss]".to_string()).into(), + }; + let range_query = ElasticRangeQuery { + field: "date".to_string(), + value: range_query_params, + }; + let range_query_ast = range_query.convert_to_query_ast().unwrap(); + assert!(matches!( + range_query_ast, + QueryAst::Range(RangeQuery { + field, + lower_bound: Bound::Excluded(lower_bound), + upper_bound: Bound::Unbounded, + }) + if field == "date" && lower_bound == JsonLiteral::String("2021-01-03T13:32:43Z".to_string()) + )); + } +}