mirror of
https://github.com/meilisearch/meilisearch.git
synced 2025-07-27 00:31:02 +00:00
Add doc loading
This commit is contained in:
@ -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 {
|
||||||
|
@ -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(),
|
||||||
|
@ -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)]
|
||||||
|
Reference in New Issue
Block a user