package org.raidenjpa.query.executor;
import static org.junit.Assert.assertEquals;
import static org.raidenjpa.query.executor.WhereStackAction.NOTHING;
import static org.raidenjpa.query.executor.WhereStackAction.REDUCE;
import static org.raidenjpa.query.executor.WhereStackAction.RESOLVE;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Test;
import org.raidenjpa.entities.A;
import org.raidenjpa.query.parser.LogicExpressionElement;
import org.raidenjpa.query.parser.QueryParser;
public class WhereStackTest {
@Test
public void testAndOperationReturningTrue() {
String jpql = "SELECT a FROM A a WHERE a.stringValue = :stringValue AND a.intValue = :intValue";
QueryParser queryParser = new QueryParser(jpql);
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("stringValue", "a1");
parameters.put("intValue", 1);
A a = new A("a1", 1);
LogicExpressionExecutor logicExpressionExecutor = new LogicExpressionExecutor(queryParser.getWhere().getLogicExpression(), parameters);
logicExpressionExecutor.initStack();
List<LogicExpressionElement> elements = queryParser.getWhere().getLogicExpression().getElements();
LogicExpressionElement firstExpression = elements.get(0);
assertEquals(RESOLVE, logicExpressionExecutor.push(firstExpression));
logicExpressionExecutor.resolve(new QueryResultRow("a", a), true);
assertEquals(true, logicExpressionExecutor.getResult());
LogicExpressionElement logicOperator = elements.get(1);
assertEquals(NOTHING, logicExpressionExecutor.push(logicOperator));
LogicExpressionElement secondExpression = elements.get(2);
assertEquals(REDUCE, logicExpressionExecutor.push(secondExpression));
logicExpressionExecutor.reduce(new QueryResultRow("a", a), true);
assertEquals(true, logicExpressionExecutor.getResult());
}
@Test
public void testAndOperationReturningFalse() {
String jpql = "SELECT a FROM A a WHERE a.stringValue = :stringValue AND a.intValue = :intValue";
QueryParser queryParser = new QueryParser(jpql);
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("stringValue", "a1");
parameters.put("intValue", 2);
A a = new A("a1", 1);
LogicExpressionExecutor logicExpressionExecutor = new LogicExpressionExecutor(queryParser.getWhere().getLogicExpression(), parameters);
logicExpressionExecutor.initStack();
List<LogicExpressionElement> elements = queryParser.getWhere().getLogicExpression().getElements();
LogicExpressionElement firstExpression = elements.get(0);
assertEquals(RESOLVE, logicExpressionExecutor.push(firstExpression));
logicExpressionExecutor.resolve(new QueryResultRow("a", a), true);
assertEquals(true, logicExpressionExecutor.getResult());
LogicExpressionElement logicOperator = elements.get(1);
assertEquals(NOTHING, logicExpressionExecutor.push(logicOperator));
LogicExpressionElement secondExpression = elements.get(2);
assertEquals(REDUCE, logicExpressionExecutor.push(secondExpression));
logicExpressionExecutor.reduce(new QueryResultRow("a", a), true);
assertEquals(false, logicExpressionExecutor.getResult());
}
}