From f981e6e1f18ee61da5e6e40a7efde059bef435f8 Mon Sep 17 00:00:00 2001 From: Darkheir Date: Fri, 9 Jan 2026 15:59:43 +0100 Subject: [PATCH] feat: Add support for Exists leaf in query parser Signed-off-by: Darkheir --- src/query/query_parser/logical_ast.rs | 4 ++++ src/query/query_parser/query_parser.rs | 18 +++++++++++------- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/query/query_parser/logical_ast.rs b/src/query/query_parser/logical_ast.rs index 17c68a76a..a7ab46b44 100644 --- a/src/query/query_parser/logical_ast.rs +++ b/src/query/query_parser/logical_ast.rs @@ -28,6 +28,9 @@ pub enum LogicalLiteral { pattern: Arc, field: Field, }, + Exists { + field: String, + }, } pub enum LogicalAst { @@ -159,6 +162,7 @@ impl fmt::Debug for LogicalLiteral { ref pattern, ref field, } => write!(formatter, "Regex({field:?}, {pattern:?})"), + LogicalLiteral::Exists { ref field } => write!(formatter, "exists:{field}"), } } } diff --git a/src/query/query_parser/query_parser.rs b/src/query/query_parser/query_parser.rs index 402a8ef92..089d26598 100644 --- a/src/query/query_parser/query_parser.rs +++ b/src/query/query_parser/query_parser.rs @@ -16,8 +16,8 @@ use crate::index::Index; use crate::json_utils::convert_to_fast_value_and_append_to_json_term; use crate::query::range_query::{is_type_valid_for_fastfield_range_query, RangeQuery}; use crate::query::{ - AllQuery, BooleanQuery, BoostQuery, EmptyQuery, FuzzyTermQuery, Occur, PhrasePrefixQuery, - PhraseQuery, Query, RegexQuery, TermQuery, TermSetQuery, + AllQuery, BooleanQuery, BoostQuery, EmptyQuery, ExistsQuery, FuzzyTermQuery, Occur, + PhrasePrefixQuery, PhraseQuery, Query, RegexQuery, TermQuery, TermSetQuery, }; use crate::schema::{ Facet, FacetParseError, Field, FieldType, IndexRecordOption, IntoIpv6Addr, JsonObjectOptions, @@ -856,11 +856,9 @@ impl QueryParser { let logical_ast = LogicalAst::Leaf(Box::new(LogicalLiteral::Set { elements })); (Some(logical_ast), errors) } - UserInputLeaf::Exists { .. } => ( - None, - vec![QueryParserError::UnsupportedQuery( - "Range query need to target a specific field.".to_string(), - )], + UserInputLeaf::Exists { field } => ( + Some(LogicalAst::Leaf(Box::new(LogicalLiteral::Exists { field }))), + Vec::new(), ), UserInputLeaf::Regex { field, pattern } => { if !self.regexes_allowed { @@ -952,6 +950,7 @@ fn convert_literal_to_query( LogicalLiteral::Regex { pattern, field } => { Box::new(RegexQuery::from_regex(pattern, field)) } + LogicalLiteral::Exists { field } => Box::new(ExistsQuery::new(field, true)), } } @@ -2121,4 +2120,9 @@ mod test { "Unsupported query: Regex queries are not allowed." ); } + + #[test] + pub fn test_exists() { + test_parse_query_to_logical_ast_helper("title:*", "exists:title", false); + } }