/** * 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.tests.unit.services.impl.solr; import com.lyncode.xoai.dataprovider.data.Filter; import com.lyncode.xoai.dataprovider.filter.Scope; import com.lyncode.xoai.dataprovider.filter.ScopedFilter; import com.lyncode.xoai.dataprovider.filter.conditions.AndCondition; import com.lyncode.xoai.dataprovider.filter.conditions.Condition; import com.lyncode.xoai.dataprovider.filter.conditions.CustomCondition; import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.ParameterList; import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.ParameterMap; import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.StringValue; import org.dspace.xoai.filter.DSpaceMetadataExistsFilter; import org.dspace.xoai.filter.DSpaceSetSpecFilter; import org.dspace.xoai.filter.DateFromFilter; import org.dspace.xoai.filter.DateUntilFilter; import org.dspace.xoai.services.impl.solr.DSpaceSolrQueryResolver; import org.dspace.xoai.tests.unit.services.impl.AbstractQueryResolverTest; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.util.ArrayList; import java.util.Date; import java.util.List; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; public class DSpaceSolrQueryResolverTest extends AbstractQueryResolverTest { private static final Date DATE = new Date(); private static final String SET = "col_testSet"; private static final String FIELD_1 = "dc.title"; private static final String FIELD_2 = "dc.type"; private DSpaceSolrQueryResolver underTest = new DSpaceSolrQueryResolver();; @Before public void autowire () { autowire(underTest); } @After public void cleanup() { underTest = null; } @Test public void fromFilterQuery() throws Exception { List<ScopedFilter> scopedFilters = new ArrayList<ScopedFilter>(); scopedFilters.add(new ScopedFilter(new Condition() { @Override public Filter getFilter() { return new DateFromFilter(DATE); } }, Scope.Query)); String result = underTest.buildQuery(scopedFilters); assertThat(result, is("((item.lastmodified:[" + escapedFromDate(DATE) + " TO *]))")); } @Test public void fromAndUntilFilterQuery() throws Exception { List<ScopedFilter> scopedFilters = new ArrayList<ScopedFilter>(); Condition fromCondition = new Condition() { @Override public Filter getFilter() { return new DateFromFilter(DATE); } }; Condition untilCondition = new Condition() { @Override public Filter getFilter() { return new DateUntilFilter(DATE); } }; scopedFilters.add(new ScopedFilter(new AndCondition(getFilterResolver(), fromCondition, untilCondition), Scope.Query)); String result = underTest.buildQuery(scopedFilters); assertThat(result, is("(((item.lastmodified:["+escapedFromDate(DATE)+" TO *]) AND (item.lastmodified:[* TO "+escapedUntilDate(DATE)+"])))")); } @Test public void customConditionForMetadataExistsFilterWithOneSingleValue() throws Exception { List<ScopedFilter> scopedFilters = new ArrayList<ScopedFilter>(); ParameterMap filterConfiguration = new ParameterMap().withValues(new StringValue() .withValue(FIELD_1) .withName("fields")); scopedFilters.add(new ScopedFilter(new CustomCondition(getFilterResolver(), DSpaceMetadataExistsFilter.class, filterConfiguration), Scope.Query)); String result = underTest.buildQuery(scopedFilters); assertThat(result, is("(((metadata."+FIELD_1+":[* TO *])))")); } @Test public void customConditionForMetadataExistsFilterWithMultipleValues() throws Exception { List<ScopedFilter> scopedFilters = new ArrayList<ScopedFilter>(); ParameterMap filterConfiguration = new ParameterMap().withValues(new ParameterList() .withValues( new StringValue().withValue(FIELD_1), new StringValue().withValue(FIELD_2) ) .withName("fields")); scopedFilters.add(new ScopedFilter(new CustomCondition(getFilterResolver(), DSpaceMetadataExistsFilter.class, filterConfiguration), Scope.Query)); String result = underTest.buildQuery(scopedFilters); assertThat(result, is("(((metadata."+FIELD_1+":[* TO *] OR metadata."+FIELD_2+":[* TO *])))")); } @Test public void fromFilterInMetadataFormatScope() throws Exception { List<ScopedFilter> scopedFilters = new ArrayList<ScopedFilter>(); scopedFilters.add(new ScopedFilter(new Condition() { @Override public Filter getFilter() { return new DateFromFilter(DATE); } }, Scope.MetadataFormat)); String result = underTest.buildQuery(scopedFilters); assertThat(result, is("((item.deleted:true OR (item.lastmodified:[" + escapedFromDate(DATE) + " TO *])))")); } @Test public void fromAndSetFilterQuery() throws Exception { List<ScopedFilter> scopedFilters = new ArrayList<ScopedFilter>(); scopedFilters.add(new ScopedFilter(new Condition() { @Override public Filter getFilter() { return new DateFromFilter(DATE); } }, Scope.Query)); scopedFilters.add(new ScopedFilter(new Condition() { @Override public Filter getFilter() { return new DSpaceSetSpecFilter(collectionsService, handleResolver, SET); } }, Scope.Query)); String result = underTest.buildQuery(scopedFilters); assertThat(result, is("((item.lastmodified:[" + escapedFromDate(DATE) + " TO *])) AND ((item.collections:"+SET+"))")); } }