persistence@glassfish.java.net

entity-persistence-tests failure complexConstructorAggregatesTest

From: Michael Bouschen <Michael.Bouschen_at_Sun.COM>
Date: Tue, 21 Mar 2006 20:01:06 +0100

Hi Pramod,

today I figured out that one query test in entity-persistence-tests
(complexConstructorAggregatesTest from JUnitEJBQLComplexTestSuite) fails
because the test data has been changed since I have written the test. I
fixed this and you find the changes attached.

Regards Michael




/*
 * The contents of this file are subject to the terms
 * of the Common Development and Distribution License
 * (the "License"). You may not use this file except
 * in compliance with the License.
 *
 * You can obtain a copy of the license at
 * glassfish/bootstrap/legal/CDDLv1.0.txt or
 * https://glassfish.dev.java.net/public/CDDLv1.0.html.
 * See the License for the specific language governing
 * permissions and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL
 * HEADER in each file and include the License file at
 * glassfish/bootstrap/legal/CDDLv1.0.txt. If applicable,
 * add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your
 * own identifying information: Portions Copyright [yyyy]
 * [name of copyright owner]
 */
// Copyright (c) 1998, 2006, Oracle. All rights reserved.


/*
 * The contents of this file are subject to the terms
 * of the Common Development and Distribution License
 * (the "License"). You may not use this file except
 * in compliance with the License.
 *
 * You can obtain a copy of the license at
 * glassfish/bootstrap/legal/CDDLv1.0.txt or
 * https://glassfish.dev.java.net/public/CDDLv1.0.html.
 * See the License for the specific language governing
 * permissions and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL
 * HEADER in each file and include the License file at
 * glassfish/bootstrap/legal/CDDLv1.0.txt. If applicable,
 * add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your
 * own identifying information: Portions Copyright [yyyy]
 * [name of copyright owner]
 */

package oracle.toplink.essentials.testing.tests.ejb.ejbqltesting;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import junit.framework.Assert;
import junit.framework.Test;
import junit.framework.TestSuite;

import javax.persistence.Query;

import oracle.toplink.essentials.expressions.Expression;
import oracle.toplink.essentials.expressions.ExpressionBuilder;

import oracle.toplink.essentials.sessions.Session;

import oracle.toplink.essentials.queryframework.ReadAllQuery;
import oracle.toplink.essentials.queryframework.ReadObjectQuery;

import oracle.toplink.essentials.queryframework.ReportQuery;

import oracle.toplink.essentials.testing.models.cmp3.advanced.Employee;
import oracle.toplink.essentials.testing.models.cmp3.advanced.EmployeePopulator;

import oracle.toplink.essentials.testing.models.cmp3.advanced.LargeProject;
import oracle.toplink.essentials.testing.models.cmp3.advanced.Project;
import oracle.toplink.essentials.testing.framework.junit.JUnitTestCase;

import junit.extensions.TestSetup;
import oracle.toplink.essentials.sessions.DatabaseSession;
import oracle.toplink.essentials.internal.sessions.AbstractSession;
import oracle.toplink.essentials.testing.models.cmp3.advanced.AdvancedTableCreator;

/**
 * <p>
 * <b>Purpose</b>: Test complex EJBQL functionality.
 * <p>
 * <b>Description</b>: This class creates a test suite, initializes the database
 * and adds tests to the suite.
 * <p>
 * <b>Responsibilities</b>:
 * <ul>
 * <li> Run tests for complex EJBQL functionality
 * </ul>
 * @see oracle.toplink.essentials.testing.models.cmp3.advanced.EmployeePopulator
 * @see JUnitDomainObjectComparer
 */

public class JUnitEJBQLComplexTestSuite extends JUnitTestCase
{
    static JUnitDomainObjectComparer comparer; //the global comparer object used in all tests
  
    public JUnitEJBQLComplexTestSuite()
    {
        super();
    }
  
    public JUnitEJBQLComplexTestSuite(String name)
    {
        super(name);
    }
  
    //This method is run at the end of EVERY test case method
    public void tearDown()
    {
        clearCache();
    }
  
