/* * Copyright 2012-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.data.solr.core; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import java.util.Arrays; import java.util.Calendar; import java.util.Collections; import java.util.Date; import java.util.List; import java.util.TimeZone; import org.apache.commons.lang3.StringUtils; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.common.params.CommonParams; import org.apache.solr.common.params.FacetParams; import org.apache.solr.common.params.FacetParams.FacetRangeInclude; import org.apache.solr.common.params.FacetParams.FacetRangeOther; import org.apache.solr.common.params.GroupParams; import org.apache.solr.common.params.HighlightParams; import org.apache.solr.common.params.SpellingParams; import org.apache.solr.common.params.StatsParams; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.joda.time.LocalDateTime; import org.junit.Before; import org.junit.Test; import org.springframework.core.convert.converter.Converter; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.data.geo.Box; import org.springframework.data.geo.Circle; import org.springframework.data.geo.Distance; import org.springframework.data.geo.Metrics; import org.springframework.data.geo.Point; import org.springframework.data.solr.core.query.AnyCriteria; import org.springframework.data.solr.core.query.Criteria; import org.springframework.data.solr.core.query.FacetOptions; import org.springframework.data.solr.core.query.FacetOptions.FacetParameter; import org.springframework.data.solr.core.query.FacetOptions.FacetSort; import org.springframework.data.solr.core.query.FacetOptions.FieldWithDateRangeParameters; import org.springframework.data.solr.core.query.FacetOptions.FieldWithFacetParameters; import org.springframework.data.solr.core.query.FacetOptions.FieldWithNumericRangeParameters; import org.springframework.data.solr.core.query.FacetQuery; import org.springframework.data.solr.core.query.GroupOptions; import org.springframework.data.solr.core.query.HighlightOptions; import org.springframework.data.solr.core.query.Join; import org.springframework.data.solr.core.query.MaxFunction; import org.springframework.data.solr.core.query.Query; import org.springframework.data.solr.core.query.Query.Operator; import org.springframework.data.solr.core.query.SimpleFacetQuery; import org.springframework.data.solr.core.query.SimpleField; import org.springframework.data.solr.core.query.SimpleFilterQuery; import org.springframework.data.solr.core.query.SimpleHighlightQuery; import org.springframework.data.solr.core.query.SimpleQuery; import org.springframework.data.solr.core.query.SimpleStringCriteria; import org.springframework.data.solr.core.query.SolrDataQuery; import org.springframework.data.solr.core.query.SolrPageRequest; import org.springframework.data.solr.core.query.SpellcheckOptions; import org.springframework.data.solr.core.query.StatsOptions; /** * @author Christoph Strobl * @author John Dorman * @author Rosty Kerei * @author Andrey Paramonov * @author Philipp Jardas * @author Francisco Spaeth * @author Petar Tahchiev */ public class DefaultQueryParserTests { private DefaultQueryParser queryParser; @Before public void setUp() { this.queryParser = new DefaultQueryParser(); } @Test public void testIs() { Criteria criteria = new Criteria("field_1").is("is"); assertEquals("field_1", criteria.getField().getName()); assertEquals("field_1:is", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testMultipleIs() { Criteria criteria = new Criteria("field_1").is("is").is("another is"); assertEquals("field_1", criteria.getField().getName()); assertEquals("field_1:(is \"another is\")", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testEndsWith() { Criteria criteria = new Criteria("field_1").endsWith("end"); assertEquals("field_1", criteria.getField().getName()); assertEquals("field_1:*end", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testEndsWithMulitpleValues() { Criteria criteria = new Criteria("field_1").endsWith(Arrays.asList("one", "two", "three")); assertEquals("field_1", criteria.getField().getName()); assertEquals("field_1:(*one *two *three)", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testStartsWith() { Criteria criteria = new Criteria("field_1").startsWith("start"); assertEquals("field_1", criteria.getField().getName()); assertEquals("field_1:start*", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testStartsWithMultipleValues() { Criteria criteria = new Criteria("field_1").startsWith(Arrays.asList("one", "two", "three")); assertEquals("field_1", criteria.getField().getName()); assertEquals("field_1:(one* two* three*)", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testContains() { Criteria criteria = new Criteria("field_1").contains("contains"); assertEquals("field_1", criteria.getField().getName()); assertEquals("field_1:*contains*", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testContainsWithMultipleValues() { Criteria criteria = new Criteria("field_1").contains(Arrays.asList("one", "two", "three")); assertEquals("field_1", criteria.getField().getName()); assertEquals("field_1:(*one* *two* *three*)", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testExpression() { Criteria criteria = new Criteria("field_1").expression("(have fun using +solr && expressions*)"); assertEquals("field_1:(have fun using +solr && expressions*)", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testCriteriaChain() { Criteria criteria = new Criteria("field_1").startsWith("start").endsWith("end").contains("contains").is("is"); assertEquals("field_1", criteria.getField().getName()); assertEquals("field_1:(start* *end *contains* is)", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testAnd() { Criteria criteria = new Criteria("field_1").startsWith("start").endsWith("end").and("field_2").startsWith("2start") .endsWith("2end"); assertEquals("field_1:(start* *end) AND field_2:(2start* *2end)", queryParser.createQueryStringFromNode(criteria)); } @Test public void testOr() { Criteria criteria = new Criteria("field_1").startsWith("start").or("field_2").endsWith("end").startsWith("start2"); assertEquals("field_1:start* OR field_2:(*end start2*)", queryParser.createQueryStringFromNode(criteria)); } @Test public void testCriteriaWithWhiteSpace() { Criteria criteria = new Criteria("field_1").is("white space"); assertEquals("field_1:\"white space\"", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testCriteriaWithDoubleQuotes() { Criteria criteria = new Criteria("field_1").is("with \"quote"); assertEquals("field_1:\"with \\\"quote\"", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testIsNot() { Criteria criteria = new Criteria("field_1").is("value_1").not(); assertEquals("-field_1:value_1", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testFuzzy() { Criteria criteria = new Criteria("field_1").fuzzy("value_1"); assertEquals("field_1:value_1~", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testFuzzyWithDistance() { Criteria criteria = new Criteria("field_1").fuzzy("value_1", 0.5f); assertEquals("field_1:value_1~0.5", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testSloppy() { Criteria criteria = new Criteria("field_1").sloppy("value1 value2", 2); assertEquals("field_1:\"value1 value2\"~2", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testBoost() { Criteria criteria = new Criteria("field_1").is("value_1").boost(2f); assertEquals("field_1:value_1^2.0", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testBoostMultipleValues() { Criteria criteria = new Criteria("field_1").is("value_1").is("value_2").boost(2f); assertEquals("field_1:(value_1 value_2)^2.0", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testBoostMultipleCriteriasValues() { Criteria criteria = new Criteria("field_1").is("value_1").is("value_2").boost(2f).and("field_3").is("value_3"); assertEquals("field_1:(value_1 value_2)^2.0 AND field_3:value_3", queryParser.createQueryStringFromNode(criteria)); } @Test public void testBetween() { Criteria criteria = new Criteria("field_1").between(100, 200); assertEquals("field_1:[100 TO 200]", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testBetweenExcludeLowerBound() { Criteria criteria = new Criteria("field_1").between(100, 200, false, true); assertEquals("field_1:{100 TO 200]", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testBetweenExcludeUpperBound() { Criteria criteria = new Criteria("field_1").between(100, 200, true, false); assertEquals("field_1:[100 TO 200}", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testBetweenWithoutUpperBound() { Criteria criteria = new Criteria("field_1").between(100, null); assertEquals("field_1:[100 TO *]", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testBetweenWithoutLowerBound() { Criteria criteria = new Criteria("field_1").between(null, 200); assertEquals("field_1:[* TO 200]", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testBetweenWithDateValue() { DateTime lowerBound = new DateTime(2012, 8, 21, 6, 35, 0, DateTimeZone.UTC); DateTime upperBound = new DateTime(2012, 8, 21, 19, 30, 0, DateTimeZone.UTC); Criteria criteria = new Criteria("field_1").between(lowerBound, upperBound); assertEquals("field_1:[2012\\-08\\-21T06\\:35\\:00.000Z TO 2012\\-08\\-21T19\\:30\\:00.000Z]", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testBetweenNegativeNumber() { Criteria criteria = new Criteria("field_1").between(-200, -100); assertEquals("field_1:[\\-200 TO \\-100]", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testIn() { Criteria criteria = new Criteria("field_1").in(1, 2, 3, 5, 8, 13, 21); assertEquals("field_1:(1 2 3 5 8 13 21)", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testIsWithJavaDateValue() { DateTime dateTime = new DateTime(2012, 8, 21, 6, 35, 0, DateTimeZone.UTC); Calendar calendar = Calendar.getInstance(); calendar.setTimeZone(TimeZone.getTimeZone("UTC")); calendar.setTimeInMillis(dateTime.getMillis()); Criteria criteria = new Criteria("dateField").is(calendar.getTime()); assertEquals("dateField:2012\\-08\\-21T06\\:35\\:00.000Z", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testIsWithJodaDateTime() { DateTime dateTime = new DateTime(2012, 8, 21, 6, 35, 0, DateTimeZone.UTC); Criteria criteria = new Criteria("dateField").is(dateTime); assertEquals("dateField:2012\\-08\\-21T06\\:35\\:00.000Z", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testIsWithJodaLocalDateTime() { LocalDateTime dateTime = new LocalDateTime(new DateTime(2012, 8, 21, 6, 35, 0, DateTimeZone.UTC).getMillis(), DateTimeZone.UTC); Criteria criteria = new Criteria("dateField").is(dateTime); assertEquals("dateField:2012\\-08\\-21T06\\:35\\:00.000Z", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testIsWithNegativeNumner() { Criteria criteria = new Criteria("field_1").is(-100); assertEquals("field_1:\\-100", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testNear() { Criteria criteria = new Criteria("field_1").near(new Point(48.303056, 14.290556), new Distance(5)); assertEquals("{!bbox pt=48.303056,14.290556 sfield=field_1 d=5.0}", queryParser.createQueryStringFromCriteria(criteria)); } @Test(expected = IllegalArgumentException.class) // DATASOLR-142 public void testCircleForNearMustNotBeNull() { new Criteria("field_1").near((Circle) null); } @Test public void testNearWithDistanceUnitMiles() { Criteria criteria = new Criteria("field_1").near(new Point(48.303056, 14.290556), new Distance(1, Metrics.MILES)); assertEquals("{!bbox pt=48.303056,14.290556 sfield=field_1 d=1.609344}", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testNearWithDistanceUnitKilometers() { Criteria criteria = new Criteria("field_1").near(new Point(48.303056, 14.290556), new Distance(1, Metrics.KILOMETERS)); assertEquals("{!bbox pt=48.303056,14.290556 sfield=field_1 d=1.0}", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testNearWithCoords() { Criteria criteria = new Criteria("field_1") .near(new Box(new Point(48.303056, 14.290556), new Point(48.303056, 14.290556))); assertEquals("field_1:[48.303056,14.290556 TO 48.303056,14.290556]", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testWithinWithDistanceUnitMiles() { Criteria criteria = new Criteria("field_1").within(new Point(48.303056, 14.290556), new Distance(1, Metrics.MILES)); assertEquals("{!geofilt pt=48.303056,14.290556 sfield=field_1 d=1.609344}", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testWithinWithDistanceUnitKilometers() { Criteria criteria = new Criteria("field_1").within(new Point(48.303056, 14.290556), new Distance(1, Metrics.KILOMETERS)); assertEquals("{!geofilt pt=48.303056,14.290556 sfield=field_1 d=1.0}", queryParser.createQueryStringFromCriteria(criteria)); } @Test(expected = IllegalArgumentException.class) // DATASOLR-142 public void testCircleForWithinMustNotBeNull() { new Criteria("field_1").within((Circle) null); } @Test // DATASOLR-142 public void testWithinCircleWorksCorrectly() { Criteria criteria = new Criteria("field_1") .within(new Circle(new Point(48.303056, 14.290556), new Distance(1, Metrics.KILOMETERS))); assertEquals("{!geofilt pt=48.303056,14.290556 sfield=field_1 d=1.0}", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testWithinWithNullDistance() { Criteria criteria = new Criteria("field_1").within(new Point(48.303056, 14.290556), null); assertEquals("{!geofilt pt=48.303056,14.290556 sfield=field_1 d=0.0}", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testStringCriteria() { Criteria criteria = new SimpleStringCriteria("field_1:value_1 AND field_2:value_2"); assertEquals("field_1:value_1 AND field_2:value_2", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testStringCriteriaWithMoreFragments() { Criteria criteria = new SimpleStringCriteria("field_1:value_1 AND field_2:value_2"); criteria = criteria.and("field_3").is("value_3"); assertEquals("field_1:value_1 AND field_2:value_2 AND field_3:value_3", queryParser.createQueryStringFromNode(criteria)); } @Test public void testRegisterAlternateConverter() { Criteria criteria = new Criteria("field_1").is(100); queryParser.registerConverter(new Converter<Number, String>() { @Override public String convert(Number arg0) { return StringUtils.reverse(arg0.toString()); } }); assertEquals("field_1:001", queryParser.createQueryStringFromCriteria(criteria)); } @Test public void testConstructSimpleSolrQuery() { Query query = new SimpleQuery(new Criteria("field_1").is("value_1")); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertNotNull(solrQuery); assertQueryStringPresent(solrQuery); assertPaginationNotPresent(solrQuery); assertProjectionNotPresent(solrQuery); assertGroupingNotPresent(solrQuery); assertFactingNotPresent(solrQuery); } @Test public void testConstructSolrQueryWithPagination() { int page = 1; int pageSize = 100; Query query = new SimpleQuery(new Criteria("field_1").is("value_1")) .setPageRequest(new PageRequest(page, pageSize)); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertNotNull(solrQuery); assertQueryStringPresent(solrQuery); assertPaginationPresent(solrQuery, page * pageSize, pageSize); assertProjectionNotPresent(solrQuery); assertGroupingNotPresent(solrQuery); assertFactingNotPresent(solrQuery); } @Test public void testConstructSimpleSolrQueryWithProjection() { Query query = new SimpleQuery(new Criteria("field_1").is("value_1")).addProjectionOnField("projection_1") .addProjectionOnField(new SimpleField("projection_2")); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertNotNull(solrQuery); assertQueryStringPresent(solrQuery); assertPaginationNotPresent(solrQuery); assertProjectionPresent(solrQuery, "projection_1,projection_2"); assertGroupingNotPresent(solrQuery); assertFactingNotPresent(solrQuery); } @Test public void testConstructSolrQueryWithSingleGroupBy() { Query query = new SimpleQuery(new Criteria("field_1").is("value_1")).addGroupByField("group_1"); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertNotNull(solrQuery); assertQueryStringPresent(solrQuery); assertPaginationNotPresent(solrQuery); assertProjectionNotPresent(solrQuery); assertGroupingPresent(solrQuery, "group_1"); assertFactingNotPresent(solrQuery); } @Test public void testConstructSolrQueryWithSingleFacetOnField() { Query query = new SimpleFacetQuery(new Criteria("field_1").is("value_1")) .setFacetOptions(new FacetOptions("facet_1")); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertNotNull(solrQuery); assertQueryStringPresent(solrQuery); assertPaginationNotPresent(solrQuery); assertProjectionNotPresent(solrQuery); assertGroupingNotPresent(solrQuery); assertFactingPresent(solrQuery, "facet_1"); } @Test public void testConstructSolrQueryWithSinglePivot() { Query query = new SimpleFacetQuery(new Criteria("field_1").is("value_1")) .setFacetOptions(new FacetOptions().addFacetOnPivot("field_1", "field_2")); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertNotNull(solrQuery); assertQueryStringPresent(solrQuery); assertPaginationNotPresent(solrQuery); assertProjectionNotPresent(solrQuery); assertGroupingNotPresent(solrQuery); assertPivotFactingPresent(solrQuery, "field_1,field_2"); } @Test public void testConstructSolrQueryWithMultipleFacetOnFields() { FacetQuery query = new SimpleFacetQuery(new Criteria("field_1").is("value_1")) .setFacetOptions(new FacetOptions("facet_1", "facet_2")); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertNotNull(solrQuery); assertQueryStringPresent(solrQuery); assertPaginationNotPresent(solrQuery); assertProjectionNotPresent(solrQuery); assertGroupingNotPresent(solrQuery); assertFactingPresent(solrQuery, "facet_1", "facet_2"); } @Test public void testConstructSolrQueryWithMultiplePivot() { FacetQuery query = new SimpleFacetQuery(new Criteria("field_1").is("value_1")).setFacetOptions( new FacetOptions().addFacetOnPivot("field_1", "field_2").addFacetOnPivot("field_2", "field_3")); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertNotNull(solrQuery); assertQueryStringPresent(solrQuery); assertPaginationNotPresent(solrQuery); assertProjectionNotPresent(solrQuery); assertGroupingNotPresent(solrQuery); assertPivotFactingPresent(solrQuery, "field_1,field_2", "field_2,field_3"); } @Test public void testConstructSolrQueryWithFacetPrefix() { FacetQuery query = new SimpleFacetQuery(new Criteria("field_1").is("value_1")); FacetOptions facetOptions = new FacetOptions(new SimpleField("facet_1"), new SimpleField("facet_2")); facetOptions.setFacetPrefix("prefix"); query.setFacetOptions(facetOptions); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertNotNull(solrQuery); assertQueryStringPresent(solrQuery); assertPaginationNotPresent(solrQuery); assertProjectionNotPresent(solrQuery); assertGroupingNotPresent(solrQuery); assertFactingPresent(solrQuery, "facet_1", "facet_2"); assertEquals(facetOptions.getFacetPrefix(), solrQuery.getParams("facet.prefix")[0]); } @Test public void testConstructSolrQueryWithFieldFacetParameters() { FacetQuery query = new SimpleFacetQuery(new Criteria("field_1").is("value_1")); FieldWithFacetParameters fieldWithFacetParameters = new FieldWithFacetParameters("facet_2").setPrefix("prefix") .setSort(FacetSort.INDEX).setLimit(3).setOffset(2).setMethod("method").setMissing(true); FacetOptions facetOptions = new FacetOptions(new SimpleField("facet_1"), fieldWithFacetParameters); query.setFacetOptions(facetOptions); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertNotNull(solrQuery); assertQueryStringPresent(solrQuery); assertPaginationNotPresent(solrQuery); assertProjectionNotPresent(solrQuery); assertGroupingNotPresent(solrQuery); assertFactingPresent(solrQuery, "facet_1", "facet_2"); assertEquals(fieldWithFacetParameters.getPrefix(), solrQuery.getParams("f." + fieldWithFacetParameters.getName() + ".facet.prefix")[0]); assertEquals(FacetParams.FACET_SORT_INDEX, solrQuery.getParams("f." + fieldWithFacetParameters.getName() + ".facet.sort")[0]); assertEquals(Integer.toString(fieldWithFacetParameters.getOffset()), solrQuery.getParams("f." + fieldWithFacetParameters.getName() + ".facet.offset")[0]); assertEquals(Integer.toString(fieldWithFacetParameters.getLimit()), solrQuery.getParams("f." + fieldWithFacetParameters.getName() + ".facet.limit")[0]); assertEquals(fieldWithFacetParameters.getMethod(), solrQuery.getParams("f." + fieldWithFacetParameters.getName() + ".facet.method")[0]); assertEquals(fieldWithFacetParameters.getMissing().toString(), solrQuery.getParams("f." + fieldWithFacetParameters.getName() + ".facet.missing")[0]); } @Test public void testConstructSolrQueryWithCustomFieldFacetParameters() { FacetQuery query = new SimpleFacetQuery(new Criteria("field_1").is("value_1")); FieldWithFacetParameters fieldWithFacetParameters = new FieldWithFacetParameters("facet_2") .addFacetParameter(new FacetParameter(FacetParams.FACET_ZEROS, "on")); FacetOptions facetOptions = new FacetOptions(new SimpleField("facet_1"), fieldWithFacetParameters); query.setFacetOptions(facetOptions); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertEquals("on", solrQuery.getParams("f." + fieldWithFacetParameters.getName() + ".facet.zeros")[0]); } @Test public void testConstructSolrQueryWithFacetSort() { FacetQuery query = new SimpleFacetQuery(new Criteria("field_1").is("value_1")) .setFacetOptions(new FacetOptions("facet_1").setFacetSort(FacetOptions.FacetSort.INDEX)); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertEquals("index", solrQuery.getFacetSortString()); query.getFacetOptions().setFacetSort(FacetOptions.FacetSort.COUNT); solrQuery = queryParser.constructSolrQuery(query); assertEquals("count", solrQuery.getFacetSortString()); } @Test public void testConstructSolrQueryWithSingleFacetFilterQuery() { FacetQuery query = new SimpleFacetQuery(new Criteria("field_1").is("value_1")).setFacetOptions( new FacetOptions().addFacetQuery(new SimpleQuery(new SimpleStringCriteria("field_2:[* TO 5]")))); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertNotNull(solrQuery); assertQueryStringPresent(solrQuery); assertPaginationNotPresent(solrQuery); assertProjectionNotPresent(solrQuery); assertGroupingNotPresent(solrQuery); assertArrayEquals(new String[] { "field_2:[* TO 5]" }, solrQuery.getFacetQuery()); } @Test public void testConstructSolrQueryWithMultipleFacetFilterQuerues() { FacetQuery query = new SimpleFacetQuery(new Criteria("field_1").is("value_1")) .setFacetOptions(new FacetOptions().addFacetQuery(new SimpleQuery(new SimpleStringCriteria("field_2:[* TO 5]"))) .addFacetQuery(new SimpleQuery(new Criteria("field_3").startsWith("prefix")))); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertNotNull(solrQuery); assertQueryStringPresent(solrQuery); assertPaginationNotPresent(solrQuery); assertProjectionNotPresent(solrQuery); assertGroupingNotPresent(solrQuery); assertArrayEquals(new String[] { "field_2:[* TO 5]", "field_3:prefix*" }, solrQuery.getFacetQuery()); } @Test public void testWithFilterQuery() { Query query = new SimpleQuery(new Criteria("field_1").is("value_1")) .addFilterQuery(new SimpleFilterQuery(new Criteria("filter_field").is("filter_value"))); SolrQuery solrQuery = queryParser.constructSolrQuery(query); String[] filterQueries = solrQuery.getFilterQueries(); assertEquals(1, filterQueries.length); assertEquals("filter_field:filter_value", filterQueries[0]); } @Test public void testWithEmptyFilterQuery() { Query query = new SimpleQuery(new Criteria("field_1").is("value_1")).addFilterQuery(new SimpleQuery()); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertNull(solrQuery.getFilterQueries()); } @Test public void testWithSimpleStringCriteria() { SimpleStringCriteria criteria = new SimpleStringCriteria("field_1:value_1"); Query query = new SimpleQuery(criteria); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertNotNull(solrQuery); assertQueryStringPresent(solrQuery); assertPaginationNotPresent(solrQuery); assertProjectionNotPresent(solrQuery); assertGroupingNotPresent(solrQuery); assertFactingNotPresent(solrQuery); assertEquals(criteria.getQueryString(), solrQuery.getQuery()); } @Test public void testWithNullSort() { SimpleStringCriteria criteria = new SimpleStringCriteria("field_1:value_1"); Query query = new SimpleQuery(criteria); query.addSort(null); // do this explicitly SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertNull(solrQuery.getSortField()); assertTrue(solrQuery.getSorts().isEmpty()); } @Test public void testWithSortAscOnSingleField() { SimpleStringCriteria criteria = new SimpleStringCriteria("field_1:value_1"); Query query = new SimpleQuery(criteria); query.addSort(new Sort("field_2")); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertEquals("field_2 asc", solrQuery.getSortField()); assertEquals(1, solrQuery.getSorts().size()); } @Test public void testWithSortDescOnSingleField() { SimpleStringCriteria criteria = new SimpleStringCriteria("field_1:value_1"); Query query = new SimpleQuery(criteria); query.addSort(new Sort(Sort.Direction.DESC, "field_2")); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertEquals("field_2 desc", solrQuery.getSortField()); assertEquals(1, solrQuery.getSorts().size()); } @Test public void testWithSortAscMultipleFields() { SimpleStringCriteria criteria = new SimpleStringCriteria("field_1:value_1"); Query query = new SimpleQuery(criteria); query.addSort(new Sort("field_2", "field_3")); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertEquals("field_2 asc,field_3 asc", solrQuery.getSortField()); assertEquals(2, solrQuery.getSorts().size()); } @Test public void testWithSortDescMultipleFields() { SimpleStringCriteria criteria = new SimpleStringCriteria("field_1:value_1"); Query query = new SimpleQuery(criteria); query.addSort(new Sort(Sort.Direction.DESC, "field_2", "field_3")); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertEquals("field_2 desc,field_3 desc", solrQuery.getSortField()); assertEquals(2, solrQuery.getSorts().size()); } @Test public void testWithSortMixedDirections() { SimpleStringCriteria criteria = new SimpleStringCriteria("field_1:value_1"); Query query = new SimpleQuery(criteria); query.addSort(new Sort("field_1")); query.addSort(new Sort(Sort.Direction.DESC, "field_2", "field_3")); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertEquals("field_1 asc,field_2 desc,field_3 desc", solrQuery.getSortField()); assertEquals(3, solrQuery.getSorts().size()); } @Test public void testWithORDefaultOperator() { SimpleQuery query = new SimpleQuery(new SimpleStringCriteria("field_1:value_1")); query.setDefaultOperator(Operator.OR); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertEquals("OR", solrQuery.get("q.op")); } @Test public void testWithANDDefaultOperator() { SimpleQuery query = new SimpleQuery(new SimpleStringCriteria("field_1:value_1")); query.setDefaultOperator(Operator.AND); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertEquals("AND", solrQuery.get("q.op")); } @Test public void testWithNONEDefaultOperator() { SimpleQuery query = new SimpleQuery(new SimpleStringCriteria("field_1:value_1")); query.setDefaultOperator(Operator.NONE); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertNull(solrQuery.get("q.op")); } @Test public void testWithoutDefaultOperator() { SimpleQuery query = new SimpleQuery(new SimpleStringCriteria("field_1:value_1")); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertNull(solrQuery.get("q.op")); } @Test public void testWithNullDefaultOperator() { SimpleQuery query = new SimpleQuery(new SimpleStringCriteria("field_1:value_1")); query.setDefaultOperator(null); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertNull(solrQuery.get("q.op")); } @Test public void testWithTimeAllowed() { SimpleQuery query = new SimpleQuery(new SimpleStringCriteria("field_1:value_1")); query.setTimeAllowed(100); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertEquals(new Integer(100), solrQuery.getTimeAllowed()); } @Test public void testWithoutTimeAllowed() { SimpleQuery query = new SimpleQuery(new SimpleStringCriteria("field_1:value_1")); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertNull(solrQuery.getTimeAllowed()); } @Test public void testWithLuceneDefType() { SimpleQuery query = new SimpleQuery(new SimpleStringCriteria("field_1:value_1")); query.setDefType("lucene"); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertNotNull(solrQuery.get("defType")); } @Test public void testWithEdismaxDefType() { SimpleQuery query = new SimpleQuery(new SimpleStringCriteria("field_1:value_1")); query.setDefType("edismax"); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertNotNull(solrQuery.get("defType")); } @Test public void testWithUndefindedDefType() { SimpleQuery query = new SimpleQuery(new SimpleStringCriteria("field_1:value_1")); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertNull(solrQuery.get("defType")); } @Test public void testWithFooRequestHandler() { SimpleQuery query = new SimpleQuery(new SimpleStringCriteria("field_1:value_1")); query.setRequestHandler("/foo"); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertNotNull(solrQuery.get("qt")); } @Test public void testWithUndefinedRequestHandler() { SimpleQuery query = new SimpleQuery(new SimpleStringCriteria("field_1:value_1")); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertNull(solrQuery.get("qt")); } @Test public void testWithJoinOperator() { SimpleQuery query = new SimpleQuery(new SimpleStringCriteria("field_1:value_1")); query.setJoin(Join.from("inner_id").to("outer_id")); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertEquals("{!join from=inner_id to=outer_id}field_1:value_1", solrQuery.getQuery()); } @Test // DATASOLR-176 public void testWithJoinTwoCoresOperator() { SimpleQuery query = new SimpleQuery(new SimpleStringCriteria("field_1:value_1")); query.setJoin(Join.from("inner_id").fromIndex("sourceIndex").to("outer_id")); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertEquals("{!join from=inner_id to=outer_id fromIndex=sourceIndex}field_1:value_1", solrQuery.getQuery()); } @Test public void testConstructSolrQueryWithEmptyHighlightOption() { SimpleHighlightQuery query = new SimpleHighlightQuery(new SimpleStringCriteria("field_1:value_1")); query.setHighlightOptions(new HighlightOptions()); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertTrue(solrQuery.getHighlight()); assertArrayEquals(new String[] { Criteria.WILDCARD }, solrQuery.getHighlightFields()); } @Test public void testConstructSolrQueryWithoutHighlightOption() { SimpleHighlightQuery query = new SimpleHighlightQuery(new SimpleStringCriteria("field_1:value_1")); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertFalse(solrQuery.getHighlight()); } @Test public void testConstructSolrQueryWithHighlightOptionHavingFields() { SimpleHighlightQuery query = new SimpleHighlightQuery(new SimpleStringCriteria("field_1:value_1")); HighlightOptions options = new HighlightOptions(); options.addField("field_2", "field_3"); query.setHighlightOptions(options); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertArrayEquals(new String[] { "field_2", "field_3" }, solrQuery.getHighlightFields()); } @Test public void testConstructSorlQueryWithHighlightOptionFragsize() { SimpleHighlightQuery query = new SimpleHighlightQuery(new SimpleStringCriteria("field_1:value_1")); HighlightOptions options = new HighlightOptions(); options.setFragsize(10); query.setHighlightOptions(options); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertEquals(options.getFragsize().intValue(), solrQuery.getHighlightFragsize()); } @Test public void testConstructSorlQueryWithHighlightOptionFormatter() { SimpleHighlightQuery query = new SimpleHighlightQuery(new SimpleStringCriteria("field_1:value_1")); HighlightOptions options = new HighlightOptions(); options.setFormatter("formatter"); query.setHighlightOptions(options); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertEquals(options.getFormatter(), solrQuery.getParams(HighlightParams.FORMATTER)[0]); } @Test public void testConstructSorlQueryWithHighlightOptionNrSnipplets() { SimpleHighlightQuery query = new SimpleHighlightQuery(new SimpleStringCriteria("field_1:value_1")); HighlightOptions options = new HighlightOptions(); options.setNrSnipplets(10); query.setHighlightOptions(options); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertEquals(options.getNrSnipplets().intValue(), solrQuery.getHighlightSnippets()); } @Test public void testConstructSorlQueryWithHighlightOptionsAndAnySolrParameter() { SimpleHighlightQuery query = new SimpleHighlightQuery(new SimpleStringCriteria("field_1:value_1")); HighlightOptions options = new HighlightOptions(); options.addHighlightParameter(HighlightParams.SIMPLE_PRE, "{pre}"); query.setHighlightOptions(options); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertEquals(options.<String> getHighlightParameterValue(HighlightParams.SIMPLE_PRE), solrQuery.getHighlightSimplePre()); } @Test public void testConstructSorlQueryWithFieldSpecificHighlightOptions() { SimpleHighlightQuery query = new SimpleHighlightQuery(new SimpleStringCriteria("field_1:value_1")); HighlightOptions options = new HighlightOptions(); HighlightOptions.FieldWithHighlightParameters fieldWithHighlightParameters = new HighlightOptions.FieldWithHighlightParameters( "field_2"); fieldWithHighlightParameters.setFormatter("formatter"); fieldWithHighlightParameters.setFragsize(10); options.addField(fieldWithHighlightParameters); query.setHighlightOptions(options); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertArrayEquals(new String[] { "field_2" }, solrQuery.getHighlightFields()); assertEquals(fieldWithHighlightParameters.getFormatter(), solrQuery.getParams("f.field_2." + HighlightParams.FORMATTER)[0]); assertEquals(fieldWithHighlightParameters.getFragsize().toString(), solrQuery.getParams("f.field_2." + HighlightParams.FRAGSIZE)[0]); } @Test // DATASOLR-105 public void testNestedOrPartWithAnd() { Criteria criteria = Criteria.where("field_1").is("foo") .and(Criteria.where("field_2").is("bar").or("field_3").is("roo"))// .or(Criteria.where("field_4").is("spring").and("field_5").is("data")); assertEquals("field_1:foo AND (field_2:bar OR field_3:roo) OR (field_4:spring AND field_5:data)", queryParser.createQueryStringFromNode(criteria)); } @Test // DATASOLR-105 public void testNestedOrPartWithAndSomeOtherThings() { Criteria criteria = Criteria.where("field_1").is("foo").is("bar") .and(Criteria.where("field_2").is("bar").is("lala").or("field_3").is("roo")) .or(Criteria.where("field_4").is("spring").and("field_5").is("data")); assertEquals("field_1:(foo bar) AND (field_2:(bar lala) OR field_3:roo) OR (field_4:spring AND field_5:data)", queryParser.createQueryStringFromNode(criteria)); } @Test // DATASOLR-105 public void testMultipleAnd() { Criteria criteria = Criteria.where("field_1").is("foo").and("field_2").is("bar").and("field_3").is("roo"); assertEquals("field_1:foo AND field_2:bar AND field_3:roo", queryParser.createQueryStringFromNode(criteria)); } @Test // DATASOLR-105 public void testMultipleOr() { Criteria criteria = Criteria.where("field_1").is("foo").or("field_2").is("bar").or("field_3").is("roo"); assertEquals("field_1:foo OR field_2:bar OR field_3:roo", queryParser.createQueryStringFromNode(criteria)); } @Test // DATASOLR-105 public void testEmptyCriteriaShouldBeDefaultedToNotNUll() { Criteria criteria = Criteria.where("field_1").is("foo").and("field_2").or("field_3"); assertEquals("field_1:foo AND field_2:[* TO *] OR field_3:[* TO *]", queryParser.createQueryStringFromNode(criteria)); } @Test // DATASOLR-105 public void testDeepNesting() { Criteria criteria = Criteria.where("field_1").is("foo") .and(Criteria.where("field_2").is("bar").and("field_3").is("roo")// .and(Criteria.where("field_4").is("spring").and("field_5").is("data").or("field_6").is("solr"))); assertEquals("field_1:foo AND (field_2:bar AND field_3:roo AND (field_4:spring AND field_5:data OR field_6:solr))", queryParser.createQueryStringFromNode(criteria)); } @Test // DATASOLR-168 public void testNotCritieraCarriedOnPorperlyForNullAndNotNull() { Criteria criteria = new Criteria("param1").isNotNull().and("param2").isNull(); assertEquals("param1:[* TO *] AND -param2:[* TO *]", queryParser.createQueryStringFromNode(criteria)); } @Test // DATASOLR-112 public void pageableUsingZeroShouldBeParsedCorrectlyWhenSetUsingPageable() { SimpleQuery query = new SimpleQuery("*:*").setPageRequest(new SolrPageRequest(0, 0)); assertPaginationPresent(queryParser.constructSolrQuery(query), 0, 0); } @Test // DATASOLR-112 public void pageableUsingZeroShouldBeParsedCorrectlyWhenSetUsingExplititMethods() { SimpleQuery query = new SimpleQuery("*:*").setOffset(0L).setRows(0); assertPaginationPresent(queryParser.constructSolrQuery(query), 0, 0); } @Test // DATASOLR-160 public void testConstructSolrQueryWithStatField() { StatsOptions statsOptions = new StatsOptions().addField(new SimpleField("field_1")); SimpleQuery query = new SimpleQuery("*:*"); query.setStatsOptions(statsOptions); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertEquals("field_1", solrQuery.get(StatsParams.STATS_FIELD)); } @Test // DATASOLR-160 public void testConstructSolrQueryWithStatFields() { StatsOptions statsOptions = new StatsOptions()// .addField(new SimpleField("field_1"))// .addField(new SimpleField("field_2")); SimpleQuery query = new SimpleQuery("*:*"); query.setStatsOptions(statsOptions); SolrQuery solrQuery = queryParser.constructSolrQuery(query); List<String> fields = Arrays.asList(solrQuery.getParams(StatsParams.STATS_FIELD)); Collections.sort(fields); assertEquals(2, fields.size()); assertEquals(Arrays.asList("field_1", "field_2"), fields); } @Test // DATASOLR-160 public void testConstructSolrQueryWithStatFacets() { StatsOptions statsOptions = new StatsOptions()// .addFacet(new SimpleField("field_1"))// .addFacet(new SimpleField("field_2")); SimpleQuery query = new SimpleQuery("*:*"); query.setStatsOptions(statsOptions); SolrQuery solrQuery = queryParser.constructSolrQuery(query); List<String> facets = Arrays.asList(solrQuery.getParams(StatsParams.STATS_FACET)); Collections.sort(facets); assertEquals(2, facets.size()); assertEquals(Arrays.asList("field_1", "field_2"), facets); } @Test // DATASOLR-160 public void testConstructSolrQueryWithStatFieldsAndFacets() { StatsOptions statsOptions = new StatsOptions()// .addField(new SimpleField("field_1"))// .addFacet(new SimpleField("field_2")); SimpleQuery query = new SimpleQuery("*:*"); query.setStatsOptions(statsOptions); SolrQuery solrQuery = queryParser.constructSolrQuery(query); String[] fields = solrQuery.getParams(StatsParams.STATS_FIELD); String[] facets = solrQuery.getParams(StatsParams.STATS_FACET); assertEquals(1, fields.length); assertEquals(1, facets.length); assertEquals("field_1", fields[0]); assertEquals("field_2", facets[0]); } @Test // DATASOLR-160 public void testConstructSolrQueryWithSelectiveStatsFacet() { StatsOptions statsOptions = new StatsOptions()// .addField(new SimpleField("field_1"))// .addSelectiveFacet(new SimpleField("field_2")); SimpleQuery query = new SimpleQuery("*:*"); query.setStatsOptions(statsOptions); SolrQuery solrQuery = queryParser.constructSolrQuery(query); String[] fields = solrQuery.getParams(StatsParams.STATS_FIELD); String[] facets = solrQuery.getParams(CommonParams.FIELD + ".field_1." + StatsParams.STATS_FACET); assertEquals(1, fields.length); assertEquals(1, facets.length); assertEquals("field_1", fields[0]); assertEquals("field_2", facets[0]); } @Test // DATASOLR-160 public void testConstructSolrQueryWithSelectiveStatsCountDistinct() { StatsOptions statsOptions = new StatsOptions()// .addField(new SimpleField("field_1")).setSelectiveCalcDistinct(true) // .addField(new SimpleField("field_2")).setSelectiveCalcDistinct(false) // .addField(new SimpleField("field_3")); SimpleQuery query = new SimpleQuery("*:*"); query.setStatsOptions(statsOptions); SolrQuery solrQuery = queryParser.constructSolrQuery(query); String[] fields = solrQuery.getParams(StatsParams.STATS_FIELD); String[] calc1 = solrQuery.getParams(CommonParams.FIELD + ".field_1." + StatsParams.STATS_CALC_DISTINCT); String[] calc2 = solrQuery.getParams(CommonParams.FIELD + ".field_2." + StatsParams.STATS_CALC_DISTINCT); String[] calc3 = solrQuery.getParams(CommonParams.FIELD + ".field_3." + StatsParams.STATS_CALC_DISTINCT); Arrays.sort(fields); assertEquals(3, fields.length); assertArrayEquals(new String[] { "field_1", "field_2", "field_3" }, fields); assertEquals("true", calc1[0]); assertEquals("false", calc2[0]); assertNull(calc3); } @Test // DATASOLR-160 public void testConstructSolrQueryWithStatsConfig() { StatsOptions statsOptions = new StatsOptions()// .addField(new SimpleField("field_1"))// .addSelectiveFacet(new SimpleField("field_1_1"))// .addSelectiveFacet(new SimpleField("field_1_2"))// .addField("field_2")// .addFacet("field_3"); SimpleQuery query = new SimpleQuery("*:*"); query.setStatsOptions(statsOptions); SolrQuery solrQuery = queryParser.constructSolrQuery(query); List<String> fields = Arrays.asList(solrQuery.getParams(StatsParams.STATS_FIELD)); Collections.sort(fields); List<String> selectiveFacets = Arrays .asList(solrQuery.getParams(CommonParams.FIELD + ".field_1." + StatsParams.STATS_FACET)); String[] facets = solrQuery.getParams(StatsParams.STATS_FACET); assertEquals(2, fields.size()); assertEquals(2, selectiveFacets.size()); assertEquals("field_1", fields.get(0)); assertEquals("field_2", fields.get(1)); assertEquals("field_1_1", selectiveFacets.get(0)); assertEquals("field_1_2", selectiveFacets.get(1)); assertEquals("field_3", facets[0]); } @Test // DATASOLR-121 public void testConstructGroupQueryWithAllPossibleParameters() { GroupOptions groupOptions = new GroupOptions(); SimpleQuery query = new SimpleQuery(); query.addCriteria(new SimpleStringCriteria("*:*")); query.setGroupOptions(groupOptions); groupOptions.setOffset(1); groupOptions.setLimit(2); groupOptions.addGroupByField("field_1"); groupOptions.addGroupByFunction(MaxFunction.max("field_1", "field_2")); groupOptions.addGroupByQuery(new SimpleQuery("*:*")); groupOptions.addSort(new Sort(Sort.Direction.DESC, "field_3")); groupOptions.setTotalCount(true); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertGroupFormatPresent(solrQuery, true); assertEquals("field_1", solrQuery.get(GroupParams.GROUP_FIELD)); assertEquals("{!func}max(field_1,field_2)", solrQuery.get(GroupParams.GROUP_FUNC)); assertEquals("*:*", solrQuery.get(GroupParams.GROUP_QUERY)); assertEquals("field_3 desc", solrQuery.get(GroupParams.GROUP_SORT)); assertEquals("1", solrQuery.get(GroupParams.GROUP_OFFSET)); assertEquals("2", solrQuery.get(GroupParams.GROUP_LIMIT)); } @Test // DATASOLR-310 public void testConstructGroupQueryWithLimitSetToNegative1() { GroupOptions groupOptions = new GroupOptions(); SimpleQuery query = new SimpleQuery(); query.addCriteria(new SimpleStringCriteria("*:*")); query.setGroupOptions(groupOptions); groupOptions.setLimit(-1); groupOptions.addGroupByField("field_1"); groupOptions.addSort(new Sort(Sort.Direction.DESC, "field_3")); groupOptions.setTotalCount(true); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertGroupFormatPresent(solrQuery, true); assertEquals("field_1", solrQuery.get(GroupParams.GROUP_FIELD)); assertEquals("-1", solrQuery.get(GroupParams.GROUP_LIMIT)); } @Test // DATASOLR-121 public void testConstructGroupQueryWithoutPagingParameters() { SimpleQuery query = new SimpleQuery(); query.addCriteria(new SimpleStringCriteria("*:*")); query.setGroupOptions(new GroupOptions().addGroupByField("fieldName")); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertGroupFormatPresent(solrQuery, false); assertNull(solrQuery.get(GroupParams.GROUP_SORT)); assertNull(solrQuery.get(GroupParams.GROUP_OFFSET)); assertNull(solrQuery.get(GroupParams.GROUP_LIMIT)); } @Test // DATASOLR-121 public void testConstructGroupQueryWithMultipleFunctions() { SimpleQuery query = new SimpleQuery(); query.addCriteria(new SimpleStringCriteria("*:*")); query.setGroupOptions(new GroupOptions()); query.getGroupOptions().addGroupByFunction(MaxFunction.max("field_1", "field_2")); query.getGroupOptions().addGroupByFunction(MaxFunction.max("field_3", "field_4")); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertGroupFormatPresent(solrQuery, false); assertArrayEquals(new String[] { "{!func}max(field_1,field_2)", "{!func}max(field_3,field_4)" }, solrQuery.getParams(GroupParams.GROUP_FUNC)); assertNull(solrQuery.getParams(GroupParams.GROUP_QUERY)); assertNull(solrQuery.getParams(GroupParams.GROUP_FIELD)); } @Test // DATASOLR-121 public void testConstructGroupQueryWithMultipleQueries() { SimpleQuery query = new SimpleQuery(); query.addCriteria(new SimpleStringCriteria("*:*")); query.setGroupOptions(new GroupOptions()); query.getGroupOptions().addGroupByQuery(new SimpleQuery("query1")); query.getGroupOptions().addGroupByQuery(new SimpleQuery("query2")); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertGroupFormatPresent(solrQuery, false); assertArrayEquals(new String[] { "query1", "query2" }, solrQuery.getParams(GroupParams.GROUP_QUERY)); assertNull(solrQuery.getParams(GroupParams.GROUP_FUNC)); assertNull(solrQuery.getParams(GroupParams.GROUP_FIELD)); } @Test // DATASOLR-196 public void connectShouldAllowConcatinationOfCriteriaWithAndPreservingDesiredBracketing() { Criteria part1 = Criteria.where("z").is("roo"); Criteria part2 = Criteria.where("x").is("foo").or("y").is("bar"); Criteria criteria = part1.connect().and(part2); assertEquals("z:roo AND (x:foo OR y:bar)", queryParser.createQueryStringFromNode(criteria)); } @Test // DATASOLR-196 public void connectShouldAllowConcatinationOfCriteriaWithAndPreservingDesiredBracketingReverse() { Criteria part1 = Criteria.where("z").is("roo"); Criteria part2 = Criteria.where("x").is("foo").or("y").is("bar"); Criteria criteria = part2.connect().and(part1); assertEquals("(x:foo OR y:bar) AND z:roo", queryParser.createQueryStringFromNode(criteria)); } @Test // DATASOLR-196 public void connectShouldAllowConcatinationOfCriteriaWithOrPreservingDesiredBracketing() { Criteria part1 = Criteria.where("z").is("roo"); Criteria part2 = Criteria.where("x").is("foo").or("y").is("bar"); Criteria criteria = part1.connect().or(part2); assertEquals("z:roo OR (x:foo OR y:bar)", queryParser.createQueryStringFromNode(criteria)); } @Test // DATASOLR-196 public void connectShouldAllowConcatinationOfCriteriaWithOrPreservingDesiredBracketingReverse() { Criteria part1 = Criteria.where("z").is("roo"); Criteria part2 = Criteria.where("x").is("foo").or("y").is("bar"); Criteria criteria = part2.connect().or(part1); assertEquals("(x:foo OR y:bar) OR z:roo", queryParser.createQueryStringFromNode(criteria)); } @Test // DATASOLR-196 public void notOperatorShouldWrapWholeExpression() { Criteria part1 = Criteria.where("text").startsWith("fx").or("product_code").startsWith("fx"); Criteria part2 = Criteria.where("text").startsWith("option").or("product_code").startsWith("option"); Criteria criteria = part1.connect().and(part2).notOperator(); String expected = "-((text:fx* OR product_code:fx*) AND (text:option* OR product_code:option*))"; assertEquals(expected, queryParser.createQueryStringFromNode(criteria)); } @Test // DATASOLR-196 public void notOperatorShouldWrapNestedExpressionCorrectly() { Criteria part1 = Criteria.where("z").is("roo"); Criteria part2 = Criteria.where("x").is("foo").or("y").is("bar").notOperator(); Criteria criteria = part1.connect().or(part2); assertEquals("z:roo OR -(x:foo OR y:bar)", queryParser.createQueryStringFromNode(criteria)); } @Test // DATASOLR-196 public void notOperatorShouldWrapNestedExpressionCorrectlyReverse() { Criteria part1 = Criteria.where("z").is("roo"); Criteria part2 = Criteria.where("x").is("foo").or("y").is("bar").notOperator(); Criteria criteria = part2.connect().or(part1); assertEquals("-(x:foo OR y:bar) OR z:roo", queryParser.createQueryStringFromNode(criteria)); } @Test // DATASOLR-196 public void notOperatorShouldWrapNestedExpressionCorrectlyReverseWithDoubleNegation() { Criteria part1 = Criteria.where("z").is("roo"); Criteria part2 = Criteria.where("x").is("foo").or("y").is("bar").notOperator(); Criteria criteria = part2.connect().and(part1).notOperator(); assertEquals("-(-(x:foo OR y:bar) AND z:roo)", queryParser.createQueryStringFromNode(criteria)); } @Test // DATASOLR-236 public void testNegativeFacetLimitUsingFacetOptions_setFacetLimit() { FacetQuery query = new SimpleFacetQuery(new Criteria("field_1").is("value_1")); FacetOptions facetOptions = new FacetOptions(new SimpleField("facet_1")); facetOptions.setFacetLimit(-1); query.setFacetOptions(facetOptions); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertEquals(-1, solrQuery.getFacetLimit()); assertEquals(null, solrQuery.get(FacetParams.FACET_OFFSET)); } @Test // DATASOLR-236 public void testNegativeFacetLimitUsingFacetOptions_setPageable() { FacetQuery query = new SimpleFacetQuery(new Criteria("field_1").is("value_1")); FacetOptions facetOptions = new FacetOptions(new SimpleField("facet_1")); facetOptions.setPageable(new SolrPageRequest(0, -1)); query.setFacetOptions(facetOptions); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertEquals(-1, solrQuery.getFacetLimit()); assertEquals(null, solrQuery.get(FacetParams.FACET_OFFSET)); } @Test // DATASOLR-236 public void testNegativeFacetOffsetAndFacetLimitUsingFacetOptions_setPageable() { FacetQuery query = new SimpleFacetQuery(new Criteria("field_1").is("value_1")); FacetOptions facetOptions = new FacetOptions(new SimpleField("facet_1")); facetOptions.setPageable(new SolrPageRequest(1, -1)); query.setFacetOptions(facetOptions); SolrQuery solrQuery = queryParser.constructSolrQuery(query); assertEquals(-1, solrQuery.getFacetLimit()); assertEquals(Integer.valueOf(0), solrQuery.getInt(FacetParams.FACET_OFFSET)); } @Test // DATASOLR-86 public void testRegularNumericRangeFacets() { FacetOptions facetOptions = new FacetOptions() // .addFacetByRange( // new FieldWithNumericRangeParameters("field1", 4, 8, 2) // .setHardEnd(true) // .setInclude(FacetRangeInclude.ALL) // .setOther(FacetRangeOther.ALL))// .addFacetByRange( // new FieldWithNumericRangeParameters("field2", 0.5, 12.3, 0.7) // .setHardEnd(false) // .setInclude(FacetRangeInclude.OUTER) // .setOther(FacetRangeOther.NONE)) .addFacetByRange( // new FieldWithNumericRangeParameters("field3", 4, 8, 2) // .setHardEnd(true) // .setOther(FacetRangeOther.ALL))// .addFacetByRange( // new FieldWithNumericRangeParameters("field4", 4, 8, 2) // .setHardEnd(true) // .setInclude(FacetRangeInclude.OUTER)) // .addFacetByRange( // new FieldWithNumericRangeParameters("field5", 4, 8, 2));// SolrDataQuery facetQuery = new SimpleFacetQuery(new SimpleStringCriteria("*:*")).setFacetOptions(facetOptions); SolrQuery solrQuery = queryParser.constructSolrQuery(facetQuery); assertTrue(facetOptions.hasFacets()); assertArrayEquals(new String[] {}, solrQuery.getFacetFields()); assertArrayEquals(new String[] { "field1", "field2", "field3", "field4", "field5" }, solrQuery.getParams(FacetParams.FACET_RANGE)); assertEquals("4", solrQuery.getFieldParam("field1", FacetParams.FACET_RANGE_START)); assertEquals("2", solrQuery.getFieldParam("field1", FacetParams.FACET_RANGE_GAP)); assertEquals("8", solrQuery.getFieldParam("field1", FacetParams.FACET_RANGE_END)); assertEquals("true", solrQuery.getFieldParam("field1", FacetParams.FACET_RANGE_HARD_END)); assertEquals("all", solrQuery.getFieldParam("field1", FacetParams.FACET_RANGE_INCLUDE)); assertEquals("all", solrQuery.getFieldParam("field1", FacetParams.FACET_RANGE_OTHER)); assertEquals("0.5", solrQuery.getFieldParam("field2", FacetParams.FACET_RANGE_START)); assertEquals("0.7", solrQuery.getFieldParam("field2", FacetParams.FACET_RANGE_GAP)); assertEquals("12.3", solrQuery.getFieldParam("field2", FacetParams.FACET_RANGE_END)); assertNull(solrQuery.getFieldParam("field2", FacetParams.FACET_RANGE_HARD_END)); assertEquals("outer", solrQuery.getFieldParam("field2", FacetParams.FACET_RANGE_INCLUDE)); assertEquals("none", solrQuery.getFieldParam("field2", FacetParams.FACET_RANGE_OTHER)); assertEquals("4", solrQuery.getFieldParam("field3", FacetParams.FACET_RANGE_START)); assertEquals("2", solrQuery.getFieldParam("field3", FacetParams.FACET_RANGE_GAP)); assertEquals("8", solrQuery.getFieldParam("field3", FacetParams.FACET_RANGE_END)); assertEquals("true", solrQuery.getFieldParam("field3", FacetParams.FACET_RANGE_HARD_END)); assertNull("all", solrQuery.getFieldParam("field3", FacetParams.FACET_RANGE_INCLUDE)); assertEquals("all", solrQuery.getFieldParam("field3", FacetParams.FACET_RANGE_OTHER)); assertEquals("4", solrQuery.getFieldParam("field4", FacetParams.FACET_RANGE_START)); assertEquals("2", solrQuery.getFieldParam("field4", FacetParams.FACET_RANGE_GAP)); assertEquals("8", solrQuery.getFieldParam("field4", FacetParams.FACET_RANGE_END)); assertEquals("true", solrQuery.getFieldParam("field4", FacetParams.FACET_RANGE_HARD_END)); assertEquals("outer", solrQuery.getFieldParam("field4", FacetParams.FACET_RANGE_INCLUDE)); assertNull("all", solrQuery.getFieldParam("field4", FacetParams.FACET_RANGE_OTHER)); assertEquals("4", solrQuery.getFieldParam("field5", FacetParams.FACET_RANGE_START)); assertEquals("2", solrQuery.getFieldParam("field5", FacetParams.FACET_RANGE_GAP)); assertEquals("8", solrQuery.getFieldParam("field5", FacetParams.FACET_RANGE_END)); assertNull("true", solrQuery.getFieldParam("field5", FacetParams.FACET_RANGE_HARD_END)); assertNull("all", solrQuery.getFieldParam("field5", FacetParams.FACET_RANGE_INCLUDE)); assertNull("all", solrQuery.getFieldParam("field5", FacetParams.FACET_RANGE_OTHER)); } @Test // DATASOLR-86, DATASOLR-309 public void testRegularDateRangeFacets() { FacetOptions facetOptions = new FacetOptions() // .addFacetByRange( // new FieldWithDateRangeParameters("field1", new Date(100), new Date(10000000L), "+1DAY") // .setHardEnd(true) // .setInclude(FacetRangeInclude.ALL) // .setOther(FacetRangeOther.ALL))// .addFacetByRange( // new FieldWithDateRangeParameters("field2", new Date(100), new Date(10000000L), "+2DAY") // .setHardEnd(false) // .setInclude(FacetRangeInclude.OUTER) // .setOther(FacetRangeOther.NONE)) .addFacetByRange( // new FieldWithDateRangeParameters("field3", new Date(100), new Date(10000000L), "+2DAY") // .setHardEnd(true) // .setOther(FacetRangeOther.NONE)) .addFacetByRange( // new FieldWithDateRangeParameters("field4", new Date(100), new Date(10000000L), "+2DAY") // .setHardEnd(true) // .setInclude(FacetRangeInclude.OUTER)) .addFacetByRange( // new FieldWithDateRangeParameters("field5", new Date(100), new Date(10000000L), "+2DAY")); SolrDataQuery facetQuery = new SimpleFacetQuery(new SimpleStringCriteria("*:*")).setFacetOptions(facetOptions); SolrQuery solrQuery = queryParser.constructSolrQuery(facetQuery); assertTrue(facetOptions.hasFacets()); assertArrayEquals(new String[] {}, solrQuery.getFacetFields()); assertArrayEquals(new String[] { "field1", "field2", "field3", "field4", "field5" }, solrQuery.getParams(FacetParams.FACET_RANGE)); // RANGE is being used on SolrJ even for DATE fields assertEquals("1970-01-01T00:00:00.100Z", solrQuery.getFieldParam("field1", FacetParams.FACET_RANGE_START)); assertEquals("+1DAY", solrQuery.getFieldParam("field1", FacetParams.FACET_RANGE_GAP)); assertEquals("1970-01-01T02:46:40Z", solrQuery.getFieldParam("field1", FacetParams.FACET_RANGE_END)); assertEquals("true", solrQuery.getFieldParam("field1", FacetParams.FACET_RANGE_HARD_END)); assertEquals("all", solrQuery.getFieldParam("field1", FacetParams.FACET_RANGE_INCLUDE)); assertEquals("all", solrQuery.getFieldParam("field1", FacetParams.FACET_RANGE_OTHER)); assertEquals("1970-01-01T00:00:00.100Z", solrQuery.getFieldParam("field2", FacetParams.FACET_RANGE_START)); assertEquals("+2DAY", solrQuery.getFieldParam("field2", FacetParams.FACET_RANGE_GAP)); assertEquals("1970-01-01T02:46:40Z", solrQuery.getFieldParam("field2", FacetParams.FACET_RANGE_END)); assertNull(solrQuery.getFieldParam("field2", FacetParams.FACET_RANGE_HARD_END)); assertEquals("outer", solrQuery.getFieldParam("field2", FacetParams.FACET_RANGE_INCLUDE)); assertEquals("none", solrQuery.getFieldParam("field2", FacetParams.FACET_RANGE_OTHER)); assertEquals("1970-01-01T00:00:00.100Z", solrQuery.getFieldParam("field3", FacetParams.FACET_RANGE_START)); assertEquals("+2DAY", solrQuery.getFieldParam("field3", FacetParams.FACET_RANGE_GAP)); assertEquals("1970-01-01T02:46:40Z", solrQuery.getFieldParam("field3", FacetParams.FACET_RANGE_END)); assertEquals("true", solrQuery.getFieldParam("field3", FacetParams.FACET_RANGE_HARD_END)); assertNull(solrQuery.getFieldParam("field3", FacetParams.FACET_RANGE_INCLUDE)); assertEquals("none", solrQuery.getFieldParam("field3", FacetParams.FACET_RANGE_OTHER)); assertEquals("1970-01-01T00:00:00.100Z", solrQuery.getFieldParam("field4", FacetParams.FACET_RANGE_START)); assertEquals("+2DAY", solrQuery.getFieldParam("field4", FacetParams.FACET_RANGE_GAP)); assertEquals("1970-01-01T02:46:40Z", solrQuery.getFieldParam("field4", FacetParams.FACET_RANGE_END)); assertEquals("true", solrQuery.getFieldParam("field4", FacetParams.FACET_RANGE_HARD_END)); assertEquals("outer", solrQuery.getFieldParam("field4", FacetParams.FACET_RANGE_INCLUDE)); assertNull(solrQuery.getFieldParam("field4", FacetParams.FACET_RANGE_OTHER)); assertEquals("1970-01-01T00:00:00.100Z", solrQuery.getFieldParam("field5", FacetParams.FACET_RANGE_START)); assertEquals("+2DAY", solrQuery.getFieldParam("field5", FacetParams.FACET_RANGE_GAP)); assertEquals("1970-01-01T02:46:40Z", solrQuery.getFieldParam("field5", FacetParams.FACET_RANGE_END)); assertNull(solrQuery.getFieldParam("field5", FacetParams.FACET_RANGE_HARD_END)); assertNull(solrQuery.getFieldParam("field5", FacetParams.FACET_RANGE_INCLUDE)); assertNull(solrQuery.getFieldParam("field5", FacetParams.FACET_RANGE_OTHER)); } @Test // DATASOLR-86 public void testNoRangeFacetAssignmentWhenNoRangeFacetsPresent() { FacetOptions facetOptions = new FacetOptions("field1"); SolrDataQuery facetQuery = new SimpleFacetQuery(new SimpleStringCriteria("*:*")).setFacetOptions(facetOptions); SolrQuery solrQuery = queryParser.constructSolrQuery(facetQuery); assertTrue(facetOptions.hasFacets()); assertArrayEquals(new String[] { "field1" }, solrQuery.getFacetFields()); assertNull(solrQuery.getParams(FacetParams.FACET_DATE)); assertNull(solrQuery.getParams(FacetParams.FACET_RANGE)); } @Test // DATASOLR-324 public void shouldNotEnableSpellcheckWennNoSpellcheckOptionsPresent() { SimpleQuery q = new SimpleQuery(AnyCriteria.any()); SolrQuery solrQuery = queryParser.constructSolrQuery(q); assertThat(solrQuery.get("spellcheck"), is(nullValue())); } @Test // DATASOLR-324 public void shouldEnableSpellcheckWennSpellcheckOptionsPresent() { SimpleQuery q = new SimpleQuery(AnyCriteria.any()); q.setSpellcheckOptions(SpellcheckOptions.spellcheck()); SolrQuery solrQuery = queryParser.constructSolrQuery(q); assertThat(solrQuery.get("spellcheck"), is(equalTo("on"))); } @Test // DATASOLR-324 public void shouldApplySpellcheckOptionsCorrectly() { SimpleQuery q = new SimpleQuery(AnyCriteria.any()); q.setSpellcheckOptions(SpellcheckOptions.spellcheck().dictionaries("dict1", "dict2").count(5).extendedResults()); SolrQuery solrQuery = queryParser.constructSolrQuery(q); assertThat(solrQuery.get("spellcheck"), is(equalTo("on"))); assertThat(solrQuery.getParams(SpellingParams.SPELLCHECK_DICT), is(new String[] { "dict1", "dict2" })); assertThat(solrQuery.get(SpellingParams.SPELLCHECK_EXTENDED_RESULTS), is(equalTo("true"))); } private void assertPivotFactingPresent(SolrQuery solrQuery, String... expected) { assertArrayEquals(expected, solrQuery.getParams(FacetParams.FACET_PIVOT)); } private void assertFactingPresent(SolrQuery solrQuery, String... expected) { assertArrayEquals(expected, solrQuery.getFacetFields()); } private void assertFactingNotPresent(SolrQuery solrQuery) { assertNull(solrQuery.get(FacetParams.FACET_FIELD)); } private void assertQueryStringPresent(SolrQuery solrQuery) { assertNotNull(solrQuery.get(CommonParams.Q)); } private void assertProjectionNotPresent(SolrQuery solrQuery) { assertNull(solrQuery.getFields()); } private void assertProjectionPresent(SolrQuery solrQuery, String expected) { assertNotNull(solrQuery.get(CommonParams.FL)); assertEquals(expected, solrQuery.get(CommonParams.FL)); } private void assertPaginationNotPresent(SolrQuery solrQuery) { assertNull(solrQuery.getStart()); assertNull(solrQuery.getRows()); } private void assertPaginationPresent(SolrQuery solrQuery, int start, int rows) { assertEquals(Integer.valueOf(start), solrQuery.getStart()); assertEquals(Integer.valueOf(rows), solrQuery.getRows()); } private void assertGroupingNotPresent(SolrQuery solrQuery) { assertNull(solrQuery.get(GroupParams.GROUP)); assertNull(solrQuery.get(GroupParams.GROUP_FIELD)); assertNull(solrQuery.get(GroupParams.GROUP_MAIN)); } private void assertGroupingPresent(SolrQuery solrQuery, String expected) { assertNotNull(solrQuery.get(GroupParams.GROUP)); assertNotNull(solrQuery.get(GroupParams.GROUP_FIELD)); assertNotNull(solrQuery.get(GroupParams.GROUP_MAIN)); assertEquals(expected, solrQuery.get(GroupParams.GROUP_FIELD)); } private void assertGroupFormatPresent(SolrQuery solrQuery, boolean groupTotalCount) { assertEquals("true", solrQuery.get(GroupParams.GROUP)); assertEquals("false", solrQuery.get(GroupParams.GROUP_MAIN)); assertEquals("grouped", solrQuery.get(GroupParams.GROUP_FORMAT)); assertEquals(String.valueOf(groupTotalCount), solrQuery.get(GroupParams.GROUP_TOTAL_COUNT)); } }