From 59636fa68833a4e24ee28a95e1ba6ad2034b4982 Mon Sep 17 00:00:00 2001 From: many Date: Thu, 28 Oct 2021 12:13:51 +0200 Subject: [PATCH] Pimp error where no document is provided --- .../tests/documents/add_documents.rs | 6 ++-- meilisearch-lib/src/document_formats.rs | 31 +++++++++++++------ .../src/index_controller/updates/mod.rs | 13 +++----- 3 files changed, 30 insertions(+), 20 deletions(-) diff --git a/meilisearch-http/tests/documents/add_documents.rs b/meilisearch-http/tests/documents/add_documents.rs index fc27765ab..4363bd29d 100644 --- a/meilisearch-http/tests/documents/add_documents.rs +++ b/meilisearch-http/tests/documents/add_documents.rs @@ -695,10 +695,10 @@ async fn error_add_no_documents() { let (response, code) = index.add_documents(json!([]), None).await; let expected_response = json!({ - "message": "A json payload is missing.", - "code": "missing_payload", + "message": "The `json` payload must contain at least one document.", + "code": "malformed_payload", "type": "invalid_request", - "link": "https://docs.meilisearch.com/errors#missing_payload" + "link": "https://docs.meilisearch.com/errors#malformed_payload" }); assert_eq!(response, expected_response); diff --git a/meilisearch-lib/src/document_formats.rs b/meilisearch-lib/src/document_formats.rs index 9ddbdf09d..137ecc280 100644 --- a/meilisearch-lib/src/document_formats.rs +++ b/meilisearch-lib/src/document_formats.rs @@ -32,6 +32,8 @@ pub enum DocumentFormatError { Box, PayloadType, ), + #[error("The `{0}` payload must contain at least one document.")] + EmptyPayload(PayloadType), } impl From<(PayloadType, milli::documents::Error)> for DocumentFormatError { @@ -48,6 +50,7 @@ impl ErrorCode for DocumentFormatError { match self { DocumentFormatError::Internal(_) => Code::Internal, DocumentFormatError::MalformedPayload(_, _) => Code::MalformedPayload, + DocumentFormatError::EmptyPayload(_) => Code::MalformedPayload, } } } @@ -55,18 +58,22 @@ impl ErrorCode for DocumentFormatError { internal_error!(DocumentFormatError: io::Error); /// reads csv from input and write an obkv batch to writer. -pub fn read_csv(input: impl Read, writer: impl Write + Seek) -> Result { +pub fn read_csv(input: impl Read, writer: impl Write + Seek) -> Result<()> { let writer = BufWriter::new(writer); let builder = DocumentBatchBuilder::from_csv(input, writer).map_err(|e| (PayloadType::Csv, e))?; - let document_count = builder.len(); + + if builder.len() == 0 { + return Err(DocumentFormatError::EmptyPayload(PayloadType::Csv)); + } + builder.finish().map_err(|e| (PayloadType::Csv, e))?; - Ok(document_count) + Ok(()) } /// reads jsonl from input and write an obkv batch to writer. -pub fn read_ndjson(input: impl Read, writer: impl Write + Seek) -> Result { +pub fn read_ndjson(input: impl Read, writer: impl Write + Seek) -> Result<()> { let mut reader = BufReader::new(input); let writer = BufWriter::new(writer); @@ -80,22 +87,28 @@ pub fn read_ndjson(input: impl Read, writer: impl Write + Seek) -> Result buf.clear(); } - let document_count = builder.len(); + if builder.len() == 0 { + return Err(DocumentFormatError::EmptyPayload(PayloadType::Ndjson)); + } builder.finish().map_err(|e| (PayloadType::Ndjson, e))?; - Ok(document_count) + Ok(()) } /// reads json from input and write an obkv batch to writer. -pub fn read_json(input: impl Read, writer: impl Write + Seek) -> Result { +pub fn read_json(input: impl Read, writer: impl Write + Seek) -> Result<()> { let writer = BufWriter::new(writer); let mut builder = DocumentBatchBuilder::new(writer).map_err(|e| (PayloadType::Json, e))?; builder .extend_from_json(input) .map_err(|e| (PayloadType::Json, e))?; - let document_count = builder.len(); + + if builder.len() == 0 { + return Err(DocumentFormatError::EmptyPayload(PayloadType::Json)); + } + builder.finish().map_err(|e| (PayloadType::Json, e))?; - Ok(document_count) + Ok(()) } diff --git a/meilisearch-lib/src/index_controller/updates/mod.rs b/meilisearch-lib/src/index_controller/updates/mod.rs index 3f2a2ef32..07ceed92b 100644 --- a/meilisearch-lib/src/index_controller/updates/mod.rs +++ b/meilisearch-lib/src/index_controller/updates/mod.rs @@ -174,18 +174,15 @@ impl UpdateLoop { } let reader = Cursor::new(buffer); - let document_count = match format { + match format { DocumentAdditionFormat::Json => read_json(reader, &mut *update_file)?, DocumentAdditionFormat::Csv => read_csv(reader, &mut *update_file)?, DocumentAdditionFormat::Ndjson => read_ndjson(reader, &mut *update_file)?, - }; - - if document_count > 0 { - update_file.persist()?; - Ok(()) - } else { - Err(UpdateLoopError::MissingPayload(format)) } + + update_file.persist()?; + + Ok(()) }) .await??;