    //This suite contains all tests contained in this class
    public static Test suite()
    {
        TestSuite suite = new TestSuite();
        suite.setName("JUnitEJBQLComplexTestSuite");
        suite.addTest(new JUnitEJBQLComplexTestSuite("complexABSTest"));
        suite.addTest(new JUnitEJBQLComplexTestSuite("compexInTest"));
        suite.addTest(new JUnitEJBQLComplexTestSuite("complexLengthTest"));
        suite.addTest(new JUnitEJBQLComplexTestSuite("complexLikeTest"));
        suite.addTest(new JUnitEJBQLComplexTestSuite("complexNotInTest"));
        suite.addTest(new JUnitEJBQLComplexTestSuite("complexNotLikeTest"));
        suite.addTest(new JUnitEJBQLComplexTestSuite("complexParameterTest"));
        suite.addTest(new JUnitEJBQLComplexTestSuite("complexReverseAbsTest"));
        suite.addTest(new JUnitEJBQLComplexTestSuite("complexReverseLengthTest"));
        suite.addTest(new JUnitEJBQLComplexTestSuite("complexReverseParameterTest"));
        suite.addTest(new JUnitEJBQLComplexTestSuite("complexReverseSqrtTest"));
        suite.addTest(new JUnitEJBQLComplexTestSuite("complexSqrtTest"));
        suite.addTest(new JUnitEJBQLComplexTestSuite("complexStringInTest"));
        suite.addTest(new JUnitEJBQLComplexTestSuite("complexStringNotInTest"));
        suite.addTest(new JUnitEJBQLComplexTestSuite("complexSubstringTest"));
        suite.addTest(new JUnitEJBQLComplexTestSuite("complexNestedOneToManyUsingInClause"));
        suite.addTest(new JUnitEJBQLComplexTestSuite("complexUnusedVariableTest"));
        suite.addTest(new JUnitEJBQLComplexTestSuite("complexFetchJoinTest"));
        suite.addTest(new JUnitEJBQLComplexTestSuite("complexConstructorTest"));
        suite.addTest(new JUnitEJBQLComplexTestSuite("complexConstructorAggregatesTest"));
        suite.addTest(new JUnitEJBQLComplexTestSuite("complexResultPropertiesTest"));
        /* Removed because this functionality requires implementation in ReportQuery
        suite.addTest(new JUnitEJBQLComplexTestSuite("complexInheritanceTest"));
        

        suite.addTest(new JUnitEJBQLComplexTestSuite("complexInheritanceUsingNamedQueryTest"));
    */
        
        return new TestSetup(suite) {
     
            //This method is run at the end of the SUITE only
            protected void tearDown() {
                
                clearCache();
            }
            
            //This method is run at the start of the SUITE only
            protected void setUp() {
                
                //get session to start setup
                DatabaseSession session = JUnitTestCase.getServerSession();
                
                //create a new EmployeePopulator
                EmployeePopulator employeePopulator = new EmployeePopulator();
                
                new AdvancedTableCreator().replaceTables(session);
                
                //initialize the global comparer object
                comparer = new JUnitDomainObjectComparer();
                
                //set the session for the comparer to use
                comparer.setSession((AbstractSession)session.getActiveSession());
                
                //Populate the tables
                employeePopulator.buildExamples();
                
                //Persist the examples in the database
                employeePopulator.persistExample(session);
            }
        };
  }


    public void complexABSTest()
    {
        oracle.toplink.essentials.ejb.cmp3.EntityManager em = (oracle.toplink.essentials.ejb.cmp3.EntityManager) createEntityManager();
         
        Employee emp1 = (Employee)em.getActiveSession().readAllObjects(Employee.class).firstElement();
            Employee emp2 = (Employee)em.getActiveSession().readAllObjects(Employee.class).lastElement();
        
        clearCache();
            String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
            ejbqlString = ejbqlString + "(ABS(emp.salary) = ";
            ejbqlString = ejbqlString + emp1.getSalary() + ")";
        ejbqlString = ejbqlString + " OR (ABS(emp.salary) = ";
        ejbqlString = ejbqlString + emp2.getSalary() + ")";
        
        Vector expectedResult = new Vector();
        expectedResult.add(emp1);
        expectedResult.add(emp2);
        
        List result = (List) em.createQuery(ejbqlString).getResultList();
   
        Assert.assertTrue("Complex ABS test failed", comparer.compareObjects(result, expectedResult));
        
    }
    
