From b192cb9c1f243bee805af50c6ce24d33260ff732 Mon Sep 17 00:00:00 2001 From: Marin Postma Date: Tue, 4 May 2021 18:22:48 +0200 Subject: [PATCH] enable string syntax for the filters --- meilisearch-http/src/index/search.rs | 61 +++++++++++++-------------- meilisearch-http/src/routes/search.rs | 8 +++- 2 files changed, 37 insertions(+), 32 deletions(-) diff --git a/meilisearch-http/src/index/search.rs b/meilisearch-http/src/index/search.rs index 312067472..6f5a0d6d9 100644 --- a/meilisearch-http/src/index/search.rs +++ b/meilisearch-http/src/index/search.rs @@ -277,35 +277,6 @@ impl Matcher for MatchingWords { } } -fn parse_facets_array( - txn: &RoTxn, - index: &Index, - arr: &[Value], -) -> anyhow::Result> { - let mut ands = Vec::new(); - for value in arr { - match value { - Value::String(s) => ands.push(Either::Right(s.clone())), - Value::Array(arr) => { - let mut ors = Vec::new(); - for value in arr { - match value { - Value::String(s) => ors.push(s.clone()), - v => bail!("Invalid facet expression, expected String, found: {:?}", v), - } - } - ands.push(Either::Left(ors)); - } - v => bail!( - "Invalid facet expression, expected String or [String], found: {:?}", - v - ), - } - } - - FacetCondition::from_array(txn, &index.0, ands) -} - struct Highlighter<'a, A> { analyzer: Analyzer<'a, A>, marks: (String, String), @@ -367,13 +338,41 @@ fn parse_facets( txn: &RoTxn, ) -> anyhow::Result> { match facets { - // Disabled for now - //Value::String(expr) => Ok(Some(FacetCondition::from_str(txn, index, expr)?)), + Value::String(expr) => Ok(Some(FacetCondition::from_str(txn, index, expr)?)), Value::Array(arr) => parse_facets_array(txn, index, arr), v => bail!("Invalid facet expression, expected Array, found: {:?}", v), } } +fn parse_facets_array( + txn: &RoTxn, + index: &Index, + arr: &[Value], +) -> anyhow::Result> { + let mut ands = Vec::new(); + for value in arr { + match value { + Value::String(s) => ands.push(Either::Right(s.clone())), + Value::Array(arr) => { + let mut ors = Vec::new(); + for value in arr { + match value { + Value::String(s) => ors.push(s.clone()), + v => bail!("Invalid facet expression, expected String, found: {:?}", v), + } + } + ands.push(Either::Left(ors)); + } + v => bail!( + "Invalid facet expression, expected String or [String], found: {:?}", + v + ), + } + } + + FacetCondition::from_array(txn, &index.0, ands) +} + #[cfg(test)] mod test { use std::iter::FromIterator; diff --git a/meilisearch-http/src/routes/search.rs b/meilisearch-http/src/routes/search.rs index 5f4e285f8..be06960cf 100644 --- a/meilisearch-http/src/routes/search.rs +++ b/meilisearch-http/src/routes/search.rs @@ -2,6 +2,7 @@ use std::collections::HashSet; use std::convert::{TryFrom, TryInto}; use actix_web::{get, post, web, HttpResponse}; +use serde_json::Value; use serde::Deserialize; use crate::error::ResponseError; @@ -50,7 +51,12 @@ impl TryFrom for SearchQuery { .map(|attrs| attrs.split(',').map(String::from).collect::>()); let filter = match other.filter { - Some(ref f) => Some(serde_json::from_str(f)?), + Some(f) => { + match serde_json::from_str(&f) { + Ok(v) => Some(v), + _ => Some(Value::String(f)), + } + }, None => None, };