/*
* 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.query;
import static org.hamcrest.CoreMatchers.*;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.hamcrest.collection.IsIterableContainingInOrder;
import org.hamcrest.core.Is;
import org.hamcrest.core.IsEqual;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Order;
import org.springframework.data.solr.core.query.Query.Operator;
/**
* @author Christoph Strobl
* @author Rosty Kerei
*/
public class SimpleQueryTests {
@Test(expected = IllegalArgumentException.class)
public void testAddNullCriteria() {
new SimpleQuery().addCriteria(null);
}
@Test(expected = IllegalArgumentException.class)
public void testAddCriteriaWithEmptyFieldname() {
new SimpleQuery().addCriteria(new Criteria(new SimpleField("")));
}
@Test
public void testAddCriteria() {
Criteria criteria1 = new Criteria("field_1");
Criteria criteria2 = new Criteria("field_2");
Query query = new SimpleQuery().addCriteria(criteria1).addCriteria(criteria2);
Assert.assertThat(query.getCriteria().getSiblings(), IsIterableContainingInOrder.contains(criteria1, criteria2));
}
@Test(expected = IllegalArgumentException.class)
public void testAddProjectionNullField() {
new SimpleQuery().addProjectionOnField((Field) null);
}
@Test(expected = IllegalArgumentException.class)
public void testAddProjectionNullFieldName() {
new SimpleQuery().addProjectionOnField(new SimpleField(StringUtils.EMPTY));
}
@SuppressWarnings("rawtypes")
@Test
public void testAddProjection() {
Query query = new SimpleQuery().addProjectionOnField(new SimpleField("field_1"))
.addProjectionOnField(new SimpleField("field_2"));
Assert.assertEquals(2, ((List) query.getProjectionOnFields()).size());
}
@Test
public void testSetPageRequest() {
SimpleQuery query = new SimpleQuery();
Assert.assertThat(query.getPageRequest().isUnpaged(), is(true));
Assert.assertNull(query.getOffset());
Assert.assertNull(query.getRows());
Pageable alteredPage = new PageRequest(0, 20);
query.setPageRequest(alteredPage);
Assert.assertThat(query.getPageRequest(), IsEqual.equalTo(alteredPage));
Assert.assertThat(query.getSort(), IsEqual.equalTo(Sort.unsorted()));
}
@Test
public void testSetPageRequestWithSort() {
SimpleQuery query = new SimpleQuery();
Pageable alteredPage = new PageRequest(0, 20, Sort.Direction.DESC, "value_1", "value_2");
query.setPageRequest(alteredPage);
Assert.assertThat(query.getPageRequest(), IsEqual.equalTo(alteredPage));
Assert.assertNotNull(query.getSort());
int i = 0;
for (Order order : query.getSort()) {
Assert.assertEquals(Sort.Direction.DESC, order.getDirection());
Assert.assertEquals("value_" + (++i), order.getProperty());
}
}
@Test
public void testCreateQueryWithSortedPageRequest() {
SimpleQuery query = new SimpleQuery(new SimpleStringCriteria("*:*"),
new PageRequest(0, 20, Sort.Direction.DESC, "value_1", "value_2"));
Assert.assertNotNull(query.getPageRequest());
Assert.assertNotNull(query.getSort());
int i = 0;
for (Order order : query.getSort()) {
Assert.assertEquals(Sort.Direction.DESC, order.getDirection());
Assert.assertEquals("value_" + (++i), order.getProperty());
}
}
@Test(expected = IllegalArgumentException.class)
public void testSetPageRequestWithNullValue() {
new SimpleQuery().setPageRequest(null);
}
@Test
public void testAddFacetOptions() {
FacetOptions facetOptions = new FacetOptions("field_1", "field_2");
FacetQuery query = new SimpleFacetQuery().setFacetOptions(facetOptions);
Assert.assertEquals(facetOptions, query.getFacetOptions());
}
@Test
public void testAddFacetOptionsWithNullValue() {
FacetQuery query = new SimpleFacetQuery().setFacetOptions(null);
Assert.assertNull(query.getFacetOptions());
}
@Test(expected = IllegalArgumentException.class)
public void testAddFacetOptionsWithoutFacetFields() {
new SimpleFacetQuery().setFacetOptions(new FacetOptions());
}
@Test(expected = IllegalArgumentException.class)
public void testAddGroupByNullField() {
new SimpleQuery().addGroupByField((Field) null);
}
@Test(expected = IllegalArgumentException.class)
public void testAddGroupByNullFieldName() {
new SimpleQuery().addGroupByField(new SimpleField(StringUtils.EMPTY));
}
@SuppressWarnings("rawtypes")
@Test
public void testAddGroupBy() {
Query query = new SimpleQuery().addGroupByField(new SimpleField("field_1"))
.addGroupByField(new SimpleField("field_2"));
Assert.assertEquals(2, ((List) query.getGroupByFields()).size());
}
@Test
public void testCloneQuery() {
Query query = new SimpleQuery();
Assert.assertNotSame(query, SimpleQuery.fromQuery(query));
}
@Test
public void testCloneNullQuery() {
Assert.assertNull(SimpleQuery.fromQuery(null));
}
@Test
public void testCloneQueryWithCriteria() {
Query source = new SimpleQuery(new Criteria("field_1").is("value_1"));
Query destination = SimpleQuery.fromQuery(source);
Assert.assertNotSame(source, destination);
Assert.assertEquals("field_1", destination.getCriteria().getField().getName());
}
@Test
public void testCloneQueryWithFilterQuery() {
Query source = new SimpleQuery(new Criteria("field_1").is("value_1"));
source.addFilterQuery(new SimpleQuery(new Criteria("field_2").startsWith("value_2")));
Query destination = SimpleQuery.fromQuery(source);
Assert.assertEquals(1, destination.getFilterQueries().size());
}
@Test
public void testCloneQueryWithProjection() {
Query source = new SimpleQuery(new Criteria("field_1").is("value_1"));
source.addProjectionOnField(new SimpleField("field_2"));
Query destination = SimpleQuery.fromQuery(source);
Assert.assertEquals(1, destination.getProjectionOnFields().size());
}
@Test
public void testCloneQueryWithGroupBy() {
Query source = new SimpleQuery(new Criteria("field_1").is("value_1"));
source.addGroupByField(new SimpleField("field_2"));
Query destination = SimpleQuery.fromQuery(source);
Assert.assertEquals(1, destination.getGroupByFields().size());
}
@Test
public void testCloneQueryWithSort() {
Query source = new SimpleQuery(new Criteria("field_1").is("value_1"));
source.addSort(new Sort(Sort.Direction.DESC, "field_3"));
Query destination = SimpleQuery.fromQuery(source);
Assert.assertEquals(source.getSort(), destination.getSort());
}
@Test
public void testCloneWithDefType() {
Query source = new SimpleQuery(new Criteria("field_1").is("value_1"));
source.setDefType("defType");
Query destination = SimpleQuery.fromQuery(source);
Assert.assertEquals(source.getDefType(), destination.getDefType());
}
@Test
public void testCloneWithDefaultOperator() {
Query source = new SimpleQuery(new Criteria("field_1").is("value_1"));
source.setDefaultOperator(Operator.OR);
Query destination = SimpleQuery.fromQuery(source);
Assert.assertEquals(source.getDefaultOperator(), destination.getDefaultOperator());
}
@Test
public void testCloneWithTimeAllowed() {
Query source = new SimpleQuery(new Criteria("field_1").is("value_1"));
source.setTimeAllowed(10);
Query destination = SimpleQuery.fromQuery(source);
Assert.assertEquals(source.getTimeAllowed(), destination.getTimeAllowed());
}
@Test
public void testCloneWithRequestHandler() {
Query source = new SimpleQuery(new Criteria("field_1").is("value_1"));
source.setRequestHandler("requestHandler");
Query destination = SimpleQuery.fromQuery(source);
Assert.assertEquals(source.getRequestHandler(), destination.getRequestHandler());
}
@Test
public void testAddSort() {
Sort sort = new Sort("field_2", "field_3");
Query query = new SimpleQuery(new Criteria("field_1").is("value_1"));
query.addSort(sort);
Assert.assertNotNull(query.getSort());
}
@Test
public void testAddNullSort() {
Query query = new SimpleQuery(new Criteria("field_1").is("value_1"));
query.addSort(null);
Assert.assertNull(query.getSort());
}
@Test
public void testAddNullToExistingSort() {
Sort sort = new Sort("field_2", "field_3");
Query query = new SimpleQuery(new Criteria("field_1").is("value_1"));
query.addSort(sort);
query.addSort(null);
Assert.assertNotNull(query.getSort());
Assert.assertEquals(sort, query.getSort());
}
@Test
public void testAddMultipleSort() {
Sort sort1 = new Sort("field_2", "field_3");
Sort sort2 = new Sort("field_1");
Query query = new SimpleQuery(new Criteria("field_1").is("value_1"));
query.addSort(sort1);
query.addSort(sort2);
Assert.assertNotNull(query.getSort());
Assert.assertNotNull(query.getSort().getOrderFor("field_1"));
Assert.assertNotNull(query.getSort().getOrderFor("field_2"));
Assert.assertNotNull(query.getSort().getOrderFor("field_3"));
}
@Test
public void testTimeAllowed() {
Query query = new SimpleQuery(new Criteria("field_1").is("value_1"));
Assert.assertNull(query.getTimeAllowed());
query.setTimeAllowed(100);
Assert.assertEquals(new Integer(100), query.getTimeAllowed());
}
@Test
public void shouldOverridePagableArgsByUsingExplicitSetters() {
SimpleQuery query = new SimpleQuery("*:*").setPageRequest(new PageRequest(1, 10));
query.setOffset(2L);
query.setRows(20);
Assert.assertThat(query.getOffset(), Is.is(2L));
Assert.assertThat(query.getRows(), Is.is(20));
}
}