mirror of
				https://github.com/meilisearch/meilisearch.git
				synced 2025-11-04 01:46:28 +00:00 
			
		
		
		
	Check if the geo fields changed additionally to the other faceted fields when reindexing facets
This commit is contained in:
		@@ -1,5 +1,6 @@
 | 
			
		||||
use bumpalo::Bump;
 | 
			
		||||
use heed::RoTxn;
 | 
			
		||||
use serde_json::Value;
 | 
			
		||||
 | 
			
		||||
use super::document::{
 | 
			
		||||
    Document as _, DocumentFromDb, DocumentFromVersions, MergedDocument, Versions,
 | 
			
		||||
@@ -10,7 +11,7 @@ use super::vector_document::{
 | 
			
		||||
use crate::attribute_patterns::PatternMatch;
 | 
			
		||||
use crate::documents::FieldIdMapper;
 | 
			
		||||
use crate::vector::EmbeddingConfigs;
 | 
			
		||||
use crate::{DocumentId, Index, Result};
 | 
			
		||||
use crate::{DocumentId, Index, InternalError, Result};
 | 
			
		||||
 | 
			
		||||
pub enum DocumentChange<'doc> {
 | 
			
		||||
    Deletion(Deletion<'doc>),
 | 
			
		||||
@@ -243,6 +244,29 @@ impl<'doc> Update<'doc> {
 | 
			
		||||
        Ok(has_deleted_fields)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Returns `true` if the geo fields have changed.
 | 
			
		||||
    pub fn has_changed_for_geo_fields<'t, Mapper: FieldIdMapper>(
 | 
			
		||||
        &self,
 | 
			
		||||
        rtxn: &'t RoTxn,
 | 
			
		||||
        index: &'t Index,
 | 
			
		||||
        mapper: &'t Mapper,
 | 
			
		||||
    ) -> Result<bool> {
 | 
			
		||||
        let current = self.current(rtxn, index, mapper)?;
 | 
			
		||||
        let current_geo = current.geo_field()?;
 | 
			
		||||
        let updated_geo = self.only_changed_fields().geo_field()?;
 | 
			
		||||
        match (current_geo, updated_geo) {
 | 
			
		||||
            (Some(current_geo), Some(updated_geo)) => {
 | 
			
		||||
                let current: Value =
 | 
			
		||||
                    serde_json::from_str(current_geo.get()).map_err(InternalError::SerdeJson)?;
 | 
			
		||||
                let updated: Value =
 | 
			
		||||
                    serde_json::from_str(updated_geo.get()).map_err(InternalError::SerdeJson)?;
 | 
			
		||||
                Ok(current != updated)
 | 
			
		||||
            }
 | 
			
		||||
            (None, None) => Ok(false),
 | 
			
		||||
            _ => Ok(true),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn only_changed_vectors(
 | 
			
		||||
        &self,
 | 
			
		||||
        doc_alloc: &'doc Bump,
 | 
			
		||||
 
 | 
			
		||||
@@ -117,7 +117,7 @@ impl FacetedDocidsExtractor {
 | 
			
		||||
                },
 | 
			
		||||
            ),
 | 
			
		||||
            DocumentChange::Update(inner) => {
 | 
			
		||||
                if !inner.has_changed_for_fields(
 | 
			
		||||
                let has_changed = inner.has_changed_for_fields(
 | 
			
		||||
                    &mut |field_name| {
 | 
			
		||||
                        match_faceted_field(
 | 
			
		||||
                            field_name,
 | 
			
		||||
@@ -130,7 +130,10 @@ impl FacetedDocidsExtractor {
 | 
			
		||||
                    rtxn,
 | 
			
		||||
                    index,
 | 
			
		||||
                    context.db_fields_ids_map,
 | 
			
		||||
                )? {
 | 
			
		||||
                )?;
 | 
			
		||||
                let has_changed_for_geo_fields =
 | 
			
		||||
                    inner.has_changed_for_geo_fields(rtxn, index, context.db_fields_ids_map)?;
 | 
			
		||||
                if !has_changed && !has_changed_for_geo_fields {
 | 
			
		||||
                    return Ok(());
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user