mirror of
https://github.com/meilisearch/meilisearch.git
synced 2024-11-30 00:55:00 +08:00
Rework the FacetCondition from_array constructor
This commit is contained in:
parent
65b821b192
commit
60480a1e2f
@ -3,6 +3,7 @@ use std::fmt::Debug;
|
|||||||
use std::ops::Bound::{self, Included, Excluded};
|
use std::ops::Bound::{self, Included, Excluded};
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
use anyhow::Context;
|
||||||
use either::Either;
|
use either::Either;
|
||||||
use heed::types::{ByteSlice, DecodeIgnore};
|
use heed::types::{ByteSlice, DecodeIgnore};
|
||||||
use log::debug;
|
use log::debug;
|
||||||
@ -154,16 +155,20 @@ impl FacetCondition {
|
|||||||
{
|
{
|
||||||
fn facet_condition(
|
fn facet_condition(
|
||||||
fields_ids_map: &FieldsIdsMap,
|
fields_ids_map: &FieldsIdsMap,
|
||||||
faceted_fields: &HashMap<FieldId, FacetType>,
|
faceted_fields: &HashMap<String, FacetType>,
|
||||||
key: &str,
|
key: &str,
|
||||||
value: &str,
|
value: &str,
|
||||||
) -> anyhow::Result<FacetCondition>
|
) -> anyhow::Result<FacetCondition>
|
||||||
{
|
{
|
||||||
let fid = fields_ids_map.id(key).unwrap();
|
let fid = fields_ids_map.id(key).with_context(|| {
|
||||||
let ftype = faceted_fields.get(&fid).copied().unwrap();
|
format!("{:?} must isn't part of the fields ids map", key)
|
||||||
let (neg, value) = match value.strip_prefix('-') {
|
})?;
|
||||||
Some(value) => (true, value),
|
let ftype = faceted_fields.get(key).copied().with_context(|| {
|
||||||
None => (false, value),
|
format!("{:?} must isn't a faceted field", key)
|
||||||
|
})?;
|
||||||
|
let (neg, value) = match value.trim().strip_prefix('-') {
|
||||||
|
Some(value) => (true, value.trim()),
|
||||||
|
None => (false, value.trim()),
|
||||||
};
|
};
|
||||||
|
|
||||||
let operator = match ftype {
|
let operator = match ftype {
|
||||||
@ -176,7 +181,7 @@ impl FacetCondition {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let fields_ids_map = index.fields_ids_map(rtxn)?;
|
let fields_ids_map = index.fields_ids_map(rtxn)?;
|
||||||
let faceted_fields = index.faceted_fields_ids(rtxn)?;
|
let faceted_fields = index.faceted_fields(rtxn)?;
|
||||||
let mut ands = None;
|
let mut ands = None;
|
||||||
|
|
||||||
for either in array {
|
for either in array {
|
||||||
@ -185,8 +190,8 @@ impl FacetCondition {
|
|||||||
let mut ors = None;
|
let mut ors = None;
|
||||||
for rule in array {
|
for rule in array {
|
||||||
let mut iter = rule.as_ref().splitn(2, ':');
|
let mut iter = rule.as_ref().splitn(2, ':');
|
||||||
let key = iter.next().unwrap();
|
let key = iter.next().context("missing facet condition key")?;
|
||||||
let value = iter.next().unwrap();
|
let value = iter.next().context("missing facet condition value")?;
|
||||||
let condition = facet_condition(&fields_ids_map, &faceted_fields, key, value)?;
|
let condition = facet_condition(&fields_ids_map, &faceted_fields, key, value)?;
|
||||||
ors = match ors.take() {
|
ors = match ors.take() {
|
||||||
Some(ors) => Some(Or(Box::new(ors), Box::new(condition))),
|
Some(ors) => Some(Or(Box::new(ors), Box::new(condition))),
|
||||||
@ -203,8 +208,8 @@ impl FacetCondition {
|
|||||||
},
|
},
|
||||||
Either::Right(rule) => {
|
Either::Right(rule) => {
|
||||||
let mut iter = rule.as_ref().splitn(2, ':');
|
let mut iter = rule.as_ref().splitn(2, ':');
|
||||||
let key = iter.next().unwrap();
|
let key = iter.next().context("missing facet condition key")?;
|
||||||
let value = iter.next().unwrap();
|
let value = iter.next().context("missing facet condition value")?;
|
||||||
let condition = facet_condition(&fields_ids_map, &faceted_fields, key, value)?;
|
let condition = facet_condition(&fields_ids_map, &faceted_fields, key, value)?;
|
||||||
ands = match ands.take() {
|
ands = match ands.take() {
|
||||||
Some(ands) => Some(And(Box::new(ands), Box::new(condition))),
|
Some(ands) => Some(And(Box::new(ands), Box::new(condition))),
|
||||||
|
Loading…
Reference in New Issue
Block a user