mirror of
				https://github.com/meilisearch/meilisearch.git
				synced 2025-10-31 07:56:28 +00:00 
			
		
		
		
	Add the sortable fields into the settings and in the index
This commit is contained in:
		| @@ -28,6 +28,7 @@ pub mod main_key { | ||||
|     pub const DISTINCT_FIELD_KEY: &str = "distinct-field-key"; | ||||
|     pub const DOCUMENTS_IDS_KEY: &str = "documents-ids"; | ||||
|     pub const FILTERABLE_FIELDS_KEY: &str = "filterable-fields"; | ||||
|     pub const SORTABLE_FIELDS_KEY: &str = "sortable-fields"; | ||||
|     pub const FIELD_DISTRIBUTION_KEY: &str = "fields-distribution"; | ||||
|     pub const FIELDS_IDS_MAP_KEY: &str = "fields-ids-map"; | ||||
|     pub const HARD_EXTERNAL_DOCUMENTS_IDS_KEY: &str = "hard-external-documents-ids"; | ||||
| @@ -446,13 +447,45 @@ impl Index { | ||||
|         Ok(fields_ids) | ||||
|     } | ||||
|  | ||||
|     /* sortable fields */ | ||||
|  | ||||
|     /// Writes the sortable fields names in the database. | ||||
|     pub(crate) fn put_sortable_fields( | ||||
|         &self, | ||||
|         wtxn: &mut RwTxn, | ||||
|         fields: &HashSet<String>, | ||||
|     ) -> heed::Result<()> { | ||||
|         self.main.put::<_, Str, SerdeJson<_>>(wtxn, main_key::SORTABLE_FIELDS_KEY, fields) | ||||
|     } | ||||
|  | ||||
|     /// Deletes the sortable fields ids in the database. | ||||
|     pub(crate) fn delete_sortable_fields(&self, wtxn: &mut RwTxn) -> heed::Result<bool> { | ||||
|         self.main.delete::<_, Str>(wtxn, main_key::SORTABLE_FIELDS_KEY) | ||||
|     } | ||||
|  | ||||
|     /// Returns the sortable fields names. | ||||
|     pub fn sortable_fields(&self, rtxn: &RoTxn) -> heed::Result<HashSet<String>> { | ||||
|         Ok(self | ||||
|             .main | ||||
|             .get::<_, Str, SerdeJson<_>>(rtxn, main_key::SORTABLE_FIELDS_KEY)? | ||||
|             .unwrap_or_default()) | ||||
|     } | ||||
|  | ||||
|     /// Identical to `sortable_fields`, but returns ids instead. | ||||
|     pub fn sortable_fields_ids(&self, rtxn: &RoTxn) -> Result<HashSet<FieldId>> { | ||||
|         let fields = self.sortable_fields(rtxn)?; | ||||
|         let fields_ids_map = self.fields_ids_map(rtxn)?; | ||||
|         Ok(fields.into_iter().filter_map(|name| fields_ids_map.id(&name)).collect()) | ||||
|     } | ||||
|  | ||||
|     /* faceted documents ids */ | ||||
|  | ||||
|     /// Returns the faceted fields names. | ||||
|     /// | ||||
|     /// Faceted fields are the union of all the filterable, distinct, and Asc/Desc fields. | ||||
|     /// Faceted fields are the union of all the filterable, sortable, distinct, and Asc/Desc fields. | ||||
|     pub fn faceted_fields(&self, rtxn: &RoTxn) -> Result<HashSet<String>> { | ||||
|         let filterable_fields = self.filterable_fields(rtxn)?; | ||||
|         let sortable_fields = self.sortable_fields(rtxn)?; | ||||
|         let distinct_field = self.distinct_field(rtxn)?; | ||||
|         let asc_desc_fields = | ||||
|             self.criteria(rtxn)?.into_iter().filter_map(|criterion| match criterion { | ||||
| @@ -461,6 +494,7 @@ impl Index { | ||||
|             }); | ||||
|  | ||||
|         let mut faceted_fields = filterable_fields; | ||||
|         faceted_fields.extend(sortable_fields); | ||||
|         faceted_fields.extend(asc_desc_fields); | ||||
|         if let Some(field) = distinct_field { | ||||
|             faceted_fields.insert(field.to_owned()); | ||||
|   | ||||
| @@ -75,6 +75,7 @@ pub struct Settings<'a, 't, 'u, 'i> { | ||||
|     searchable_fields: Setting<Vec<String>>, | ||||
|     displayed_fields: Setting<Vec<String>>, | ||||
|     filterable_fields: Setting<HashSet<String>>, | ||||
|     sortable_fields: Setting<HashSet<String>>, | ||||
|     criteria: Setting<Vec<String>>, | ||||
|     stop_words: Setting<BTreeSet<String>>, | ||||
|     distinct_field: Setting<String>, | ||||
| @@ -102,6 +103,7 @@ impl<'a, 't, 'u, 'i> Settings<'a, 't, 'u, 'i> { | ||||
|             searchable_fields: Setting::NotSet, | ||||
|             displayed_fields: Setting::NotSet, | ||||
|             filterable_fields: Setting::NotSet, | ||||
|             sortable_fields: Setting::NotSet, | ||||
|             criteria: Setting::NotSet, | ||||
|             stop_words: Setting::NotSet, | ||||
|             distinct_field: Setting::NotSet, | ||||
| @@ -135,6 +137,10 @@ impl<'a, 't, 'u, 'i> Settings<'a, 't, 'u, 'i> { | ||||
|         self.filterable_fields = Setting::Set(names); | ||||
|     } | ||||
|  | ||||
|     pub fn set_sortable_fields(&mut self, names: HashSet<String>) { | ||||
|         self.sortable_fields = Setting::Set(names); | ||||
|     } | ||||
|  | ||||
|     pub fn reset_criteria(&mut self) { | ||||
|         self.criteria = Setting::Reset; | ||||
|     } | ||||
| @@ -392,6 +398,23 @@ impl<'a, 't, 'u, 'i> Settings<'a, 't, 'u, 'i> { | ||||
|         Ok(()) | ||||
|     } | ||||
|  | ||||
|     fn update_sortable(&mut self) -> Result<()> { | ||||
|         match self.sortable_fields { | ||||
|             Setting::Set(ref fields) => { | ||||
|                 let mut new_fields = HashSet::new(); | ||||
|                 for name in fields { | ||||
|                     new_fields.insert(name.clone()); | ||||
|                 } | ||||
|                 self.index.put_sortable_fields(self.wtxn, &new_fields)?; | ||||
|             } | ||||
|             Setting::Reset => { | ||||
|                 self.index.delete_sortable_fields(self.wtxn)?; | ||||
|             } | ||||
|             Setting::NotSet => (), | ||||
|         } | ||||
|         Ok(()) | ||||
|     } | ||||
|  | ||||
|     fn update_criteria(&mut self) -> Result<()> { | ||||
|         match self.criteria { | ||||
|             Setting::Set(ref fields) => { | ||||
| @@ -446,6 +469,7 @@ impl<'a, 't, 'u, 'i> Settings<'a, 't, 'u, 'i> { | ||||
|  | ||||
|         self.update_displayed()?; | ||||
|         self.update_filterable()?; | ||||
|         self.update_sortable()?; | ||||
|         self.update_distinct_field()?; | ||||
|         self.update_criteria()?; | ||||
|         self.update_primary_key()?; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user