From d263f762bf88d7e2209d0d849578fd7463606eb4 Mon Sep 17 00:00:00 2001 From: mpostma Date: Thu, 13 Jan 2022 12:30:35 +0100 Subject: [PATCH] feat(http): accept empty document additions wip --- .../tests/documents/add_documents.rs | 15 +++----------- meilisearch-lib/src/document_formats.rs | 20 +++++-------------- meilisearch-lib/src/index/dump.rs | 4 ++-- 3 files changed, 10 insertions(+), 29 deletions(-) diff --git a/meilisearch-http/tests/documents/add_documents.rs b/meilisearch-http/tests/documents/add_documents.rs index f6d55409d..a8340096c 100644 --- a/meilisearch-http/tests/documents/add_documents.rs +++ b/meilisearch-http/tests/documents/add_documents.rs @@ -710,20 +710,11 @@ async fn replace_document() { } #[actix_rt::test] -async fn error_add_no_documents() { +async fn add_no_documents() { let server = Server::new().await; let index = server.index("test"); - let (response, code) = index.add_documents(json!([]), None).await; - - let expected_response = json!({ - "message": "The `json` payload must contain at least one document.", - "code": "malformed_payload", - "type": "invalid_request", - "link": "https://docs.meilisearch.com/errors#malformed_payload" - }); - - assert_eq!(response, expected_response); - assert_eq!(code, 400); + let (_response, code) = index.add_documents(json!([]), None).await; + assert_eq!(code, 202); } #[actix_rt::test] diff --git a/meilisearch-lib/src/document_formats.rs b/meilisearch-lib/src/document_formats.rs index d711fdde9..cfd73038e 100644 --- a/meilisearch-lib/src/document_formats.rs +++ b/meilisearch-lib/src/document_formats.rs @@ -32,8 +32,6 @@ 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 { @@ -50,7 +48,6 @@ impl ErrorCode for DocumentFormatError { match self { DocumentFormatError::Internal(_) => Code::Internal, DocumentFormatError::MalformedPayload(_, _) => Code::MalformedPayload, - DocumentFormatError::EmptyPayload(_) => Code::MalformedPayload, } } } @@ -63,10 +60,6 @@ pub fn read_csv(input: impl Read, writer: impl Write + Seek) -> Result { let builder = DocumentBatchBuilder::from_csv(input, writer).map_err(|e| (PayloadType::Csv, e))?; - if builder.len() == 0 { - return Err(DocumentFormatError::EmptyPayload(PayloadType::Csv)); - } - let count = builder.finish().map_err(|e| (PayloadType::Csv, e))?; Ok(count) @@ -81,16 +74,17 @@ pub fn read_ndjson(input: impl Read, writer: impl Write + Seek) -> Result let mut buf = String::new(); while reader.read_line(&mut buf)? > 0 { + // skip empty lines + if buf == "\n" { + buf.clear(); + continue; + } builder .extend_from_json(Cursor::new(&buf.as_bytes())) .map_err(|e| (PayloadType::Ndjson, e))?; buf.clear(); } - if builder.len() == 0 { - return Err(DocumentFormatError::EmptyPayload(PayloadType::Ndjson)); - } - let count = builder.finish().map_err(|e| (PayloadType::Ndjson, e))?; Ok(count) @@ -104,10 +98,6 @@ pub fn read_json(input: impl Read, writer: impl Write + Seek) -> Result { .extend_from_json(input) .map_err(|e| (PayloadType::Json, e))?; - if builder.len() == 0 { - return Err(DocumentFormatError::EmptyPayload(PayloadType::Json)); - } - let count = builder.finish().map_err(|e| (PayloadType::Json, e))?; Ok(count) diff --git a/meilisearch-lib/src/index/dump.rs b/meilisearch-lib/src/index/dump.rs index ace589529..cbaa66b03 100644 --- a/meilisearch-lib/src/index/dump.rs +++ b/meilisearch-lib/src/index/dump.rs @@ -8,7 +8,7 @@ use indexmap::IndexMap; use milli::documents::DocumentBatchReader; use serde::{Deserialize, Serialize}; -use crate::document_formats::{read_ndjson, DocumentFormatError}; +use crate::document_formats::read_ndjson; use crate::index::update_handler::UpdateHandler; use crate::index::updates::apply_settings_to_builder; @@ -130,8 +130,8 @@ impl Index { let empty = match read_ndjson(reader, &mut tmp_doc_file) { // if there was no document in the file it's because the index was empty + Ok(0) => true, Ok(_) => false, - Err(DocumentFormatError::EmptyPayload(_)) => true, Err(e) => return Err(e.into()), };