From f9215c3afd5e16e2f02ef56f7b36c74300454181 Mon Sep 17 00:00:00 2001 From: Darkheir Date: Wed, 21 Jan 2026 17:43:09 +0100 Subject: [PATCH] feat: String as sort in elasticsearch endpoints Signed-off-by: Darkheir --- .../elasticsearch_api/model/search_body.rs | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/quickwit/quickwit-serve/src/elasticsearch_api/model/search_body.rs b/quickwit/quickwit-serve/src/elasticsearch_api/model/search_body.rs index d2850349aa2..501620ebd11 100644 --- a/quickwit/quickwit-serve/src/elasticsearch_api/model/search_body.rs +++ b/quickwit/quickwit-serve/src/elasticsearch_api/model/search_body.rs @@ -134,7 +134,17 @@ impl<'de> Visitor<'de> for FieldSortVecVisitor { type Value = Vec; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("An array containing the sort fields.") + formatter.write_str("A string, array, or object containing the sort fields.") + } + + fn visit_str(self, field_name: &str) -> Result, E> + where E: serde::de::Error { + let order = default_elasticsearch_sort_order(field_name); + Ok(vec![SortField { + field: field_name.to_string(), + order, + date_format: None, + }]) } fn visit_seq(self, mut seq: A) -> Result, A::Error> @@ -231,6 +241,20 @@ mod tests { assert_eq!(field_sorts[1].order, SortOrder::Asc); } + #[test] + fn test_sort_field_str() { + let json = r#" + { + "sort": "timestamp" + } + "#; + let search_body: SearchBody = serde_json::from_str(json).unwrap(); + let field_sorts = search_body.sort.unwrap(); + assert_eq!(field_sorts.len(), 1); + assert_eq!(field_sorts[0].field, "timestamp"); + assert_eq!(field_sorts[0].order, SortOrder::Asc); + } + #[test] fn test_sort_default_orders() { let json = r#"