/*
* Licensed to STRATIO (C) under one or more contributor license agreements.
* See the NOTICE file distributed with this work for additional information
* regarding copyright ownership. The STRATIO (C) licenses this file
* to you 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 com.stratio.cassandra.lucene.search.condition;
import com.stratio.cassandra.lucene.IndexException;
import com.stratio.cassandra.lucene.schema.Schema;
import com.stratio.cassandra.lucene.search.condition.builder.DateRangeConditionBuilder;
import org.apache.lucene.search.ConstantScoreQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.spatial.prefix.IntersectsPrefixTreeFilter;
import org.junit.Test;
import static com.stratio.cassandra.lucene.schema.SchemaBuilders.*;
import static com.stratio.cassandra.lucene.search.SearchBuilders.dateRange;
import static com.stratio.cassandra.lucene.search.condition.DateRangeCondition.*;
import static org.apache.lucene.spatial.query.SpatialOperation.*;
import static org.junit.Assert.*;
/**
* @author Andres de la Pena {@literal <adelapena@stratio.com>}
*/
public class DateRangeConditionTest extends AbstractConditionTest {
private static final String TIMESTAMP_PATTERN = "timestamp";
@Test
public void testBuildString() {
DateRangeConditionBuilder builder = new DateRangeConditionBuilder("field").boost(0.4)
.from("2015/01/05")
.to("2015/01/08")
.operation("intersects");
DateRangeCondition condition = builder.build();
assertNotNull("Condition is not built", condition);
assertEquals("Boost is not set", 0.4f, condition.boost, 0);
assertEquals("Field is not set", "field", condition.field);
assertEquals("From is not set", "2015/01/05", condition.from);
assertEquals("To is not set", "2015/01/08", condition.to);
assertEquals("Operation is not set", "intersects", condition.operation);
}
@Test
public void testBuildNumber() {
DateRangeConditionBuilder builder = new DateRangeConditionBuilder("field").boost(0.4)
.from(1)
.to(2)
.operation("is_within");
DateRangeCondition condition = builder.build();
assertNotNull("Condition is not built", condition);
assertEquals("Boost is not set", 0.4f, condition.boost, 0);
assertEquals("Field is not set", "field", condition.field);
assertEquals("From is not set", 1, condition.from);
assertEquals("To is not set", 2, condition.to);
assertEquals("Operation is not set", "is_within", condition.operation);
}
@Test
public void testBuildDefaults() {
DateRangeConditionBuilder builder = new DateRangeConditionBuilder("field");
DateRangeCondition condition = builder.build();
assertNotNull("Condition is not built", condition);
assertEquals("Boost is not set to default", DEFAULT_BOOST, condition.boost, 0);
assertEquals("Field is not set", "field", condition.field);
assertEquals("From is not set to default", DEFAULT_FROM, condition.from);
assertEquals("To is not set to default", DEFAULT_TO, condition.to);
assertEquals("Operation is not set to default", DEFAULT_OPERATION, condition.operation);
}
@Test
public void testJsonSerializationString() {
DateRangeConditionBuilder builder = new DateRangeConditionBuilder("field").boost(0.4)
.from("from")
.to("to")
.operation("intersects");
testJsonSerialization(builder,
"{type:\"date_range\",field:\"field\",boost:0.4," +
"from:\"from\",to:\"to\",operation:\"intersects\"}");
}
@Test
public void testJsonSerializationNumber() {
DateRangeConditionBuilder builder = new DateRangeConditionBuilder("field").boost(0.4)
.from("2015/01/05")
.to("2015/01/08")
.operation("contains");
testJsonSerialization(builder,
"{type:\"date_range\",field:\"field\",boost:0.4," +
"from:\"2015/01/05\",to:\"2015/01/08\",operation:\"contains\"}");
}
@Test
public void testJsonSerializationDefaults() {
DateRangeConditionBuilder builder = new DateRangeConditionBuilder("field");
testJsonSerialization(builder, "{type:\"date_range\",field:\"field\"}");
}
@Test
public void testParseSpatialOperationIntersectsLowerCase() {
assertEquals("Operation is not properly parsed", Intersects, parseSpatialOperation("intersects"));
}
@Test
public void testParseSpatialOperationIntersectsUpperCase() {
assertEquals("Operation is not properly parsed", Intersects, parseSpatialOperation("INTERSECTS"));
}
@Test
public void testParseSpatialOperationIsWithinLowerCase() {
assertEquals("Operation is not properly parsed", IsWithin, parseSpatialOperation("is_within"));
}
@Test
public void testParseSpatialOperationIsWithinUpperCase() {
assertEquals("Operation is not properly parsed", IsWithin, parseSpatialOperation("IS_WITHIN"));
}
@Test
public void testParseSpatialOperationIContainsLowerCase() {
assertEquals("Operation is not properly parsed", Contains, parseSpatialOperation("contains"));
}
@Test
public void testParseSpatialOperationContainsUpperCase() {
assertEquals("Operation is not properly parsed", Contains, parseSpatialOperation("CONTAINS"));
}
@Test(expected = IndexException.class)
public void testParseSpatialOperationNull() {
parseSpatialOperation(null);
}
@Test(expected = IndexException.class)
public void testParseSpatialOperationEmpty() {
parseSpatialOperation("");
}
@Test(expected = IndexException.class)
public void testParseSpatialOperationBlank() {
parseSpatialOperation(" ");
}
@Test
public void testQuery() {
Schema schema = schema().mapper("name", dateRangeMapper("to", "from").pattern(TIMESTAMP_PATTERN)).build();
DateRangeCondition condition = new DateRangeCondition(null, "name", 1L, 2L, null);
Query query = condition.query(schema);
assertNotNull("Query is not built", query);
assertTrue("Query type is wrong", query instanceof ConstantScoreQuery);
query = ((ConstantScoreQuery) query).getQuery();
assertTrue("Query type is wrong", query instanceof IntersectsPrefixTreeFilter);
IntersectsPrefixTreeFilter filter = (IntersectsPrefixTreeFilter) query;
assertEquals("Query is wrong",
"IntersectsPrefixTreeFilter(fieldName=name,queryShape=" +
"[1970-01-01T00:00:00.001 TO 1970-01-01T00:00:00.002],detailLevel=9,prefixGridScanLevel=7)",
filter.toString());
}
@Test(expected = IndexException.class)
public void testQueryWithoutValidMapper() {
Schema schema = schema().mapper("name", uuidMapper()).build();
DateRangeCondition condition = new DateRangeCondition(null, "name", 1, 2, null);
condition.query(schema);
}
@Test
public void testToString() {
DateRangeCondition condition = dateRange("name").from(1).to(2).operation("contains").boost(0.3).build();
assertEquals("Method #toString is wrong",
"DateRangeCondition{boost=0.3, field=name, from=1, to=2, operation=contains}",
condition.toString());
}
}