From 74e2e40dfef9b18fe4bda10f886268f34cae3f5a Mon Sep 17 00:00:00 2001 From: Daniel Rainer <daniel.m.rainer@student.uibk.ac.at> Date: Thu, 18 Feb 2021 21:45:25 +0100 Subject: [PATCH] Parse metadata search queries Create object for metadata search query. This object is part of the SearchInputDTO object, which gets parsed from the JSON file sent by the front-end. --- .../search/GitFilesRepositoryImpl.java | 8 +- .../repository/search/MetaDataRepository.java | 42 +++---- .../gitsearch/service/dto/SearchInputDTO.java | 73 ++--------- .../service/dto/SearchInputMetadataDTO.java | 84 +++++++++++++ .../gitsearch/web/rest/GitFilesResource.java | 2 + .../gitsearch/service/SearchServiceIT.java | 115 +++++++++++------- 6 files changed, 188 insertions(+), 136 deletions(-) create mode 100644 src/main/java/at/ac/uibk/gitsearch/service/dto/SearchInputMetadataDTO.java diff --git a/src/main/java/at/ac/uibk/gitsearch/repository/search/GitFilesRepositoryImpl.java b/src/main/java/at/ac/uibk/gitsearch/repository/search/GitFilesRepositoryImpl.java index baf04a136..f2525a904 100644 --- a/src/main/java/at/ac/uibk/gitsearch/repository/search/GitFilesRepositoryImpl.java +++ b/src/main/java/at/ac/uibk/gitsearch/repository/search/GitFilesRepositoryImpl.java @@ -144,10 +144,10 @@ public class GitFilesRepositoryImpl implements GitFilesRepository { } SearchRequest searchRequest = new SearchRequest(GitFilesRepositoryConstants.INDEX_METADATA); BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery(); - addMetadataQueryShould(queryBuilder, searchInputDTO.getMetadataProgrammingLanguage(), GitFilesRepositoryConstants.METADATA_PROGRAMMING_LANGUAGES); - addMetadataQueryShould(queryBuilder, searchInputDTO.getMetadataKeywords(), GitFilesRepositoryConstants.METADATA_KEYWORDS); - addMetadataQueryMust(queryBuilder, searchInputDTO.getMetadataAuthor(), GitFilesRepositoryConstants.METADATA_CREATOR); - addMetadataQueryMust(queryBuilder, searchInputDTO.getMetadataLicense(), GitFilesRepositoryConstants.METADATA_LICENSE); + addMetadataQueryShould(queryBuilder, searchInputDTO.getMetadata().getProgrammingLanguage(), GitFilesRepositoryConstants.METADATA_PROGRAMMING_LANGUAGES); + addMetadataQueryShould(queryBuilder, searchInputDTO.getMetadata().getKeyword(), GitFilesRepositoryConstants.METADATA_KEYWORDS); + addMetadataQueryMust(queryBuilder, searchInputDTO.getMetadata().getAuthor(), GitFilesRepositoryConstants.METADATA_CREATOR); + addMetadataQueryMust(queryBuilder, searchInputDTO.getMetadata().getLicense(), GitFilesRepositoryConstants.METADATA_LICENSE); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder() .query(queryBuilder) .fetchSource(GitFilesRepositoryConstants.METADATA_PROJECT_ID, null); diff --git a/src/main/java/at/ac/uibk/gitsearch/repository/search/MetaDataRepository.java b/src/main/java/at/ac/uibk/gitsearch/repository/search/MetaDataRepository.java index 7ce9a5972..995be42cd 100644 --- a/src/main/java/at/ac/uibk/gitsearch/repository/search/MetaDataRepository.java +++ b/src/main/java/at/ac/uibk/gitsearch/repository/search/MetaDataRepository.java @@ -44,7 +44,7 @@ public class MetaDataRepository { /** * just a local wrapper, to decrypt JSON - * + * */ public static class SearchResultDTOWrapper { private SearchResultDTO metadata = new SearchResultDTO(); @@ -56,7 +56,7 @@ public class MetaDataRepository { public void setMetadata(SearchResultDTO metadata) { this.metadata = metadata; } - + private GitProject project; public GitProject getProject() { @@ -66,8 +66,8 @@ public class MetaDataRepository { public void setProject(GitProject project) { this.project = project; } - - + + } @@ -93,7 +93,7 @@ public class MetaDataRepository { /** * returns all keyword autocompletes for keyWord - * + * * @param keyWordPrefix * @return * @throws IOException @@ -104,7 +104,7 @@ public class MetaDataRepository { /** * returns all programmingLanguage autocompletes for keyWord - * + * * @param progammingLanguagePrefix * @return * @throws IOException @@ -115,7 +115,7 @@ public class MetaDataRepository { /** * returns all creator autocompletes - * + * * @param creatorPrefix * @return * @throws IOException @@ -126,7 +126,7 @@ public class MetaDataRepository { /** * returns all contributor autocompletes - * + * * @param contributorPrefix * @return * @throws IOException @@ -179,7 +179,7 @@ public class MetaDataRepository { } } } - + private void addTo(Map<String, Set<String>> completionMap, List<String> tokenList, String target) { tokenList.forEach(token -> { Set<String> existingTargets = completionMap.get(token); @@ -190,8 +190,8 @@ public class MetaDataRepository { existingTargets.add(target); }); } - - + + private List<String> split(String s) { StringTokenizer st = new StringTokenizer(s, " \t\n\r\f "); @@ -215,21 +215,21 @@ public class MetaDataRepository { SearchRepositoryConstants.METADATA_TITLE) .type(MultiMatchQueryBuilder.Type.PHRASE_PREFIX) ); - - if(!StringUtils.isEmpty(searchInputDTO.getMetadataProgrammingLanguage())) { - queryBuilder.must(QueryBuilders.simpleQueryStringQuery(searchInputDTO.getMetadataProgrammingLanguage()).field(SearchRepositoryConstants.METADATA_PROGRAMMING_LANGUAGES)); + + if(!StringUtils.isEmpty(searchInputDTO.getMetadata().getProgrammingLanguage())) { + queryBuilder.must(QueryBuilders.simpleQueryStringQuery(searchInputDTO.getMetadata().getProgrammingLanguage()).field(SearchRepositoryConstants.METADATA_PROGRAMMING_LANGUAGES)); } - - if(!StringUtils.isEmpty(searchInputDTO.getMetadataKeywords())) { - queryBuilder.must(QueryBuilders.simpleQueryStringQuery(searchInputDTO.getMetadataKeywords()).field(SearchRepositoryConstants.METADATA_KEYWORDS)); + + if(!StringUtils.isEmpty(searchInputDTO.getMetadata().getKeyword())) { + queryBuilder.must(QueryBuilders.simpleQueryStringQuery(searchInputDTO.getMetadata().getKeyword()).field(SearchRepositoryConstants.METADATA_KEYWORDS)); } - if(!StringUtils.isEmpty(searchInputDTO.getMetadataAuthor())) { - queryBuilder.must(QueryBuilders.simpleQueryStringQuery(searchInputDTO.getMetadataAuthor()).field(SearchRepositoryConstants.METADATA_CREATOR)); + if(!StringUtils.isEmpty(searchInputDTO.getMetadata().getAuthor())) { + queryBuilder.must(QueryBuilders.simpleQueryStringQuery(searchInputDTO.getMetadata().getAuthor()).field(SearchRepositoryConstants.METADATA_CREATOR)); } - if(!StringUtils.isEmpty(searchInputDTO.getMetadataLicense())) { - queryBuilder.must(QueryBuilders.simpleQueryStringQuery(searchInputDTO.getMetadataLicense()).field(SearchRepositoryConstants.METADATA_LICENSE)); + if(!StringUtils.isEmpty(searchInputDTO.getMetadata().getLicense())) { + queryBuilder.must(QueryBuilders.simpleQueryStringQuery(searchInputDTO.getMetadata().getLicense()).field(SearchRepositoryConstants.METADATA_LICENSE)); } char[] boundaryChars = {'\n'}; diff --git a/src/main/java/at/ac/uibk/gitsearch/service/dto/SearchInputDTO.java b/src/main/java/at/ac/uibk/gitsearch/service/dto/SearchInputDTO.java index b36fe1d26..07e511341 100644 --- a/src/main/java/at/ac/uibk/gitsearch/service/dto/SearchInputDTO.java +++ b/src/main/java/at/ac/uibk/gitsearch/service/dto/SearchInputDTO.java @@ -4,11 +4,7 @@ import java.util.List; public class SearchInputDTO { private String fulltextQuery; - private String metadataProgrammingLanguage; - private String metadataKeywords; - private String metadataNaturalLanguage; - private String metadataLicense; - private String metadataAuthor; + private SearchInputMetadataDTO metadata; private List<String> selectedRepository; private List<String> selectedUniversity; private List<String> selectedFileFormat; @@ -19,26 +15,17 @@ public class SearchInputDTO { public SearchInputDTO() { // empty for jackson } - public SearchInputDTO(String fulltextQuery, String metadataProgrammingLanguage, String metadataKeywords, - String metadataNaturalLanguage, String metadataLicense, String metadataAuthor, + public SearchInputDTO(String fulltextQuery, SearchInputMetadataDTO metadata, List<String> selectedRepository, List<String> selectedUniversity, List<String> selectedFileFormat, int page) { this.fulltextQuery = fulltextQuery; - this.metadataProgrammingLanguage = mapEmptyString(metadataProgrammingLanguage); - this.metadataKeywords = mapEmptyString(metadataKeywords); - this.metadataNaturalLanguage = mapEmptyString(metadataNaturalLanguage); - this.metadataLicense = mapEmptyString(metadataLicense); - this.metadataAuthor = mapEmptyString(metadataAuthor); + this.metadata = metadata; this.selectedRepository = selectedRepository; this.selectedUniversity = selectedUniversity; this.selectedFileFormat = selectedFileFormat; this.page = page; } - private static String mapEmptyString(String str) { - return "".equals(str) ? null : str; - } - public String getFulltextQuery() { return fulltextQuery; } @@ -47,44 +34,8 @@ public class SearchInputDTO { this.fulltextQuery = fulltextQuery; } - public String getMetadataProgrammingLanguage() { - return metadataProgrammingLanguage; - } - - public void setMetadataProgrammingLanguage(String metadataProgrammingLanguage) { - this.metadataProgrammingLanguage = metadataProgrammingLanguage; - } - - public void setMetadataKeywords(String metadataKeywords) { - this.metadataKeywords = metadataKeywords; - } - - public String getMetadataKeywords() { - return metadataKeywords; - } - - public String getMetadataNaturalLanguage() { - return metadataNaturalLanguage; - } - - public void setMetadataNaturalLanguage(String metadataNaturalLanguage) { - this.metadataNaturalLanguage = metadataNaturalLanguage; - } - - public String getMetadataLicense() { - return metadataLicense; - } - - public void setMetadataLicense(String metadataLicense) { - this.metadataLicense = metadataLicense; - } - - public String getMetadataAuthor() { - return metadataAuthor; - } - - public void setMetadataAuthor(String metadataAuthor) { - this.metadataAuthor = metadataAuthor; + public SearchInputMetadataDTO getMetadata() { + return metadata; } public List<String> getSelectedRepository() { @@ -120,19 +71,13 @@ public class SearchInputDTO { } public boolean hasMetadataInput() { - return !(metadataProgrammingLanguage == null - && metadataKeywords == null - && metadataAuthor == null - && metadataLicense == null); + return this.metadata.hasMetadataInput(); } - + @Override public String toString() { - return "SearchInputDTO [fulltextQuery=" + fulltextQuery + ", metadataProgrammingLanguage=" - + metadataProgrammingLanguage + ", metadataKeywords=" + metadataKeywords + ", metadataNaturalLanguage=" - + metadataNaturalLanguage + ", metadataLicense=" + metadataLicense + ", metadataAuthor=" - + metadataAuthor + ", selectedRepository=" + selectedRepository + ", selectedUniversity=" - + selectedUniversity + ", selectedFileFormat=" + selectedFileFormat + ", page=" + page + "]"; + return "SearchInputDTO [fulltextQuery=" + fulltextQuery + ", selectedRepository=" + selectedRepository + ", selectedUniversity=" + + selectedUniversity + ", selectedFileFormat=" + selectedFileFormat + ", page=" + page + ", metadata: {" + metadata + "}]"; } diff --git a/src/main/java/at/ac/uibk/gitsearch/service/dto/SearchInputMetadataDTO.java b/src/main/java/at/ac/uibk/gitsearch/service/dto/SearchInputMetadataDTO.java new file mode 100644 index 000000000..28be41baf --- /dev/null +++ b/src/main/java/at/ac/uibk/gitsearch/service/dto/SearchInputMetadataDTO.java @@ -0,0 +1,84 @@ +package at.ac.uibk.gitsearch.service.dto; + +public class SearchInputMetadataDTO { + private String programmingLanguage; + private String keyword; + private String naturalLanguage; + private String license; + private String author; + + public SearchInputMetadataDTO() { + } + + public SearchInputMetadataDTO(String programmingLanguage, + String keyword, + String naturalLanguage, + String license, + String author) { + this.programmingLanguage = mapEmptyString(programmingLanguage); + this.keyword = mapEmptyString(keyword); + this.naturalLanguage = mapEmptyString(naturalLanguage); + this.license = mapEmptyString(license); + this.author = mapEmptyString(author); + } + + private static String mapEmptyString(String str) { + return "".equals(str) ? null : str; + } + + public boolean hasMetadataInput() { + return !(programmingLanguage == null + && keyword == null + && author == null + && license == null); + } + + public String getProgrammingLanguage() { + return programmingLanguage; + } + + public void setProgrammingLanguage(String programmingLanguage) { + this.programmingLanguage = mapEmptyString(programmingLanguage); + } + + public String getKeyword() { + return keyword; + } + + public void setKeyword(String keyword) { + this.keyword = mapEmptyString(keyword); + } + + public String getNaturalLanguage() { + return naturalLanguage; + } + + public void setNaturalLanguage(String naturalLanguage) { + this.naturalLanguage = mapEmptyString(naturalLanguage); + } + + public String getLicense() { + return license; + } + + public void setLicense(String license) { + this.license = mapEmptyString(license); + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = mapEmptyString(author); + } + + @Override + public String toString() { + return "programmingLanguage: " + this.programmingLanguage + + ", keyword: " + this.keyword + + ", naturalLanguage: " + this.naturalLanguage + + ", license: " + this.license + + ", author: " + this.author; + } +} diff --git a/src/main/java/at/ac/uibk/gitsearch/web/rest/GitFilesResource.java b/src/main/java/at/ac/uibk/gitsearch/web/rest/GitFilesResource.java index 59fb41529..854e1e1eb 100644 --- a/src/main/java/at/ac/uibk/gitsearch/web/rest/GitFilesResource.java +++ b/src/main/java/at/ac/uibk/gitsearch/web/rest/GitFilesResource.java @@ -44,6 +44,7 @@ public class GitFilesResource { * // * @return the result of the search. * // */ + /* @GetMapping("/_search/git-files/page-details") public GitFilesPageDetailsDTO gitFilesPageDetails(@RequestParam String fulltextQuery, @RequestParam String metadataProgrammingLanguage, @@ -59,6 +60,7 @@ public class GitFilesResource { // return searchResultSearchRepository.findByContent(query); return gitFilesRepository.pageDetails(searchInput, pageSize); } + */ /** * // * {@code SEARCH /_search/git-files/aggregation?query=:query} : search for the searchResult corresponding diff --git a/src/test/java/at/ac/uibk/gitsearch/service/SearchServiceIT.java b/src/test/java/at/ac/uibk/gitsearch/service/SearchServiceIT.java index 2db5c6ab5..e1397ec6c 100644 --- a/src/test/java/at/ac/uibk/gitsearch/service/SearchServiceIT.java +++ b/src/test/java/at/ac/uibk/gitsearch/service/SearchServiceIT.java @@ -11,6 +11,7 @@ import static org.junit.Assert.assertTrue; import java.io.IOException; +import at.ac.uibk.gitsearch.service.dto.SearchInputMetadataDTO; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.MockitoAnnotations; @@ -27,9 +28,9 @@ import at.ac.uibk.gitsearch.service.dto.SearchResultsDTO; @SpringBootTest(classes = GitsearchApp.class) public class SearchServiceIT { - @Autowired + @Autowired private SearchService searchService; - + @BeforeEach public void setup() { MockitoAnnotations.initMocks(this); @@ -37,70 +38,90 @@ public class SearchServiceIT { @Test public void testFullTextSearch() throws Exception { - final String WIEN = "Wien"; - SearchInputDTO searchQuery = new SearchInputDTO(WIEN, null, null, null, null, null, null, null, null, 0); - SearchResultsDTO searchResultPage = searchService.searchResultPage(searchQuery, 0, SearchInputDTO.PAGE_SIZE); - - org.junit.Assert.assertNotNull(searchResultPage.getSearchResult()); - org.junit.Assert.assertTrue("At least one test hit", searchResultPage.getHitCount() >= 1); - org.junit.Assert.assertThat(searchResultPage.getSearchResult(), everyItem( - anyOf(hasProperty("description", containsString(WIEN)), - hasProperty("title", containsString(WIEN)) - // hasProperty("keywords", containsString("Wien")) - ))); + final String WIEN = "Wien"; + final SearchInputMetadataDTO searchMetadata = + new SearchInputMetadataDTO(null, null, null, null, null); + SearchInputDTO searchQuery = + new SearchInputDTO(WIEN, searchMetadata, null, null, null, 0); + SearchResultsDTO searchResultPage = + searchService.searchResultPage(searchQuery, 0, SearchInputDTO.PAGE_SIZE); + + org.junit.Assert.assertNotNull(searchResultPage.getSearchResult()); + org.junit.Assert.assertTrue("At least one test hit", searchResultPage.getHitCount() >= 1); + org.junit.Assert.assertThat(searchResultPage.getSearchResult(), everyItem( + anyOf(hasProperty("description", containsString(WIEN)), + hasProperty("title", containsString(WIEN)) + // hasProperty("keywords", containsString("Wien")) + ))); } @Test public void testProgrammingLanguageSearch() throws Exception { - SearchInputDTO searchQuery = new SearchInputDTO(null, "JAVA", null, null, null, null, null, null, null, 0); - SearchResultsDTO searchResultPage = searchService.searchResultPage(searchQuery, 0, SearchInputDTO.PAGE_SIZE); - - assertNotNull(searchResultPage.getSearchResult()); - assertTrue("At least one test hit", searchResultPage.getHitCount() >= 1); - assertThat(searchResultPage.getSearchResult(), everyItem( - hasProperty("programmingLanguage", - hasItemInArray(containsString("JAVA"))) - )); + final SearchInputMetadataDTO searchMetadata = + new SearchInputMetadataDTO("JAVA", null, null, null, null); + SearchInputDTO searchQuery = + new SearchInputDTO(null, searchMetadata, null, null, null, 0); + SearchResultsDTO searchResultPage = + searchService.searchResultPage(searchQuery, 0, SearchInputDTO.PAGE_SIZE); + + assertNotNull(searchResultPage.getSearchResult()); + assertTrue("At least one test hit", searchResultPage.getHitCount() >= 1); + assertThat(searchResultPage.getSearchResult(), everyItem( + hasProperty("programmingLanguage", + hasItemInArray(containsString("JAVA"))) + )); } - + @Test public void testCreatorSearch() throws IOException { - SearchInputDTO searchQuery = new SearchInputDTO(null, null, null, null, null, "Podlipnig", null, null, null, 0); - SearchResultsDTO searchResultPage = searchService.searchResultPage(searchQuery, 0, SearchInputDTO.PAGE_SIZE); - - org.junit.Assert.assertNotNull(searchResultPage.getSearchResult()); - org.junit.Assert.assertTrue("At least one test hit", searchResultPage.getHitCount() >= 1); - assertThat(searchResultPage.getSearchResult(), everyItem( - hasProperty("creator", hasItemInArray(hasProperty("name", containsString("Podlipnig")))) - )); + final SearchInputMetadataDTO searchMetadata = + new SearchInputMetadataDTO(null, null, null, null, "Podlipnig"); + SearchInputDTO searchQuery = + new SearchInputDTO(null, searchMetadata, null, null, null, 0); + SearchResultsDTO searchResultPage = + searchService.searchResultPage(searchQuery, 0, SearchInputDTO.PAGE_SIZE); + + org.junit.Assert.assertNotNull(searchResultPage.getSearchResult()); + org.junit.Assert.assertTrue("At least one test hit", searchResultPage.getHitCount() >= 1); + assertThat(searchResultPage.getSearchResult(), everyItem( + hasProperty("creator", hasItemInArray(hasProperty("name", containsString("Podlipnig")))) + )); } @Test public void testKeywordSearch() throws IOException { - SearchInputDTO searchQuery = new SearchInputDTO(null, null, "latex", null, null, null, null, null, null, 0); - SearchResultsDTO searchResultPage = searchService.searchResultPage(searchQuery, 0, SearchInputDTO.PAGE_SIZE); - - org.junit.Assert.assertNotNull(searchResultPage.getSearchResult()); - org.junit.Assert.assertTrue("At least one test hit", searchResultPage.getHitCount() >= 1); - assertThat(searchResultPage.getSearchResult(), everyItem( - hasProperty("keyword", hasItemInArray(containsString("latex"))) - )); + final SearchInputMetadataDTO searchMetadata = + new SearchInputMetadataDTO(null, "latex", null, null, null); + SearchInputDTO searchQuery = + new SearchInputDTO(null, searchMetadata, null, null, null, 0); + SearchResultsDTO searchResultPage = + searchService.searchResultPage(searchQuery, 0, SearchInputDTO.PAGE_SIZE); + + org.junit.Assert.assertNotNull(searchResultPage.getSearchResult()); + org.junit.Assert.assertTrue("At least one test hit", searchResultPage.getHitCount() >= 1); + assertThat(searchResultPage.getSearchResult(), everyItem( + hasProperty("keyword", hasItemInArray(containsString("latex"))) + )); } @Test public void testLicenseSearch() throws IOException { - SearchInputDTO searchQuery = new SearchInputDTO(null, null, null, null, "MIT", null, null, null, null, 0); - SearchResultsDTO searchResultPage = searchService.searchResultPage(searchQuery, 0, SearchInputDTO.PAGE_SIZE); - - org.junit.Assert.assertNotNull(searchResultPage.getSearchResult()); - org.junit.Assert.assertTrue("At least one test hit", searchResultPage.getHitCount() >= 1); - assertThat(searchResultPage.getSearchResult(), everyItem( - hasProperty("license", containsString("MIT")) - )); + final SearchInputMetadataDTO searchMetadata = + new SearchInputMetadataDTO(null, null, null, "MIT", null); + SearchInputDTO searchQuery = + new SearchInputDTO(null, searchMetadata, null, null, null, 0); + SearchResultsDTO searchResultPage = + searchService.searchResultPage(searchQuery, 0, SearchInputDTO.PAGE_SIZE); + + org.junit.Assert.assertNotNull(searchResultPage.getSearchResult()); + org.junit.Assert.assertTrue("At least one test hit", searchResultPage.getHitCount() >= 1); + assertThat(searchResultPage.getSearchResult(), everyItem( + hasProperty("license", containsString("MIT")) + )); } } -- GitLab