package org.gbif.occurrence.download.query; import org.gbif.api.model.occurrence.predicate.ConjunctionPredicate; import org.gbif.api.model.occurrence.predicate.DisjunctionPredicate; import org.gbif.api.model.occurrence.predicate.EqualsPredicate; import org.gbif.api.model.occurrence.predicate.GreaterThanOrEqualsPredicate; import org.gbif.api.model.occurrence.predicate.GreaterThanPredicate; import org.gbif.api.model.occurrence.predicate.InPredicate; import org.gbif.api.model.occurrence.predicate.IsNotNullPredicate; import org.gbif.api.model.occurrence.predicate.LessThanOrEqualsPredicate; import org.gbif.api.model.occurrence.predicate.LessThanPredicate; import org.gbif.api.model.occurrence.predicate.NotPredicate; import org.gbif.api.model.occurrence.predicate.Predicate; import org.gbif.api.model.occurrence.predicate.WithinPredicate; import org.gbif.api.model.occurrence.search.OccurrenceSearchParameter; import com.google.common.collect.Lists; import org.junit.Test; import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; public class SolrQueryVisitorTest { private static final OccurrenceSearchParameter PARAM = OccurrenceSearchParameter.CATALOG_NUMBER; private static final OccurrenceSearchParameter PARAM2 = OccurrenceSearchParameter.INSTITUTION_CODE; private final SolrQueryVisitor visitor = new SolrQueryVisitor(); @Test public void testComplexQuery() throws QueryBuildingException { Predicate aves = new EqualsPredicate(OccurrenceSearchParameter.TAXON_KEY, "212"); Predicate UK = new EqualsPredicate(OccurrenceSearchParameter.COUNTRY, "GB"); Predicate before1989 = new LessThanOrEqualsPredicate(OccurrenceSearchParameter.YEAR, "1989"); ConjunctionPredicate p = new ConjunctionPredicate(Lists.newArrayList(aves, UK, before1989)); String where = visitor.getQuery(p); assertEquals("((taxon_key:212) AND (country:GB) AND (year:[* TO 1989]))", where); } @Test public void testConjunctionPredicate() throws QueryBuildingException { Predicate p1 = new EqualsPredicate(PARAM, "value_1"); Predicate p2 = new EqualsPredicate(PARAM2, "value_2"); ConjunctionPredicate p = new ConjunctionPredicate(Lists.newArrayList(p1, p2)); String query = visitor.getQuery(p); assertThat(query, equalTo("((catalog_number:value_1) AND (institution_code:value_2))")); } @Test public void testDisjunctionPredicate() throws QueryBuildingException { Predicate p1 = new EqualsPredicate(PARAM, "value_1"); Predicate p2 = new EqualsPredicate(PARAM2, "value_2"); DisjunctionPredicate p = new DisjunctionPredicate(Lists.newArrayList(p1, p2)); String query = visitor.getQuery(p); assertThat(query, equalTo("((catalog_number:value_1) OR (institution_code:value_2))")); } @Test public void testEqualsPredicate() throws QueryBuildingException { Predicate p = new EqualsPredicate(PARAM, "value"); String query = visitor.getQuery(p); assertThat(query, equalTo("catalog_number:value")); } @Test public void testGreaterThanOrEqualPredicate() throws QueryBuildingException { Predicate p = new GreaterThanOrEqualsPredicate(OccurrenceSearchParameter.ELEVATION, "222"); String query = visitor.getQuery(p); assertThat(query, equalTo("elevation:[222 TO *]")); } @Test public void testGreaterThanPredicate() throws QueryBuildingException { Predicate p = new GreaterThanPredicate(OccurrenceSearchParameter.ELEVATION, "1000"); String query = visitor.getQuery(p); assertThat(query, equalTo("elevation:{1000 TO *]")); } @Test public void testInPredicate() throws QueryBuildingException { Predicate p = new InPredicate(PARAM, Lists.newArrayList("value_1", "value_2", "value_3")); String query = visitor.getQuery(p); assertThat(query, equalTo("((catalog_number:value_1) OR (catalog_number:value_2) OR (catalog_number:value_3))")); } @Test public void testLessThanOrEqualPredicate() throws QueryBuildingException { Predicate p = new LessThanOrEqualsPredicate(OccurrenceSearchParameter.ELEVATION, "1000"); String query = visitor.getQuery(p); assertThat(query, equalTo("elevation:[* TO 1000]")); } @Test public void testLessThanPredicate() throws QueryBuildingException { Predicate p = new LessThanPredicate(OccurrenceSearchParameter.ELEVATION, "1000"); String query = visitor.getQuery(p); assertThat(query, equalTo("elevation:[* TO 1000}")); } @Test public void testNotPredicate() throws QueryBuildingException { Predicate p = new NotPredicate(new EqualsPredicate(PARAM, "value")); String query = visitor.getQuery(p); assertThat(query, equalTo("-catalog_number:value")); } @Test public void testIsNotNullPredicate() throws QueryBuildingException { Predicate p = new IsNotNullPredicate(PARAM); String query = visitor.getQuery(p); assertThat(query, equalTo("catalog_number:*")); } @Test public void testNotPredicateComplex() throws QueryBuildingException { Predicate p1 = new EqualsPredicate(PARAM, "value_1"); Predicate p2 = new EqualsPredicate(PARAM2, "value_2"); ConjunctionPredicate cp = new ConjunctionPredicate(Lists.newArrayList(p1, p2)); Predicate p = new NotPredicate(cp); String query = visitor.getQuery(p); assertThat(query, equalTo("-((catalog_number:value_1) AND (institution_code:value_2))")); } @Test public void testQuotes() throws QueryBuildingException { Predicate p = new EqualsPredicate(PARAM, "my 'pleasure'"); String query = visitor.getQuery(p); assertThat(query, equalTo("catalog_number:\"my\\ 'pleasure'\"")); p = new LessThanOrEqualsPredicate(OccurrenceSearchParameter.ELEVATION, "101"); query = visitor.getQuery(p); assertThat(query, equalTo("elevation:[* TO 101]")); p = new GreaterThanPredicate(OccurrenceSearchParameter.YEAR, "1998"); query = visitor.getQuery(p); assertThat(query, equalTo("year:{1998 TO *]")); } @Test public void testWithinPredicate() throws QueryBuildingException { final String wkt = "POLYGON ((30 10, 10 20, 20 40, 40 40, 30 10))"; Predicate p = new WithinPredicate(wkt); String query = visitor.getQuery(p); assertThat(query, equalTo("coordinate:\"Intersects(POLYGON ((30 10, 10 20, 20 40, 40 40, 30 10))) distErrPct=0\"")); } }