package org.infinispan.objectfilter.impl.syntax.parser;
import static org.junit.Assert.assertEquals;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import org.infinispan.objectfilter.impl.ql.PropertyPath;
import org.infinispan.objectfilter.impl.syntax.BooleanExpr;
import org.infinispan.objectfilter.impl.syntax.ComparisonExpr;
import org.junit.Before;
import org.junit.Test;
/**
* Test for {@link ExpressionBuilder}.
*
* @author anistor@redhat.com
* @since 9.0
*/
public class ExpressionBuilderTest {
private ExpressionBuilder<Class<?>> builder;
@Before
public void setup() {
ReflectionPropertyHelper propertyHelper = new ReflectionPropertyHelper(new ReflectionEntityNamesResolver(null));
builder = new ExpressionBuilder<>(propertyHelper);
}
@Test
public void testStringEqualsQuery() {
builder.setEntityType(TestEntity.class);
builder.addComparison(PropertyPath.make("name"), ComparisonExpr.Type.EQUAL, "foo");
BooleanExpr query = builder.build();
assertEquals("EQUAL(PROP(name), CONST(\"foo\"))", query.toString());
}
@Test
public void testStringEqualsQueryOnEmbeddedProperty() {
builder.setEntityType(TestEntity.class);
builder.addComparison(PropertyPath.make("embedded.title"), ComparisonExpr.Type.EQUAL, "bar");
BooleanExpr query = builder.build();
assertEquals("EQUAL(PROP(embedded.title), CONST(\"bar\"))", query.toString());
}
@Test
public void testLongEqualsQuery() {
builder.setEntityType(TestEntity.class);
builder.addComparison(PropertyPath.make("l"), ComparisonExpr.Type.EQUAL, 10);
BooleanExpr query = builder.build();
assertEquals("EQUAL(PROP(l), CONST(10))", query.toString());
}
@Test
public void testDoubleEqualsQuery() {
builder.setEntityType(TestEntity.class);
builder.addComparison(PropertyPath.make("d"), ComparisonExpr.Type.EQUAL, 10.0);
BooleanExpr query = builder.build();
assertEquals("EQUAL(PROP(d), CONST(10.0))", query.toString());
}
@Test
public void testDateEqualsQuery() throws Exception {
builder.setEntityType(TestEntity.class);
builder.addComparison(PropertyPath.make("date"), ComparisonExpr.Type.EQUAL, makeDate("2016-09-25"));
BooleanExpr query = builder.build();
assertEquals("EQUAL(PROP(date), CONST(20160925000000000))", query.toString());
}
@Test
public void testDateRangeQuery() throws Exception {
builder.setEntityType(TestEntity.class);
builder.addRange(PropertyPath.make("date"), makeDate("2016-8-25"), makeDate("2016-10-25"));
BooleanExpr query = builder.build();
assertEquals("BETWEEN(PROP(date), CONST(20160825000000000), CONST(20161025000000000))", query.toString());
}
@Test
public void testIntegerRangeQuery() {
builder.setEntityType(TestEntity.class);
builder.addRange(PropertyPath.make("i"), 1, 10);
BooleanExpr query = builder.build();
assertEquals("BETWEEN(PROP(i), CONST(1), CONST(10))", query.toString());
}
@Test
public void testNegationQuery() {
builder.setEntityType(TestEntity.class);
builder.pushNot();
builder.addComparison(PropertyPath.make("name"), ComparisonExpr.Type.EQUAL, "foo");
BooleanExpr query = builder.build();
assertEquals("NOT(EQUAL(PROP(name), CONST(\"foo\")))", query.toString());
}
@Test
public void testConjunctionQuery() {
builder.setEntityType(TestEntity.class);
builder.pushAnd();
builder.addComparison(PropertyPath.make("name"), ComparisonExpr.Type.EQUAL, "foo");
builder.addComparison(PropertyPath.make("i"), ComparisonExpr.Type.EQUAL, 1);
BooleanExpr query = builder.build();
assertEquals("AND(EQUAL(PROP(name), CONST(\"foo\")), EQUAL(PROP(i), CONST(1)))", query.toString());
}
@Test
public void testDisjunctionQuery() {
builder.setEntityType(TestEntity.class);
builder.pushOr();
builder.addComparison(PropertyPath.make("name"), ComparisonExpr.Type.EQUAL, "foo");
builder.addComparison(PropertyPath.make("i"), ComparisonExpr.Type.EQUAL, 1);
BooleanExpr query = builder.build();
assertEquals("OR(EQUAL(PROP(name), CONST(\"foo\")), EQUAL(PROP(i), CONST(1)))", query.toString());
}
@Test
public void testNestedLogicalPredicatesQuery() {
builder.setEntityType(TestEntity.class);
builder.pushAnd();
builder.pushOr();
builder.addComparison(PropertyPath.make("name"), ComparisonExpr.Type.EQUAL, "foo");
builder.addComparison(PropertyPath.make("i"), ComparisonExpr.Type.EQUAL, 1);
builder.pop();
builder.addComparison(PropertyPath.make("l"), ComparisonExpr.Type.EQUAL, 10);
BooleanExpr query = builder.build();
assertEquals("AND(OR(EQUAL(PROP(name), CONST(\"foo\")), EQUAL(PROP(i), CONST(1))), EQUAL(PROP(l), CONST(10)))", query.toString());
}
private Date makeDate(String input) throws ParseException {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
return dateFormat.parse(input);
}
static class TestEntity {
public String id;
public String name;
public Date date;
public int i;
public long l;
public float f;
public double d;
public EmbeddedTestEntity embedded;
static class EmbeddedTestEntity {
public String title;
}
}
}