/*
Copyright 2013 Red Hat, Inc. and/or its affiliates.
This file is part of lightblue.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.redhat.lightblue.eval;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import com.redhat.lightblue.metadata.EntityMetadata;
import com.redhat.lightblue.query.QueryExpression;
import com.redhat.lightblue.util.test.AbstractJsonNodeTest;
public class QueryEvalTest extends AbstractJsonNodeTest {
EntityMetadata md;
@Before
public void setup() throws Exception {
jsonDoc = EvalTestContext.getDoc("./sample1.json");
md = EvalTestContext.getMd("./testMetadata.json");
}
@Test
public void q_value_comparison() throws Exception {
QueryExpression q = EvalTestContext.queryExpressionFromJson("{'field':'field4','op':'>','rvalue':3.5}");
QueryEvaluator qe = QueryEvaluator.getInstance(q, md);
QueryEvaluationContext ctx = qe.evaluate(jsonDoc);
Assert.assertTrue(ctx.getResult());
q = EvalTestContext.queryExpressionFromJson("{'field':'field4','op':'<','rvalue':3.5}");
qe = QueryEvaluator.getInstance(q, md);
ctx = qe.evaluate(jsonDoc);
Assert.assertFalse(ctx.getResult());
q = EvalTestContext.queryExpressionFromJson("{ '$and' : [ {'field':'field4','op':'>','rvalue':3.5},{'field':'field6.nf1','op':'>','rvalue':'nvalue0'}] }");
qe = QueryEvaluator.getInstance(q, md);
ctx = qe.evaluate(jsonDoc);
Assert.assertTrue(ctx.getResult());
}
@Test
public void q_in() throws Exception {
QueryExpression q = EvalTestContext.queryExpressionFromJson("{'field':'field3','op':'$in','values':[3]}");
QueryEvaluator qe = QueryEvaluator.getInstance(q, md);
QueryEvaluationContext ctx = qe.evaluate(jsonDoc);
Assert.assertTrue(ctx.getResult());
}
@Test
public void q_field_comparison() throws Exception {
QueryExpression q = EvalTestContext.queryExpressionFromJson("{'field':'field4','op':'>','rfield':'field3'}");
QueryEvaluator qe = QueryEvaluator.getInstance(q, md);
QueryEvaluationContext ctx = qe.evaluate(jsonDoc);
Assert.assertTrue(ctx.getResult());
}
@Test
public void q_regex() throws Exception {
QueryExpression q = EvalTestContext.queryExpressionFromJson("{'field':'field1','regex':'val.*'}");
QueryEvaluator qe = QueryEvaluator.getInstance(q, md);
QueryEvaluationContext ctx = qe.evaluate(jsonDoc);
Assert.assertTrue(ctx.getResult());
q = EvalTestContext.queryExpressionFromJson("{'field':'field1','regex':'Val.*','caseInsensitive':1}");
qe = QueryEvaluator.getInstance(q, md);
ctx = qe.evaluate(jsonDoc);
Assert.assertTrue(ctx.getResult());
q = EvalTestContext.queryExpressionFromJson("{'field':'field1','regex':'Val.*'}");
qe = QueryEvaluator.getInstance(q, md);
ctx = qe.evaluate(jsonDoc);
Assert.assertFalse(ctx.getResult());
}
@Test
public void q_logical() throws Exception {
QueryExpression q = EvalTestContext.queryExpressionFromJson("{ '$and' : [{'field':'field1','regex':'Val.*','caseInsensitive':1},{'field':'field3','op':'$eq','rvalue':3}]}");
QueryEvaluator qe = QueryEvaluator.getInstance(q, md);
QueryEvaluationContext ctx = qe.evaluate(jsonDoc);
Assert.assertTrue(ctx.getResult());
q = EvalTestContext.queryExpressionFromJson("{'$not': {'$and': [{'field':'field1','regex':'Val.*','caseInsensitive':1},{'field':'field3','op':'$eq','rvalue':3}]}}");
qe = QueryEvaluator.getInstance(q, md);
ctx = qe.evaluate(jsonDoc);
Assert.assertFalse(ctx.getResult());
q = EvalTestContext.queryExpressionFromJson("{'$not': {'$or': [{'field':'field1','regex':'Val.*'},{'field':'field3','op':'$eq','rvalue':4}]}}");
qe = QueryEvaluator.getInstance(q, md);
ctx = qe.evaluate(jsonDoc);
Assert.assertTrue(ctx.getResult());
}
@Test
public void q_arr_contains() throws Exception {
QueryExpression q = EvalTestContext.queryExpressionFromJson("{'array':'field6.nf6','contains':'$any','values':['one','five','six']}");
QueryEvaluator qe = QueryEvaluator.getInstance(q, md);
QueryEvaluationContext ctx = qe.evaluate(jsonDoc);
Assert.assertTrue(ctx.getResult());
q = EvalTestContext.queryExpressionFromJson("{'array':'field6.nf6','contains':'$all','values':['one','five','six']}");
qe = QueryEvaluator.getInstance(q, md);
ctx = qe.evaluate(jsonDoc);
Assert.assertFalse(ctx.getResult());
q = EvalTestContext.queryExpressionFromJson("{'array':'field6.nf6','contains':'$all','values':['one','two']}");
qe = QueryEvaluator.getInstance(q, md);
ctx = qe.evaluate(jsonDoc);
Assert.assertTrue(ctx.getResult());
q = EvalTestContext.queryExpressionFromJson("{'array':'field6.nf6','contains':'$none','values':['onet','twot']}");
qe = QueryEvaluator.getInstance(q, md);
ctx = qe.evaluate(jsonDoc);
Assert.assertTrue(ctx.getResult());
}
@Test
public void q_nested_array_elemmatch() throws Exception {
QueryExpression q=EvalTestContext.queryExpressionFromJson("{'array':'field12.nf1.nnf1.*.nnnf1.arr','elemMatch':{'field':'id','op':'=','rvalue':1}}");
QueryEvaluator qe = QueryEvaluator.getInstance(q, md);
QueryEvaluationContext ctx = qe.evaluate(jsonDoc);
Assert.assertTrue(ctx.getResult());
}
@Test
public void q_compare_nonexistant_field_returns_false() throws Exception {
QueryExpression q = EvalTestContext.queryExpressionFromJson("{ '$and' : [{'field':'field1','regex':'Val.*','caseInsensitive':1},{'field':'field7.5.elemf1','op':'$eq','rvalue':'x'}]}");
QueryEvaluator qe = QueryEvaluator.getInstance(q, md);
QueryEvaluationContext ctx = qe.evaluate(jsonDoc);
Assert.assertFalse(ctx.getResult());
}
@Test
public void nullObjcmp() throws Exception {
QueryExpression q = EvalTestContext.queryExpressionFromJson("{'field':'field6','op':'!=','rvalue':null}");
QueryEvaluator qe = QueryEvaluator.getInstance(q, md);
QueryEvaluationContext ctx = qe.evaluate(jsonDoc);
Assert.assertTrue(ctx.getResult());
}
}