    public void compexInTest()
    {
        oracle.toplink.essentials.ejb.cmp3.EntityManager em = (oracle.toplink.essentials.ejb.cmp3.EntityManager) createEntityManager();
         
        Employee emp1 = (Employee)em.getActiveSession().readAllObjects(Employee.class).firstElement();
            Employee emp2 = (Employee)em.getActiveSession().readAllObjects(Employee.class).elementAt(1);
        Employee emp3 = (Employee)em.getActiveSession().readAllObjects(Employee.class).elementAt(2);
        
            Vector expectedResult = new Vector();
            Vector idVector = new Vector();
            idVector.add(emp1.getId());
            idVector.add(emp2.getId());
            idVector.add(emp3.getId());
            
            ReadAllQuery raq = new ReadAllQuery();
            raq.setReferenceClass(Employee.class);
            ExpressionBuilder eb = new ExpressionBuilder();
            Expression whereClause = eb.get("id").in(idVector);
            raq.setSelectionCriteria(whereClause);
            expectedResult = (Vector)em.getActiveSession().executeQuery(raq);
            clearCache();
            String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE emp.id IN (";
            ejbqlString = ejbqlString + emp1.getId().toString() + ", ";
            ejbqlString = ejbqlString + emp2.getId().toString() + ", ";
            ejbqlString = ejbqlString + emp3.getId().toString();
            ejbqlString = ejbqlString + ")";
        
        List result = (List) em.createQuery(ejbqlString).getResultList();
 
        Assert.assertTrue("Complex IN test failed", comparer.compareObjects(result, expectedResult));
        
    }
    
    public void complexLengthTest()
    {
        oracle.toplink.essentials.ejb.cmp3.EntityManager em = (oracle.toplink.essentials.ejb.cmp3.EntityManager) createEntityManager();
        
        Assert.assertFalse("Warning SQL doesnot support LENGTH function", ((Session) JUnitTestCase.getServerSession()).getPlatform().isSQLServer());
        
        Employee expectedResult = (Employee)em.getActiveSession().readAllObjects(Employee.class).firstElement();
        clearCache();
        String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
            ejbqlString = ejbqlString + "(LENGTH(emp.firstName) = ";
            ejbqlString = ejbqlString + expectedResult.getFirstName().length() + ")";
        ejbqlString = ejbqlString + " AND ";
        ejbqlString = ejbqlString + "(LENGTH(emp.lastName) = ";
        ejbqlString = ejbqlString + expectedResult.getLastName().length() + ")";
        
        List result = (List) em.createQuery(ejbqlString).getResultList();

        Assert.assertTrue("Complex Length test failed", comparer.compareObjects(result, expectedResult));
    }
    
    public void complexLikeTest()
    {
        oracle.toplink.essentials.ejb.cmp3.EntityManager em = (oracle.toplink.essentials.ejb.cmp3.EntityManager) createEntityManager();
        
        Employee emp = (Employee)em.getActiveSession().readAllObjects(Employee.class).firstElement();
        
        String firstName = emp.getFirstName();
            String partialFirstName = emp.getFirstName().substring(0, 1);
            partialFirstName = partialFirstName + "_";
            partialFirstName = partialFirstName + firstName.substring(2, 4);
            partialFirstName = partialFirstName + "%";
            
            ReadAllQuery raq = new ReadAllQuery();
            raq.setReferenceClass(Employee.class);
            ExpressionBuilder eb = new ExpressionBuilder();
            Expression whereClause = eb.get("firstName").like(partialFirstName);
            raq.setSelectionCriteria(whereClause);
            Vector expectedResult = (Vector)em.getActiveSession().executeQuery(raq);
            clearCache();
            String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE emp.firstName LIKE \"" + partialFirstName + "\"";
        
        List result = (List) em.createQuery(ejbqlString).getResultList();
        
        Assert.assertTrue("Complex Like test failed", comparer.compareObjects(result, expectedResult));
        
    }
    
    public void complexNotInTest()
    {
        oracle.toplink.essentials.ejb.cmp3.EntityManager em = (oracle.toplink.essentials.ejb.cmp3.EntityManager) createEntityManager();
         
        Employee emp1 = (Employee)em.getActiveSession().readAllObjects(Employee.class).firstElement();
            Employee emp2 = (Employee)em.getActiveSession().readAllObjects(Employee.class).elementAt(1);
        Employee emp3 = (Employee)em.getActiveSession().readAllObjects(Employee.class).elementAt(2);
        
        ExpressionBuilder builder = new ExpressionBuilder();
        
        Vector idVector = new Vector();
            idVector.add(emp1.getId());
            idVector.add(emp2.getId());
            idVector.add(emp3.getId());
            
            Expression whereClause = builder.get("id").notIn(idVector);
            
            ReadAllQuery raq = new ReadAllQuery();
            raq.setReferenceClass(Employee.class);
            raq.setSelectionCriteria(whereClause);
            
            Vector expectedResult = (Vector)getServerSession().executeQuery(raq);
            clearCache();
            
            String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE emp.id NOT IN (";
            ejbqlString = ejbqlString + emp1.getId().toString() + ", ";
            ejbqlString = ejbqlString + emp2.getId().toString() + ", ";
            ejbqlString = ejbqlString + emp3.getId().toString();
            ejbqlString = ejbqlString + ")";
        
        List result = (List) em.createQuery(ejbqlString).getResultList();

        Assert.assertTrue("Complex Not IN test failed", comparer.compareObjects(result, expectedResult));
        
    }
    
    public void complexNotLikeTest()
    {
        oracle.toplink.essentials.ejb.cmp3.EntityManager em = (oracle.toplink.essentials.ejb.cmp3.EntityManager) createEntityManager();
        
        Employee emp = (Employee)em.getActiveSession().readAllObjects(Employee.class).firstElement();
        
        String firstName = emp.getFirstName();
            String partialFirstName = emp.getFirstName().substring(0, 1);
            partialFirstName = partialFirstName + "_";
            partialFirstName = partialFirstName + firstName.substring(2, 4);
            partialFirstName = partialFirstName + "%";
            
            ExpressionBuilder builder = new ExpressionBuilder();
            Expression whereClause = builder.get("firstName").notLike(partialFirstName);
            
            ReadAllQuery raq = new ReadAllQuery();
            raq.setReferenceClass(Employee.class);
            raq.setSelectionCriteria(whereClause);
            
            Vector expectedResult = (Vector)em.getActiveSession().executeQuery(raq);
            clearCache();
            String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE emp.firstName NOT LIKE \"" + partialFirstName + "\"";
        
        List result = (List) em.createQuery(ejbqlString).getResultList();
        
        Assert.assertTrue("Complex Not LIKE test failed", comparer.compareObjects(result, expectedResult));
        
    }
    
    public void complexParameterTest()
    {
        oracle.toplink.essentials.ejb.cmp3.EntityManager em = (oracle.toplink.essentials.ejb.cmp3.EntityManager) createEntityManager();
        
        Employee emp = (Employee)em.getActiveSession().readAllObjects(Employee.class).firstElement();
                
        String firstName = "firstName";
        String lastName = "lastName";
        
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression whereClause = builder.get(firstName).equal(builder.getParameter(firstName));
        whereClause = whereClause.and(builder.get(lastName).equal(builder.getParameter(lastName)));
        
        ReadAllQuery raq = new ReadAllQuery();
        raq.setReferenceClass(Employee.class);
        raq.setSelectionCriteria(whereClause);
        raq.addArgument(firstName);
        raq.addArgument(lastName);
        
            Vector parameters = new Vector();
            parameters.add(emp.getFirstName());
            parameters.add(emp.getLastName());
            
            Vector expectedResult = (Vector)em.getActiveSession().executeQuery(raq, parameters);
            clearCache();
        
            emp = (Employee)expectedResult.firstElement();
            
            // Set up the EJBQL using the retrieved employees
            String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
            ejbqlString = ejbqlString + "emp.firstName = ?1 ";
            ejbqlString = ejbqlString + " AND ";
            ejbqlString = ejbqlString + "emp.lastName = ?2";
        
        List result = (List) em.createQuery(ejbqlString).setParameter(1,emp.getFirstName()).setParameter(2,emp.getLastName()).getResultList();
    
        Assert.assertTrue("Complex Paramter test failed", comparer.compareObjects(result, expectedResult));
        
    }
    
    public void complexReverseAbsTest()
    {
       oracle.toplink.essentials.ejb.cmp3.EntityManager em = (oracle.toplink.essentials.ejb.cmp3.EntityManager) createEntityManager();
         
        Employee emp1 = (Employee)em.getActiveSession().readAllObjects(Employee.class).firstElement();
            Employee emp2 = (Employee)em.getActiveSession().readAllObjects(Employee.class).elementAt(1);
        clearCache();
            String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
            ejbqlString = ejbqlString + emp1.getSalary();
            ejbqlString = ejbqlString + " = ABS(emp.salary)";
            ejbqlString = ejbqlString + " OR ";
        ejbqlString = ejbqlString + emp2.getSalary();
        ejbqlString = ejbqlString + " = ABS(emp.salary)";
          
        Vector expectedResult = new Vector();
        expectedResult.add(emp1);
        expectedResult.add(emp2);
        
        List result = (List) em.createQuery(ejbqlString).getResultList();
        
        Assert.assertTrue("Complex reverse ABS test failed", comparer.compareObjects(result, expectedResult));
        
    }
    
    public void complexReverseLengthTest()
    {
        
        oracle.toplink.essentials.ejb.cmp3.EntityManager em = (oracle.toplink.essentials.ejb.cmp3.EntityManager) createEntityManager();
        
        Assert.assertFalse("Warning SQL doesnot support LENGTH function", ((Session) JUnitTestCase.getServerSession()).getPlatform().isSQLServer());
        
        Employee expectedResult = (Employee) em.getActiveSession().readAllObjects(Employee.class).firstElement();
        clearCache();
        
        String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
            ejbqlString = ejbqlString + expectedResult.getFirstName().length();
        ejbqlString = ejbqlString + " = LENGTH(emp.firstName)";
            ejbqlString = ejbqlString + " AND ";
        ejbqlString = ejbqlString + expectedResult.getLastName().length();
        ejbqlString = ejbqlString + " = LENGTH(emp.lastName)";
        
        List result = (List) em.createQuery(ejbqlString).getResultList();
                        
        Assert.assertTrue("Complex reverse Length test failed", comparer.compareObjects(result, expectedResult));
    }
    
    public void complexReverseParameterTest()
    {
        oracle.toplink.essentials.ejb.cmp3.EntityManager em = (oracle.toplink.essentials.ejb.cmp3.EntityManager) createEntityManager();
        
        Employee emp = (Employee)em.getActiveSession().readAllObjects(Employee.class).firstElement();
        
        String firstName = "firstName";
        String lastName = "lastName";
        
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression whereClause = builder.get(firstName).equal(builder.getParameter(firstName));
        whereClause = whereClause.and(builder.get(lastName).equal(builder.getParameter(lastName)));
        
        ReadAllQuery raq = new ReadAllQuery();
        raq.setReferenceClass(Employee.class);
        raq.setSelectionCriteria(whereClause);
        raq.addArgument(firstName);
        raq.addArgument(lastName);
        
            Vector parameters = new Vector();
            parameters.add(emp.getFirstName());
            parameters.add(emp.getLastName());
            
            Vector expectedResult = (Vector)getServerSession().executeQuery(raq, parameters);
            
        clearCache();
        
            emp = (Employee)expectedResult.firstElement();
            
            // Set up the EJBQL using the retrieved employees
            String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
            ejbqlString = ejbqlString + "?1 = emp.firstName";
            ejbqlString = ejbqlString + " AND ";
            ejbqlString = ejbqlString + "?2 = emp.lastName";
        
        List result = (List) em.createQuery(ejbqlString).setParameter(1,emp.getFirstName()).setParameter(2,emp.getLastName()).getResultList();

        Assert.assertTrue("Complex Reverse Paramter test failed", comparer.compareObjects(result, expectedResult));
        
    }
    
    public void complexReverseSqrtTest()
    {
        oracle.toplink.essentials.ejb.cmp3.EntityManager em = (oracle.toplink.essentials.ejb.cmp3.EntityManager) createEntityManager();
         
        ReadAllQuery raq = new ReadAllQuery();
        ExpressionBuilder expbldr = new ExpressionBuilder();
        Expression whereClause1 = expbldr.get("lastName").equal("TestCase1");
        Expression whereClause2 = expbldr.get("lastName").equal("TestCase2");
        raq.setReferenceClass(Employee.class);
        raq.setSelectionCriteria(whereClause1.or(whereClause2));
        
        Vector expectedResult = (Vector) em.getActiveSession().executeQuery(raq);
        
        clearCache();
        
        Employee emp1 = (Employee) expectedResult.elementAt(0);
        Employee emp2 = (Employee) expectedResult.elementAt(1);
        
            double salarySquareRoot1 = Math.sqrt((new Double(emp1.getSalary()).doubleValue()));
            double salarySquareRoot2 = Math.sqrt((new Double(emp2.getSalary()).doubleValue()));
        
            String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
            ejbqlString = ejbqlString + salarySquareRoot1;
            ejbqlString = ejbqlString + " = SQRT(emp.salary)";
                ejbqlString = ejbqlString + " OR ";
                ejbqlString = ejbqlString + salarySquareRoot2;
                ejbqlString = ejbqlString + " = SQRT(emp.salary)";
        
        List result = (List) em.createQuery(ejbqlString).getResultList();

        Assert.assertTrue("Complex Reverse Square Root test failed", comparer.compareObjects(result, expectedResult));
        
    }
    
    public void complexSqrtTest()
    {
        oracle.toplink.essentials.ejb.cmp3.EntityManager em = (oracle.toplink.essentials.ejb.cmp3.EntityManager) createEntityManager();
         
        ReadAllQuery raq = new ReadAllQuery();
        ExpressionBuilder expbldr = new ExpressionBuilder();
        Expression whereClause1 = expbldr.get("lastName").equal("TestCase1");
        Expression whereClause2 = expbldr.get("lastName").equal("TestCase2");
        raq.setReferenceClass(Employee.class);
        raq.setSelectionCriteria(whereClause1.or(whereClause2));
        
        Vector expectedResult = (Vector) em.getActiveSession().executeQuery(raq);
        
        clearCache();
        
        Employee emp1 = (Employee) expectedResult.elementAt(0);
        Employee emp2 = (Employee) expectedResult.elementAt(1);
        
        double salarySquareRoot1 = Math.sqrt((new Double(emp1.getSalary()).doubleValue()));
            double salarySquareRoot2 = Math.sqrt((new Double(emp2.getSalary()).doubleValue()));

            String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
            ejbqlString = ejbqlString + "(SQRT(emp.salary) = ";
            ejbqlString = ejbqlString + salarySquareRoot1 + ")";
                ejbqlString = ejbqlString + " OR ";
                ejbqlString = ejbqlString + "(SQRT(emp.salary) = ";
                ejbqlString = ejbqlString + salarySquareRoot2 + ")";
        
        List result = (List) em.createQuery(ejbqlString).getResultList();
        
        Assert.assertTrue("Complex Square Root test failed", comparer.compareObjects(result, expectedResult));
    }
    
    public void complexStringInTest()
    {
        oracle.toplink.essentials.ejb.cmp3.EntityManager em = (oracle.toplink.essentials.ejb.cmp3.EntityManager) createEntityManager();
         
        Employee emp1 = (Employee)em.getActiveSession().readAllObjects(Employee.class).firstElement();
            Employee emp2 = (Employee)em.getActiveSession().readAllObjects(Employee.class).elementAt(1);
        Employee emp3 = (Employee)em.getActiveSession().readAllObjects(Employee.class).elementAt(2);
        
        Vector fnVector = new Vector();
            fnVector.add(emp1.getFirstName());
            fnVector.add(emp2.getFirstName());
            fnVector.add(emp3.getFirstName());
            
            ReadAllQuery raq = new ReadAllQuery();
            raq.setReferenceClass(Employee.class);
            ExpressionBuilder eb = new ExpressionBuilder();
            Expression whereClause = eb.get("firstName").in(fnVector);
            raq.setSelectionCriteria(whereClause);
            Vector expectedResult = (Vector)getServerSession().executeQuery(raq);
            
        clearCache();
        
            String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE emp.firstName IN (";
            ejbqlString = ejbqlString + "\"" + emp1.getFirstName() + "\"" + ", ";
            ejbqlString = ejbqlString + "\"" + emp2.getFirstName() + "\"" + ", ";
            ejbqlString = ejbqlString + "\"" + emp3.getFirstName() + "\"" ;
            ejbqlString = ejbqlString + ")";
        
        List result = (List) em.createQuery(ejbqlString).getResultList();

        Assert.assertTrue("Complex String In test failed", comparer.compareObjects(result, expectedResult));
        
    }
    
    public void complexStringNotInTest()
    {
        oracle.toplink.essentials.ejb.cmp3.EntityManager em = (oracle.toplink.essentials.ejb.cmp3.EntityManager) createEntityManager();
         
        Employee emp1 = (Employee)em.getActiveSession().readAllObjects(Employee.class).firstElement();
            Employee emp2 = (Employee)em.getActiveSession().readAllObjects(Employee.class).elementAt(1);
        Employee emp3 = (Employee)em.getActiveSession().readAllObjects(Employee.class).elementAt(2);
        
            
            ExpressionBuilder builder = new ExpressionBuilder();
            
        Vector nameVector = new Vector();
            nameVector.add(emp1.getFirstName());
            nameVector.add(emp2.getFirstName());
            nameVector.add(emp3.getFirstName());
            
            
            Expression whereClause = builder.get("firstName").notIn(nameVector);
            ReadAllQuery raq = new ReadAllQuery();
            raq.setReferenceClass(Employee.class);
            raq.setSelectionCriteria(whereClause);
            
            Vector expectedResult = (Vector)em.getActiveSession().executeQuery(raq);
        
        clearCache();
        
            String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE emp.firstName NOT IN (";
            ejbqlString = ejbqlString + "\"" + emp1.getFirstName() + "\"" + ", ";
            ejbqlString = ejbqlString + "\"" + emp2.getFirstName() + "\"" + ", ";
            ejbqlString = ejbqlString + "\"" + emp3.getFirstName() + "\"" ;
            ejbqlString = ejbqlString + ")";
        
         List result = (List) em.createQuery(ejbqlString).getResultList();

         Assert.assertTrue("Complex String Not In test failed", comparer.compareObjects(result, expectedResult));
        
    }
    
    public void complexSubstringTest()
    {
        oracle.toplink.essentials.ejb.cmp3.EntityManager em = (oracle.toplink.essentials.ejb.cmp3.EntityManager) createEntityManager();
         
        Employee expectedResult = (Employee)em.getActiveSession().readAllObjects(Employee.class).firstElement();
        
        String firstNamePart, lastNamePart;
            String ejbqlString;

            firstNamePart = expectedResult.getFirstName().substring(0, 2);
        
            lastNamePart = expectedResult.getLastName().substring(0, 1);
        
            ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
            ejbqlString = ejbqlString + "(SUBSTRING(emp.firstName, 1, 2) = ";//changed from 0, 2 to 1, 2(ZYP)
            ejbqlString = ejbqlString + "\"" + firstNamePart + "\")";
        ejbqlString = ejbqlString + " AND ";
        ejbqlString = ejbqlString + "(SUBSTRING(emp.lastName, 1, 1) = ";//changed from 0, 1 to 1, 1(ZYP)
        ejbqlString = ejbqlString + "\"" + lastNamePart + "\")";
        
        List result = (List) em.createQuery(ejbqlString).getResultList();
 
        Assert.assertTrue("Complex Sub String test failed", comparer.compareObjects(result, expectedResult));
    }
    
    public void complexNestedOneToManyUsingInClause()
    {
        oracle.toplink.essentials.ejb.cmp3.EntityManager em = (oracle.toplink.essentials.ejb.cmp3.EntityManager) createEntityManager();
         
        Employee emp = (Employee)em.getActiveSession().readAllObjects(Employee.class).firstElement();
        
        ExpressionBuilder builder = new ExpressionBuilder();
            Expression whereClause = builder.anyOf("managedEmployees").anyOf("projects").
                get("name").equal("Enterprise");
            ReadAllQuery readQuery = new ReadAllQuery();
            readQuery.dontMaintainCache();
            readQuery.setReferenceClass(Employee.class);
        readQuery.setSelectionCriteria(whereClause);

            Vector expectedResult = (Vector)em.getActiveSession().executeQuery(readQuery);
            
        clearCache();
        
            String ejbqlString;
            ejbqlString = "SELECT OBJECT(emp) FROM Employee emp, " +
                "IN(emp.managedEmployees) mEmployees, IN(mEmployees.projects) projects " +
                "WHERE projects.name = 'Enterprise'";
        
        List result = (List) em.createQuery(ejbqlString).getResultList();
 
        Assert.assertTrue("Complex Nested One To Many Using In Clause test failed", comparer.compareObjects(result, expectedResult));
            
    }

    public void complexUnusedVariableTest()
    {
        oracle.toplink.essentials.ejb.cmp3.EntityManager em = (oracle.toplink.essentials.ejb.cmp3.EntityManager) createEntityManager();
         
        Employee emp = (Employee)em.getActiveSession().readAllObjects(Employee.class).firstElement();
        ReportQuery reportQuery = new ReportQuery();
            reportQuery.dontMaintainCache();
        reportQuery.setShouldReturnWithoutReportQueryResult(true);
            reportQuery.setReferenceClass(Employee.class);
        ExpressionBuilder builder = reportQuery.getExpressionBuilder();
        reportQuery.addNonFetchJoinedAttribute(builder.get("address"));
        reportQuery.addItem("emp", builder);
            Vector expectedResult = (Vector)em.getActiveSession().executeQuery(reportQuery);
            
        clearCache();
        
            String ejbqlString;
            ejbqlString = "SELECT emp FROM Employee emp JOIN emp.address a";
        List result = (List) em.createQuery(ejbqlString).getResultList();
 
        Assert.assertTrue("Complex Unused Variable test failed", comparer.compareObjects(result, expectedResult));
            
    }

    public void complexFetchJoinTest()
    {
        oracle.toplink.essentials.ejb.cmp3.EntityManager em = (oracle.toplink.essentials.ejb.cmp3.EntityManager) createEntityManager();
         
        Employee emp = (Employee)em.getServerSession().readAllObjects(Employee.class).firstElement();
        ReportQuery reportQuery = new ReportQuery();
            reportQuery.dontMaintainCache();
        reportQuery.setShouldReturnWithoutReportQueryResult(true);
            reportQuery.setReferenceClass(Employee.class);
        ExpressionBuilder builder = reportQuery.getExpressionBuilder();
        List joins = new ArrayList(1);
        joins.add(builder.get("address"));
        reportQuery.addItem("emp", builder, joins);
            Vector expectedResult = (Vector)em.getServerSession().executeQuery(reportQuery);
            
        clearCache();
        
            String ejbqlString;
            ejbqlString = "SELECT emp FROM Employee emp JOIN FETCH emp.address";
        List result = (List) em.createQuery(ejbqlString).getResultList();
 
        Assert.assertTrue("Complex Fetch Join test failed", comparer.compareObjects(result, expectedResult));
            
    }
    
    public void complexConstructorTest()
    {
        oracle.toplink.essentials.ejb.cmp3.EntityManager em = (oracle.toplink.essentials.ejb.cmp3.EntityManager) createEntityManager();
        
        Employee emp = (Employee)em.getActiveSession().readAllObjects(Employee.class).firstElement();

        // simple constructor query
            String ejbqlString = "SELECT NEW oracle.toplink.essentials.testing.tests.ejb.ejbqltesting.JUnitEJBQLComplexTestSuite.NameHolder(emp.firstName, emp.lastName) FROM Employee emp WHERE emp.id = :id";
        Query query = em.createQuery(ejbqlString);
        query.setParameter("id", emp.getId());
        NameHolder result = (NameHolder)query.getSingleResult();
        NameHolder expectedResult = new NameHolder(emp.getFirstName(), emp.getLastName());

        Assert.assertTrue("Constructor Test Case Failed", result.equals(expectedResult));
    }

    public void complexConstructorAggregatesTest()
    {
        oracle.toplink.essentials.ejb.cmp3.EntityManager em = (oracle.toplink.essentials.ejb.cmp3.EntityManager) createEntityManager();

        Collection emps = em.getActiveSession().readAllObjects(Employee.class);
        Employee emp = null;
        // find an employee with managed employees
        for (Iterator i = emps.iterator(); i.hasNext();) {
            Employee e = (Employee)i.next();
            Collection managed = e.getManagedEmployees();
            if ((managed != null) && (managed.size() > 0)) {
                emp = e;
                break;
            }
        }

        // constructor query using aggregates
        String ejbqlString = "SELECT NEW oracle.toplink.essentials.testing.tests.ejb.ejbqltesting.JUnitEJBQLComplexTestSuite.LongHolder(SUM(emp.salary), COUNT(emp)) FROM Employee emp WHERE emp.manager.id = :id";
        Query query = em.createQuery(ejbqlString);
        query.setParameter("id", emp.getId());
        LongHolder result = (LongHolder)query.getSingleResult();

        // calculate expected result
        Collection managed = emp.getManagedEmployees();
        int count = 0;
        int sum = 0;
        if (managed != null) {
            count = managed.size();
            for (Iterator i = managed.iterator(); i.hasNext();) {
                Employee e = (Employee)i.next();
                sum += e.getSalary();
            }
        }
        LongHolder expectedResult = new LongHolder(new Long(sum), new Long(count));
        
        Assert.assertTrue("Constructor with aggregates argument Test Case Failed", result.equals(expectedResult));
    }
    
    public void complexResultPropertiesTest()
    {
        oracle.toplink.essentials.ejb.cmp3.EntityManager em = (oracle.toplink.essentials.ejb.cmp3.EntityManager) createEntityManager();

        String ejbql = "SELECT e FROM Employee e ORDER BY e.id";
        Query query = em.createQuery(ejbql);
        List allEmps = query.getResultList();
        int nrOfEmps = allEmps.size();
        List result = null;
        List expectedResult = null;
        int firstResult = 2;
        int maxResults = nrOfEmps - 1;

        // Test setFirstResult
        query = em.createQuery(ejbql);
        query.setFirstResult(firstResult);
        result = query.getResultList();
        expectedResult = allEmps.subList(firstResult, nrOfEmps);
        Assert.assertTrue("Query.setFirstResult Test Case Failed", result.equals(expectedResult));

        // Test setMaxResults
        query = em.createQuery(ejbql);
        query.setMaxResults(maxResults);
        result = query.getResultList();
        expectedResult = allEmps.subList(0, maxResults);
        Assert.assertTrue("Query.setFirstResult Test Case Failed", result.equals(expectedResult));

        // Test setFirstResult and setMaxResults
        maxResults = nrOfEmps - firstResult - 1;
        query = em.createQuery(ejbql);
        query.setFirstResult(firstResult);
        query.setMaxResults(maxResults);
        result = query.getResultList();
        expectedResult = allEmps.subList(firstResult, nrOfEmps - 1);
        Assert.assertTrue("Query.setFirstResult Test Case Failed", result.equals(expectedResult));
        
    }
    
    public void complexInheritanceTest()
    {
    
        oracle.toplink.essentials.ejb.cmp3.EntityManager em = (oracle.toplink.essentials.ejb.cmp3.EntityManager) createEntityManager();
        
        ((AbstractSession) em.getActiveSession()).addAlias("ProjectBaseClass", getServerSession().getDescriptor(Project.class));
        
        Project expectedResult = (Project)em.getActiveSession().readAllObjects(Project.class).firstElement();
        String projectName = expectedResult.getName();
            ReadObjectQuery roq = new ReadObjectQuery();
            ExpressionBuilder eb = new ExpressionBuilder();
            Expression whereClause = eb.get("name").equal(projectName);
            roq.setSelectionCriteria(whereClause);
            roq.setReferenceClass(LargeProject.class);
            LargeProject proj = (LargeProject)em.getActiveSession().executeQuery(roq);

        //Set criteria for EJBQL and call super-class method to construct the EJBQL query
            String ejbqlString = "SELECT OBJECT(project) FROM ProjectBaseClass project WHERE project.name = \"" + projectName +"\"";
        
        List result = (List) em.createQuery(ejbqlString).getResultList();
        
        ((AbstractSession)em.getActiveSession()).getAliasDescriptors().remove("ProjectBaseClass");
 
        Assert.assertTrue("Complex Inheritance test failed", comparer.compareObjects(result, expectedResult));

    }
    
    public void complexInheritanceUsingNamedQueryTest()
    {
        oracle.toplink.essentials.ejb.cmp3.EntityManager em = (oracle.toplink.essentials.ejb.cmp3.EntityManager) createEntityManager();
        
        Project expectedResult = (Project)em.getActiveSession().readAllObjects(Project.class).firstElement();
            
        String argument = expectedResult.getName();
            
            //set up query, using query framework, to return a Project object which will be compared
            //against the Project object which is returned by the EJBQL query
            ReadObjectQuery roq = new ReadObjectQuery();
            roq.setReferenceClass(LargeProject.class);
            ExpressionBuilder eb = new ExpressionBuilder();
            Expression whereClause = eb.get("name").equal(argument);
            roq.setSelectionCriteria(whereClause);
            Project proj = (Project)getServerSession().executeQuery(roq);
        
        String queryName = "findLargeProjectByNameEJBQL";
        
        Session uow = (Session)em.getActiveSession();
        
        if (!(em.getActiveSession().containsQuery(queryName))) {
            ((AbstractSession)em.getActiveSession()).addAlias("ProjectBaseClass", getServerSession().getDescriptor(Project.class));

            //Named query must be built and registered with the session
            ReadObjectQuery query = new ReadObjectQuery();
            query.setEJBQLString("SELECT OBJECT(project) FROM ProjectBaseClass project WHERE project.name = ?1");
            query.setName(queryName);
            query.addArgument("1");
            query.setReferenceClass(Project.class);
            uow.addQuery("findLargeProjectByNameEJBQL", query);
        }
        
        Project result = (Project)uow.executeQuery("findLargeProjectByNameEJBQL",argument);
        
        em.getActiveSession().removeQuery("findLargeProjectByBudgetEJBQL");
        ((AbstractSession)em.getActiveSession()).getAliasDescriptors().remove("ProjectBaseClass");
  
        Assert.assertTrue("Complex Inheritance using named query test failed", comparer.compareObjects(result, expectedResult));
        
    }
    public static void main(String[] args)
    {
         junit.swingui.TestRunner.main(args);
    }

    // Helper methods and classes for constructor query test cases

    public static boolean equals(Object o1, Object o2) {
        if (o1 == o2) {
            return true;
        }
        if (o1 == null || o2 == null) {
            return false;
        }
        return o1.equals(o2);
    }
    
    public static class NameHolder {
        public String firstName;
        public String lastName;
        public NameHolder(String firstName, String lastName) {
            this.firstName = firstName;
            this.lastName = lastName;
        }
        public int hashCode() {
            int result = 0;
            result += firstName != null ? firstName.hashCode() : 0;
            result += lastName != null ? lastName.hashCode() : 0;
            return result;
        }
        public boolean equals(Object o) {
            if ((o == null) || (!(o instanceof NameHolder))) {
                return false;
            }
            NameHolder other = (NameHolder) o;
            return JUnitEJBQLComplexTestSuite.equals(this.firstName, other.firstName) &&
                JUnitEJBQLComplexTestSuite.equals(this.lastName, other.lastName);
        }
        public String toString() {
            return "NameHolder(" + firstName + ", " + lastName + ")";
        }
    }
    
    public static class LongHolder {
        public Long value1;
        public Long value2;
        public LongHolder(Long value1, Long value2) {
            this.value1 = value1;
            this.value2 = value2;
        }
        public int hashCode() {
            int result = 0;
            result += value1 != null ? value1.hashCode() : 0;
            result += value2 != null ? value2.hashCode() : 0;
            return result;
        }
        public boolean equals(Object o) {
            if ((o == null) || (!(o instanceof LongHolder))) {
                return false;
            }
            LongHolder other = (LongHolder) o;
            return JUnitEJBQLComplexTestSuite.equals(this.value1, other.value1) &&
                JUnitEJBQLComplexTestSuite.equals(this.value2, other.value2);
        }
        public String toString() {
            return "LongHolder(" + value1 + ", " + value2 + ")";
        }
    }
}