diff --git a/crates/meilisearch/src/routes/indexes/render.rs b/crates/meilisearch/src/routes/indexes/render.rs index b22c931c7..31e23936a 100644 --- a/crates/meilisearch/src/routes/indexes/render.rs +++ b/crates/meilisearch/src/routes/indexes/render.rs @@ -16,7 +16,7 @@ use meilisearch_types::error::ResponseError; use meilisearch_types::heed::RoTxn; use meilisearch_types::index_uid::IndexUid; use meilisearch_types::keys::actions; -use meilisearch_types::milli::prompt::{get_document, OwnedFields}; +use meilisearch_types::milli::prompt::{build_doc, build_doc_fields, OwnedFields}; use meilisearch_types::milli::vector::db::IndexEmbeddingConfig; use meilisearch_types::milli::vector::json_template::{self, JsonTemplate}; use meilisearch_types::milli::vector::EmbedderOptions; @@ -532,12 +532,18 @@ async fn render(index: Index, query: RenderQuery) -> Result, external_id: &str, - with_fields: bool, + fid_map: &FieldsIdsMap, +) -> Result, crate::Error> { + _build_doc_fields(index, rtxn, external_id, fid_map, None) + .map(|opt| opt.map(|(doc, _fields)| doc)) +} + +/// Build the liquid objects corresponding to the `doc` and `fields` object of a [`Prompt`] from the given external document id. +pub fn build_doc_fields( + index: &Index, + rtxn: &RoTxn<'_>, + external_id: &str, + fid_map_with_meta: &FieldIdMapWithMetadata, +) -> Result, crate::Error> { + _build_doc_fields( + index, + rtxn, + external_id, + fid_map_with_meta.as_fields_ids_map(), + Some(fid_map_with_meta), + ) + .map(|opt| { + opt.map(|(doc, fields)| { + (doc, fields.expect("fid_map_with_meta were provided so fields must be Some")) + }) + }) +} + +fn _build_doc_fields( + index: &Index, + rtxn: &RoTxn<'_>, + external_id: &str, + fid_map: &FieldsIdsMap, + fid_map_with_meta: Option<&FieldIdMapWithMetadata>, ) -> Result)>, crate::Error> { let Some(internal_id) = index.external_documents_ids().get(rtxn, external_id)? else { return Ok(None); }; - let fid_map = index.fields_ids_map(rtxn)?; let Some(document_from_db) = DocumentFromDb::new(internal_id, rtxn, index, &fid_map)? else { return Ok(None); }; @@ -186,11 +217,8 @@ pub fn get_document( let doc_alloc = Bump::new(); let parseable_document = ParseableDocument::new(document_from_db, &doc_alloc); - if with_fields { - let metadata_builder = MetadataBuilder::from_index(index, rtxn)?; - let fid_map_with_meta = FieldIdMapWithMetadata::new(fid_map.clone(), metadata_builder); - let fields = OwnedFields::new(&parseable_document, &fid_map_with_meta); - + if let Some(fid_map_with_meta) = fid_map_with_meta { + let fields = OwnedFields::new(&parseable_document, fid_map_with_meta); Ok(Some((parseable_document.to_value(), Some(fields.to_value())))) } else { Ok(Some((parseable_document.to_value(), None)))