enable string syntax for the filters

This commit is contained in:
Marin Postma 2021-05-04 18:22:48 +02:00
parent a717925caa
commit b192cb9c1f
No known key found for this signature in database
GPG Key ID: D5241F0C0C865F30
2 changed files with 37 additions and 32 deletions

View File

@ -277,35 +277,6 @@ impl Matcher for MatchingWords {
} }
} }
fn parse_facets_array(
txn: &RoTxn,
index: &Index,
arr: &[Value],
) -> anyhow::Result<Option<FacetCondition>> {
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> { struct Highlighter<'a, A> {
analyzer: Analyzer<'a, A>, analyzer: Analyzer<'a, A>,
marks: (String, String), marks: (String, String),
@ -367,13 +338,41 @@ fn parse_facets(
txn: &RoTxn, txn: &RoTxn,
) -> anyhow::Result<Option<FacetCondition>> { ) -> anyhow::Result<Option<FacetCondition>> {
match facets { 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), Value::Array(arr) => parse_facets_array(txn, index, arr),
v => bail!("Invalid facet expression, expected Array, found: {:?}", v), v => bail!("Invalid facet expression, expected Array, found: {:?}", v),
} }
} }
fn parse_facets_array(
txn: &RoTxn,
index: &Index,
arr: &[Value],
) -> anyhow::Result<Option<FacetCondition>> {
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)] #[cfg(test)]
mod test { mod test {
use std::iter::FromIterator; use std::iter::FromIterator;

View File

@ -2,6 +2,7 @@ use std::collections::HashSet;
use std::convert::{TryFrom, TryInto}; use std::convert::{TryFrom, TryInto};
use actix_web::{get, post, web, HttpResponse}; use actix_web::{get, post, web, HttpResponse};
use serde_json::Value;
use serde::Deserialize; use serde::Deserialize;
use crate::error::ResponseError; use crate::error::ResponseError;
@ -50,7 +51,12 @@ impl TryFrom<SearchQueryGet> for SearchQuery {
.map(|attrs| attrs.split(',').map(String::from).collect::<Vec<_>>()); .map(|attrs| attrs.split(',').map(String::from).collect::<Vec<_>>());
let filter = match other.filter { 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, None => None,
}; };