package com.breeze.test;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.hibernate.SessionFactory;
import com.breeze.hib.HibernateMetadata;
import com.breeze.metadata.DataType;
import com.breeze.metadata.IEntityType;
import com.breeze.metadata.Metadata;
import com.breeze.query.AndOrPredicate;
import com.breeze.query.AnyAllPredicate;
import com.breeze.query.BinaryPredicate;
import com.breeze.query.Expression;
import com.breeze.query.FnExpression;
import com.breeze.query.LitExpression;
import com.breeze.query.Operator;
import com.breeze.query.Predicate;
import com.breeze.query.PropExpression;
import com.breeze.query.UnaryPredicate;
import com.breeze.util.JsonGson;
import junit.framework.TestCase;
// TODO: need nested property tests
public class PredicateTest extends TestCase {
private Metadata _metadata;
protected void setUp() throws Exception {
super.setUp();
SessionFactory sf = StaticConfigurator.getSessionFactory();
_metadata = new HibernateMetadata(sf);
_metadata.build();
}
public void testFunc1ArgPred() {
String json = "{ 'month(birthDate)': { gt: 3}}";
Map map = JsonGson.fromJson(json);
Predicate pred = Predicate.predicateFromMap(map);
assertTrue(pred != null);
assertTrue(pred instanceof BinaryPredicate);
BinaryPredicate bpred = (BinaryPredicate) pred;
IEntityType et = _metadata.getEntityTypeForResourceName("Employees");
pred.validate(et);
FnExpression expr1 = (FnExpression) bpred.getExpr1();
assert(expr1.getFnName().equals("month"));
List<Expression> args = expr1.getExpressions();
assertTrue(args.size() == 1);
PropExpression arg1 = (PropExpression) args.get(0);
assertTrue(arg1.getPropertyPath().equals("birthDate"));
}
public void testFuncNArgsPred() {
String json = "{ 'substring(lastName, 1,3)': { gt: 'ABC'}}";
Map map = JsonGson.fromJson(json);
Predicate pred = Predicate.predicateFromMap(map);
assertTrue(pred != null);
assertTrue(pred instanceof BinaryPredicate);
BinaryPredicate bpred = (BinaryPredicate) pred;
IEntityType et = _metadata.getEntityTypeForResourceName("Employees");
pred.validate(et);
FnExpression expr1 = (FnExpression) bpred.getExpr1();
assertTrue(expr1.getFnName().equals("substr"));
List<Expression> args = expr1.getExpressions();
assertTrue(args.size() == 3);
PropExpression arg1 = (PropExpression) args.get(0);
assertTrue(arg1.getPropertyPath().equals("lastName"));
}
public void testBinaryPredNull() {
String pJson = "{ shipName: null }";
Map map = JsonGson.fromJson(pJson);
Predicate pred = Predicate.predicateFromMap(map);
assertTrue(pred != null);
assertTrue(pred instanceof BinaryPredicate);
BinaryPredicate bpred = (BinaryPredicate) pred;
assertTrue(bpred.getOperator() == Operator.Equals);
assertTrue(bpred.getExpr1Source().equals("shipName"));
assertTrue(bpred.getExpr2Source() == null);
IEntityType et = _metadata.getEntityTypeForResourceName("Orders");
pred.validate(et);
PropExpression expr1 = (PropExpression) bpred.getExpr1();
assertTrue(expr1.getPropertyPath().equals("shipName"));
LitExpression expr2 = (LitExpression) bpred.getExpr2();
assertTrue(expr2.getDataType() == DataType.String);
assertTrue(expr2.getValue() == null);
}
public void testBinaryPredDouble() {
String pJson = "{ freight: { '>' : 100}}";
Map map = JsonGson.fromJson(pJson);
Predicate pred = Predicate.predicateFromMap(map);
assertTrue(pred != null);
assertTrue(pred instanceof BinaryPredicate);
BinaryPredicate bpred = (BinaryPredicate) pred;
assertTrue(bpred.getOperator() == Operator.GreaterThan);
assertTrue(bpred.getExpr1Source().equals("freight"));
assertTrue(bpred.getExpr2Source().equals(100.0));
IEntityType et = _metadata.getEntityTypeForResourceName("Orders");
pred.validate(et);
PropExpression expr1 = (PropExpression) bpred.getExpr1();
assertTrue(expr1.getPropertyPath().equals("freight"));
LitExpression expr2 = (LitExpression) bpred.getExpr2();
assertTrue(expr2.getDataType() == DataType.Decimal);
assertTrue(expr2.getValue().equals(BigDecimal.valueOf(100.0)));
}
public void testBinaryPredString() {
String pJson = "{ lastName: { 'startsWith' : 'S'}}";
Map map = JsonGson.fromJson(pJson);
Predicate pred = Predicate.predicateFromMap(map);
assertTrue(pred != null);
assertTrue(pred instanceof BinaryPredicate);
BinaryPredicate bpred = (BinaryPredicate) pred;
assertTrue(bpred.getOperator() == Operator.StartsWith);
assertTrue(bpred.getExpr1Source().equals("lastName"));
assertTrue(bpred.getExpr2Source().equals("S"));
IEntityType et = _metadata.getEntityTypeForResourceName("Employees");
pred.validate(et);
PropExpression expr1 = (PropExpression) bpred.getExpr1();
assertTrue(expr1.getPropertyPath().equals("lastName"));
LitExpression expr2 = (LitExpression) bpred.getExpr2();
assertTrue(expr2.getDataType() == DataType.String);
assertTrue(expr2.getValue().equals("S"));
}
public void testBinaryPredBoolean() {
// TODO: can't validate this because 'discontinued' property is no longer on order.
String pJson = "{ discontinued: true }";
Map map = JsonGson.fromJson(pJson);
Predicate pred = Predicate.predicateFromMap(map);
assertTrue(pred != null);
assertTrue(pred instanceof BinaryPredicate);
BinaryPredicate bpred = (BinaryPredicate) pred;
assertTrue(bpred.getOperator() == Operator.Equals);
assertTrue(bpred.getExpr1Source().equals("discontinued"));
assertTrue(bpred.getExpr2Source().equals(true));
}
public void testBinaryPredStringQuote() {
String pJson = "{ 'companyName': { 'contains': \"'\" } }";
Map map = JsonGson.fromJson(pJson);
Predicate pred = Predicate.predicateFromMap(map);
assertTrue(pred != null);
assertTrue(pred instanceof BinaryPredicate);
BinaryPredicate bpred = (BinaryPredicate) pred;
assertTrue(bpred.getOperator() == Operator.Contains);
assertTrue(bpred.getExpr1Source().equals("companyName"));
assertTrue(bpred.getExpr2Source().equals("'"));
IEntityType et = _metadata.getEntityTypeForResourceName("Customers");
pred.validate(et);
PropExpression expr1 = (PropExpression) bpred.getExpr1();
assertTrue(expr1.getPropertyPath().equals("companyName"));
LitExpression expr2 = (LitExpression) bpred.getExpr2();
assertTrue(expr2.getDataType() == DataType.String);
assertTrue(expr2.getValue().equals("'"));
}
@SuppressWarnings("deprecation")
public void testBinaryExplicitDate() {
String pJson = "{ shippedDate: { value: '2015-02-09T00:00:00', dataType: 'DateTime' }}";
Map map = JsonGson.fromJson(pJson);
Predicate pred = Predicate.predicateFromMap(map);
assertTrue(pred != null);
assertTrue(pred instanceof BinaryPredicate);
BinaryPredicate bpred = (BinaryPredicate) pred;
assertTrue(bpred.getOperator() == Operator.Equals);
assertTrue(bpred.getExpr1Source().equals("shippedDate"));
assertTrue(bpred.getExpr2Source() instanceof Map);
Map expr2Source = (Map) bpred.getExpr2Source();
assertTrue(expr2Source.get("dataType").equals("DateTime"));
IEntityType et = _metadata.getEntityTypeForResourceName("Orders");
pred.validate(et);
PropExpression expr1 = (PropExpression) bpred.getExpr1();
assertTrue(expr1.getPropertyPath().equals("shippedDate"));
LitExpression expr2 = (LitExpression) bpred.getExpr2();
assertTrue(expr2.getDataType() == DataType.DateTime);
assertTrue(expr2.getValue().equals(new Date(115,1,9))); // wierd rules: yy - 1900, mm (0-11), dd (1-31)
}
public void testBinaryExplicit2() {
String pJson = "{ 'lastName': { 'startsWith': { value: 'firstName' } } }";
Map map = JsonGson.fromJson(pJson);
Predicate pred = Predicate.predicateFromMap(map);
assertTrue(pred != null);
assertTrue(pred instanceof BinaryPredicate);
BinaryPredicate bpred = (BinaryPredicate) pred;
assertTrue(bpred.getOperator() == Operator.StartsWith);
assertTrue(bpred.getExpr1Source().equals("lastName"));
assertTrue(bpred.getExpr2Source() instanceof Map);
Map expr2Source = (Map) bpred.getExpr2Source();
assertTrue(expr2Source.get("value").equals("firstName"));
IEntityType et = _metadata.getEntityTypeForResourceName("Employees");
pred.validate(et);
PropExpression expr1 = (PropExpression) bpred.getExpr1();
assertTrue(expr1.getPropertyPath().equals("lastName"));
LitExpression expr2 = (LitExpression) bpred.getExpr2();
assertTrue(expr2.getDataType() == DataType.String);
assertTrue(expr2.getValue().equals("firstName"));
}
public void testExplicitAnd() {
String pJson = "{ and: [ { freight: { gt: 100} }, { shipCity: { startsWith: 'S'} } ] }";
Map map = JsonGson.fromJson(pJson);
Predicate pred = Predicate.predicateFromMap(map);
assertTrue(pred != null);
assertTrue(pred instanceof AndOrPredicate);
AndOrPredicate aopred = (AndOrPredicate) pred;
assertTrue(aopred.getOperator() == Operator.And);
assertTrue(aopred.getPredicates().size() == 2);
List<Predicate> preds = aopred.getPredicates();
Predicate pred1 = preds.get(0);
assertTrue(pred1 instanceof BinaryPredicate);
BinaryPredicate bpred1 = (BinaryPredicate) pred1;
assertTrue(bpred1.getOperator() == Operator.GreaterThan);
assertTrue(bpred1.getExpr1Source().equals("freight"));
assertTrue(bpred1.getExpr2Source().equals(100.0));
Predicate pred2 = preds.get(1);
assertTrue(pred2 instanceof BinaryPredicate);
BinaryPredicate bpred2 = (BinaryPredicate) pred2;
assertTrue(bpred2.getOperator() == Operator.StartsWith);
assertTrue(bpred2.getExpr1Source().equals("shipCity"));
assertTrue(bpred2.getExpr2Source().equals("S"));
IEntityType et = _metadata.getEntityTypeForResourceName("Orders");
pred.validate(et);
PropExpression expr1 = (PropExpression) bpred1.getExpr1();
assertTrue(expr1.getPropertyPath().equals("freight"));
LitExpression expr2 = (LitExpression) bpred1.getExpr2();
assertTrue(expr2.getDataType() == DataType.Decimal);
assertTrue(expr2.getValue().equals(BigDecimal.valueOf(100.0)));
PropExpression expr1b = (PropExpression) bpred2.getExpr1();
assertTrue(expr1b.getPropertyPath().equals("shipCity"));
LitExpression expr2b = (LitExpression) bpred2.getExpr2();
assertTrue(expr2b.getDataType() == DataType.String);
assertTrue(expr2b.getValue().equals("S"));
}
public void testImplicitAnd() {
String pJson = "{ freight: { '>' : 100, 'lt': 200 }}";
Map map = JsonGson.fromJson(pJson);
Predicate pred = Predicate.predicateFromMap(map);
assertTrue(pred != null);
assertTrue(pred instanceof AndOrPredicate);
AndOrPredicate aopred = (AndOrPredicate) pred;
assertTrue(aopred.getOperator() == Operator.And);
assertTrue(aopred.getPredicates().size() == 2);
List<Predicate> preds = aopred.getPredicates();
Predicate pred1 = preds.get(0);
assertTrue(pred1 instanceof BinaryPredicate);
BinaryPredicate bpred = (BinaryPredicate) pred1;
assertTrue(bpred.getOperator() == Operator.GreaterThan);
assertTrue(bpred.getExpr1Source().equals("freight"));
assertTrue(bpred.getExpr2Source().equals(100.0));
Predicate pred2 = preds.get(1);
assertTrue(pred2 instanceof BinaryPredicate);
bpred = (BinaryPredicate) pred2;
assertTrue(bpred.getOperator() == Operator.LessThan);
assertTrue(bpred.getExpr1Source().equals("freight"));
assertTrue(bpred.getExpr2Source().equals(200.0));
IEntityType et = _metadata.getEntityTypeForResourceName("Orders");
pred.validate(et);
}
public void testImplicitAnd3Way() {
String pJson = "{ freight: { '>': 100}, rowVersion: { lt: 10}, shippedDate: '2015-02-09T00:00:00' }";
Map map = JsonGson.fromJson(pJson);
Predicate pred = Predicate.predicateFromMap(map);
assertTrue(pred != null);
assertTrue(pred instanceof AndOrPredicate);
AndOrPredicate aopred = (AndOrPredicate) pred;
assertTrue(aopred.getOperator() == Operator.And);
assertTrue(aopred.getPredicates().size() == 3);
List<Predicate> preds = aopred.getPredicates();
Predicate pred1 = preds.get(0);
assertTrue(pred1 instanceof BinaryPredicate);
BinaryPredicate bpred = (BinaryPredicate) pred1;
assertTrue(bpred.getOperator() == Operator.GreaterThan);
assertTrue(bpred.getExpr1Source().equals("freight"));
assertTrue(bpred.getExpr2Source().equals(100.0));
Predicate pred2 = preds.get(1);
assertTrue(pred2 instanceof BinaryPredicate);
bpred = (BinaryPredicate) pred2;
assertTrue(bpred.getOperator() == Operator.LessThan);
assertTrue(bpred.getExpr1Source().equals("rowVersion"));
assertTrue(bpred.getExpr2Source().equals(10.0));
Predicate pred3 = preds.get(2);
assertTrue(pred3 instanceof BinaryPredicate);
bpred = (BinaryPredicate) pred3;
assertTrue(bpred.getOperator() == Operator.Equals);
assertTrue(bpred.getExpr1Source().equals("shippedDate"));
assertTrue(bpred.getExpr2Source().equals("2015-02-09T00:00:00"));
IEntityType et = _metadata.getEntityTypeForResourceName("Orders");
pred.validate(et);
}
public void testNot() {
String pJson = "{ not: { freight: { gt: 100}}}";
Map map = JsonGson.fromJson(pJson);
Predicate pred = Predicate.predicateFromMap(map);
assertTrue(pred != null);
assertTrue(pred instanceof UnaryPredicate);
UnaryPredicate upred = (UnaryPredicate) pred;
assertTrue(upred.getOperator() == Operator.Not);
Predicate basePred = upred.getPredicate();
assertTrue(basePred instanceof BinaryPredicate);
BinaryPredicate bpred = (BinaryPredicate) basePred;
assertTrue(bpred.getOperator() == Operator.GreaterThan);
assertTrue(bpred.getExpr1Source().equals("freight"));
assertTrue(bpred.getExpr2Source().equals(100.0));
IEntityType et = _metadata.getEntityTypeForResourceName("Orders");
pred.validate(et);
}
public void testAny() {
String pJson = "{ orders: { any: {freight: { '>': 950 } } } }";
Map map = JsonGson.fromJson(pJson);
Predicate pred = Predicate.predicateFromMap(map);
assertTrue(pred != null);
assertTrue(pred instanceof AnyAllPredicate);
AnyAllPredicate aapred = (AnyAllPredicate) pred;
assertTrue(aapred.getOperator() == Operator.Any);
assertTrue(aapred.getExprSource().equals("orders"));
Predicate basePred = aapred.getPredicate();
assertTrue(basePred instanceof BinaryPredicate);
BinaryPredicate bpred = (BinaryPredicate) basePred;
assertTrue(bpred.getOperator() == Operator.GreaterThan);
assertTrue(bpred.getExpr1Source().equals("freight"));
assertTrue(bpred.getExpr2Source().equals(950.0));
IEntityType et = _metadata.getEntityTypeForResourceName("Customers");
pred.validate(et);
PropExpression propExpr = (PropExpression) aapred.getExpr();
assertTrue(propExpr.getPropertyPath().equals("orders"));
assertTrue(propExpr.getProperty().getName().equals("orders"));
}
public void testAndWithAll() {
String pJson = "{ and: [ { companyName: { contains: 'ar' } }, { orders: { all: { freight: 10 } } } ] }";
Map map = JsonGson.fromJson(pJson);
Predicate pred = Predicate.predicateFromMap(map);
assertTrue(pred != null);
assertTrue(pred instanceof AndOrPredicate);
AndOrPredicate aopred = (AndOrPredicate) pred;
assertTrue(aopred.getOperator() == Operator.And);
assertTrue(aopred.getPredicates().size() == 2);
List<Predicate> preds = aopred.getPredicates();
Predicate pred1 = preds.get(0);
assertTrue(pred1 instanceof BinaryPredicate);
BinaryPredicate bpred = (BinaryPredicate) pred1;
assertTrue(bpred.getOperator() == Operator.Contains);
assertTrue(bpred.getExpr1Source().equals("companyName"));
assertTrue(bpred.getExpr2Source().equals("ar"));
Predicate pred2 = preds.get(1);
assertTrue(pred2 instanceof AnyAllPredicate);
AnyAllPredicate aapred = (AnyAllPredicate) pred2;
assertTrue(aapred.getOperator() == Operator.All);
assertTrue(aapred.getExprSource().equals("orders"));
Predicate basePred = aapred.getPredicate();
assertTrue(basePred instanceof BinaryPredicate);
bpred = (BinaryPredicate) basePred;
assertTrue(bpred.getOperator() == Operator.Equals);
assertTrue(bpred.getExpr1Source().equals("freight"));
assertTrue(bpred.getExpr2Source().equals(10.0));
}
public void testBinaryPredFn() {
String pJson = "{ 'toLower(\"shipName\")': 'abc' }";
Map map = JsonGson.fromJson(pJson);
Predicate pred = Predicate.predicateFromMap(map);
assertTrue(pred != null);
assertTrue(pred instanceof BinaryPredicate);
BinaryPredicate bpred = (BinaryPredicate) pred;
assertTrue(bpred.getOperator() == Operator.Equals);
assertTrue(bpred.getExpr1Source().equals("toLower(\"shipName\")"));
assertTrue(bpred.getExpr2Source().equals("abc"));
IEntityType et = _metadata.getEntityTypeForResourceName("Orders");
pred.validate(et);
FnExpression expr1 = (FnExpression) bpred.getExpr1();
assertTrue(expr1.getFnName().equals("toLower"));
List<Expression> argExprs = expr1.getExpressions();
PropExpression argExpr1 = (PropExpression) argExprs.get(0);
assertTrue(argExpr1.getDataType() == DataType.String);
assertTrue(argExpr1.getPropertyPath().equals("shipName"));
}
}