package org.raidenjpa.query.parser;
import static org.junit.Assert.assertEquals;
import java.util.List;
import org.junit.Test;
import org.raidenjpa.util.BadSmell;
public class WhereParseTest {
@Test
public void testOneExpression() {
String jpql = "SELECT a FROM A a WHERE a.stringValue = :a ORDER BY a.stringValue";
QueryParser parser = new QueryParser(jpql);
List<LogicExpressionElement> elements = parser.getWhere().getLogicExpression().getElements();
Condition condition = (Condition) elements.get(0);
assertExpression(condition, "a.stringValue", "=", "a");
assertEquals(1, elements.size());
}
@Test
public void testIsNullExpression() {
String jpql = "SELECT a FROM A a WHERE a.stringValue is null";
QueryParser parser = new QueryParser(jpql);
List<LogicExpressionElement> elements = parser.getWhere().getLogicExpression().getElements();
Condition condition = (Condition) elements.get(0);
assertNullExpression(condition, "a.stringValue", "is", "null");
}
@Test
public void testIsNullExpressionWithLogicOperator() {
String jpql = "SELECT a FROM A a WHERE a.stringValue is null AND a.stringValue = :stringValue";
QueryParser parser = new QueryParser(jpql);
List<LogicExpressionElement> elements = parser.getWhere().getLogicExpression().getElements();
Condition condition = (Condition) elements.get(0);
assertNullExpression(condition, "a.stringValue", "is", "null");
org.junit.Assert.assertTrue(elements.get(1) instanceof LogicOperator);
org.junit.Assert.assertTrue(elements.get(2) instanceof Condition);
}
@Test
public void testAndExpression() {
String jpql;
jpql = "SELECT a FROM A a";
jpql += " WHERE a.stringValue = :stringValue AND a.intValue = :intValue ORDER BY a.stringValue";
QueryParser parser = new QueryParser(jpql);
List<LogicExpressionElement> elements = parser.getWhere().getLogicExpression().getElements();
Condition firstExpression = (Condition) elements.get(0);
assertExpression(firstExpression, "a.stringValue", "=", "stringValue");
LogicOperator logicOperator = (LogicOperator) elements.get(1);
assertEquals("AND", logicOperator.getOperator());
Condition secondExpression = (Condition) elements.get(2);
assertExpression(secondExpression, "a.intValue", "=", "intValue");
}
@Test
public void testInOperator() {
String jpql;
jpql = "SELECT a FROM A a";
jpql += " WHERE a.intValue IN (:values)";
QueryParser parser = new QueryParser(jpql);
List<LogicExpressionElement> elements = parser.getWhere().getLogicExpression().getElements();
assertEquals(1, elements.size());
Condition firstExpression = (Condition) elements.get(0);
assertExpression(firstExpression, "a.intValue", "IN", "values");
}
@Test
public void testWhereLiteral() {
String jpql;
jpql = "SELECT a FROM A a";
jpql += " WHERE a.intValue = 1";
QueryParser parser = new QueryParser(jpql);
List<LogicExpressionElement> elements = parser.getWhere().getLogicExpression().getElements();
Condition firstExpression = (Condition) elements.get(0);
assertExpression(firstExpression, "a.intValue", "=", "1");
}
@Test
public void testLike() {
String jpql;
jpql = "SELECT a FROM A a";
jpql += " WHERE a.intValue like :a1";
QueryParser parser = new QueryParser(jpql);
assertEquals("like", ((Condition) parser.getWhere().getLogicExpression().getElements().get(0)).getOperator());
}
@BadSmell("Duplicated")
private void assertNullExpression(Condition condition, String leftSide, String operator, String parameterName) {
ConditionPath left = (ConditionPath) condition.getLeft();
String[] paths = leftSide.split("\\.");
assertEquals(paths.length, left.getPath().size());
assertEquals(paths[0], left.getPath().get(0));
assertEquals(paths[1], left.getPath().get(1));
assertEquals(operator, condition.getOperator());
org.junit.Assert.assertTrue(condition.getRight() instanceof ConditionNull);
}
private void assertExpression(Condition condition, String leftSide, String operator, String parameterName) {
ConditionPath left = (ConditionPath) condition.getLeft();
String[] paths = leftSide.split("\\.");
assertEquals(paths.length, left.getPath().size());
assertEquals(paths[0], left.getPath().get(0));
assertEquals(paths[1], left.getPath().get(1));
assertEquals(operator, condition.getOperator());
ConditionParameter right = (ConditionParameter) condition.getRight();
assertEquals(parameterName, right.getParameterName());
}
}