From d1ac40ea14309d8f2f123748a3277fc04d12dfd9 Mon Sep 17 00:00:00 2001 From: Tamo Date: Mon, 17 Jan 2022 13:51:46 +0100 Subject: [PATCH] fix(filter): Fix two bugs. - Stop lowercasing the field when looking in the field id map - When a field id does not exist it means there is currently zero documents containing this field thus we returns an empty RoaringBitmap instead of throwing an internal error --- milli/src/search/facet/filter.rs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/milli/src/search/facet/filter.rs b/milli/src/search/facet/filter.rs index 551fa0d4e..3ca8c3984 100644 --- a/milli/src/search/facet/filter.rs +++ b/milli/src/search/facet/filter.rs @@ -33,7 +33,6 @@ enum FilterError<'a> { BadGeoLng(f64), Reserved(&'a str), TooDeep, - InternalError, } impl<'a> std::error::Error for FilterError<'a> {} @@ -58,7 +57,6 @@ impl<'a> Display for FilterError<'a> { Self::BadGeo(keyword) => write!(f, "`{}` is a reserved keyword and thus can't be used as a filter expression. Use the _geoRadius(latitude, longitude, distance) built-in rule to filter on _geo field coordinates.", keyword), Self::BadGeoLat(lat) => write!(f, "Bad latitude `{}`. Latitude must be contained between -90 and 90 degrees. ", lat), Self::BadGeoLng(lng) => write!(f, "Bad longitude `{}`. Longitude must be contained between -180 and 180 degrees. ", lng), - Self::InternalError => write!(f, "Internal error while executing this filter."), } } } @@ -342,12 +340,12 @@ impl<'a> Filter<'a> { match &self.condition { FilterCondition::Condition { fid, op } => { let filterable_fields = index.filterable_fields(rtxn)?; - if filterable_fields.contains(&fid.to_lowercase()) { + if filterable_fields.contains(fid.value()) { let field_ids_map = index.fields_ids_map(rtxn)?; - if let Some(fid) = field_ids_map.id(&fid) { + if let Some(fid) = field_ids_map.id(fid.value()) { Self::evaluate_operator(rtxn, index, numbers_db, strings_db, fid, &op) } else { - return Err(fid.as_external_error(FilterError::InternalError))?; + return Ok(RoaringBitmap::new()); } } else { match *fid.deref() {