From baa93720d72b61b5cc51cc27d5f03bbe434e17c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominique=20Eifl=C3=A4nder?= Date: Wed, 28 Jul 2021 12:13:45 +0200 Subject: [PATCH] RED-1874: Enabled to delete documents --- .../v1/server/exception/IndexException.java | 1 + .../server/queue/IndexingMessageReceiver.java | 28 ++++++++++++++ .../server/queue/MessagingConfiguration.java | 23 +++++++++++ .../server/service/DocumentDeleteService.java | 38 +++++++++++++++++++ .../v1/server/service/IndexCreatorTest.java | 14 ++++++- 5 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/DocumentDeleteService.java diff --git a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/exception/IndexException.java b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/exception/IndexException.java index bc8d7c5..348419e 100644 --- a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/exception/IndexException.java +++ b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/exception/IndexException.java @@ -5,6 +5,7 @@ public class IndexException extends RuntimeException { public static final String INDEX_EXISTS_ERROR = "Unable to check, if index exists"; public static final String CONTENT_TO_JSON_ERROR = "Could not convert document with id '%s' to JSON!"; public static final String DOCUMENT_INDEX_ERROR = "Error during indexing document with id '%s'"; + public static final String DOCUMENT_DELETE_ERROR = "Error during deleting document with id '%s'"; public static final String FAILED_TO_SEARCH = "Error during search"; diff --git a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/queue/IndexingMessageReceiver.java b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/queue/IndexingMessageReceiver.java index 62906ac..c3ed516 100644 --- a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/queue/IndexingMessageReceiver.java +++ b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/queue/IndexingMessageReceiver.java @@ -1,5 +1,7 @@ package com.iqser.red.service.search.v1.server.queue; +import static com.iqser.red.service.search.v1.server.queue.MessagingConfiguration.DELETE_FROM_INDEX_DLQ; +import static com.iqser.red.service.search.v1.server.queue.MessagingConfiguration.DELETE_FROM_INDEX_QUEUE; import static com.iqser.red.service.search.v1.server.queue.MessagingConfiguration.INDEXING_DQL; import static com.iqser.red.service.search.v1.server.queue.MessagingConfiguration.INDEXING_QUEUE; @@ -14,6 +16,7 @@ import com.iqser.red.service.search.v1.model.IndexMessage; import com.iqser.red.service.search.v1.server.client.FileStatusClient; import com.iqser.red.service.search.v1.server.client.FileStatusProcessingUpdateClient; import com.iqser.red.service.search.v1.server.model.Text; +import com.iqser.red.service.search.v1.server.service.DocumentDeleteService; import com.iqser.red.service.search.v1.server.service.DocumentIndexService; import com.iqser.red.service.search.v1.server.service.TextStorageService; @@ -30,6 +33,7 @@ public class IndexingMessageReceiver { private final DocumentIndexService documentIndexService; private final FileStatusClient fileStatusClient; private final FileStatusProcessingUpdateClient fileStatusProcessingUpdateClient; + private final DocumentDeleteService documentDeleteService; @RabbitHandler @@ -57,4 +61,28 @@ public class IndexingMessageReceiver { log.info("Failed to process indexing request: {}", indexRequest); } + + @RabbitHandler + @RabbitListener(queues = DELETE_FROM_INDEX_QUEUE) + public void receiveDeleteDocumentRequest(String in) throws JsonProcessingException { + + var indexRequest = objectMapper.readValue(in, IndexMessage.class); + log.info("Processing delete document request: {}", indexRequest); + documentDeleteService.deleteDocument(indexRequest.getFileId()); + log.info("Successfully deleted document with dossierId {} and fileId {}", indexRequest.getDossierId(), indexRequest.getFileId()); + + } + + + @RabbitHandler + @RabbitListener(queues = DELETE_FROM_INDEX_DLQ) + public void receiveDeleteDocumentRequestDLQ(String in) throws JsonProcessingException { + + var indexRequest = objectMapper.readValue(in, IndexMessage.class); + fileStatusProcessingUpdateClient.indexingFailed(indexRequest.getDossierId(), indexRequest.getFileId()); + log.info("Failed to process delete from index request: {}", indexRequest); + } + + + } diff --git a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/queue/MessagingConfiguration.java b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/queue/MessagingConfiguration.java index 417e558..a072327 100644 --- a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/queue/MessagingConfiguration.java +++ b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/queue/MessagingConfiguration.java @@ -14,6 +14,9 @@ public class MessagingConfiguration { public static final String INDEXING_QUEUE = "indexingQueue"; public static final String INDEXING_DQL = "indexingDQL"; + public static final String DELETE_FROM_INDEX_QUEUE = "deleteFromIndexQueue"; + public static final String DELETE_FROM_INDEX_DLQ = "deleteFromIndexDLQ"; + @Bean public Queue indexingQueue() { @@ -32,4 +35,24 @@ public class MessagingConfiguration { return QueueBuilder.durable(INDEXING_DQL).build(); } + + + @Bean + public Queue deleteFromIndexQueue() { + + return QueueBuilder.durable(DELETE_FROM_INDEX_QUEUE) + .withArgument("x-dead-letter-exchange", "") + .withArgument("x-dead-letter-routing-key", DELETE_FROM_INDEX_DLQ) + .maxPriority(2) + .build(); + } + + + @Bean + public Queue deleteFromIndexDLQ() { + + return QueueBuilder.durable(DELETE_FROM_INDEX_DLQ).build(); + } + + } diff --git a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/DocumentDeleteService.java b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/DocumentDeleteService.java new file mode 100644 index 0000000..6993a67 --- /dev/null +++ b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/DocumentDeleteService.java @@ -0,0 +1,38 @@ +package com.iqser.red.service.search.v1.server.service; + +import static com.iqser.red.service.search.v1.server.service.IndexCreatorService.INDEX_NAME; + +import java.io.IOException; + +import org.elasticsearch.action.delete.DeleteRequest; +import org.elasticsearch.client.RequestOptions; +import org.springframework.stereotype.Service; + +import com.iqser.red.service.search.v1.server.client.ElasticsearchClient; +import com.iqser.red.service.search.v1.server.exception.IndexException; +import com.iqser.red.service.search.v1.server.settings.ElasticsearchSettings; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class DocumentDeleteService { + + private final ElasticsearchClient client; + private final ElasticsearchSettings settings; + + + public void deleteDocument(String fileId) { + + DeleteRequest request = new DeleteRequest(INDEX_NAME).id(fileId).setRefreshPolicy(settings.getRefreshPolicy()); + + try { + client.delete(request, RequestOptions.DEFAULT); + } catch (IOException e) { + throw new IndexException(String.format(IndexException.DOCUMENT_DELETE_ERROR, fileId), e); + } + } + +} + + diff --git a/search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/IndexCreatorTest.java b/search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/IndexCreatorTest.java index e7b1377..7e3ab5c 100644 --- a/search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/IndexCreatorTest.java +++ b/search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/IndexCreatorTest.java @@ -1,6 +1,7 @@ package com.iqser.red.service.search.v1.server.service; import static org.assertj.core.api.Assertions.assertThat; + import java.io.IOException; import org.junit.Test; @@ -30,6 +31,9 @@ public class IndexCreatorTest extends AbstractElasticsearchIntegrationTest { @Autowired private SearchService searchService; + @Autowired + private DocumentDeleteService documentDeleteService; + @MockBean private FileStatusClient fileStatusClient; @@ -38,7 +42,7 @@ public class IndexCreatorTest extends AbstractElasticsearchIntegrationTest { @Test - public void test() throws IOException, InterruptedException { + public void test() throws IOException { ClassPathResource textResource = new ClassPathResource("files/Text.json"); Text text = objectMapper.readValue(textResource.getInputStream(), Text.class); @@ -49,9 +53,15 @@ public class IndexCreatorTest extends AbstractElasticsearchIntegrationTest { documentIndexService.indexDocument("dossierId", "fileId", "Single Study - Oral (Gavage) Mouse.pdf", text); documentIndexService.indexDocument("dossierId2", "fileId2", "S-Metolachlor_RAR_01_Volume_1_2018-09-06.pdf", text2); - SearchResult result = searchService.search("hans klaus single" ,null, null, 0 , 10, true); + SearchResult result = searchService.search("hans klaus single", null, null, 0, 10, true); assertThat(result.getMatchedDocuments().size()).isEqualTo(2); + + documentDeleteService.deleteDocument("fileId"); + + result = searchService.search("hans klaus single", null, null, 0, 10, true); + + assertThat(result.getMatchedDocuments().size()).isEqualTo(1); } }