mirror of
https://github.com/meilisearch/MeiliSearch
synced 2025-03-13 03:21:39 +01:00
Revert "Remove filter pre-check"
This reverts commit b12ffd13569e1c90f7ae1b3a45211eec4594b0e2.
This commit is contained in:
parent
6269f757ff
commit
dfb8411647
@ -231,8 +231,26 @@ impl<'a> Filter<'a> {
|
|||||||
|
|
||||||
impl<'a> Filter<'a> {
|
impl<'a> Filter<'a> {
|
||||||
pub fn evaluate(&self, rtxn: &heed::RoTxn<'_>, index: &Index) -> Result<RoaringBitmap> {
|
pub fn evaluate(&self, rtxn: &heed::RoTxn<'_>, index: &Index) -> Result<RoaringBitmap> {
|
||||||
|
// to avoid doing this for each recursive call we're going to do it ONCE ahead of time
|
||||||
let fields_ids_map = index.fields_ids_map(rtxn)?;
|
let fields_ids_map = index.fields_ids_map(rtxn)?;
|
||||||
let filterable_attributes_rules = index.filterable_attributes_rules(rtxn)?;
|
let filterable_attributes_rules = index.filterable_attributes_rules(rtxn)?;
|
||||||
|
for fid in self.condition.fids(MAX_FILTER_DEPTH) {
|
||||||
|
let attribute = fid.value();
|
||||||
|
if matching_features(attribute, &filterable_attributes_rules)
|
||||||
|
.map_or(false, |(_, features)| features.is_filterable())
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the field is not filterable, return an error
|
||||||
|
return Err(fid.as_external_error(FilterError::AttributeNotFilterable {
|
||||||
|
attribute,
|
||||||
|
filterable_patterns: filtered_matching_patterns(
|
||||||
|
&filterable_attributes_rules,
|
||||||
|
&|features| features.is_filterable(),
|
||||||
|
),
|
||||||
|
}))?;
|
||||||
|
}
|
||||||
|
|
||||||
self.inner_evaluate(rtxn, index, &fields_ids_map, &filterable_attributes_rules, None)
|
self.inner_evaluate(rtxn, index, &fields_ids_map, &filterable_attributes_rules, None)
|
||||||
}
|
}
|
||||||
@ -466,22 +484,15 @@ impl<'a> Filter<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
FilterCondition::In { fid, els } => {
|
FilterCondition::In { fid, els } => {
|
||||||
let Some((rule_index, features)) =
|
|
||||||
matching_features(fid.value(), filterable_attribute_rules)
|
|
||||||
.filter(|(_, features)| features.is_filterable())
|
|
||||||
else {
|
|
||||||
// If the field is not filterable, return an error
|
|
||||||
return Err(fid.as_external_error(FilterError::AttributeNotFilterable {
|
|
||||||
attribute: fid.value(),
|
|
||||||
filterable_patterns: filtered_matching_patterns(
|
|
||||||
filterable_attribute_rules,
|
|
||||||
&|features| features.is_filterable(),
|
|
||||||
),
|
|
||||||
}))?;
|
|
||||||
};
|
|
||||||
let Some(field_id) = field_ids_map.id(fid.value()) else {
|
let Some(field_id) = field_ids_map.id(fid.value()) else {
|
||||||
return Ok(RoaringBitmap::new());
|
return Ok(RoaringBitmap::new());
|
||||||
};
|
};
|
||||||
|
let Some((rule_index, features)) =
|
||||||
|
matching_features(fid.value(), filterable_attribute_rules)
|
||||||
|
else {
|
||||||
|
return Ok(RoaringBitmap::new());
|
||||||
|
};
|
||||||
|
|
||||||
els.iter()
|
els.iter()
|
||||||
.map(|el| Condition::Equal(el.clone()))
|
.map(|el| Condition::Equal(el.clone()))
|
||||||
.map(|op| {
|
.map(|op| {
|
||||||
@ -492,20 +503,12 @@ impl<'a> Filter<'a> {
|
|||||||
.union()
|
.union()
|
||||||
}
|
}
|
||||||
FilterCondition::Condition { fid, op } => {
|
FilterCondition::Condition { fid, op } => {
|
||||||
|
let Some(field_id) = field_ids_map.id(fid.value()) else {
|
||||||
|
return Ok(RoaringBitmap::new());
|
||||||
|
};
|
||||||
let Some((rule_index, features)) =
|
let Some((rule_index, features)) =
|
||||||
matching_features(fid.value(), filterable_attribute_rules)
|
matching_features(fid.value(), filterable_attribute_rules)
|
||||||
.filter(|(_, features)| features.is_filterable())
|
|
||||||
else {
|
else {
|
||||||
// If the field is not filterable, return an error
|
|
||||||
return Err(fid.as_external_error(FilterError::AttributeNotFilterable {
|
|
||||||
attribute: fid.value(),
|
|
||||||
filterable_patterns: filtered_matching_patterns(
|
|
||||||
filterable_attribute_rules,
|
|
||||||
&|features| features.is_filterable(),
|
|
||||||
),
|
|
||||||
}))?;
|
|
||||||
};
|
|
||||||
let Some(field_id) = field_ids_map.id(fid.value()) else {
|
|
||||||
return Ok(RoaringBitmap::new());
|
return Ok(RoaringBitmap::new());
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user