From d534a7f7c82ae415296147a9be7295ad966ece8d Mon Sep 17 00:00:00 2001 From: Marin Postma Date: Wed, 15 Dec 2021 10:07:47 +0100 Subject: [PATCH 1/2] bug(lib): ignore primary if already set on document addition --- .../tests/documents/add_documents.rs | 23 +++++++++++++++++++ meilisearch-lib/src/index/updates.rs | 4 +++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/meilisearch-http/tests/documents/add_documents.rs b/meilisearch-http/tests/documents/add_documents.rs index 6556b675b..b001b6ce9 100644 --- a/meilisearch-http/tests/documents/add_documents.rs +++ b/meilisearch-http/tests/documents/add_documents.rs @@ -1032,3 +1032,26 @@ async fn error_primary_key_inference() { assert_eq!(response["error"], expected_error); } + +#[actix_rt::test] +async fn add_documents_with_primary_key_twice() { + let server = Server::new().await; + let index = server.index("test"); + + let documents = json!([ + { + "title": "11", + "desc": "foobar" + } + ]); + + index.add_documents(documents.clone(), Some("title")).await; + index.wait_task(0).await; + let (response, _code) = index.get_task(0).await; + assert_eq!(response["status"], "succeeded"); + + index.add_documents(documents, Some("title")).await; + index.wait_task(1).await; + let (response, _code) = index.get_task(1).await; + assert_eq!(response["status"], "succeeded"); +} diff --git a/meilisearch-lib/src/index/updates.rs b/meilisearch-lib/src/index/updates.rs index e9d9b0cd0..c1fc9a5c0 100644 --- a/meilisearch-lib/src/index/updates.rs +++ b/meilisearch-lib/src/index/updates.rs @@ -237,7 +237,9 @@ impl Index { let mut txn = self.write_txn()?; if let Some(primary_key) = primary_key { - self.update_primary_key_txn(&mut txn, primary_key)?; + if self.primary_key(&txn)?.is_none() { + self.update_primary_key_txn(&mut txn, primary_key)?; + } } let indexing_callback = |indexing_step| debug!("update: {:?}", indexing_step); From 80ed9654e1b035782a18ea70ca1ed60dd8dafc3a Mon Sep 17 00:00:00 2001 From: Marin Postma Date: Wed, 15 Dec 2021 09:49:39 +0100 Subject: [PATCH 2/2] chore(http): rename task types --- meilisearch-http/src/task.rs | 24 +++++++++---------- .../tests/documents/add_documents.rs | 10 ++++---- meilisearch-http/tests/tasks/mod.rs | 6 ++--- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/meilisearch-http/src/task.rs b/meilisearch-http/src/task.rs index 1eba76ca8..7def064c2 100644 --- a/meilisearch-http/src/task.rs +++ b/meilisearch-http/src/task.rs @@ -13,9 +13,9 @@ enum TaskType { IndexCreation, IndexUpdate, IndexDeletion, - DocumentsAddition, - DocumentsPartial, - DocumentsDeletion, + DocumentAddition, + DocumentPartial, + DocumentDeletion, SettingsUpdate, ClearAll, } @@ -26,13 +26,13 @@ impl From for TaskType { TaskContent::DocumentAddition { merge_strategy: IndexDocumentsMethod::ReplaceDocuments, .. - } => TaskType::DocumentsAddition, + } => TaskType::DocumentAddition, TaskContent::DocumentAddition { merge_strategy: IndexDocumentsMethod::UpdateDocuments, .. - } => TaskType::DocumentsPartial, + } => TaskType::DocumentPartial, TaskContent::DocumentDeletion(DocumentDeletion::Clear) => TaskType::ClearAll, - TaskContent::DocumentDeletion(DocumentDeletion::Ids(_)) => TaskType::DocumentsDeletion, + TaskContent::DocumentDeletion(DocumentDeletion::Ids(_)) => TaskType::DocumentDeletion, TaskContent::SettingsUpdate { .. } => TaskType::SettingsUpdate, TaskContent::IndexDeletion => TaskType::IndexDeletion, TaskContent::IndexCreation { .. } => TaskType::IndexCreation, @@ -56,7 +56,7 @@ enum TaskStatus { #[allow(clippy::large_enum_variant)] enum TaskDetails { #[serde(rename_all = "camelCase")] - DocumentsAddition { + DocumentAddition { received_documents: usize, indexed_documents: Option, }, @@ -123,21 +123,21 @@ impl From for TaskView { documents_count, .. } => { - let details = TaskDetails::DocumentsAddition { + let details = TaskDetails::DocumentAddition { received_documents: documents_count, indexed_documents: None, }; let task_type = match merge_strategy { - IndexDocumentsMethod::UpdateDocuments => TaskType::DocumentsPartial, - IndexDocumentsMethod::ReplaceDocuments => TaskType::DocumentsAddition, + IndexDocumentsMethod::UpdateDocuments => TaskType::DocumentPartial, + IndexDocumentsMethod::ReplaceDocuments => TaskType::DocumentAddition, _ => unreachable!("Unexpected document merge strategy."), }; (task_type, Some(details)) } TaskContent::DocumentDeletion(DocumentDeletion::Ids(ids)) => ( - TaskType::DocumentsDeletion, + TaskType::DocumentDeletion, Some(TaskDetails::DocumentDeletion { received_document_ids: ids.len(), deleted_documents: None, @@ -181,7 +181,7 @@ impl From for TaskView { indexed_documents: num, .. }, - Some(TaskDetails::DocumentsAddition { + Some(TaskDetails::DocumentAddition { ref mut indexed_documents, .. }), diff --git a/meilisearch-http/tests/documents/add_documents.rs b/meilisearch-http/tests/documents/add_documents.rs index 6556b675b..1b934965b 100644 --- a/meilisearch-http/tests/documents/add_documents.rs +++ b/meilisearch-http/tests/documents/add_documents.rs @@ -563,7 +563,7 @@ async fn add_documents_no_index_creation() { assert_eq!(code, 200); assert_eq!(response["status"], "succeeded"); assert_eq!(response["uid"], 0); - assert_eq!(response["type"], "documentsAddition"); + assert_eq!(response["type"], "documentAddition"); assert_eq!(response["details"]["receivedDocuments"], 1); assert_eq!(response["details"]["indexedDocuments"], 1); @@ -633,7 +633,7 @@ async fn document_addition_with_primary_key() { assert_eq!(code, 200); assert_eq!(response["status"], "succeeded"); assert_eq!(response["uid"], 0); - assert_eq!(response["type"], "documentsAddition"); + assert_eq!(response["type"], "documentAddition"); assert_eq!(response["details"]["receivedDocuments"], 1); assert_eq!(response["details"]["indexedDocuments"], 1); @@ -662,7 +662,7 @@ async fn document_update_with_primary_key() { assert_eq!(code, 200); assert_eq!(response["status"], "succeeded"); assert_eq!(response["uid"], 0); - assert_eq!(response["type"], "documentsPartial"); + assert_eq!(response["type"], "documentPartial"); assert_eq!(response["details"]["indexedDocuments"], 1); assert_eq!(response["details"]["receivedDocuments"], 1); @@ -775,7 +775,7 @@ async fn add_larger_dataset() { let (response, code) = index.get_task(update_id).await; assert_eq!(code, 200); assert_eq!(response["status"], "succeeded"); - assert_eq!(response["type"], "documentsAddition"); + assert_eq!(response["type"], "documentAddition"); assert_eq!(response["details"]["indexedDocuments"], 77); assert_eq!(response["details"]["receivedDocuments"], 77); let (response, code) = index @@ -797,7 +797,7 @@ async fn update_larger_dataset() { index.wait_task(0).await; let (response, code) = index.get_task(0).await; assert_eq!(code, 200); - assert_eq!(response["type"], "documentsPartial"); + assert_eq!(response["type"], "documentPartial"); assert_eq!(response["details"]["indexedDocuments"], 77); let (response, code) = index .get_all_documents(GetAllDocumentsOptions { diff --git a/meilisearch-http/tests/tasks/mod.rs b/meilisearch-http/tests/tasks/mod.rs index daba2e6ec..3edb89376 100644 --- a/meilisearch-http/tests/tasks/mod.rs +++ b/meilisearch-http/tests/tasks/mod.rs @@ -117,13 +117,13 @@ async fn test_summarized_task_view() { assert_valid_summarized_task!(response, "settingsUpdate", "test"); let (response, _) = index.update_documents(json!([{"id": 1}]), None).await; - assert_valid_summarized_task!(response, "documentsPartial", "test"); + assert_valid_summarized_task!(response, "documentPartial", "test"); let (response, _) = index.add_documents(json!([{"id": 1}]), None).await; - assert_valid_summarized_task!(response, "documentsAddition", "test"); + assert_valid_summarized_task!(response, "documentAddition", "test"); let (response, _) = index.delete_document(1).await; - assert_valid_summarized_task!(response, "documentsDeletion", "test"); + assert_valid_summarized_task!(response, "documentDeletion", "test"); let (response, _) = index.clear_all_documents().await; assert_valid_summarized_task!(response, "clearAll", "test");