diff --git a/src/main/java/org/genesys2/server/model/filters/BasicFilter.java b/src/main/java/org/genesys2/server/model/filters/BasicFilter.java index 977c6134664c7241aade721d97c230ca826ee606..26c418c65335ee060a228bac5bd85ce56e521b21 100644 --- a/src/main/java/org/genesys2/server/model/filters/BasicFilter.java +++ b/src/main/java/org/genesys2/server/model/filters/BasicFilter.java @@ -16,22 +16,37 @@ package org.genesys2.server.model.filters; - public class BasicFilter implements GenesysFilter { private final String name; private final DataType dataType; private FilterType filterType; private final Integer maxLength; + private boolean analyzed = false; + @Override public boolean isCore() { return true; } + /** + * Is the field analyzed by indexer? + */ + @Override + public boolean isAnalyzed() { + return this.analyzed; + }; + + public BasicFilter setAnalyzed(boolean analyzed) { + this.analyzed = analyzed; + return this; + } + public BasicFilter(String name, DataType type) { this.name = name; this.dataType = type; if (this.dataType == DataType.NUMERIC) { + this.analyzed = false; this.filterType = FilterType.RANGE; } else { this.filterType = FilterType.EXACT; @@ -62,14 +77,12 @@ public class BasicFilter implements GenesysFilter { return name; } - public String getName() { - return name; - } - + @Override public DataType getDataType() { return dataType; } + @Override public FilterType getFilterType() { return filterType; } diff --git a/src/main/java/org/genesys2/server/model/filters/GenesysFilter.java b/src/main/java/org/genesys2/server/model/filters/GenesysFilter.java index f304e6ded8c4cd4bf26fc009359dcb3f9a77b1dd..8e1d41f2997b4a965ead4262f43ddb8b5372d28a 100644 --- a/src/main/java/org/genesys2/server/model/filters/GenesysFilter.java +++ b/src/main/java/org/genesys2/server/model/filters/GenesysFilter.java @@ -16,15 +16,24 @@ package org.genesys2.server.model.filters; + public interface GenesysFilter { public String getKey(); public enum DataType { - FIXEDSTRING, STRING, NUMERIC, BOOLEAN + STRING, NUMERIC, BOOLEAN } public enum FilterType { EXACT, RANGE, LIST, AUTOCOMPLETE, I18NLIST } + + boolean isCore(); + + DataType getDataType(); + + FilterType getFilterType(); + + public boolean isAnalyzed(); } \ No newline at end of file diff --git a/src/main/java/org/genesys2/server/service/ElasticService.java b/src/main/java/org/genesys2/server/service/ElasticService.java index 6de4569d7b012c0937b7a78b7ad5fbb2c5485459..ec28a4dd9140106a813bd7dfffebbaa540a7c8f8 100644 --- a/src/main/java/org/genesys2/server/service/ElasticService.java +++ b/src/main/java/org/genesys2/server/service/ElasticService.java @@ -38,7 +38,7 @@ public interface ElasticService { void refreshIndex(String className); - Page filter(String jsonFilter, Pageable pageable) throws SearchException; + Page filter(AppliedFilters appliedFilters, Pageable pageable) throws SearchException; } diff --git a/src/main/java/org/genesys2/server/service/impl/ElasticsearchSearchServiceImpl.java b/src/main/java/org/genesys2/server/service/impl/ElasticsearchSearchServiceImpl.java index b48f09d62ac7f22128d8373dd9699473bb8985b9..59abf12fdc394bde93a9f183cb823c8e7ac3c681 100644 --- a/src/main/java/org/genesys2/server/service/impl/ElasticsearchSearchServiceImpl.java +++ b/src/main/java/org/genesys2/server/service/impl/ElasticsearchSearchServiceImpl.java @@ -1,6 +1,5 @@ package org.genesys2.server.service.impl; -import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -9,19 +8,31 @@ import java.util.List; import java.util.Map; import java.util.Set; -import org.apache.commons.lang3.StringUtils; import org.elasticsearch.index.query.AndFilterBuilder; import org.elasticsearch.index.query.FilterBuilders; import org.elasticsearch.index.query.OrFilterBuilder; -import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.sort.SortBuilder; +import org.elasticsearch.search.sort.SortBuilders; +import org.elasticsearch.search.sort.SortOrder; import org.genesys2.server.model.elastic.AccessionDetails; +import org.genesys2.server.model.filters.GenesysFilter; import org.genesys2.server.model.genesys.Accession; +import org.genesys2.server.model.impl.FaoInstitute; +import org.genesys2.server.model.impl.Organization; import org.genesys2.server.service.ElasticService; import org.genesys2.server.service.FilterConstants; import org.genesys2.server.service.GenesysFilterService; import org.genesys2.server.service.GenesysService; +import org.genesys2.server.service.OrganizationService; +import org.genesys2.server.service.impl.FilterHandler.AppliedFilter; import org.genesys2.server.service.impl.FilterHandler.AppliedFilters; +import org.genesys2.server.service.impl.FilterHandler.FilterValue; +import org.genesys2.server.service.impl.FilterHandler.LiteralValueFilter; +import org.genesys2.server.service.impl.FilterHandler.MaxValueFilter; +import org.genesys2.server.service.impl.FilterHandler.MinValueFilter; +import org.genesys2.server.service.impl.FilterHandler.StartsWithFilter; +import org.genesys2.server.service.impl.FilterHandler.ValueRangeFilter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; @@ -37,7 +48,6 @@ import org.springframework.stereotype.Service; import org.springframework.util.StopWatch; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; @Service public class ElasticsearchSearchServiceImpl implements ElasticService, InitializingBean { @@ -49,9 +59,15 @@ public class ElasticsearchSearchServiceImpl implements ElasticService, Initializ @Autowired private GenesysService genesysService; + @Autowired + private OrganizationService organizationService; + @Autowired private GenesysFilterService filterService; + @Autowired + private FilterHandler filterHandler; + @Autowired private ObjectMapper objectMapper; @@ -76,86 +92,134 @@ public class ElasticsearchSearchServiceImpl implements ElasticService, Initializ } @Override - public Page filter(String jsonFilter, Pageable pageable) throws SearchException { - Map> filters; - try { - filters = objectMapper.readValue(jsonFilter, Map.class); - } catch (IOException e) { - throw new SearchException(e.getMessage(), e); - } + public Page filter(AppliedFilters appliedFilters, Pageable pageable) throws SearchException { AndFilterBuilder filterBuilder = FilterBuilders.andFilter(); - for (String key : filters.keySet()) { + for (AppliedFilter appliedFilter : appliedFilters) { + + String key = appliedFilter.getFilterName(); + + GenesysFilter genesysFilter = filterHandler.getFilter(key); - List filterValues = filters.get(key); - if (filterValues == null || filterValues.isEmpty()) + if (genesysFilter == null) { + LOG.warn("No such filter " + key); continue; + } - System.err.println("key=" + key); - - if (FilterConstants.ACCENUMB.equals(key) || FilterConstants.COLLMISSID.equals(key)) { - // indexed field - filterBuilder.add(FilterBuilders.queryFilter(makeQuery(key, filterValues))); - } else if (FilterConstants.ALIAS.equals(key)) { - // Nested object - filterBuilder.add(FilterBuilders.nestedFilter("aliases", makeQuery("aliases.name", filterValues))); - } else if (FilterConstants.SGSV.equals(key)) { - // Check for existance nested object - OrFilterBuilder orFilter = FilterBuilders.orFilter(); - if (filterValues.contains(true)) { - // true: - orFilter.add(FilterBuilders.notFilter(FilterBuilders.missingFilter(FilterConstants.SGSV))); - } - if (filterValues.contains(false)) { - // false: - orFilter.add(FilterBuilders.missingFilter(FilterConstants.SGSV)); - } + // Filter-level OR + OrFilterBuilder orFilter = FilterBuilders.orFilter(); - if (filterValues.contains(true) || filterValues.contains(false)) - filterBuilder.add(orFilter); - } else if (FilterConstants.GEO_ELEVATION.equals(key) || FilterConstants.GEO_LONGITUDE.equals(key) || FilterConstants.GEO_LATITUDE.equals(key)) { - OrFilterBuilder orFilter = FilterBuilders.orFilter(); - // range filters - for (Object val : filterValues) { - System.err.println(val.getClass() + " " + val); - Map v = (Map) val; - List range = (List) v.get("range"); - Number max = (Number) v.get("max"); - Number min = (Number) v.get("min"); - if (range != null) { - System.err.println("Range " + range.getClass() + " " + range); - orFilter.add(FilterBuilders.rangeFilter(key).from(range.get(0)).to(range.get(1))); - } else if (max != null) { - System.err.println("Max " + max); - orFilter.add(FilterBuilders.rangeFilter(key).to(max)); - } else if (min != null) { - System.err.println("Min " + min); - orFilter.add(FilterBuilders.rangeFilter(key).from(min)); + // null + if (appliedFilter.getWithNull()) { + orFilter.add(FilterBuilders.missingFilter(key)); + } + + Set filterValues = appliedFilter.getValues(); + if (filterValues != null && !filterValues.isEmpty()) { + + { + // Handle literals + Set literals = new HashSet(); + for (FilterValue filterValue : filterValues) { + if (filterValue instanceof FilterHandler.LiteralValueFilter) { + FilterHandler.LiteralValueFilter literal = (LiteralValueFilter) filterValue; + literals.add(literal.getValue()); + } } - } - filterBuilder.add(orFilter); - - } else { - Set nonNull = new HashSet(filters.size()); - boolean hasNull = false; - for (Object val : filterValues) { - if (val != null) { - nonNull.add(val); - } else { - hasNull = true; + if (!literals.isEmpty()) { + + if (genesysFilter.isAnalyzed()) { + // query + StringBuilder sb = new StringBuilder(); + for (Object val : literals) { + if (sb.length() > 0) + sb.append(","); + if (val instanceof String) + sb.append("\"" + val + "\""); + else + sb.append(val); + } + + if (FilterConstants.ALIAS.equals(key)) { + // Nested + orFilter.add(FilterBuilders.nestedFilter("aliases", QueryBuilders.queryString("aliases.name" + ":(" + sb.toString() + ")"))); + } else if (FilterConstants.SGSV.equals(key)) { + // Check if exists + if (filterValues.contains(true)) { + // true: + orFilter.add(FilterBuilders.notFilter(FilterBuilders.missingFilter(FilterConstants.SGSV))); + } + if (filterValues.contains(false)) { + // false: + orFilter.add(FilterBuilders.missingFilter(FilterConstants.SGSV)); + } + } else { + orFilter.add(FilterBuilders.queryFilter(QueryBuilders.queryString(key + ":(" + sb.toString() + ")"))); + } + } else { + // terms + + if (FilterConstants.ORGANIZATION.equals(key)) { + Set instCodes = new HashSet(); + for (Object literal : literals) { + if (literal instanceof String) { + Organization organization = organizationService.getOrganization((String) literal); + if (organization != null) + for (FaoInstitute inst : organizationService.getMembers(organization)) { + instCodes.add(inst.getCode()); + } + } + } + if (!instCodes.isEmpty()) { + orFilter.add(FilterBuilders.termsFilter(FilterConstants.INSTCODE, instCodes).execution("or")); + } + } else { + orFilter.add(FilterBuilders.termsFilter(key, literals).execution("or")); + } + } } } - if (hasNull) { - filterBuilder.add(FilterBuilders.orFilter(FilterBuilders.missingFilter(key), FilterBuilders.termsFilter(key, nonNull).execution("or"))); - } else { - filterBuilder.add(FilterBuilders.termsFilter(key, filterValues).execution("or")); + + { + // Handle operations + for (FilterValue filterValue : filterValues) { + if (filterValue instanceof ValueRangeFilter) { + ValueRangeFilter range = (ValueRangeFilter) filterValue; + LOG.debug("Range " + range.getClass() + " " + range); + orFilter.add(FilterBuilders.rangeFilter(key).from(range.getFrom()).to(range.getTo())); + } else if (filterValue instanceof MaxValueFilter) { + MaxValueFilter max = (MaxValueFilter) filterValue; + LOG.debug("Max " + max); + orFilter.add(FilterBuilders.rangeFilter(key).to(max.getTo())); + } else if (filterValue instanceof MinValueFilter) { + MinValueFilter min = (MinValueFilter) filterValue; + LOG.debug("Min " + min); + orFilter.add(FilterBuilders.rangeFilter(key).from(min.getFrom())); + } else if (filterValue instanceof StartsWithFilter) { + StartsWithFilter startsWith = (StartsWithFilter) filterValue; + LOG.debug("startsWith " + startsWith); + if (genesysFilter.isAnalyzed()) { + if (FilterConstants.ALIAS.equals(key)) { + orFilter.add(FilterBuilders.nestedFilter("aliases", + QueryBuilders.queryString("aliases.name" + ":" + startsWith.getStartsWith() + "*"))); + } else { + orFilter.add(FilterBuilders.queryFilter(QueryBuilders.queryString(key + ":" + startsWith.getStartsWith() + "*"))); + } + } else { + orFilter.add(FilterBuilders.prefixFilter(key, startsWith.getStartsWith())); + } + } + } } } + + filterBuilder.add(orFilter); + } - SearchQuery searchQuery = new NativeSearchQueryBuilder().withFilter(filterBuilder).withPageable(pageable).build(); - // System.err.println("Filter query: " + searchQuery.toString()); + SortBuilder sortBuilder = SortBuilders.fieldSort("acceNumb").order(SortOrder.ASC); + SearchQuery searchQuery = new NativeSearchQueryBuilder().withFilter(filterBuilder).withSort(sortBuilder).withPageable(pageable).build(); try { Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, AccessionDetails.class); @@ -165,17 +229,6 @@ public class ElasticsearchSearchServiceImpl implements ElasticService, Initializ } } - private QueryBuilder makeQuery(String key, List list) { - // Indexed fields - StringBuilder sb = new StringBuilder(); - for (String val : list) { - if (sb.length() > 0) - sb.append(","); - sb.append("\"" + val + "\""); - } - return QueryBuilders.queryString(key + ":(" + sb.toString() + ")"); - } - @Override public void update(String className, long id) { if (!clazzMap.containsKey(className)) { @@ -343,10 +396,11 @@ public class ElasticsearchSearchServiceImpl implements ElasticService, Initializ LOG.info("Initializing index"); elasticsearchTemplate.createIndex("genesysarchive"); } - Map indexMapping = elasticsearchTemplate.getMapping(AccessionDetails.class); - for (Object key : indexMapping.keySet()) { - System.err.println("Mapping ke=" + key + " val=" + indexMapping.get(key)); - } + Map indexMapping = elasticsearchTemplate.getMapping(AccessionDetails.class); + // for (Object key : indexMapping.keySet()) { + // System.err.println("Mapping ke=" + key + " val=" + + // indexMapping.get(key)); + // } LOG.info("Copying mapping"); elasticsearchTemplate.putMapping("genesysarchive", "mcpd", indexMapping); } diff --git a/src/main/java/org/genesys2/server/service/impl/FilterHandler.java b/src/main/java/org/genesys2/server/service/impl/FilterHandler.java index d1719755824023b623c776fc7bc154b9c646866a..bb68cba7a1c88b599ceeff2e090e1e7b72a48841 100644 --- a/src/main/java/org/genesys2/server/service/impl/FilterHandler.java +++ b/src/main/java/org/genesys2/server/service/impl/FilterHandler.java @@ -27,6 +27,7 @@ import java.util.Set; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.Predicate; +import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -38,9 +39,6 @@ import org.genesys2.server.model.filters.GenesysFilter.DataType; import org.genesys2.server.model.filters.GenesysFilter.FilterType; import org.genesys2.server.model.filters.I18nListFilter; import org.genesys2.server.model.filters.MethodFilter; -import org.genesys2.server.model.filters.NoSuchFilterException; -import org.genesys2.server.model.filters.NoSuchFilterValueException; -import org.genesys2.server.model.filters.UnsupportedFilterOperation; import org.genesys2.server.model.filters.ValueName; import org.genesys2.server.model.genesys.Method; import org.genesys2.server.model.genesys.TraitCode; @@ -96,13 +94,13 @@ public class FilterHandler { this.availableFilters.add(new BasicFilter(FilterConstants.ORGANIZATION, DataType.STRING)); this.availableFilters.add(new AutocompleteFilter(FilterConstants.INSTCODE, "/explore/ac/instCode")); - this.availableFilters.add(new BasicFilter(FilterConstants.ACCENUMB, DataType.STRING, FilterType.RANGE)); - this.availableFilters.add(new BasicFilter(FilterConstants.ALIAS, DataType.STRING, FilterType.RANGE)); + this.availableFilters.add(new BasicFilter(FilterConstants.ACCENUMB, DataType.STRING, FilterType.RANGE).setAnalyzed(true)); + this.availableFilters.add(new BasicFilter(FilterConstants.ALIAS, DataType.STRING, FilterType.RANGE).setAnalyzed(true)); this.availableFilters.add(new BasicFilter(FilterConstants.SGSV, DataType.BOOLEAN)); this.availableFilters.add(new BasicFilter(FilterConstants.MLSSTATUS, DataType.BOOLEAN)); this.availableFilters.add(new BasicFilter(FilterConstants.ART15, DataType.BOOLEAN)); this.availableFilters.add(new BasicFilter(FilterConstants.AVAILABLE, DataType.BOOLEAN)); - this.availableFilters.add(new BasicFilter(FilterConstants.COLLMISSID, DataType.STRING)); + this.availableFilters.add(new BasicFilter(FilterConstants.COLLMISSID, DataType.STRING).setAnalyzed(true)); this.availableFilters.add(new I18nListFilter(FilterConstants.STORAGE, DataType.NUMERIC).build("accession.storage", new Integer[] { 10, 11, 12, 13, 20, 30, 40, 50, 99 })); } @@ -111,37 +109,39 @@ public class FilterHandler { return Collections.unmodifiableList(this.availableFilters); } + public GenesysFilter getFilter(String key) { + if (key.startsWith("gm:")) { + return getMethodFilter(key); + } + + for (GenesysFilter f : this.availableFilters) { + if (f.getKey().equals(key)) + return f; + } + + return null; + } + public List selectFilters(String[] selectedFilters) { LOG.debug("Loading filter definitions sel=" + ArrayUtils.toString(selectedFilters)); final List filters = new ArrayList(); for (final String selectedFilter : selectedFilters) { - if (selectedFilter.startsWith("gm:")) { - try { - final GenesysFilter methodFilter = getMethodFilter(Long.parseLong(selectedFilter.substring(3))); - if (methodFilter != null) { - filters.add(methodFilter); - } - } catch (NumberFormatException | NullPointerException e) { - LOG.warn(e); - } - } else { - final GenesysFilter coreFilter = CollectionUtils.find(this.availableFilters, new Predicate() { - @Override - public boolean evaluate(GenesysFilter object) { - return object.getKey().equals(selectedFilter); - } - }); - if (coreFilter != null) { - filters.add(coreFilter); + try { + final GenesysFilter filter = getFilter(selectedFilter); + if (filter != null) { + filters.add(filter); } + } catch (NumberFormatException | NullPointerException e) { + LOG.warn(e); } } return filters; } - GenesysFilter getMethodFilter(long methodId) { + GenesysFilter getMethodFilter(String methodFilterName) { + long methodId = Long.parseLong(methodFilterName.substring(3)); final Method method = traitService.getMethod(methodId); return method == null ? null : toFilter(method); } @@ -172,75 +172,6 @@ public class FilterHandler { return filter; } - public List fromJSON(String jsonFilter) throws IOException, NoSuchFilterException, UnsupportedFilterOperation, NoSuchFilterValueException { - @SuppressWarnings("unchecked") - Map> filters = objectMapper.readValue(jsonFilter, Map.class); - AppliedFilters appliedFilters = new AppliedFilters(); - - for (String key : filters.keySet()) { - - List filterValues = filters.get(key); - if (filterValues == null || filterValues.isEmpty()) - continue; - - LOG.info("key=" + key); - - AppliedFilter appliedFilter = new AppliedFilter(); - appliedFilter.setFilter(getFilterByName(key)); - for (Object filterValue : filterValues) { - appliedFilter.addFilterValue(toFilterValue(filterValue)); - } - } - - return appliedFilters; - } - - private FilterValue toFilterValue(Object filterValue) throws UnsupportedFilterOperation, NoSuchFilterValueException { - if (filterValue == null) - return null; - - if (filterValue instanceof Map) { - return toFilterOperation((Map) filterValue); - } else if (filterValue instanceof Number || filterValue instanceof String) { - return new LiteralValueFilter(filterValue); - } else { - throw new NoSuchFilterValueException(filterValue); - } - } - - private FilterValue toFilterOperation(Map filterValue) throws UnsupportedFilterOperation { - @SuppressWarnings("unchecked") - List range = (List) filterValue.get("range"); - - if (range != null) { - return new ValueRangeFilter(range.get(0), range.get(1)); - } - Number max = (Number) filterValue.get("max"); - if (max != null) { - return new MaxValueFilter(max); - } - Number min = (Number) filterValue.get("min"); - if (min != null) { - return new MinValueFilter(min); - } - - String like = (String) filterValue.get("like"); - if (like != null) { - return new StartsWithFilter(like); - } - - throw new UnsupportedFilterOperation(filterValue.toString()); - } - - private GenesysFilter getFilterByName(String key) throws NoSuchFilterException { - for (GenesysFilter filter : this.availableFilters) { - if (filter.getKey().equals(key)) { - return filter; - } - } - throw new NoSuchFilterException(key); - } - public static interface FilterValue { String getType(); } @@ -316,7 +247,11 @@ public class FilterHandler { jp.nextToken(); String op = jp.getCurrentName(); if ("like".equals(op)) { - af.addFilterValue(new StartsWithFilter(jp.nextTextValue())); + String startsWith = jp.nextTextValue(); + if (startsWith == null || StringUtils.isBlank(startsWith)) + throw new JsonParseException("StartsWithFilter expects a non-blank string", jp.getCurrentLocation()); + + af.addFilterValue(new StartsWithFilter(startsWith)); } else if ("min".equals(op)) { Number number1 = null; jp.nextToken(); @@ -436,6 +371,7 @@ public class FilterHandler { * @param class1 * @return */ + @SuppressWarnings("unchecked") public T getFirstLiteralValue(String filterName, Class clazz) { AppliedFilter af = get(filterName); if (af != null) { @@ -453,15 +389,10 @@ public class FilterHandler { public static class AppliedFilter { - private GenesysFilter filter; private Set values = new HashSet(); private boolean withNull = false; private String filterName; - public void setFilter(GenesysFilter filter) { - this.filter = filter; - } - public String getFilterName() { return this.filterName; } @@ -481,10 +412,6 @@ public class FilterHandler { return this; } - public GenesysFilter getFilter() { - return filter; - } - public boolean getWithNull() { return this.withNull; } diff --git a/src/main/java/org/genesys2/server/servlet/controller/ExplorerController.java b/src/main/java/org/genesys2/server/servlet/controller/ExplorerController.java index c34abe3e24407a7a99994122732b0576528308ee..c94d030bfd8539f7c0b6188dd48d236dcbf1967a 100644 --- a/src/main/java/org/genesys2/server/servlet/controller/ExplorerController.java +++ b/src/main/java/org/genesys2/server/servlet/controller/ExplorerController.java @@ -30,6 +30,7 @@ import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.ArrayUtils; +import org.genesys2.server.model.elastic.AccessionDetails; import org.genesys2.server.model.filters.GenesysFilter; import org.genesys2.server.model.genesys.Accession; import org.genesys2.server.model.genesys.Method; @@ -37,6 +38,7 @@ import org.genesys2.server.model.genesys.Parameter; import org.genesys2.server.model.genesys.ParameterCategory; import org.genesys2.server.model.impl.Crop; import org.genesys2.server.service.CropService; +import org.genesys2.server.service.ElasticService; import org.genesys2.server.service.FilterConstants; import org.genesys2.server.service.GenesysFilterService; import org.genesys2.server.service.GenesysService; @@ -48,6 +50,7 @@ import org.genesys2.server.service.impl.FilterHandler; import org.genesys2.server.service.impl.FilterHandler.AppliedFilter; import org.genesys2.server.service.impl.FilterHandler.AppliedFilters; import org.genesys2.server.service.impl.GenesysFilterServiceImpl.LabelValue; +import org.genesys2.server.service.impl.SearchException; import org.genesys2.spring.ResourceNotFoundException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; @@ -62,7 +65,6 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; -import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.jhlabs.image.MapColorsFilter; @@ -71,6 +73,9 @@ public class ExplorerController extends BaseController { @Autowired private GenesysFilterService filterService; + + @Autowired + private ElasticService elasticService; @Autowired private CropService cropService; @@ -181,6 +186,66 @@ public class ExplorerController extends BaseController { return "/accession/explore"; } + + /** + * Browse all using Elasticsearch + * + * @param model + * @param page + * @return + * @throws IOException + * @throws SearchException + */ + @RequestMapping("/explore-es") + public String viewElasticFiltered(ModelMap model, @RequestParam(value = "page", required = false, defaultValue = "1") int page, + @RequestParam(value = "filter", required = true, defaultValue = "{}") String jsonFilter) throws IOException, SearchException { + + String[] selectedFilters = null; + + _logger.debug("Filtering by: " + jsonFilter); + AppliedFilters appliedFilters = mapper.readValue(jsonFilter, AppliedFilters.class); + + Crop crop = null; + { + String shortName = appliedFilters.getFirstLiteralValue(FilterConstants.CROPS, String.class); + if (shortName != null) + crop = cropService.getCrop((String) shortName); + + if (crop != null) { + // Keep only one crop + AppliedFilter af = appliedFilters.get(FilterConstants.CROPS); + af.getValues().clear(); + af.addFilterValue(new FilterHandler.LiteralValueFilter(crop.getShortName())); + } + } + model.addAttribute("crop", crop); + + + // JSP works with JsonObject + final Map> filters = mapper.readValue(appliedFilters.toString(), Map.class); + model.addAttribute("filters", filters); + + + selectedFilters = appliedFilters.getFilterNames(); + final List currentFilters = filterHandler.selectFilters(selectedFilters); + final List availableFilters = filterHandler.listAvailableFilters(); + + _logger.info(appliedFilters.toString()); + model.addAttribute("jsonFilter", appliedFilters.toString()); + + final Page accessions = elasticService.filter(appliedFilters, new PageRequest(page - 1, 50, new Sort("acceNumb"))); + + _logger.info("Got: " + accessions); + + model.addAttribute("crops", cropService.list(getLocale())); + model.addAttribute("pagedData", accessions); + model.addAttribute("currentFilters", currentFilters); + model.addAttribute("availableFilters", availableFilters); + + return "/accession/explore-es"; + } + + @RequestMapping(value = "/additional-filter", method = RequestMethod.GET) public String getAdditionalFilters(ModelMap model, @RequestParam(value = "filter", required = true, defaultValue = "") String[] selectedFilters) throws IOException { diff --git a/src/main/webapp/WEB-INF/jsp/accession/explore-es.jsp b/src/main/webapp/WEB-INF/jsp/accession/explore-es.jsp new file mode 100644 index 0000000000000000000000000000000000000000..2166617ba5b6bb40936f9e57e54e2a1caedc789b --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/accession/explore-es.jsp @@ -0,0 +1,422 @@ + + +<%@include file="/WEB-INF/jsp/init.jsp"%> + + + +<spring:message code="accession.page.data.title" /> + + +

+ +

+ <%--Dropdown filters--%> +
+ + +
+ + <%--Filters--%> +
+ +
+ + + + + + + <%--Accessions--%> + + + + + + + + + + <%-- + --%> + + + + + + + + + <%-- --%> + + <%-- --%> + + + + <%-- + --%> + + + +
+
${status.count + pagedData.size * pagedData.number}">">">">">
+ + + + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/accession/explore.jsp b/src/main/webapp/WEB-INF/jsp/accession/explore.jsp index dcf7efb6bca4a28af8103599e202c9cc00569e0e..4aefabf1045826a963dfefefaf03d9d4b68a72c4 100644 --- a/src/main/webapp/WEB-INF/jsp/accession/explore.jsp +++ b/src/main/webapp/WEB-INF/jsp/accession/explore.jsp @@ -377,13 +377,13 @@ }); $("body").on("click", ".apply", function () { - GenesysFilterUtil.submitJson(jsonData); + GenesysFilterUtil.submitJson('/explore', jsonData); }); $("body").on("click", ".remove-filter", function () { var key = $(this).parents(".filter-block").attr("i-key"); delete jsonData[key]; - GenesysFilterUtil.submitJson(jsonData); + GenesysFilterUtil.submitJson('/explore', jsonData); }); $("body").on("click", ".edit-fil", function () { @@ -407,7 +407,7 @@ GenesysFilterUtil.removeValue(value, key, jsonData); if (! $(this).parents(".filter-block").hasClass("filter-edit")) { - GenesysFilterUtil.submitJson(jsonData); + GenesysFilterUtil.submitJson('/explore', jsonData); } $(this).remove(); diff --git a/src/main/webapp/html/js/crophub.js b/src/main/webapp/html/js/crophub.js index 0e5f2db7366a3979291f736eeff58cc67657b1b4..45d696acb1fc2250dba58062c5a21df7f022c198 100644 --- a/src/main/webapp/html/js/crophub.js +++ b/src/main/webapp/html/js/crophub.js @@ -373,9 +373,9 @@ GenesysFilterUtil = { return str.substr(0, index) + chr + str.substr(index + 1); }, //form 'get' request - submitJson: function (jsonData) { + submitJson: function (url, jsonData) { var filter = JSON.stringify(jsonData); - var url = '/explore?filter=' + filter; + var url = url + '?filter=' + filter; window.location.href = encodeURI(url); }, diff --git a/src/test/java/org/genesys2/server/service/impl/ElasticsearchTest.java b/src/test/java/org/genesys2/server/service/impl/ElasticsearchTest.java index 91216f86c44842d5a0e488116e5c5b2be9019e07..a21b854e22ea0bf50292cf2cd0cff9f48329a403 100644 --- a/src/test/java/org/genesys2/server/service/impl/ElasticsearchTest.java +++ b/src/test/java/org/genesys2/server/service/impl/ElasticsearchTest.java @@ -16,13 +16,19 @@ package org.genesys2.server.service.impl; +import static org.junit.Assert.assertTrue; + import java.io.IOException; +import java.util.HashSet; +import java.util.Set; import org.apache.log4j.Logger; import org.apache.velocity.app.VelocityEngine; import org.apache.velocity.exception.VelocityException; import org.genesys2.server.aspect.AsAdminAspect; import org.genesys2.server.model.elastic.AccessionDetails; +import org.genesys2.server.model.impl.FaoInstitute; +import org.genesys2.server.model.impl.Organization; import org.genesys2.server.service.AclService; import org.genesys2.server.service.ContentService; import org.genesys2.server.service.CropService; @@ -35,11 +41,15 @@ import org.genesys2.server.service.HtmlSanitizer; import org.genesys2.server.service.InstituteService; import org.genesys2.server.service.OrganizationService; import org.genesys2.server.service.TaxonomyService; +import org.genesys2.server.service.TraitService; import org.genesys2.server.service.UserService; +import org.genesys2.server.service.impl.FilterHandler.AppliedFilter; +import org.genesys2.server.service.impl.FilterHandler.AppliedFilters; import org.genesys2.server.test.JpaDataConfig; import org.genesys2.server.test.PropertyPlacholderInitializer; import org.genesys2.spring.config.ElasticsearchConfig; import org.genesys2.spring.config.HazelcastConfig; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -57,9 +67,6 @@ import org.springframework.ui.velocity.VelocityEngineFactoryBean; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.NullNode; -import com.fasterxml.jackson.databind.node.ObjectNode; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = ElasticsearchTest.Config.class, initializers = PropertyPlacholderInitializer.class) @@ -71,6 +78,11 @@ public class ElasticsearchTest { @ComponentScan(basePackages = { "org.genesys2.server.persistence.domain" }) public static class Config { + @Bean + public FilterHandler filterHadler() { + return new FilterHandler(); + } + @Bean public ElasticService searchService() { return new ElasticsearchSearchServiceImpl(); @@ -151,6 +163,11 @@ public class ElasticsearchTest { public GenesysFilterService genesysFilterService() { return new GenesysFilterServiceImpl(); } + + @Bean + private TraitService traitService() { + return new TraitServiceImpl(); + } } @Autowired @@ -159,39 +176,42 @@ public class ElasticsearchTest { @Autowired private ElasticService elasticService; + @Autowired + private OrganizationService organizationService; + @Test public void testzz() throws JsonProcessingException, SearchException { Page a = elasticService.search("+acceNumb='PI 584950' +orgCty.iso3='THA' +taxonomy.genus=Vigna", new PageRequest(0, 10)); - LOG.info("Size: " + a.getNumberOfElements()); + LOG.info("Size: " + a.getNumberOfElements() + " total=" + a.getTotalElements()); for (AccessionDetails aa : a.getContent()) { - LOG.info(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(aa)); + LOG.info(mapper.writeValueAsString(aa)); } } @Test public void testInstituteCode() throws JsonProcessingException, SearchException { - ObjectNode jsonFilter = mapper.createObjectNode(); - ArrayNode arr = jsonFilter.putArray(FilterConstants.INSTCODE); - arr.add("NGA039"); + AppliedFilters filters = new AppliedFilters(); + filters.add(new AppliedFilter().setFilterName(FilterConstants.INSTCODE).addFilterValue(new FilterHandler.LiteralValueFilter("NGA039"))); - Page a = elasticService.filter(jsonFilter.toString(), new PageRequest(0, 100)); - LOG.info("Size: " + a.getNumberOfElements()); + LOG.info(filters); + Page a = elasticService.filter(filters, new PageRequest(0, 100)); + LOG.info("Size: " + a.getNumberOfElements() + " total=" + a.getTotalElements()); for (AccessionDetails aa : a.getContent()) { - // LOG.info(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(aa)); + assertTrue("NGA039".equals(aa.getInstitute().getCode())); LOG.info(mapper.writeValueAsString(aa)); } } @Test public void testGenus() throws JsonProcessingException, SearchException { - ObjectNode jsonFilter = mapper.createObjectNode(); - ArrayNode arr = jsonFilter.putArray(FilterConstants.TAXONOMY_GENUS); - arr.add("Vigna"); + AppliedFilters filters = new AppliedFilters(); + filters.add(new AppliedFilter().setFilterName(FilterConstants.TAXONOMY_GENUS).addFilterValue(new FilterHandler.LiteralValueFilter("Vigna"))); - Page a = elasticService.filter(jsonFilter.toString(), new PageRequest(0, 100)); - LOG.info("Size: " + a.getNumberOfElements()); + LOG.info(filters); + Page a = elasticService.filter(filters, new PageRequest(0, 100)); + LOG.info("Size: " + a.getNumberOfElements() + " total=" + a.getTotalElements()); for (AccessionDetails aa : a.getContent()) { - // LOG.info(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(aa)); + assertTrue("Vigna".equals(aa.getTaxonomy().getGenus())); LOG.info(mapper.writeValueAsString(aa)); } @@ -199,16 +219,16 @@ public class ElasticsearchTest { @Test public void testGenusAndSpecies() throws JsonProcessingException, SearchException { - ObjectNode jsonFilter = mapper.createObjectNode(); - ArrayNode arr = jsonFilter.putArray(FilterConstants.TAXONOMY_GENUS); - arr.add("Vigna"); - arr = jsonFilter.putArray(FilterConstants.TAXONOMY_SPECIES); - arr.add("unguiculata"); - - Page a = elasticService.filter(jsonFilter.toString(), new PageRequest(0, 100)); - LOG.info("Size: " + a.getNumberOfElements()); + AppliedFilters filters = new AppliedFilters(); + filters.add(new AppliedFilter().setFilterName(FilterConstants.TAXONOMY_GENUS).addFilterValue(new FilterHandler.LiteralValueFilter("Vigna"))); + filters.add(new AppliedFilter().setFilterName(FilterConstants.TAXONOMY_SPECIES).addFilterValue(new FilterHandler.LiteralValueFilter("unguiculata"))); + + LOG.info(filters); + Page a = elasticService.filter(filters, new PageRequest(0, 100)); + LOG.info("Size: " + a.getNumberOfElements() + " total=" + a.getTotalElements()); for (AccessionDetails aa : a.getContent()) { - // LOG.info(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(aa)); + assertTrue("Vigna".equals(aa.getTaxonomy().getGenus())); + assertTrue("unguiculata".equals(aa.getTaxonomy().getSpecies())); LOG.info(mapper.writeValueAsString(aa)); } @@ -216,139 +236,142 @@ public class ElasticsearchTest { @Test public void testAcceNumb() throws JsonProcessingException, SearchException { - ObjectNode jsonFilter = mapper.createObjectNode(); - ArrayNode arr = jsonFilter.putArray(FilterConstants.ACCENUMB); - arr.add("TVu-7268"); + AppliedFilters filters = new AppliedFilters(); + filters.add(new AppliedFilter().setFilterName(FilterConstants.ACCENUMB).addFilterValue(new FilterHandler.LiteralValueFilter("TVu-7268"))); - Page a = elasticService.filter(jsonFilter.toString(), new PageRequest(0, 100)); - LOG.info("Size: " + a.getNumberOfElements()); + LOG.info(filters); + Page a = elasticService.filter(filters, new PageRequest(0, 100)); + LOG.info("Size: " + a.getNumberOfElements() + " total=" + a.getTotalElements()); for (AccessionDetails aa : a.getContent()) { - // LOG.info(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(aa)); + assertTrue("TVu-7268".equals(aa.getAcceNumb())); + LOG.info(mapper.writeValueAsString(aa)); + } + } + + @Test + public void testAcceNumbStarts() throws JsonProcessingException, SearchException { + AppliedFilters filters = new AppliedFilters(); + filters.add(new AppliedFilter().setFilterName(FilterConstants.ACCENUMB).addFilterValue(new FilterHandler.StartsWithFilter("ITC05"))); + + LOG.info(filters); + Page a = elasticService.filter(filters, new PageRequest(0, 100)); + LOG.info("Size: " + a.getNumberOfElements() + " total=" + a.getTotalElements()); + for (AccessionDetails aa : a.getContent()) { + assertTrue(aa.getAcceNumb().startsWith("ITC05")); LOG.info(mapper.writeValueAsString(aa)); } } @Test public void testAccenumb() throws JsonProcessingException, SearchException { - ObjectNode jsonFilter = mapper.createObjectNode(); - // ACCENUMB is analyzed (not a term) - ArrayNode arr = jsonFilter.putArray(FilterConstants.ACCENUMB); - arr.add("VI039981"); - arr.add("VI039982"); - // ALIAS is analyzed (not a term) - // arr = jsonFilter.putArray(FilterConstants.ALIAS); - // arr.add("TOT0956"); - - Page a = elasticService.filter(jsonFilter.toString(), new PageRequest(0, 100)); - LOG.info("Size: " + a.getNumberOfElements()); + AppliedFilters filters = new AppliedFilters(); + filters.add(new AppliedFilter().setFilterName(FilterConstants.ACCENUMB).addFilterValue(new FilterHandler.LiteralValueFilter("VI039981")) + .addFilterValue(new FilterHandler.LiteralValueFilter("VI039982"))); + + LOG.info(filters); + Page a = elasticService.filter(filters, new PageRequest(0, 100)); + LOG.info("Size: " + a.getNumberOfElements() + " total=" + a.getTotalElements()); for (AccessionDetails aa : a.getContent()) { - // LOG.info(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(aa)); LOG.info(mapper.writeValueAsString(aa)); } } @Test public void testAliases() throws JsonProcessingException, SearchException { - ObjectNode jsonFilter = mapper.createObjectNode(); - // ACCENUMB is analyzed (not a term) - ArrayNode arr = jsonFilter.putArray(FilterConstants.ACCENUMB); - arr.add("VI039981"); - arr.add("VI039982"); // should not be found! - // ALIAS is analyzed (not a term) - arr = jsonFilter.putArray(FilterConstants.ALIAS); - arr.add("TOT0956"); - - Page a = elasticService.filter(jsonFilter.toString(), new PageRequest(0, 100)); - LOG.info("Size: " + a.getNumberOfElements()); + AppliedFilters filters = new AppliedFilters(); + filters.add(new AppliedFilter().setFilterName(FilterConstants.ACCENUMB).addFilterValue(new FilterHandler.LiteralValueFilter("VI039981")) + .addFilterValue(new FilterHandler.LiteralValueFilter("VI039982"))); + filters.add(new AppliedFilter().setFilterName(FilterConstants.ALIAS).addFilterValue(new FilterHandler.LiteralValueFilter("TOT0956"))); + + LOG.info(filters); + Page a = elasticService.filter(filters, new PageRequest(0, 100)); + LOG.info("Size: " + a.getNumberOfElements() + " total=" + a.getTotalElements()); for (AccessionDetails aa : a.getContent()) { - // LOG.info(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(aa)); LOG.info(mapper.writeValueAsString(aa)); } } @Test public void testSampStat() throws JsonProcessingException, SearchException { - ObjectNode jsonFilter = mapper.createObjectNode(); - // ACCENUMB is analyzed (not a term) - ArrayNode arr = jsonFilter.putArray(FilterConstants.SAMPSTAT); - arr.add(110); - arr.add(120); - - Page a = elasticService.filter(jsonFilter.toString(), new PageRequest(0, 100)); - LOG.info("Size: " + a.getNumberOfElements()); + AppliedFilters filters = new AppliedFilters(); + filters.add(new AppliedFilter().setFilterName(FilterConstants.SAMPSTAT).addFilterValue(new FilterHandler.LiteralValueFilter(110)) + .addFilterValue(new FilterHandler.LiteralValueFilter(120))); + + LOG.info(filters); + Page a = elasticService.filter(filters, new PageRequest(0, 100)); + LOG.info("Size: " + a.getNumberOfElements() + " total=" + a.getTotalElements()); for (AccessionDetails aa : a.getContent()) { - // LOG.info(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(aa)); + assertTrue(aa.getSampStat() == 110 || aa.getSampStat() == 120); LOG.info(mapper.writeValueAsString(aa)); } } @Test public void testStorage() throws JsonProcessingException, SearchException { - ObjectNode jsonFilter = mapper.createObjectNode(); - // ACCENUMB is analyzed (not a term) - ArrayNode arr = jsonFilter.putArray(FilterConstants.STORAGE); - arr.add(30); - arr.add(40); - - Page a = elasticService.filter(jsonFilter.toString(), new PageRequest(0, 100)); - LOG.info("Size: " + a.getNumberOfElements()); + AppliedFilters filters = new AppliedFilters(); + filters.add(new AppliedFilter().setFilterName(FilterConstants.STORAGE).addFilterValue(new FilterHandler.LiteralValueFilter(30)) + .addFilterValue(new FilterHandler.LiteralValueFilter(40))); + + LOG.info(filters); + Page a = elasticService.filter(filters, new PageRequest(0, 100)); + LOG.info("Size: " + a.getNumberOfElements() + " total=" + a.getTotalElements()); for (AccessionDetails aa : a.getContent()) { - // LOG.info(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(aa)); + assertTrue(aa.getStorage().contains(40) || aa.getStorage().contains(30)); LOG.info(mapper.writeValueAsString(aa)); } } @Test public void testAvailable() throws JsonProcessingException, SearchException { - ObjectNode jsonFilter = mapper.createObjectNode(); - // ACCENUMB is analyzed (not a term) - ArrayNode arr = jsonFilter.putArray(FilterConstants.AVAILABLE); - arr.add(NullNode.getInstance()); - arr.add(true); + AppliedFilters filters = new AppliedFilters(); + filters.add(new AppliedFilter().setFilterName(FilterConstants.AVAILABLE).addFilterValue(new FilterHandler.LiteralValueFilter(true)) + .addFilterValue(null)); - Page a = elasticService.filter(jsonFilter.toString(), new PageRequest(0, 100)); + LOG.info(filters); + Page a = elasticService.filter(filters, new PageRequest(0, 100)); LOG.info("Size: " + a.getNumberOfElements() + " total=" + a.getTotalElements()); for (AccessionDetails aa : a.getContent()) { - // LOG.info(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(aa)); + assertTrue(aa.getAvailable() == null || aa.getAvailable() == Boolean.TRUE); LOG.info(mapper.writeValueAsString(aa)); } } @Test public void testCollMissId() throws JsonProcessingException, SearchException { - ObjectNode jsonFilter = mapper.createObjectNode(); - // ACCENUMB is analyzed (not a term) - ArrayNode arr = jsonFilter.putArray(FilterConstants.COLLMISSID); - arr.add("SDC-CLVNET GERMPLASM COLLECTING PROJECT"); + AppliedFilters filters = new AppliedFilters(); + filters.add(new AppliedFilter().setFilterName(FilterConstants.COLLMISSID).addFilterValue( + new FilterHandler.LiteralValueFilter("SDC-CLVNET GERMPLASM COLLECTING PROJECT"))); - Page a = elasticService.filter(jsonFilter.toString(), new PageRequest(0, 100)); + LOG.info(filters); + Page a = elasticService.filter(filters, new PageRequest(0, 100)); LOG.info("Size: " + a.getNumberOfElements() + " total=" + a.getTotalElements()); for (AccessionDetails aa : a.getContent()) { - // LOG.info(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(aa)); + assertTrue(aa.getColl().collMissId.equals("SDC-CLVNET GERMPLASM COLLECTING PROJECT")); LOG.info(mapper.writeValueAsString(aa)); } } @Test public void testSgsv() throws JsonProcessingException, SearchException { - ObjectNode jsonFilter = mapper.createObjectNode(); - // ACCENUMB is analyzed (not a term) - ArrayNode arr = jsonFilter.putArray(FilterConstants.SGSV); - arr.add(true); + AppliedFilters filters = new AppliedFilters(); + filters.add(new AppliedFilter().setFilterName(FilterConstants.SGSV).addFilterValue(new FilterHandler.LiteralValueFilter(true))); - Page a = elasticService.filter(jsonFilter.toString(), new PageRequest(0, 100)); + LOG.info(filters); + Page a = elasticService.filter(filters, new PageRequest(0, 100)); LOG.info("Size: " + a.getNumberOfElements() + " total=" + a.getTotalElements()); for (AccessionDetails aa : a.getContent()) { - // LOG.info(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(aa)); + assertTrue(aa.getSgsv() != null); LOG.info(mapper.writeValueAsString(aa)); } - arr.removeAll(); - arr.add(false); - a = elasticService.filter(jsonFilter.toString(), new PageRequest(0, 100)); + filters = new AppliedFilters(); + filters.add(new AppliedFilter().setFilterName(FilterConstants.SGSV).addFilterValue(new FilterHandler.LiteralValueFilter(false))); + + LOG.info(filters); + a = elasticService.filter(filters, new PageRequest(0, 100)); LOG.info("Size: " + a.getNumberOfElements() + " total=" + a.getTotalElements()); for (AccessionDetails aa : a.getContent()) { - // LOG.info(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(aa)); + assertTrue(aa.getSgsv() == null); LOG.info(mapper.writeValueAsString(aa)); } } @@ -356,8 +379,11 @@ public class ElasticsearchTest { @Test public void testGeo() throws JsonProcessingException, IOException, SearchException { // {"sgsv":[],"sampStat":[],"geo.latitude":[{"range":[-20,30]}]} - ObjectNode jsonFilter = (ObjectNode) mapper.readTree("{\"sgsv\":[],\"sampStat\":[],\"geo.latitude\":[{\"range\":[-20,30]},{\"max\":-50.1}]}"); - Page a = elasticService.filter(jsonFilter.toString(), new PageRequest(0, 100)); + AppliedFilters filters = mapper + .readValue("{\"sgsv\":[],\"sampStat\":[],\"geo.latitude\":[{\"range\":[-20,30]},{\"max\":-50.1}]}", AppliedFilters.class); + + LOG.info(filters); + Page a = elasticService.filter(filters, new PageRequest(0, 100)); LOG.info("Size: " + a.getNumberOfElements() + " total=" + a.getTotalElements()); for (AccessionDetails aa : a.getContent()) { // LOG.info(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(aa)); @@ -365,4 +391,26 @@ public class ElasticsearchTest { } } + @Ignore("We don't have organizations in the hsql db") + @Test + public void testOrganization() throws JsonProcessingException, SearchException { + AppliedFilters filters = new AppliedFilters(); + filters.add(new AppliedFilter().setFilterName(FilterConstants.ORGANIZATION).addFilterValue(new FilterHandler.LiteralValueFilter("EURISCO"))); + + Set organizationInst = new HashSet(); + Organization org = organizationService.getOrganization("EURISCO"); + if (org != null) + for (FaoInstitute institue : organizationService.getMembers(org)) { + organizationInst.add(institue.getCode()); + } + + LOG.info(filters); + Page a = elasticService.filter(filters, new PageRequest(0, 100)); + LOG.info("Size: " + a.getNumberOfElements() + " total=" + a.getTotalElements()); + for (AccessionDetails aa : a.getContent()) { + assertTrue(organizationInst.contains(aa.getInstitute().getCode())); + LOG.info(mapper.writeValueAsString(aa)); + } + } + }