Pull request #34: RED-2896 Added validations and use default values for pagination if params are invalid

Merge in RED/search-service from RED-2896 to master

* commit '655b504848f58cbb860a194fd2b22c5048139fe4':
  RED-2896 Added validations and use default values for pagination if params are invalid
This commit is contained in:
Philipp Schramm 2022-01-19 16:26:11 +01:00
commit 3e121e9e06
3 changed files with 51 additions and 27 deletions

View File

@ -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;
}
}

View File

@ -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<String> musts = new ArrayList<>();
List<String> 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]);
}
}
}

View File

@ -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");