package org.gbif.checklistbank.ws.client; import org.gbif.api.model.Constants; import org.gbif.api.model.checklistbank.search.NameUsageSearchParameter; import org.gbif.api.model.checklistbank.search.NameUsageSearchRequest; import org.gbif.api.model.checklistbank.search.NameUsageSearchResult; import org.gbif.api.model.checklistbank.search.NameUsageSuggestRequest; import org.gbif.api.model.checklistbank.search.NameUsageSuggestResult; import org.gbif.api.model.common.search.SearchResponse; import org.gbif.api.service.checklistbank.NameUsageSearchService; import org.gbif.api.vocabulary.Habitat; import org.gbif.api.vocabulary.Rank; import org.gbif.api.vocabulary.TaxonomicStatus; import org.gbif.api.vocabulary.ThreatStatus; import java.util.List; import java.util.UUID; import org.junit.Assert; import org.junit.Test; import static org.gbif.api.model.common.paging.PagingConstants.DEFAULT_PARAM_LIMIT; import static org.gbif.api.model.common.paging.PagingConstants.DEFAULT_PARAM_OFFSET; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; public class NameUsageSearchWsClientIT { private static String SQUIRRELS_DATASET_KEY = "109aea14-c252-4a85-96e2-f5f4d5d088f4"; private NameUsageSearchService wsClient; public NameUsageSearchWsClientIT() { wsClient = WsClientSuite.getClient(NameUsageSearchService.class); } @Test public void searchHighlightTest() { NameUsageSearchRequest searchRequest = new NameUsageSearchRequest(DEFAULT_PARAM_OFFSET, DEFAULT_PARAM_LIMIT); searchRequest.setQ("puma"); searchRequest.setHighlight(true); SearchResponse<NameUsageSearchResult, NameUsageSearchParameter> response = wsClient.search(searchRequest); assertNotNull(response); } @Test public void searchSuggestTest() { NameUsageSuggestRequest req = new NameUsageSuggestRequest(); req.addParameter(NameUsageSearchParameter.DATASET_KEY, SQUIRRELS_DATASET_KEY); req.setLimit(100); req.setQ("tetracanthus"); List<NameUsageSuggestResult> results = wsClient.suggest(req); for (NameUsageSuggestResult r : results) { System.out.println(r.getScientificName()); } assertEquals(0, results.size()); assertNotNull(results); req = new NameUsageSuggestRequest(); req.addParameter(NameUsageSearchParameter.DATASET_KEY, SQUIRRELS_DATASET_KEY); req.setLimit(100); req.setQ("Sciu"); results = wsClient.suggest(req); //TODO: why does this not work !!!???!??!?!?! // assertEquals(27, results.size()); // assertEquals("Sciuridae", results.get(0).getScientificName()); } @Test public void searchTest() { NameUsageSearchRequest searchRequest = new NameUsageSearchRequest(DEFAULT_PARAM_OFFSET, DEFAULT_PARAM_LIMIT); searchRequest.setQ("puma"); searchRequest.addFacets(NameUsageSearchParameter.DATASET_KEY); searchRequest.addParameter(NameUsageSearchParameter.DATASET_KEY, Constants.NUB_DATASET_KEY.toString()); searchRequest.setMultiSelectFacets(true); SearchResponse<NameUsageSearchResult, NameUsageSearchParameter> response = wsClient.search(searchRequest); assertNotNull(response); } @Test public void searchTestWithNubKey() { NameUsageSearchRequest searchRequest = new NameUsageSearchRequest(DEFAULT_PARAM_OFFSET, DEFAULT_PARAM_LIMIT); searchRequest.setQ("oenanthe"); searchRequest.addParameter(NameUsageSearchParameter.HIGHERTAXON_KEY, "3184223"); searchRequest.addFacets(NameUsageSearchParameter.DATASET_KEY); searchRequest.addParameter(NameUsageSearchParameter.DATASET_KEY, Constants.NUB_DATASET_KEY.toString()); SearchResponse<NameUsageSearchResult, NameUsageSearchParameter> response = wsClient.search(searchRequest); assertNotNull(response); } @Test public void searchSearches() { assertSearch("vulgaris", NameUsageSearchParameter.RANK, 10L, null); } @Test public void searchSearchFacets() { // RANK assertSearch("Sciurus vulgaris", NameUsageSearchParameter.RANK, 10L, null); assertSearch("Sciurus vulgaris", NameUsageSearchParameter.RANK, Rank.VARIETY, 2l, null); SearchResponse<NameUsageSearchResult, NameUsageSearchParameter> result = assertSearch("Sciurus vulgaris", NameUsageSearchParameter.RANK, Rank.SPECIES, 1l, null); assertEquals((Integer) 100000025, result.getResults().get(0).getKey()); assertEquals("Sciurus vulgaris Linnaeus, 1758", result.getResults().get(0).getScientificName()); // CHECKLIST assertSearch("Animalia", NameUsageSearchParameter.DATASET_KEY, 2L, null); result = assertSearch("Animalia", NameUsageSearchParameter.DATASET_KEY, Constants.NUB_DATASET_KEY.toString(), 1l, null); assertEquals((Integer) 1, result.getResults().get(0).getKey()); assertSearch("Animalia", NameUsageSearchParameter.DATASET_KEY, UUID.randomUUID().toString(), 0l, null); // HIGHERTAXON assertSearch("Rodentia", NameUsageSearchParameter.HIGHERTAXON_KEY, 2L, null); // we only have the order Rodentia in the nub without children result = assertSearch("Rodentia", NameUsageSearchParameter.HIGHERTAXON_KEY, "1", 1l, null); assertEquals((Integer) 10, result.getResults().get(0).getKey()); // plain facet filter search, no query NameUsageSearchRequest req = new NameUsageSearchRequest(); req.setQ(null); req.addChecklistFilter(UUID.fromString(SQUIRRELS_DATASET_KEY)); req.addHigherTaxonFilter(100000024); assertSearch(req, true, 14l, null); // TAXSTATUS assertSearch("Sciurus", NameUsageSearchParameter.STATUS, 17L, null); assertSearch("Sciurus", NameUsageSearchParameter.STATUS, TaxonomicStatus.SYNONYM, 4l, null); assertSearch("Sciurus", NameUsageSearchParameter.STATUS, TaxonomicStatus.HETEROTYPIC_SYNONYM, 0l, null); assertSearch("Sciurus", NameUsageSearchParameter.STATUS, TaxonomicStatus.MISAPPLIED, 0l, null); // EXTINCT assertSearch("Sciurus", NameUsageSearchParameter.IS_EXTINCT, 17L, null); result = assertSearch("Sciurus", NameUsageSearchParameter.IS_EXTINCT, "false", 1l, null); assertEquals((Integer) 100000025, result.getResults().get(0).getKey()); assertSearch("Sciurus", NameUsageSearchParameter.IS_EXTINCT, "true", 1l, null); // HABITAT assertSearch("Sciurus", NameUsageSearchParameter.HABITAT, 17L, null); result = assertSearch("Sciurus", NameUsageSearchParameter.HABITAT, Habitat.TERRESTRIAL, 1l, null); assertEquals((Integer) 100000025, result.getResults().get(0).getKey()); assertSearch("Sciurus", NameUsageSearchParameter.HABITAT, Habitat.MARINE, 0l, null); assertSearch("Sciurus", NameUsageSearchParameter.HABITAT, Habitat.FRESHWATER, 1l, null); // THREAT assertSearch("Sciurillus", NameUsageSearchParameter.THREAT, 5L, null); result = assertSearch("Sciurillus", NameUsageSearchParameter.THREAT, ThreatStatus.NEAR_THREATENED, 1l, null); assertEquals((Integer) 100000007, result.getResults().get(0).getKey()); assertSearch("Sciurillus", NameUsageSearchParameter.THREAT, ThreatStatus.EXTINCT_IN_THE_WILD, 0l, null); // HIGHERTAXON & RANK NameUsageSearchRequest searchRequest = new NameUsageSearchRequest(0L, 20); searchRequest.setQ("Sciurus"); searchRequest.addFacets(NameUsageSearchParameter.HIGHERTAXON_KEY, NameUsageSearchParameter.RANK); assertSearch(searchRequest, true, 17L, null); searchRequest.addParameter(NameUsageSearchParameter.HIGHERTAXON_KEY, "100000025"); assertSearch(searchRequest, true, 13l, null); searchRequest.addParameter(NameUsageSearchParameter.RANK, Rank.VARIETY); assertSearch(searchRequest, true, 2l, null); } private SearchResponse<NameUsageSearchResult, NameUsageSearchParameter> assertSearch(String q, NameUsageSearchParameter facet, Long expectedCount, String expectedFacetCounts) { return assertSearch(q, facet, (String) null, expectedCount, expectedFacetCounts); } private SearchResponse<NameUsageSearchResult, NameUsageSearchParameter> assertSearch(String q, NameUsageSearchParameter facet, Enum<?> facetFilter, Long expectedCount, String expectedFacetCounts) { NameUsageSearchRequest searchRequest = prepareRequest(q, facet); if (facetFilter != null) { searchRequest.addParameter(facet, facetFilter); } return assertSearch(searchRequest, facet != null, expectedCount, expectedFacetCounts); } private SearchResponse<NameUsageSearchResult, NameUsageSearchParameter> assertSearch(String q, NameUsageSearchParameter facet, String facetFilter, Long expectedCount, String expectedFacetCounts) { NameUsageSearchRequest searchRequest = prepareRequest(q, facet); if (facetFilter != null) { searchRequest.addParameter(facet, facetFilter); } return assertSearch(searchRequest, facet != null, expectedCount, expectedFacetCounts); } private NameUsageSearchRequest prepareRequest(String q, NameUsageSearchParameter facet) { // build request NameUsageSearchRequest searchRequest = new NameUsageSearchRequest(0L, 20); searchRequest.setQ(q); if (facet != null) { searchRequest.addFacets(facet); } return searchRequest; } private SearchResponse<NameUsageSearchResult, NameUsageSearchParameter> assertSearch(NameUsageSearchRequest searchRequest, boolean useFacets, Long expectedCount, String expectedFacetCounts) { // query SearchResponse<NameUsageSearchResult, NameUsageSearchParameter> response = wsClient.search(searchRequest); // assert if (expectedCount != null) { assertEquals(expectedCount, response.getCount()); } if (useFacets && expectedFacetCounts != null) { assertEquals(1, response.getFacets().size()); assertEquals(expectedFacetCounts, response.getFacets().get(0).getCounts().size()); } if (!useFacets) { Assert.assertTrue(response.getFacets().isEmpty()); } for (NameUsageSearchResult u : response.getResults()) { assertNotNull(u); assertEquals(NameUsageSearchResult.class, u.getClass()); } return response; } }