package org.raidenjpa.query.parser; import static org.junit.Assert.assertEquals; import java.util.List; import org.junit.Test; public class SubQueryParseTest { @Test public void testInOperatorWithSubselect() { String jpql; jpql = "SELECT a FROM A a"; jpql += " WHERE a.intValue = 1 AND a.id IN (SELECT a.id FROM A a WHERE a.stringValue = :stringValue) ORDER BY a.stringValue"; QueryParser principalParser = new QueryParser(jpql); List<LogicExpressionElement> elements = principalParser.getWhere().getLogicExpression().getElements(); assertEquals(3, elements.size()); ConditionSubQuery subQuery = (ConditionSubQuery) ((Condition) elements.get(2)).getRight(); QueryParser subQueryParser = subQuery.getQueryParser(); assertEquals(1, subQueryParser.getSelect().getElements().size()); } @Test public void testInOperatorWithSubselectAndIn() { String jpql; jpql = "SELECT a FROM A a"; jpql += " WHERE a.id IN (SELECT a.id FROM A a WHERE a.stringValue = :stringValue AND a.intValue IN (:ids)) ORDER BY a.stringValue"; QueryParser principalParser = new QueryParser(jpql); List<LogicExpressionElement> elements = principalParser.getWhere().getLogicExpression().getElements(); assertEquals(1, elements.size()); ConditionSubQuery subQuery = (ConditionSubQuery) ((Condition) elements.get(0)).getRight(); QueryParser subQueryParser = subQuery.getQueryParser(); assertEquals(1, subQueryParser.getSelect().getElements().size()); assertEquals("A", subQueryParser.getFrom().getItem("a").getClassName()); assertEquals(3, subQueryParser.getWhere().getLogicExpression().getElements().size()); Condition condition = (Condition) subQueryParser.getWhere().getLogicExpression().getElements().get(2); assertEquals("a", ((ConditionPath) condition.getLeft()).getPath().get(0)); assertEquals("intValue", ((ConditionPath) condition.getLeft()).getPath().get(1)); assertEquals("IN", condition.getOperator()); assertEquals("ids", ((ConditionParameter) condition.getRight()).getParameterName()); assertEquals("a", ((OrderByElement) principalParser.getOrderBy().getElements().get(0)).getPath().get(0)); assertEquals("stringValue", ((OrderByElement) principalParser.getOrderBy().getElements().get(0)).getPath().get(1)); } }