From 655b504848f58cbb860a194fd2b22c5048139fe4 Mon Sep 17 00:00:00 2001 From: Philipp Schramm Date: Wed, 19 Jan 2022 14:44:09 +0100 Subject: [PATCH] RED-2896 Added validations and use default values for pagination if params are invalid --- .../v1/server/service/SearchService.java | 39 ++++++++++++++----- .../v1/server/utils/QueryStringConverter.java | 36 +++++++++-------- .../v1/server/service/IndexCreatorTest.java | 3 +- 3 files changed, 51 insertions(+), 27 deletions(-) diff --git a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/SearchService.java b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/SearchService.java index 181a482..7764181 100644 --- a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/SearchService.java +++ b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/SearchService.java @@ -55,8 +55,8 @@ public class SearchService { Query query = QueryStringConverter.convert(queryString); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().query(convertQuery(query, dossierTemplateIds, dossierIds, fileId, assignee, workflowStatus, fileAttributes, returnSections)) - .from(page * pageSize) - .size(pageSize) + .from(getPageOrDefault(page) * getPageSizeOrDefault(pageSize)) + .size(getPageSizeOrDefault(pageSize)) .fetchSource(new String[]{"dossierId", "fileId"}, new String[]{"sections"}) .highlighter(new HighlightBuilder().field("sections.text").field("filename").field("fileAttributes.value").highlighterType("fvh"))// .trackScores(true); @@ -122,7 +122,9 @@ public class SearchService { var dossierTemplateIdQueryBuilder = QueryBuilders.boolQuery(); for (var dossierTemplateId : dossierTemplateIds) { - dossierTemplateIdQueryBuilder = dossierTemplateIdQueryBuilder.should(QueryBuilders.matchQuery("dossierTemplateId", dossierTemplateId)); + if (StringUtils.isNotEmpty(dossierTemplateId)) { + dossierTemplateIdQueryBuilder = dossierTemplateIdQueryBuilder.should(QueryBuilders.matchQuery("dossierTemplateId", dossierTemplateId)); + } } filterQuery.must(dossierTemplateIdQueryBuilder); @@ -133,13 +135,14 @@ public class SearchService { var dossierIdQueryBuilder = QueryBuilders.boolQuery(); for (var dossierId : dossierIds) { - dossierIdQueryBuilder = dossierIdQueryBuilder.should(QueryBuilders.matchQuery("dossierId", dossierId)); + if (StringUtils.isNotEmpty(dossierId)) { + dossierIdQueryBuilder = dossierIdQueryBuilder.should(QueryBuilders.matchQuery("dossierId", dossierId)); + } } filterQuery.must(dossierIdQueryBuilder); } - if (StringUtils.isNotEmpty(fileId)) { filterQuery.must(QueryBuilders.matchQuery("fileId", fileId)); } @@ -156,10 +159,11 @@ public class SearchService { var fileAttributesQueryBuilder = QueryBuilders.boolQuery(); for (var fileAttributeKey : fileAttributes.keySet()) { - - fileAttributesQueryBuilder.filter(QueryBuilders.boolQuery() - .must(QueryBuilders.matchQuery("fileAttributes.name", fileAttributeKey)) - .must(QueryBuilders.matchQuery("fileAttributes.value", fileAttributes.get(fileAttributeKey)))); + if (StringUtils.isNotEmpty(fileAttributeKey)) { + fileAttributesQueryBuilder.filter(QueryBuilders.boolQuery() + .must(QueryBuilders.matchQuery("fileAttributes.name", fileAttributeKey)) + .must(QueryBuilders.matchQuery("fileAttributes.value", fileAttributes.get(fileAttributeKey)))); + } } filterQuery.must(fileAttributesQueryBuilder); @@ -230,4 +234,21 @@ public class SearchService { .build(); } + private int getPageSizeOrDefault(int pageSize) { + + if (pageSize <= 0) { + return 10; + } + return pageSize; + } + + + private int getPageOrDefault(int page) { + + if (page < 0) { + return 0; + } + return page; + } + } diff --git a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/utils/QueryStringConverter.java b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/utils/QueryStringConverter.java index 10c8cd2..da4283e 100644 --- a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/utils/QueryStringConverter.java +++ b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/utils/QueryStringConverter.java @@ -1,6 +1,7 @@ package com.iqser.red.service.search.v1.server.utils; import com.iqser.red.service.search.v1.server.model.Query; +import io.micrometer.core.instrument.util.StringUtils; import lombok.experimental.UtilityClass; import java.util.ArrayList; @@ -15,23 +16,26 @@ public class QueryStringConverter { boolean inQuots = false; List musts = new ArrayList<>(); List shoulds = new ArrayList<>(); - char[] trimmedQuery = queryString.trim().toCharArray(); - for (int i = 0; i < trimmedQuery.length; i++) { - if (trimmedQuery[i] == '"' && !inQuots) { - inQuots = true; - } else if (trimmedQuery[i] == '"' && inQuots) { - musts.add(sb.toString().trim()); - sb = new StringBuilder(); - inQuots = false; - } else if (trimmedQuery[i] == ' ' && !inQuots && !sb.toString().isEmpty()) { - shoulds.add(sb.toString().trim()); - sb = new StringBuilder(); - } else if (i == trimmedQuery.length - 1) { - sb.append(trimmedQuery[i]); - shoulds.add(sb.toString().trim()); - } else { - sb.append(trimmedQuery[i]); + if (StringUtils.isNotEmpty(queryString)) { + char[] trimmedQuery = queryString.trim().toCharArray(); + for (int i = 0; i < trimmedQuery.length; i++) { + + if (trimmedQuery[i] == '"' && !inQuots) { + inQuots = true; + } else if (trimmedQuery[i] == '"' && inQuots) { + musts.add(sb.toString().trim()); + sb = new StringBuilder(); + inQuots = false; + } else if (trimmedQuery[i] == ' ' && !inQuots && !sb.toString().isEmpty()) { + shoulds.add(sb.toString().trim()); + sb = new StringBuilder(); + } else if (i == trimmedQuery.length - 1) { + sb.append(trimmedQuery[i]); + shoulds.add(sb.toString().trim()); + } else { + sb.append(trimmedQuery[i]); + } } } 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 bd16f71..9cb7c5e 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 @@ -24,7 +24,6 @@ import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; -@Ignore @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT, properties = {AbstractElasticsearchIntegrationTest.WAIT_FOR_WRITE_REQUESTS}) public class IndexCreatorTest extends AbstractElasticsearchIntegrationTest { @@ -88,7 +87,7 @@ public class IndexCreatorTest extends AbstractElasticsearchIntegrationTest { assertThat(result.getMatchedDocuments().size()).isEqualTo(0); // Act & Assert 2 - result = searchService.search("S-Metolachlor", null, null, null, null, WorkflowStatus.NEW.name(), null, 0, 10, false); + result = searchService.search("S-Metolachlor", null, null, null, null, WorkflowStatus.NEW.name(), null, -1, 0, false); assertThat(result.getMatchedDocuments().size()).isEqualTo(2); assertThat(result.getMatchedDocuments().stream().map(MatchedDocument::getFileId)).contains("fileId1"); assertThat(result.getMatchedDocuments().stream().map(MatchedDocument::getFileId)).contains("fileId2");