package org.araqne.logdb.query.parser;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import org.araqne.logdb.QueryParseException;
import org.araqne.logdb.QueryParserService;
import org.araqne.logdb.Row;
import org.araqne.logdb.impl.FunctionRegistryImpl;
import org.araqne.logdb.query.command.Eval;
import org.araqne.logdb.query.engine.QueryParserServiceImpl;
import org.junit.Before;
import org.junit.Test;
public class EvalParserTest {
private QueryParserService queryParserService;
@Before
public void setup() {
QueryParserServiceImpl p = new QueryParserServiceImpl();
p.setFunctionRegistry(new FunctionRegistryImpl());
queryParserService = p;
}
@Test
public void testConstantExpr() {
EvalParser p = new EvalParser();
p.setQueryParserService(queryParserService);
{
Eval eval = (Eval) p.parse(null, "eval n=1+2+min(10, 4, 34, -9)");
Row r = new Row();
eval.onPush(r);
assertEquals(1, r.map().size());
assertEquals(-6L, r.get("n"));
}
{
Eval eval = (Eval) p.parse(null, "eval n=1+2+min(10, 4, 34, -9), t=\"asdf\"");
Row r = new Row();
eval.onPush(r);
assertEquals(2, r.map().size());
assertEquals(-6L, r.get("n"));
assertEquals("asdf", r.get("t"));
}
{
Eval eval = (Eval) p.parse(null, "eval b=1==2");
Row r = new Row();
eval.onPush(r);
assertEquals(1, r.map().size());
assertEquals(false, r.get("b"));
}
{
Eval eval = (Eval) p.parse(null, "eval a=b=1+2-5, c=2, d=3");
Row r = new Row();
eval.onPush(r);
assertEquals(4, r.map().size());
assertEquals(-2L, r.get("a"));
assertEquals(-2L, r.get("b"));
assertEquals(2, r.get("c"));
assertEquals(3, r.get("d"));
}
{
Eval eval = (Eval) p.parse(null, "eval (seq=min(1, 3, 4, -1))");
Row r = new Row();
eval.onPush(r);
assertEquals(1, r.map().size());
assertEquals(-1, r.get("seq"));
}
}
@Test
public void testBackwardCompatibility() {
EvalParser p = new EvalParser();
p.setQueryParserService(queryParserService);
{
Eval eval = (Eval) p.parse(null, "eval (seq=min(1, 3, 4, -1))");
assertEquals("eval seq=min(1, 3, 4, -1)", eval.toString());
Row r = new Row();
eval.onPush(r);
assertEquals(1, r.map().size());
assertEquals(-1, r.get("seq"));
}
}
@Test
public void testBrokenEval1() {
EvalParser p = new EvalParser();
p.setQueryParserService(queryParserService);
String query = "eval test";
try {
p.parse(null, query);
fail();
} catch (QueryParseException e) {
if(e.isDebugMode()){
System.out.println("query " + query);
System.out.println(e.getMessage());
}
assertEquals("20100", e.getType());
assertEquals(5, e.getStartOffset());
assertEquals(8, e.getEndOffset());
}
}
@Test
public void testBrokenEval2() {
EvalParser p = new EvalParser();
p.setQueryParserService(queryParserService);
String query = "eval =";
try {
p.parse(null, query);
fail();
} catch (QueryParseException e) {
if(e.isDebugMode()){
System.out.println("query " + query);
System.out.println(e.getMessage());
}
assertEquals("90100", e.getType());
assertEquals(5, e.getStartOffset());
assertEquals(7, e.getEndOffset());
}
query = "eval =";
try {
p.parse(null, query);
fail();
} catch (QueryParseException e) {
if(e.isDebugMode()){
System.out.println("query " + query);
System.out.println(e.getMessage());
}
assertEquals("90100", e.getType());
assertEquals(5, e.getStartOffset());
assertEquals(5, e.getEndOffset());
}
}
@Test
public void testBrokenEval3() {
EvalParser p = new EvalParser();
p.setQueryParserService(queryParserService);
String query = "eval n= ";
try {
p.parse(null, query);
fail();
} catch (QueryParseException e) {
if(e.isDebugMode()){
System.out.println("query " + query);
System.out.println(e.getMessage());
}
assertEquals("90100", e.getType());
assertEquals(5, e.getStartOffset());
assertEquals(10, e.getEndOffset());
}
}
@Test
public void testEvalQueryGeneration() {
EvalParser p = new EvalParser();
p.setQueryParserService(queryParserService);
Eval eval = (Eval) p.parse(null, "eval n=1+2");
assertEquals("eval n=(1 + 2)", eval.toString());
}
@Test
public void testError90100() {
EvalParser p = new EvalParser();
p.setQueryParserService(queryParserService);
try {
p.parse(null, "eval n=abs(-1+ )");
fail();
} catch (QueryParseException e) {
if (e.isDebugMode()) {
System.out.println(e.getMessage());
}
assertEquals("90100", e.getType());
assertEquals("n=abs(-1+ )", e.getParams().get("value"));
}
}
}