add error on search with empty facets

This commit is contained in:
mpostma 2020-06-10 12:03:19 +02:00
parent 18b56c6af8
commit 2ada9c5d72
3 changed files with 7 additions and 4 deletions

View File

@ -183,6 +183,7 @@ pub enum FacetError {
AttributeNotFound(String), AttributeNotFound(String),
AttributeNotSet { expected: Vec<String>, found: String }, AttributeNotSet { expected: Vec<String>, found: String },
InvalidDocumentAttribute(String), InvalidDocumentAttribute(String),
NoAttributesForFaceting,
} }
impl FacetError { impl FacetError {
@ -207,6 +208,7 @@ impl fmt::Display for FacetError {
AttributeNotFound(attr) => write!(f, "unknown {:?} attribute", attr), AttributeNotFound(attr) => write!(f, "unknown {:?} attribute", attr),
AttributeNotSet { found, expected } => write!(f, "`{}` is not set as a faceted attribute. available facet attributes: {}", found, expected.join(", ")), AttributeNotSet { found, expected } => write!(f, "`{}` is not set as a faceted attribute. available facet attributes: {}", found, expected.join(", ")),
InvalidDocumentAttribute(attr) => write!(f, "invalid document attribute {}, accepted types: String and [String]", attr), InvalidDocumentAttribute(attr) => write!(f, "invalid document attribute {}, accepted types: String and [String]", attr),
NoAttributesForFaceting => write!(f, "impossible to perform faceted search, no attributes for faceting are set"),
} }
} }
} }

View File

@ -35,6 +35,9 @@ impl FacetFilter {
schema: &Schema, schema: &Schema,
attributes_for_faceting: &[FieldId], attributes_for_faceting: &[FieldId],
) -> MResult<FacetFilter> { ) -> MResult<FacetFilter> {
if attributes_for_faceting.is_empty() {
return Err(FacetError::NoAttributesForFaceting.into());
}
let parsed = serde_json::from_str::<Value>(s).map_err(|e| FacetError::ParsingError(e.to_string()))?; let parsed = serde_json::from_str::<Value>(s).map_err(|e| FacetError::ParsingError(e.to_string()))?;
let mut filter = Vec::new(); let mut filter = Vec::new();
match parsed { match parsed {

View File

@ -87,10 +87,8 @@ async fn search_with_url_query(
} }
if let Some(ref facet_filters) = params.facet_filters { if let Some(ref facet_filters) = params.facet_filters {
let attrs = index.main.attributes_for_faceting(&reader)?; let attrs = index.main.attributes_for_faceting(&reader)?.unwrap_or_default();
if let Some(attrs) = attrs { search_builder.add_facet_filters(FacetFilter::from_str(facet_filters, &schema, &attrs)?);
search_builder.add_facet_filters(FacetFilter::from_str(facet_filters, &schema, &attrs)?);
}
} }
if let Some(facets) = &params.facets_distribution { if let Some(facets) = &params.facets_distribution {