From a6218a20ae3eedbdd0927e3dc850cf6f960e6b2c Mon Sep 17 00:00:00 2001 From: Kerollmops Date: Wed, 23 Jun 2021 13:56:13 +0200 Subject: [PATCH] Introduce a new InvalidFacetsDistribution user error --- milli/src/error.rs | 15 +++++++++++++-- milli/src/search/facet/facet_distribution.rs | 7 +++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/milli/src/error.rs b/milli/src/error.rs index d927407f0..713935869 100644 --- a/milli/src/error.rs +++ b/milli/src/error.rs @@ -1,3 +1,4 @@ +use std::collections::HashSet; use std::convert::Infallible; use std::error::Error as StdError; use std::{fmt, io, str}; @@ -51,13 +52,14 @@ pub enum FieldIdMapMissingEntry { pub enum UserError { AttributeLimitReached, Csv(csv::Error), - MaxDatabaseSizeReached, DocumentLimitReached, - InvalidFilter(pest::error::Error), InvalidCriterionName { name: String }, InvalidDocumentId { document_id: Value }, + InvalidFacetsDistribution { invalid_facets_name: HashSet }, + InvalidFilter(pest::error::Error), InvalidFilterAttribute(pest::error::Error), InvalidStoreFile, + MaxDatabaseSizeReached, MissingDocumentId { document: Object }, MissingPrimaryKey, NoSpaceLeftOnDevice, @@ -202,6 +204,15 @@ impl fmt::Display for UserError { Self::AttributeLimitReached => f.write_str("maximum number of attributes reached"), Self::Csv(error) => error.fmt(f), Self::DocumentLimitReached => f.write_str("maximum number of documents reached"), + Self::InvalidFacetsDistribution { invalid_facets_name } => { + let name_list = + invalid_facets_name.iter().map(AsRef::as_ref).collect::>().join(", "); + write!( + f, + "invalid facet distribution, the fields {} are not set as filterable", + name_list + ) + } Self::InvalidFilter(error) => error.fmt(f), Self::InvalidCriterionName { name } => write!(f, "invalid criterion {}", name), Self::InvalidDocumentId { document_id } => { diff --git a/milli/src/search/facet/facet_distribution.rs b/milli/src/search/facet/facet_distribution.rs index 4d077b8f1..71816cf5d 100644 --- a/milli/src/search/facet/facet_distribution.rs +++ b/milli/src/search/facet/facet_distribution.rs @@ -6,7 +6,7 @@ use heed::types::{ByteSlice, Unit}; use heed::{BytesDecode, Database}; use roaring::RoaringBitmap; -use crate::error::FieldIdMapMissingEntry; +use crate::error::{FieldIdMapMissingEntry, UserError}; use crate::facet::FacetType; use crate::heed_codec::facet::FacetValueStringCodec; use crate::search::facet::{FacetIter, FacetRange}; @@ -219,7 +219,10 @@ impl<'a> FacetDistribution<'a> { Some(ref facets) => { let invalid_fields: HashSet<_> = facets.difference(&filterable_fields).collect(); if !invalid_fields.is_empty() { - todo!("return an error specifying that these fields are not filterable"); + return Err(UserError::InvalidFacetsDistribution { + invalid_facets_name: invalid_fields.into_iter().cloned().collect(), + } + .into()); } else { facets.clone() }