Add doc loading

This commit is contained in:
Mubelotix
2025-07-17 07:51:15 +02:00
parent e124c161ec
commit fc8b6e0f9f
3 changed files with 48 additions and 8 deletions

View File

@ -423,7 +423,8 @@ InvalidRenderTemplateId , InvalidRequest , BAD_REQU
InvalidRenderTemplateInline , InvalidRequest , BAD_REQUEST ; InvalidRenderTemplateInline , InvalidRequest , BAD_REQUEST ;
InvalidRenderInput , InvalidRequest , BAD_REQUEST ; InvalidRenderInput , InvalidRequest , BAD_REQUEST ;
InvalidRenderInputDocumentId , InvalidRequest , BAD_REQUEST ; InvalidRenderInputDocumentId , InvalidRequest , BAD_REQUEST ;
InvalidRenderInputInline , InvalidRequest , BAD_REQUEST InvalidRenderInputInline , InvalidRequest , BAD_REQUEST ;
RenderDocumentNotFound , InvalidRequest , NOT_FOUND
} }
impl ErrorCode for JoinError { impl ErrorCode for JoinError {

View File

@ -1461,8 +1461,6 @@ fn some_documents<'a, 't: 'a>(
document.remove("_vectors"); document.remove("_vectors");
} }
RetrieveVectors::Retrieve => { RetrieveVectors::Retrieve => {
// Clippy is simply wrong
#[allow(clippy::manual_unwrap_or_default)]
let mut vectors = match document.remove("_vectors") { let mut vectors = match document.remove("_vectors") {
Some(Value::Object(map)) => map, Some(Value::Object(map)) => map,
_ => Default::default(), _ => Default::default(),

View File

@ -1,3 +1,5 @@
use std::collections::BTreeMap;
use actix_web::web::{self, Data}; use actix_web::web::{self, Data};
use actix_web::{HttpRequest, HttpResponse}; use actix_web::{HttpRequest, HttpResponse};
use deserr::actix_web::{AwebJson, AwebQueryParameter}; use deserr::actix_web::{AwebJson, AwebQueryParameter};
@ -6,12 +8,13 @@ use index_scheduler::IndexScheduler;
use itertools::structs; use itertools::structs;
use meilisearch_types::deserr::query_params::Param; use meilisearch_types::deserr::query_params::Param;
use meilisearch_types::deserr::{DeserrJsonError, DeserrQueryParamError}; use meilisearch_types::deserr::{DeserrJsonError, DeserrQueryParamError};
use meilisearch_types::error::deserr_codes::{InvalidRenderInput, InvalidRenderInputDocumentId, InvalidRenderInputInline, InvalidRenderTemplate, InvalidRenderTemplateId, InvalidRenderTemplateInline};
use meilisearch_types::error::ResponseError; use meilisearch_types::error::ResponseError;
use meilisearch_types::error::{deserr_codes::*, Code}; use meilisearch_types::error::{Code};
use meilisearch_types::index_uid::IndexUid; use meilisearch_types::index_uid::IndexUid;
use meilisearch_types::keys::actions; use meilisearch_types::keys::actions;
use meilisearch_types::serde_cs::vec::CS; use meilisearch_types::serde_cs::vec::CS;
use meilisearch_types::{heed, Index}; use meilisearch_types::{heed, milli, Index};
use serde::Serialize; use serde::Serialize;
use serde_json::Value; use serde_json::Value;
use tracing::debug; use tracing::debug;
@ -19,6 +22,7 @@ use utoipa::{IntoParams, OpenApi, ToSchema};
use super::ActionPolicy; use super::ActionPolicy;
use crate::analytics::Analytics; use crate::analytics::Analytics;
use crate::error::MeilisearchHttpError;
use crate::extractors::authentication::GuardedData; use crate::extractors::authentication::GuardedData;
use crate::extractors::sequential_extractor::SeqHandler; use crate::extractors::sequential_extractor::SeqHandler;
use crate::routes::indexes::similar_analytics::{SimilarAggregator, SimilarGET, SimilarPOST}; use crate::routes::indexes::similar_analytics::{SimilarAggregator, SimilarGET, SimilarPOST};
@ -157,6 +161,9 @@ enum RenderError {
LeftOverToken(String), LeftOverToken(String),
MissingChatCompletionTemplate, MissingChatCompletionTemplate,
UnknownChatCompletionTemplate(String), UnknownChatCompletionTemplate(String),
DocumentNotFound(String),
BothInlineDocAndDocId,
} }
impl From<heed::Error> for RenderError { impl From<heed::Error> for RenderError {
@ -165,6 +172,12 @@ impl From<heed::Error> for RenderError {
} }
} }
impl From<milli::Error> for RenderError {
fn from(error: milli::Error) -> Self {
RenderError::ReponseError(error.into())
}
}
use RenderError::*; use RenderError::*;
impl From<RenderError> for ResponseError { impl From<RenderError> for ResponseError {
@ -260,6 +273,14 @@ impl From<RenderError> for ResponseError {
format!("Unknown chat completion template ID `{id}`. The only available template is `documentTemplate`."), format!("Unknown chat completion template ID `{id}`. The only available template is `documentTemplate`."),
Code::InvalidRenderTemplateId, Code::InvalidRenderTemplateId,
), ),
DocumentNotFound(doc_id) => ResponseError::from_msg(
format!("Document with ID `{doc_id}` not found."),
Code::RenderDocumentNotFound,
),
BothInlineDocAndDocId => ResponseError::from_msg(
String::from("A document id was provided but adding it to the input would overwrite the `doc` field that you already defined inline."),
Code::InvalidRenderInput,
),
} }
} }
} }
@ -396,6 +417,26 @@ async fn render(index: Index, query: RenderQuery) -> Result<RenderResult, Render
(None, None) => return Err(MissingTemplate), (None, None) => return Err(MissingTemplate),
}; };
let mut media = query.input.inline.unwrap_or_default();
if let Some(document_id) = query.input.document_id {
let internal_id = index
.external_documents_ids()
.get(&rtxn, &document_id)?
.ok_or_else(|| DocumentNotFound(document_id.to_string()))?;
let document = index.document(&rtxn, internal_id)?;
let fields_ids_map = index.fields_ids_map(&rtxn)?;
let all_fields: Vec<_> = fields_ids_map.iter().map(|(id, _)| id).collect();
let document = milli::obkv_to_json(&all_fields, &fields_ids_map, document)?;
let document = Value::Object(document);
if media.insert(String::from("doc"), document).is_some() {
return Err(BothInlineDocAndDocId);
}
}
Ok(RenderResult { template, rendered: String::from("TODO: Implement render logic here") }) Ok(RenderResult { template, rendered: String::from("TODO: Implement render logic here") })
} }
@ -420,10 +461,10 @@ pub struct RenderQueryTemplate {
#[derive(Debug, Clone, PartialEq, Deserr, ToSchema)] #[derive(Debug, Clone, PartialEq, Deserr, ToSchema)]
#[deserr(error = DeserrJsonError<InvalidRenderInput>, rename_all = camelCase, deny_unknown_fields)] #[deserr(error = DeserrJsonError<InvalidRenderInput>, rename_all = camelCase, deny_unknown_fields)]
pub struct RenderQueryInput { pub struct RenderQueryInput {
#[deserr(default, error = DeserrJsonError<InvalidRenderTemplateId>)] #[deserr(default, error = DeserrJsonError<InvalidRenderInputDocumentId>)]
document_id: Option<String>, document_id: Option<String>,
#[deserr(default, error = DeserrJsonError<InvalidRenderTemplateId>)] #[deserr(default, error = DeserrJsonError<InvalidRenderInputInline>)]
inline: Option<serde_json::Value>, inline: Option<BTreeMap<String, serde_json::Value>>,
} }
#[derive(Debug, Clone, Serialize, PartialEq, ToSchema)] #[derive(Debug, Clone, Serialize, PartialEq, ToSchema)]