mirror of
				https://github.com/meilisearch/meilisearch.git
				synced 2025-11-04 01:46:28 +00:00 
			
		
		
		
	Changes to primary key
This commit is contained in:
		@@ -2,9 +2,13 @@ use std::borrow::Cow;
 | 
				
			|||||||
use std::iter;
 | 
					use std::iter;
 | 
				
			||||||
use std::result::Result as StdResult;
 | 
					use std::result::Result as StdResult;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use bumpalo::Bump;
 | 
				
			||||||
 | 
					use serde_json::value::RawValue;
 | 
				
			||||||
use serde_json::{from_str, Value};
 | 
					use serde_json::{from_str, Value};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use crate::update::new::{CowStr, TopLevelMap};
 | 
					use crate::fields_ids_map::MutFieldIdMapper;
 | 
				
			||||||
 | 
					use crate::update::new::indexer::de::DeOrBumpStr;
 | 
				
			||||||
 | 
					use crate::update::new::{CowStr, KvReaderFieldId, TopLevelMap};
 | 
				
			||||||
use crate::{FieldId, InternalError, Object, Result, UserError};
 | 
					use crate::{FieldId, InternalError, Object, Result, UserError};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// The symbol used to define levels in a nested primary key.
 | 
					/// The symbol used to define levels in a nested primary key.
 | 
				
			||||||
@@ -117,6 +121,78 @@ impl<'a> PrimaryKey<'a> {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn extract_docid_from_db<'pl, 'bump: 'pl, Mapper: FieldIdMapper>(
 | 
				
			||||||
 | 
					        &self,
 | 
				
			||||||
 | 
					        document: &'pl KvReaderFieldId,
 | 
				
			||||||
 | 
					        db_fields_ids_map: &Mapper,
 | 
				
			||||||
 | 
					        indexer: &'bump Bump,
 | 
				
			||||||
 | 
					    ) -> Result<DeOrBumpStr<'pl, 'bump>> {
 | 
				
			||||||
 | 
					        use serde::Deserializer as _;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        match self {
 | 
				
			||||||
 | 
					            PrimaryKey::Flat { name: _, field_id } => {
 | 
				
			||||||
 | 
					                let Some(document_id) = document.get(*field_id) else {
 | 
				
			||||||
 | 
					                    return Err(InternalError::DocumentsError(
 | 
				
			||||||
 | 
					                        crate::documents::Error::InvalidDocumentFormat,
 | 
				
			||||||
 | 
					                    )
 | 
				
			||||||
 | 
					                    .into());
 | 
				
			||||||
 | 
					                };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                let document_id: &RawValue =
 | 
				
			||||||
 | 
					                    serde_json::from_slice(document_id).map_err(InternalError::SerdeJson)?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                let document_id = document_id
 | 
				
			||||||
 | 
					                    .deserialize_any(crate::update::new::indexer::de::DocumentIdVisitor(indexer))
 | 
				
			||||||
 | 
					                    .map_err(InternalError::SerdeJson)?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                let external_document_id = match document_id {
 | 
				
			||||||
 | 
					                    Ok(document_id) => Ok(document_id),
 | 
				
			||||||
 | 
					                    Err(_) => Err(InternalError::DocumentsError(
 | 
				
			||||||
 | 
					                        crate::documents::Error::InvalidDocumentFormat,
 | 
				
			||||||
 | 
					                    )),
 | 
				
			||||||
 | 
					                }?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                Ok(external_document_id)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            PrimaryKey::Nested { name } => todo!(),
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn extract_fields_and_docid<'pl, 'bump: 'pl, Mapper: MutFieldIdMapper>(
 | 
				
			||||||
 | 
					        &self,
 | 
				
			||||||
 | 
					        document: &'pl RawValue,
 | 
				
			||||||
 | 
					        new_fields_ids_map: &mut Mapper,
 | 
				
			||||||
 | 
					        indexer: &'bump Bump,
 | 
				
			||||||
 | 
					    ) -> Result<DeOrBumpStr<'pl, 'bump>> {
 | 
				
			||||||
 | 
					        use serde::Deserializer as _;
 | 
				
			||||||
 | 
					        let res = document
 | 
				
			||||||
 | 
					            .deserialize_map(crate::update::new::indexer::de::FieldAndDocidExtractor::new(
 | 
				
			||||||
 | 
					                new_fields_ids_map,
 | 
				
			||||||
 | 
					                self,
 | 
				
			||||||
 | 
					                indexer,
 | 
				
			||||||
 | 
					            ))
 | 
				
			||||||
 | 
					            .map_err(UserError::SerdeJson)?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let external_document_id = match res {
 | 
				
			||||||
 | 
					            Ok(document_id) => Ok(document_id),
 | 
				
			||||||
 | 
					            Err(DocumentIdExtractionError::InvalidDocumentId(e)) => Err(e),
 | 
				
			||||||
 | 
					            Err(DocumentIdExtractionError::MissingDocumentId) => {
 | 
				
			||||||
 | 
					                Err(UserError::MissingDocumentId {
 | 
				
			||||||
 | 
					                    primary_key: self.name().to_string(),
 | 
				
			||||||
 | 
					                    document: serde_json::from_str(document.get()).unwrap(),
 | 
				
			||||||
 | 
					                })
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            Err(DocumentIdExtractionError::TooManyDocumentIds(_)) => {
 | 
				
			||||||
 | 
					                Err(UserError::TooManyDocumentIds {
 | 
				
			||||||
 | 
					                    primary_key: self.name().to_string(),
 | 
				
			||||||
 | 
					                    document: serde_json::from_str(document.get()).unwrap(),
 | 
				
			||||||
 | 
					                })
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Ok(external_document_id)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// Returns the document ID based on the primary and
 | 
					    /// Returns the document ID based on the primary and
 | 
				
			||||||
    /// search for it recursively in zero-copy-deserialized documents.
 | 
					    /// search for it recursively in zero-copy-deserialized documents.
 | 
				
			||||||
    pub fn document_id_from_top_level_map<'p>(
 | 
					    pub fn document_id_from_top_level_map<'p>(
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user