mirror of
https://github.com/meilisearch/MeiliSearch
synced 2025-01-10 21:44:34 +01:00
Pimp error where no document is provided
This commit is contained in:
parent
ff0908d3fa
commit
59636fa688
@ -695,10 +695,10 @@ async fn error_add_no_documents() {
|
|||||||
let (response, code) = index.add_documents(json!([]), None).await;
|
let (response, code) = index.add_documents(json!([]), None).await;
|
||||||
|
|
||||||
let expected_response = json!({
|
let expected_response = json!({
|
||||||
"message": "A json payload is missing.",
|
"message": "The `json` payload must contain at least one document.",
|
||||||
"code": "missing_payload",
|
"code": "malformed_payload",
|
||||||
"type": "invalid_request",
|
"type": "invalid_request",
|
||||||
"link": "https://docs.meilisearch.com/errors#missing_payload"
|
"link": "https://docs.meilisearch.com/errors#malformed_payload"
|
||||||
});
|
});
|
||||||
|
|
||||||
assert_eq!(response, expected_response);
|
assert_eq!(response, expected_response);
|
||||||
|
@ -32,6 +32,8 @@ pub enum DocumentFormatError {
|
|||||||
Box<dyn std::error::Error + Send + Sync + 'static>,
|
Box<dyn std::error::Error + Send + Sync + 'static>,
|
||||||
PayloadType,
|
PayloadType,
|
||||||
),
|
),
|
||||||
|
#[error("The `{0}` payload must contain at least one document.")]
|
||||||
|
EmptyPayload(PayloadType),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<(PayloadType, milli::documents::Error)> for DocumentFormatError {
|
impl From<(PayloadType, milli::documents::Error)> for DocumentFormatError {
|
||||||
@ -48,6 +50,7 @@ impl ErrorCode for DocumentFormatError {
|
|||||||
match self {
|
match self {
|
||||||
DocumentFormatError::Internal(_) => Code::Internal,
|
DocumentFormatError::Internal(_) => Code::Internal,
|
||||||
DocumentFormatError::MalformedPayload(_, _) => Code::MalformedPayload,
|
DocumentFormatError::MalformedPayload(_, _) => Code::MalformedPayload,
|
||||||
|
DocumentFormatError::EmptyPayload(_) => Code::MalformedPayload,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -55,18 +58,22 @@ impl ErrorCode for DocumentFormatError {
|
|||||||
internal_error!(DocumentFormatError: io::Error);
|
internal_error!(DocumentFormatError: io::Error);
|
||||||
|
|
||||||
/// reads csv from input and write an obkv batch to writer.
|
/// reads csv from input and write an obkv batch to writer.
|
||||||
pub fn read_csv(input: impl Read, writer: impl Write + Seek) -> Result<usize> {
|
pub fn read_csv(input: impl Read, writer: impl Write + Seek) -> Result<()> {
|
||||||
let writer = BufWriter::new(writer);
|
let writer = BufWriter::new(writer);
|
||||||
let builder =
|
let builder =
|
||||||
DocumentBatchBuilder::from_csv(input, writer).map_err(|e| (PayloadType::Csv, e))?;
|
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))?;
|
builder.finish().map_err(|e| (PayloadType::Csv, e))?;
|
||||||
|
|
||||||
Ok(document_count)
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// reads jsonl from input and write an obkv batch to writer.
|
/// reads jsonl from input and write an obkv batch to writer.
|
||||||
pub fn read_ndjson(input: impl Read, writer: impl Write + Seek) -> Result<usize> {
|
pub fn read_ndjson(input: impl Read, writer: impl Write + Seek) -> Result<()> {
|
||||||
let mut reader = BufReader::new(input);
|
let mut reader = BufReader::new(input);
|
||||||
let writer = BufWriter::new(writer);
|
let writer = BufWriter::new(writer);
|
||||||
|
|
||||||
@ -80,22 +87,28 @@ pub fn read_ndjson(input: impl Read, writer: impl Write + Seek) -> Result<usize>
|
|||||||
buf.clear();
|
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))?;
|
builder.finish().map_err(|e| (PayloadType::Ndjson, e))?;
|
||||||
|
|
||||||
Ok(document_count)
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// reads json from input and write an obkv batch to writer.
|
/// reads json from input and write an obkv batch to writer.
|
||||||
pub fn read_json(input: impl Read, writer: impl Write + Seek) -> Result<usize> {
|
pub fn read_json(input: impl Read, writer: impl Write + Seek) -> Result<()> {
|
||||||
let writer = BufWriter::new(writer);
|
let writer = BufWriter::new(writer);
|
||||||
let mut builder = DocumentBatchBuilder::new(writer).map_err(|e| (PayloadType::Json, e))?;
|
let mut builder = DocumentBatchBuilder::new(writer).map_err(|e| (PayloadType::Json, e))?;
|
||||||
builder
|
builder
|
||||||
.extend_from_json(input)
|
.extend_from_json(input)
|
||||||
.map_err(|e| (PayloadType::Json, e))?;
|
.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))?;
|
builder.finish().map_err(|e| (PayloadType::Json, e))?;
|
||||||
|
|
||||||
Ok(document_count)
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -174,18 +174,15 @@ impl UpdateLoop {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let reader = Cursor::new(buffer);
|
let reader = Cursor::new(buffer);
|
||||||
let document_count = match format {
|
match format {
|
||||||
DocumentAdditionFormat::Json => read_json(reader, &mut *update_file)?,
|
DocumentAdditionFormat::Json => read_json(reader, &mut *update_file)?,
|
||||||
DocumentAdditionFormat::Csv => read_csv(reader, &mut *update_file)?,
|
DocumentAdditionFormat::Csv => read_csv(reader, &mut *update_file)?,
|
||||||
DocumentAdditionFormat::Ndjson => read_ndjson(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??;
|
.await??;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user