/** * The contents of this file are subject to the license and copyright * detailed in the LICENSE and NOTICE files at the root of the source * tree and available online at * * http://www.dspace.org/license/ */ package org.dspace.xoai.filter; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.StringUtils; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import org.apache.solr.client.solrj.util.ClientUtils; import org.dspace.xoai.data.DSpaceItem; import org.dspace.xoai.filter.data.DSpaceMetadataFilterOperator; import org.dspace.xoai.filter.results.SolrFilterResult; import com.google.common.base.Function; import com.lyncode.builder.ListBuilder; import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.ParameterList; import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.ParameterValue; import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.SimpleType; /** * @author Lyncode Development Team (dspace at lyncode dot com) */ public class DSpaceAtLeastOneMetadataFilter extends DSpaceFilter { private static final Logger log = LogManager.getLogger(DSpaceAtLeastOneMetadataFilter.class); private String field; private DSpaceMetadataFilterOperator operator = DSpaceMetadataFilterOperator.UNDEF; private List<String> values; private String getField() { if (field == null) { field = getConfiguration().get("field").asSimpleType().asString(); } return field; } private List<String> getValues() { if (values == null) { ParameterValue parameterValue = getConfiguration().get("value"); if (parameterValue == null) parameterValue = getConfiguration().get("values"); if (parameterValue instanceof SimpleType) { values = new ArrayList<>(); values.add(((SimpleType) parameterValue).asString()); } else if (parameterValue instanceof ParameterList) { values = new ListBuilder<ParameterValue>() .add(parameterValue.asParameterList().getValues()) .build(new Function<ParameterValue, String>() { @Override public String apply(ParameterValue elem) { return elem.asSimpleType().asString(); } }); } else values = new ArrayList<>(); } return values; } private DSpaceMetadataFilterOperator getOperator() { if (operator == DSpaceMetadataFilterOperator.UNDEF) operator = DSpaceMetadataFilterOperator.valueOf(getConfiguration() .get("operator").asSimpleType().asString().toUpperCase()); return operator; } @Override public boolean isShown(DSpaceItem item) { if (this.getField() == null) return true; List<String> values = item.getMetadata(this.getField()); for (String praticalValue : values) { for (String theoreticValue : this.getValues()) { switch (this.getOperator()) { case STARTS_WITH: if (praticalValue.startsWith(theoreticValue)) return true; break; case ENDS_WITH: if (praticalValue.endsWith(theoreticValue)) return true; break; case EQUAL: if (praticalValue.equals(theoreticValue)) return true; break; case GREATER: if (praticalValue.compareTo(theoreticValue) > 0) return true; break; case GREATER_OR_EQUAL: if (praticalValue.compareTo(theoreticValue) >= 0) return true; break; case LOWER: if (praticalValue.compareTo(theoreticValue) < 0) return true; break; case LOWER_OR_EQUAL: if (praticalValue.compareTo(theoreticValue) <= 0) return true; break; case CONTAINS: default: if (praticalValue.contains(theoreticValue)) return true; break; } } } return false; } @Override public SolrFilterResult buildSolrQuery() { String field = this.getField(); List<String> parts = new ArrayList<>(); if (this.getField() != null) { for (String v : this.getValues()) this.buildQuery("metadata." + field, ClientUtils.escapeQueryChars(v), parts); if (parts.size() > 0) { return new SolrFilterResult(StringUtils.join(parts.iterator(), " OR ")); } } return new SolrFilterResult(); } private void buildQuery(String field, String value, List<String> parts) { switch (this.getOperator()) { case ENDS_WITH: parts.add("(" + field + ":*" + value + ")"); break; case STARTS_WITH: parts.add("(" + field + ":" + value + "*)"); break; case EQUAL: parts.add("(" + field + ":" + value + ")"); break; case GREATER: parts.add("(" + field + ":[" + value + " TO *])"); break; case LOWER: parts.add("(" + field + ":[* TO " + value + "])"); break; case LOWER_OR_EQUAL: parts.add("(-(" + field + ":[" + value + " TO *]))"); break; case GREATER_OR_EQUAL: parts.add("(-(" + field + ":[* TO " + value + "]))"); break; case CONTAINS: default: parts.add("(" + field + ":*" + value + "*)"); break; } } }