mirror of
				https://github.com/meilisearch/meilisearch.git
				synced 2025-10-31 07:56:28 +00:00 
			
		
		
		
	Apply PR requests related to Refactor the FieldIdMapWithMetadata
This commit is contained in:
		| @@ -107,8 +107,15 @@ impl<'indexing> GlobalFieldsIdsMap<'indexing> { | ||||
|     } | ||||
|  | ||||
|     /// Get the metadata of a field based on its id. | ||||
|     pub fn metadata(&self, id: FieldId) -> Option<Metadata> { | ||||
|         self.local.metadata(id).or_else(|| self.global.read().unwrap().metadata(id)) | ||||
|     pub fn metadata(&mut self, id: FieldId) -> Option<Metadata> { | ||||
|         if self.local.metadata(id).is_none() { | ||||
|             let global = self.global.read().unwrap(); | ||||
|  | ||||
|             let (name, metadata) = global.name_with_metadata(id)?; | ||||
|             self.local.insert(name, id, metadata); | ||||
|         } | ||||
|  | ||||
|         self.local.metadata(id) | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -22,7 +22,7 @@ pub struct Metadata { | ||||
|     pub distinct: bool, | ||||
|     /// The field has been defined as asc/desc in the ranking rules. | ||||
|     pub asc_desc: bool, | ||||
|     /// The field is a geo field. | ||||
|     /// The field is a geo field (`_geo`, `_geo.lat`, `_geo.lng`). | ||||
|     pub geo: bool, | ||||
|     /// The id of the localized attributes rule if the field is localized. | ||||
|     pub localized_attributes_rule_id: Option<NonZeroU16>, | ||||
| @@ -215,9 +215,8 @@ pub struct MetadataBuilder { | ||||
| impl MetadataBuilder { | ||||
|     pub fn from_index(index: &Index, rtxn: &RoTxn) -> Result<Self> { | ||||
|         let searchable_attributes = match index.user_defined_searchable_fields(rtxn)? { | ||||
|             Some(fields) if fields.contains(&"*") => None, | ||||
|             None => None, | ||||
|             Some(fields) => Some(fields.into_iter().map(|s| s.to_string()).collect()), | ||||
|             None => None, | ||||
|         }; | ||||
|         let filterable_attributes = index.filterable_attributes_rules(rtxn)?; | ||||
|         let sortable_attributes = index.sortable_fields(rtxn)?; | ||||
| @@ -225,14 +224,14 @@ impl MetadataBuilder { | ||||
|         let distinct_attribute = index.distinct_field(rtxn)?.map(|s| s.to_string()); | ||||
|         let asc_desc_attributes = index.asc_desc_fields(rtxn)?; | ||||
|  | ||||
|         Ok(Self { | ||||
|         Ok(Self::_new( | ||||
|             searchable_attributes, | ||||
|             filterable_attributes, | ||||
|             sortable_attributes, | ||||
|             localized_attributes, | ||||
|             distinct_attribute, | ||||
|             asc_desc_attributes, | ||||
|         }) | ||||
|         )) | ||||
|     } | ||||
|  | ||||
|     #[cfg(test)] | ||||
| @@ -246,11 +245,29 @@ impl MetadataBuilder { | ||||
|         localized_attributes: Option<Vec<LocalizedAttributesRule>>, | ||||
|         distinct_attribute: Option<String>, | ||||
|         asc_desc_attributes: HashSet<String>, | ||||
|     ) -> Self { | ||||
|         Self::_new( | ||||
|             searchable_attributes, | ||||
|             filterable_attributes, | ||||
|             sortable_attributes, | ||||
|             localized_attributes, | ||||
|             distinct_attribute, | ||||
|             asc_desc_attributes, | ||||
|         ) | ||||
|     } | ||||
|  | ||||
|     fn _new( | ||||
|         searchable_attributes: Option<Vec<String>>, | ||||
|         filterable_attributes: Vec<FilterableAttributesRule>, | ||||
|         sortable_attributes: HashSet<String>, | ||||
|         localized_attributes: Option<Vec<LocalizedAttributesRule>>, | ||||
|         distinct_attribute: Option<String>, | ||||
|         asc_desc_attributes: HashSet<String>, | ||||
|     ) -> Self { | ||||
|         let searchable_attributes = match searchable_attributes { | ||||
|             Some(fields) if fields.iter().any(|f| f == "*") => None, | ||||
|             None => None, | ||||
|             Some(fields) => Some(fields), | ||||
|             None => None, | ||||
|         }; | ||||
|  | ||||
|         Self { | ||||
|   | ||||
| @@ -294,11 +294,7 @@ impl<'a> FacetDistribution<'a> { | ||||
|             return Ok(Default::default()); | ||||
|         }; | ||||
|  | ||||
|         let fields_ids_map = self.index.fields_ids_map(self.rtxn)?; | ||||
|         let fields_ids_map = FieldIdMapWithMetadata::new( | ||||
|             fields_ids_map, | ||||
|             MetadataBuilder::from_index(self.index, self.rtxn)?, | ||||
|         ); | ||||
|         let fields_ids_map = self.index.fields_ids_map_with_metadata(self.rtxn)?; | ||||
|         let filterable_attributes_rules = self.index.filterable_attributes_rules(self.rtxn)?; | ||||
|         self.check_faceted_fields(&fields_ids_map, &filterable_attributes_rules)?; | ||||
|  | ||||
| @@ -365,12 +361,17 @@ impl<'a> FacetDistribution<'a> { | ||||
|         metadata: &Metadata, | ||||
|         filterable_attributes_rules: &[FilterableAttributesRule], | ||||
|     ) -> bool { | ||||
|         // If the field is not filterable, we don't want to compute the facet distribution. | ||||
|         if !metadata.filterable_attributes_features(filterable_attributes_rules).is_filterable() { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         match &self.facets { | ||||
|             Some(facets) => { | ||||
|                 // The list of facets provided by the user is a legacy pattern ("dog.age" must be selected with "dog"). | ||||
|                 facets.keys().any(|key| match_field_legacy(key, name) == PatternMatch::Match) | ||||
|             } | ||||
|             None => metadata.is_faceted(filterable_attributes_rules), | ||||
|             None => true, | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -385,7 +386,9 @@ impl<'a> FacetDistribution<'a> { | ||||
|             for field in facets.keys() { | ||||
|                 let is_valid_faceted_field = | ||||
|                     fields_ids_map.id_with_metadata(field).map_or(false, |(_, metadata)| { | ||||
|                         metadata.is_faceted(filterable_attributes_rules) | ||||
|                         metadata | ||||
|                             .filterable_attributes_features(filterable_attributes_rules) | ||||
|                             .is_filterable() | ||||
|                     }); | ||||
|                 if !is_valid_faceted_field { | ||||
|                     invalid_facets.insert(field.to_string()); | ||||
| @@ -397,7 +400,10 @@ impl<'a> FacetDistribution<'a> { | ||||
|             let valid_facets_name = fields_ids_map | ||||
|                 .iter() | ||||
|                 .filter_map(|(_, name, metadata)| { | ||||
|                     if metadata.is_faceted(filterable_attributes_rules) { | ||||
|                     if metadata | ||||
|                         .filterable_attributes_features(filterable_attributes_rules) | ||||
|                         .is_filterable() | ||||
|                     { | ||||
|                         Some(name.to_string()) | ||||
|                     } else { | ||||
|                         None | ||||
|   | ||||
| @@ -25,7 +25,7 @@ use crate::{GlobalFieldsIdsMap, Index, Result}; | ||||
| pub(super) fn post_process<MSP>( | ||||
|     indexing_context: IndexingContext<MSP>, | ||||
|     wtxn: &mut RwTxn<'_>, | ||||
|     global_fields_ids_map: GlobalFieldsIdsMap<'_>, | ||||
|     mut global_fields_ids_map: GlobalFieldsIdsMap<'_>, | ||||
|     facet_field_ids_delta: FacetFieldIdsDelta, | ||||
| ) -> Result<()> | ||||
| where | ||||
| @@ -33,7 +33,7 @@ where | ||||
| { | ||||
|     let index = indexing_context.index; | ||||
|     indexing_context.progress.update_progress(IndexingStep::PostProcessingFacets); | ||||
|     compute_facet_level_database(index, wtxn, facet_field_ids_delta, &global_fields_ids_map)?; | ||||
|     compute_facet_level_database(index, wtxn, facet_field_ids_delta, &mut global_fields_ids_map)?; | ||||
|     compute_facet_search_database(index, wtxn, global_fields_ids_map)?; | ||||
|     indexing_context.progress.update_progress(IndexingStep::PostProcessingWords); | ||||
|     if let Some(prefix_delta) = compute_word_fst(index, wtxn)? { | ||||
| @@ -170,7 +170,7 @@ fn compute_facet_level_database( | ||||
|     index: &Index, | ||||
|     wtxn: &mut RwTxn, | ||||
|     mut facet_field_ids_delta: FacetFieldIdsDelta, | ||||
|     global_fields_ids_map: &GlobalFieldsIdsMap, | ||||
|     global_fields_ids_map: &mut GlobalFieldsIdsMap, | ||||
| ) -> Result<()> { | ||||
|     let rtxn = index.read_txn()?; | ||||
|     let filterable_attributes_rules = index.filterable_attributes_rules(&rtxn)?; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user