public void testProjectOuterJoinTeamLeaderAddressTeamMembersAddressPhonesWhereProjectName() {
    ReadAllQuery query = new ReadAllQuery();
    query.setReferenceClass(Project.class);
    query.setSelectionCriteria(
        query
            .getExpressionBuilder()
            .get("name")
            .equal("Problem Reporting System")
            .or(query.getExpressionBuilder().get("name").equal("Bleep Blob")));

    ReadAllQuery controlQuery = (ReadAllQuery) query.clone();

    Expression teamLeader = query.getExpressionBuilder().getAllowingNull("teamLeader");
    query.addJoinedAttribute(teamLeader);
    Expression teamLeaderAddress = teamLeader.getAllowingNull("address");
    query.addJoinedAttribute(teamLeaderAddress);
    Expression teamMembers = query.getExpressionBuilder().anyOfAllowingNone("teamMembers");
    query.addJoinedAttribute(teamMembers);
    Expression teamMembersAddress = teamMembers.getAllowingNull("address");
    query.addJoinedAttribute(teamMembersAddress);
    Expression teamMembersPhones = teamMembers.anyOfAllowingNone("phoneNumbers");
    query.addJoinedAttribute(teamMembersPhones);

    String errorMsg = executeQueriesAndCompareResults(controlQuery, query);
    if (errorMsg.length() > 0) {
      fail(errorMsg);
    }
  }
  /** INTERNAL: Select all objects for a concrete descriptor. */
  protected Object selectAllObjects(ReadAllQuery query) {
    ReadAllQuery concreteQuery = (ReadAllQuery) query.deepClone();
    concreteQuery.setReferenceClass(descriptor.getJavaClass());
    concreteQuery.setDescriptor(descriptor);

    // Avoid cloning the query again ...
    concreteQuery.setIsExecutionClone(true);
    concreteQuery
        .getExpressionBuilder()
        .setQueryClassAndDescriptor(descriptor.getJavaClass(), descriptor);

    // Update the selection criteria if needed as well and don't lose
    // the translation row.
    if (concreteQuery.getQueryMechanism().getSelectionCriteria() != null) {
      // make sure query builder is used for the selection criteria as deepClone will create
      // two separate builders.
      concreteQuery.setSelectionCriteria(
          concreteQuery
              .getQueryMechanism()
              .getSelectionCriteria()
              .rebuildOn(concreteQuery.getExpressionBuilder()));
      return query.getSession().executeQuery(concreteQuery, query.getTranslationRow());
    }

    return query.getSession().executeQuery(concreteQuery);
  }
  public void testEmployeeOuterJoinAddressPhoneProjectsTeamLeaderAddressTeamMembersPhones() {
    ReadAllQuery query = new ReadAllQuery();
    query.setReferenceClass(Employee.class);

    ReadAllQuery controlQuery = (ReadAllQuery) query.clone();

    // Note that without the following two lines address and phones are not read not for all
    // Employees:
    // once an Employee is built (without Address and Phones)
    // it's not going to be rebuilt (get Address and Phones) when it's
    // up again either as a teamLeader or teamMember.
    // That means that only Employees read first indirectly (either as teamLeaders or
    // teamMembers would've got Phones and Addresses).
    query.addJoinedAttribute(query.getExpressionBuilder().getAllowingNull("address"));
    query.addJoinedAttribute(query.getExpressionBuilder().anyOfAllowingNone("phoneNumbers"));

    Expression projects = query.getExpressionBuilder().anyOfAllowingNone("projects");
    query.addJoinedAttribute(projects);
    Expression teamLeader = projects.getAllowingNull("teamLeader");
    query.addJoinedAttribute(teamLeader);
    Expression teamLeaderAddress = teamLeader.getAllowingNull("address");
    query.addJoinedAttribute(teamLeaderAddress);
    Expression teamMembers = projects.anyOfAllowingNone("teamMembers");
    query.addJoinedAttribute(teamMembers);
    Expression teamMembersPhones = teamMembers.anyOfAllowingNone("phoneNumbers");
    query.addJoinedAttribute(teamMembersPhones);

    String errorMsg = executeQueriesAndCompareResults(controlQuery, query);
    if (errorMsg.length() > 0) {
      fail(errorMsg);
    }
  }
 public void test() {
   ReadAllQuery q = new ReadAllQuery();
   q.setBatchFetchType(batchType);
   q.setReferenceClass(Shipment.class);
   q.addBatchReadAttribute("employee");
   q.setSelectionCriteria(
       q.getExpressionBuilder()
           .get("employee")
           .get("address")
           .equal(q.getExpressionBuilder().getParameter("ADDRESS")));
   q.addArgument("ADDRESS");
   Vector r = new Vector();
   r.addElement("885 Meadowlands Dr.");
   UnitOfWork uow = getSession().acquireUnitOfWork();
   v = (java.util.Vector) uow.executeQuery(q, r);
 }
  public void testDeleteExpression() {
    if (isOnServer()) {
      // Not work on server.
      return;
    }
    if ((JUnitTestCase.getServerSession()).getPlatform().isSymfoware()) {
      getServerSession()
          .logMessage(
              "Test testDeleteExpression skipped for this platform, "
                  + "Symfoware doesn't support UpdateAll/DeleteAll on multi-table objects (see rfe 298193).");
      return;
    }

    JpaEntityManager em = (org.eclipse.persistence.jpa.JpaEntityManager) createEntityManager();
    try {
      beginTransaction(em);
      String orderString = "DELETE FROM OrderBean o WHERE o.customer.name ='Karen McDonald' ";
      em.createQuery(orderString).executeUpdate();
      orderString = "DELETE FROM OrderBean o WHERE o.billedCustomer.name ='Karen McDonald' ";
      em.createQuery(orderString).executeUpdate();
      String ejbqlString = "DELETE FROM Customer c WHERE c.name='Karen McDonald' ";
      int result = em.createQuery(ejbqlString).executeUpdate();
      Assert.assertEquals("Delete Expression test failed: customer to delete not found", 1, result);
      em.flush();

      ReadAllQuery raq = new ReadAllQuery(Customer.class, new ExpressionBuilder());
      Expression whereClause = raq.getExpressionBuilder().get("name").equal("Karen McDonald");
      raq.setSelectionCriteria(whereClause);
      List customerFound = (List) em.getActiveSession().executeQuery(raq);
      Assert.assertEquals("Delete Expression test failed", 0, customerFound.size());
    } finally {
      rollbackTransaction(em);
    }
  }
  public void testProblemReporterProjectJoinTeamMembersJoinAddress() {
    ReadAllQuery query = new ReadAllQuery();
    query.setReferenceClass(Project.class);
    query.setSelectionCriteria(query.getExpressionBuilder().get("name").equal("Problem Reporter"));

    ReadAllQuery controlQuery = (ReadAllQuery) query.clone();

    Expression teamMembers = query.getExpressionBuilder().anyOf("teamMembers");
    query.addJoinedAttribute(teamMembers);
    Expression teamMembersAddress = teamMembers.get("address");
    query.addJoinedAttribute(teamMembersAddress);

    String errorMsg = executeQueriesAndCompareResults(controlQuery, query);
    if (errorMsg.length() > 0) {
      fail(errorMsg);
    }
  }
 public void run() {
   org.eclipse.persistence.queries.ReadAllQuery query =
       new org.eclipse.persistence.queries.ReadAllQuery(ConcurrentLargeProject.class);
   query.setSelectionCriteria(query.getExpressionBuilder().get("id").equal(idToUse));
   query.addJoinedAttribute("location");
   query.refreshIdentityMapResult();
   session.executeQuery(query);
 }
  public void testEmployeeJoinProjectsJoinTeamLeaderJoinAddressWhereManagerIsNull() {
    ReadAllQuery query = new ReadAllQuery();
    query.setReferenceClass(Employee.class);
    query.setSelectionCriteria(query.getExpressionBuilder().get("manager").isNull());

    ReadAllQuery controlQuery = (ReadAllQuery) query.clone();
    Expression projects = query.getExpressionBuilder().anyOf("projects");
    query.addJoinedAttribute(projects);
    Expression teamLeader = projects.get("teamLeader");
    query.addJoinedAttribute(teamLeader);
    Expression teamLeaderAddress = teamLeader.get("address");
    query.addJoinedAttribute(teamLeaderAddress);

    String errorMsg = executeQueriesAndCompareResults(controlQuery, query);
    if (errorMsg.length() > 0) {
      fail(errorMsg);
    }
  }
  public void testOrderByExpression() {
    EntityManager em = createEntityManager();

    ReadAllQuery raq = new ReadAllQuery(PhoneNumber.class, new ExpressionBuilder());
    Expression whereClause =
        raq.getExpressionBuilder().get("owner").get("address").get("province").equal("ONT");
    raq.setSelectionCriteria(whereClause);
    raq.addOrdering(raq.getExpressionBuilder().get("areaCode"));
    raq.addOrdering(raq.getExpressionBuilder().get("type"));
    List expectedResult = (List) getServerSession().executeQuery(raq);

    String ejbqlString =
        "SELECT p FROM Employee e JOIN e.phoneNumbers p JOIN e.address a WHERE a.province = 'ONT' "
            + "ORDER BY p.areaCode, p.type";
    List result = em.createQuery(ejbqlString).getResultList();
    Assert.assertEquals("OrderBy expression test failed: data validation error", result.size(), 13);
    Assert.assertTrue(
        "OrderBy expression test failed", comparer.compareObjects(expectedResult, result));
  }
  public void testEmployeeJoinProjects() {
    ReadAllQuery query = new ReadAllQuery();
    query.setReferenceClass(Employee.class);

    ReadAllQuery controlQuery = (ReadAllQuery) query.clone();
    query.addJoinedAttribute(query.getExpressionBuilder().anyOf("projects"));

    String errorMsg = executeQueriesAndCompareResults(controlQuery, query);
    if (errorMsg.length() > 0) {
      fail(errorMsg);
    }
  }
  protected void test() {
    query = new ReadAllQuery();
    query.setReferenceClass(referenceClass);

    ReportQuery hierarchyQuery = new ReportQuery();
    hierarchyQuery.setReferenceClass(referenceClass);
    // The #employeeId is what would cause the error
    hierarchyQuery.setCall(new SQLCall("SELECT EMP_ID FROM EMPLOYEE WHERE MANAGER_ID=#employeeId"));

    query.setSelectionCriteria(query.getExpressionBuilder().get("id").in(hierarchyQuery));
    // want the argument at the top level query
    query.addArgument("employeeId");
  }
  public void testEmployeeJoinManagerAddressOuterJoinManagerAddress() {
    ReadAllQuery query = new ReadAllQuery();
    query.setReferenceClass(Employee.class);
    query.setSelectionCriteria(
        query
            .getExpressionBuilder()
            .get("lastName")
            .equal("Way")
            .or(query.getExpressionBuilder().get("lastName").equal("Jones")));

    ReadAllQuery controlQuery = (ReadAllQuery) query.clone();
    Expression manager = query.getExpressionBuilder().get("manager");
    query.addJoinedAttribute(manager);
    query.addJoinedAttribute(manager.get("address"));
    Expression managersManager = manager.getAllowingNull("manager");
    query.addJoinedAttribute(managersManager);

    query.addJoinedAttribute(managersManager.get("address"));

    String errorMsg = executeQueriesAndCompareResults(controlQuery, query);
    if (errorMsg.length() > 0) {
      fail(errorMsg);
    }
  }
  public void testProjectJoinTeamMembersOuterJoinAddress() {
    ReadAllQuery query = new ReadAllQuery();
    query.setReferenceClass(Project.class);

    ReadAllQuery controlQuery = (ReadAllQuery) query.clone();

    Expression teamMembers = query.getExpressionBuilder().anyOf("teamMembers");
    query.addJoinedAttribute(teamMembers);
    Expression teamMembersAddress = teamMembers.getAllowingNull("address");
    query.addJoinedAttribute(teamMembersAddress);

    String errorMsg = executeQueriesAndCompareResults(controlQuery, query);
    if (errorMsg.length() > 0) {
      fail(errorMsg);
    }
  }
  public void testProjectJoinTeamLeaderJoinAddressWhereTeamLeaderNotNull() {
    ReadAllQuery query = new ReadAllQuery();
    query.setReferenceClass(Project.class);
    Expression teamLeader = query.getExpressionBuilder().get("teamLeader");
    query.setSelectionCriteria(teamLeader.notNull());

    ReadAllQuery controlQuery = (ReadAllQuery) query.clone();

    query.addJoinedAttribute(teamLeader);
    Expression teamLeaderAddress = teamLeader.get("address");
    query.addJoinedAttribute(teamLeaderAddress);

    String errorMsg = executeQueriesAndCompareResults(controlQuery, query);
    if (errorMsg.length() > 0) {
      fail(errorMsg);
    }
  }
    public void test() {
      ReadAllQuery query = new ReadAllQuery();
      query.setReferenceClass(Employee.class);
      setSelectionCriteria(query);

      ReadAllQuery controlQuery = (ReadAllQuery) query.clone();

      Expression employees = query.getExpressionBuilder().anyOf("managedEmployees");
      query.addJoinedAttribute(employees);
      Expression phones = employees.anyOf("phoneNumbers");
      query.addJoinedAttribute(phones);

      String errorMsg =
          JoinedAttributeTestHelper.executeQueriesAndCompareResults(
              controlQuery, query, (AbstractSession) getSession());
      if (errorMsg.length() > 0) {
        throw new TestErrorException(errorMsg);
      }
    }
  /**
   * Tests if SpatialExpressions will work properly without hung up when using ANYINTERACT query
   * type
   */
  public void testSimpleReadQuery() {
    if (supported) {
      JGeometry circle = JGeometry.createCircle(-10, 0, 0, 10, 10, 0, 0);
      JGeometry newCircle = JGeometry.createCircle(0, -10, 0, 10, 10, 0, 0);
      EntityManager em = createEntityManager(STRUCT_CONVERTER_PU);
      try {
        beginTransaction(em);
        SimpleSpatial simpleSpatial = new SimpleSpatial(2000, circle);
        em.persist(simpleSpatial);
        commitTransaction(em);
      } catch (RuntimeException ex) {
        if (isTransactionActive(em)) {
          rollbackTransaction(em);
        }
        throw ex;
      }

      clearCache(STRUCT_CONVERTER_PU);

      ReadAllQuery raq = new ReadAllQuery(SimpleSpatial.class);
      ExpressionBuilder eb = raq.getExpressionBuilder();

      SpatialParameters parameters = new SpatialParameters();
      parameters.setQueryType(SpatialParameters.QueryType.WINDOW).setMask(Mask.ANYINTERACT);
      Expression selectionCriteria =
          SpatialExpressionFactory.relate(eb.get("jGeometry"), newCircle, parameters);
      raq.setSelectionCriteria(selectionCriteria);
      raq.addAscendingOrdering("id");
      getServerSession(STRUCT_CONVERTER_PU).executeQuery(raq);

      // now read using jpql -  should generate the same sql as the ReadAllQuery above.
      clearCache(STRUCT_CONVERTER_PU);
      Query query =
          em.createQuery(
              "SELECT ss FROM SimpleSpatial ss WHERE FUNC('MDSYS.SDO_RELATE', ss.jGeometry, :otherGeometry, :params) = 'TRUE' ORDER BY ss.id ASC");
      query.setParameter("otherGeometry", newCircle);
      query.setParameter("params", parameters.getParameterString());
      query.getResultList();
    }
  }
  public void testMultipleUnrelatedResultWithOneToManyJoins() {
    if (getServerSession("fieldaccess").getPlatform().isSymfoware()) {
      getServerSession("fieldaccess")
          .logMessage(
              "Test testMultipleUnrelatedResultWithOneToManyJoins skipped for this platform, "
                  + "Symfoware doesn't support UpdateAll/DeleteAll on multi-table objects (see rfe 298193).");
      return;
    }
    ReadAllQuery raq = new ReadAllQuery(Employee.class);
    raq.setSelectionCriteria(raq.getExpressionBuilder().notEmpty("phoneNumbers"));
    Employee emp = (Employee) ((Vector) getDbSession().executeQuery(raq)).firstElement();
    emp.getPhoneNumbers();
    for (Iterator iterator = emp.getPhoneNumbers().iterator(); iterator.hasNext(); ) {
      ((PhoneNumber) iterator.next()).getOwner();
    }

    raq = new ReadAllQuery(Address.class);
    raq.setSelectionCriteria(raq.getExpressionBuilder().get("city").like("%ttawa%"));
    Address addr = (Address) ((Vector) getDbSession().executeQuery(raq)).firstElement();
    addr.getEmployees();
    for (Iterator iterator = addr.getEmployees().iterator(); iterator.hasNext(); ) {
      Employee addrEmp = (Employee) iterator.next();
      addrEmp.getAddress();
      addrEmp
          .getPhoneNumbers()
          .size(); // as the report query will join in all phones to all emps, make sure we can
                   // compare.
    }

    getDbSession().getIdentityMapAccessor().initializeAllIdentityMaps();

    ReportQuery query = new ReportQuery();
    query.setShouldReturnWithoutReportQueryResult(true);
    query.setReferenceClass(Address.class);

    ExpressionBuilder eb = new ExpressionBuilder(Employee.class);

    List list = new ArrayList();
    list.add(eb.anyOf("phoneNumbers"));
    query.addItem("employee", eb, list);

    list = new ArrayList();
    list.add(query.getExpressionBuilder().anyOf("employees"));
    query.addItem("address", query.getExpressionBuilder(), list);

    query.setSelectionCriteria(query.getExpressionBuilder().get("id").equal(addr.getId()));

    Vector result = (Vector) getDbSession().executeQuery(query);

    DeleteAllQuery deleteAll = new DeleteAllQuery(PhoneNumber.class);
    deleteAll.setSelectionCriteria(
        deleteAll.getExpressionBuilder().get("owner").get("id").equal(emp.getId()));
    UnitOfWork uow = getDbSession().acquireUnitOfWork();
    uow.executeQuery(deleteAll);

    UpdateAllQuery updall = new UpdateAllQuery(Employee.class);
    updall.addUpdate("address", null);
    updall.setSelectionCriteria(
        updall.getExpressionBuilder().get("address").get("id").equal(addr.getId()));
    uow.executeQuery(updall);

    uow.commit();

    try {
      Employee emp2 = null;
      Address addr2 = null;
      for (Iterator iterator = result.iterator(); iterator.hasNext(); ) {
        Object[] items = (Object[]) iterator.next();
        emp2 = (Employee) items[0];
        if (emp2.getId().equals(emp.getId())) {
          addr2 = (Address) items[1];
          break;
        }
      }
      assertTrue(
          "PhoneNumbers were not joined correctly, emp.getPhoneNumbers().size = "
              + emp.getPhoneNumbers().size()
              + " emp2.getPhoneNumbers().size = "
              + emp2.getPhoneNumbers().size(),
          (emp.getPhoneNumbers().size() == emp2.getPhoneNumbers().size()));
      assertTrue(
          "Employees were not joined correctly, addr.employees.size = "
              + addr.getEmployees().size()
              + "addr2.employees.size = "
              + addr2.getEmployees().size(),
          (addr.getEmployees().size() == addr2.getEmployees().size()));
    } finally {
      testSetup();
    }
  }
 void setSelectionCriteria(ReadAllQuery query) {
   query.setSelectionCriteria(query.getExpressionBuilder().get("firstName").like("J%"));
 }
  public void testGroupByHavingExpression() {
    EntityManager em = createEntityManager();
    boolean testPass = true;

    ReadAllQuery raq = new ReadAllQuery(Employee.class, new ExpressionBuilder());
    Expression whereClause1 = raq.getExpressionBuilder().get("firstName").equal("Bob");
    Expression whereClause2 = raq.getExpressionBuilder().get("lastName").equal("Smith");
    Expression whereClause3 = raq.getExpressionBuilder().get("firstName").equal("John");
    Expression whereClause4 = raq.getExpressionBuilder().get("lastName").equal("Way");

    raq.setSelectionCriteria((whereClause1.and(whereClause2)).or(whereClause3.and(whereClause4)));
    List employees = (List) getServerSession().executeQuery(raq);
    int firstManagerId = ((Employee) employees.get(0)).getId();
    int secondManagerId = ((Employee) employees.get(1)).getId();
    int expectedEmployeesManaged =
        ((Employee) employees.get(0)).getManagedEmployees().size()
            + ((Employee) employees.get(1)).getManagedEmployees().size();
    Vector managerVector = new Vector();
    managerVector.add(firstManagerId);
    managerVector.add(secondManagerId);
    ReportQuery query = new ReportQuery(Employee.class, new ExpressionBuilder());
    query.returnWithoutReportQueryResult();
    query.addGrouping(query.getExpressionBuilder().get("manager").get("id"));
    query.setHavingExpression(
        query.getExpressionBuilder().get("manager").get("id").in(managerVector));
    query.addAttribute("managerId", query.getExpressionBuilder().get("manager").get("id"));
    query.addAverage("salary", Double.class);
    query.addCount("id", Long.class);

    List expectedResult = (List) getServerSession().executeQuery(query);

    String ejbqlString =
        "SELECT e.manager.id, avg(e.salary), count(e) FROM Employee e"
            + " GROUP BY e.manager.id HAVING e.manager.id IN ("
            + firstManagerId
            + ","
            + secondManagerId
            + ")";

    List result = em.createQuery(ejbqlString).getResultList();
    int employeesManaged = 0;
    Iterator expectedResultIterator = expectedResult.iterator();
    Iterator resultIterator = result.iterator();
    if (expectedResult.size() == result.size()) {
      while (resultIterator.hasNext()) {
        Object objectArray[] = (Object[]) expectedResultIterator.next();
        Object otherObjectArray[] = (Object[]) resultIterator.next();
        testPass = testPass && objectArray[0].equals(otherObjectArray[0]);
        testPass = testPass && objectArray[1].equals(otherObjectArray[1]);
        testPass = testPass && objectArray[2].equals(otherObjectArray[2]);
        employeesManaged = ((Long) objectArray[2]).intValue() + employeesManaged;
      }
    } else {
      testPass = false;
    }

    Assert.assertEquals(
        "GroupBy Having expression test failed: data validation error",
        employeesManaged,
        expectedEmployeesManaged);
    Assert.assertTrue("GroupBy Having expression test failed", testPass);
  }
    public void test() {
      // clear cache
      getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
      // create batch read query, set its selectionCriteria
      ReadAllQuery query = new ReadAllQuery(Employee.class);
      setSelectionCriteria(query);
      // before adding batch read attributes clone the query to create control query
      ReadAllQuery controlQuery = (ReadAllQuery) query.clone();
      // add batch read attributes
      Expression managedEmployees = query.getExpressionBuilder().get("managedEmployees");
      Expression managedEmployeesPhoneNumbers = managedEmployees.get("phoneNumbers");
      query.addBatchReadAttribute(managedEmployeesPhoneNumbers);
      // execute the query
      List employees = (List) getSession().executeQuery(query);
      if (employees.isEmpty()) {
        throw new TestProblemException("No Employees were read");
      }
      // need to instantiate only a single Phone on a single managed Employee to trigger sql that
      // reads data from the db for all.
      // still need to trigger all the indirections - but (except the first one) they are not
      // accessing the db
      // (the data is already cached in the value holders).
      printDebug("Trigger batch reading results");
      boolean isConnected = true;
      for (int i = 0; i < employees.size(); i++) {
        Employee manager = (Employee) employees.get(i);
        if (!manager.getManagedEmployees().isEmpty()) {
          printDebug("Manager = " + manager);
          for (int j = 0; j < manager.getManagedEmployees().size(); j++) {
            Employee emp = (Employee) manager.getManagedEmployees().get(j);
            printDebug("     " + emp);
            for (int k = 0; k < emp.getPhoneNumbers().size(); k++) {
              if (isConnected) {
                // need to instantiate only a single Phone on a single managed Employee to trigger
                // sql that reads data from the db for all.
                // to ensure that no other sql is issued close connection.
                ((AbstractSession) getSession()).getAccessor().closeConnection();
                isConnected = false;
              }
              PhoneNumber phone = (PhoneNumber) emp.getPhoneNumbers().get(k);
              printDebug("          " + phone);
            }
          }
        } else {
          printDebug(manager.toString());
        }
      }
      if (!isConnected) {
        // reconnect connection
        ((AbstractSession) getSession())
            .getAccessor()
            .reestablishConnection((AbstractSession) getSession());
      }
      printDebug("");

      // obtain control results
      // clear cache
      getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
      // execute control query
      List controlEmployees = (List) getSession().executeQuery(controlQuery);
      // instantiate all value holders that the batch query expected to instantiate
      printDebug("Trigger control results");
      for (int i = 0; i < controlEmployees.size(); i++) {
        Employee manager = (Employee) controlEmployees.get(i);
        if (!manager.getManagedEmployees().isEmpty()) {
          printDebug("Manager = " + manager);
          for (int j = 0; j < manager.getManagedEmployees().size(); j++) {
            Employee emp = (Employee) manager.getManagedEmployees().get(j);
            printDebug("     " + emp);
            for (int k = 0; k < emp.getPhoneNumbers().size(); k++) {
              PhoneNumber phone = (PhoneNumber) emp.getPhoneNumbers().get(k);
              printDebug("          " + phone);
            }
          }
        } else {
          printDebug(manager.toString());
        }
      }

      // compare results
      String errorMsg =
          JoinedAttributeTestHelper.compareCollections(
              employees,
              controlEmployees,
              getSession().getClassDescriptor(Employee.class),
              ((AbstractSession) getSession()));
      if (errorMsg.length() > 0) {
        throw new TestErrorException(errorMsg);
      }
    }
  public void testTwoUnrelatedResultWithOneToOneJoinsWithExtraItem() {
    if (getServerSession("fieldaccess").getPlatform().isSymfoware()) {
      getServerSession("fieldaccess")
          .logMessage(
              "Test testTwoUnrelatedResultWithOneToOneJoinsWithExtraItem skipped for this platform, "
                  + "Symfoware doesn't support UpdateAll/DeleteAll on multi-table objects (see rfe 298193).");
      return;
    }
    ReadAllQuery raq = new ReadAllQuery(Employee.class);
    raq.setSelectionCriteria(
        raq.getExpressionBuilder()
            .get("lastName")
            .equal("Way")
            .or(raq.getExpressionBuilder().get("lastName").equal("Jones")));
    Employee emp = (Employee) ((Vector) getDbSession().executeQuery(raq)).firstElement();
    emp.getAddress();

    raq = new ReadAllQuery(Address.class);
    raq.setSelectionCriteria(raq.getExpressionBuilder().get("city").like("%ttawa%"));
    Address addr = (Address) ((Vector) getDbSession().executeQuery(raq)).firstElement();
    addr.getEmployees();
    for (Iterator iterator = addr.getEmployees().iterator(); iterator.hasNext(); ) {
      ((Employee) iterator.next()).getAddress();
    }

    getDbSession().getIdentityMapAccessor().initializeAllIdentityMaps();

    ReportQuery query = new ReportQuery();
    query.setShouldReturnWithoutReportQueryResult(true);
    query.setReferenceClass(Employee.class);

    ExpressionBuilder eb = new ExpressionBuilder(Address.class);
    query.setSelectionCriteria(
        query
            .getExpressionBuilder()
            .get("id")
            .equal(emp.getId())
            .and(eb.get("id").equal(addr.getId())));

    List list = new ArrayList();
    list.add(query.getExpressionBuilder().get("address"));
    query.addItem("employee", query.getExpressionBuilder(), list);
    query.addItem("employee_name", query.getExpressionBuilder().get("firstName"));

    list = new ArrayList();
    list.add(eb.anyOf("employees"));
    query.addItem("address", eb, list);

    Vector result = (Vector) getDbSession().executeQuery(query);

    UpdateAllQuery updall = new UpdateAllQuery(Employee.class);
    updall.addUpdate("address", null);
    updall.setSelectionCriteria(updall.getExpressionBuilder().get("id").equal(emp.getId()));
    UnitOfWork uow = getDbSession().acquireUnitOfWork();
    uow.executeQuery(updall);

    updall = new UpdateAllQuery(Employee.class);
    updall.addUpdate("address", null);
    updall.setSelectionCriteria(
        updall.getExpressionBuilder().get("address").get("id").equal(addr.getId()));
    uow.executeQuery(updall);

    uow.commit();

    Employee emp2 = (Employee) ((Object[]) result.firstElement())[0];
    Address addr2 = (Address) ((Object[]) result.firstElement())[2];
    try {
      assertTrue(
          "Address were not joined correctly, emp.getAddress() = null",
          (emp2.getAddress() != null));
      assertTrue(
          "Employees were not joined correctly, addr.employees.size = "
              + addr.getEmployees().size()
              + "addr2.employees.size = "
              + addr2.getEmployees().size(),
          (addr.getEmployees().size() == addr2.getEmployees().size()));
      if (!emp2.getFirstName().equals(((Object[]) result.firstElement())[1])) {
        fail("Failed to return employee name as an separate item");
      }

    } finally {
      testSetup();
    }
  }
  /**
   * Load the last test result from the test result database. Find only the results run on the same
   * machine and database. Compare the current test run result with the previous results do
   * determine if the test passes or fails.
   */
  public static void verify(PerformanceRegressionTest test) {
    // Ensures all tests pass to reset baseline,
    // Required when tests or environment change to be slower to avoid failures.
    if (reset) {
      throw new TestWarningException("Reseting baseline.");
    }
    Session session = LoadBuildSystem.getSystem().getSession();

    // Query all previous successful test results for this test on the same machine and database.
    // Find only the baseline version, or last version run different than current version.
    // If you need to compare results against the current version you must change the TopLink
    // version string.
    ReadAllQuery query = new ReadAllQuery(TestResult.class);
    ExpressionBuilder result = new ExpressionBuilder();
    query.setSelectionCriteria(
        result
            .get("name")
            .equal(test.getName())
            .and(
                result
                    .get("loadBuildSummary")
                    .get("machine")
                    .equal(LoadBuildSystem.getSummary().getMachine()))
            .and(
                result
                    .get("loadBuildSummary")
                    .get("loginChoice")
                    .equal(LoadBuildSystem.getSummary().getLoginChoice())));
    // Allow comparing to a set version through a system property.
    String currentVersion = LoadBuildSystem.getSummary().getToplinkVersion();
    String baselineVersion = null;
    if (System.getProperties().containsKey("toplink.loadbuild.baseline-version")) {
      baselineVersion = System.getProperties().getProperty("toplink.loadbuild.baseline-version");
      // System properties cannot store spaces so need to replace them from \b.
      baselineVersion = baselineVersion.replace('_', ' ');
      ((PerformanceComparisonTestResult) ((TestCase) test).getTestResult()).baselineVersion =
          baselineVersion;
    } else {
      // Compare against the last successful version.
      ReportQuery reportQuery = new ReportQuery(TestResult.class, query.getExpressionBuilder());
      reportQuery.useDistinct();
      reportQuery.returnSingleValue();
      reportQuery.addAttribute("version", result.get("loadBuildSummary").get("toplinkVersion"));
      reportQuery.setSelectionCriteria(
          query
              .getSelectionCriteria()
              .and(
                  (result.get("outcome").equal(TestResult.PASSED))
                      .or(result.get("outcome").equal(TestResult.WARNING)))
              .and(result.get("loadBuildSummary").get("toplinkVersion").notEqual(currentVersion)));
      reportQuery.addOrdering(result.get("loadBuildSummary").get("timestamp").descending());
      baselineVersion = (String) session.executeQuery(reportQuery);
    }
    query.setSelectionCriteria(
        query
            .getSelectionCriteria()
            .and(result.get("loadBuildSummary").get("toplinkVersion").equal(baselineVersion)));
    query.addOrdering(result.get("loadBuildSummary").get("timestamp").descending());
    query.setMaxRows(10);
    query.useCursoredStream(1, 1);
    CursoredStream stream = (CursoredStream) session.executeQuery(query);
    if (!stream.hasMoreElements()) {
      throw new TestWarningException("No previous test result to compare performance with.");
    }
    TestResult lastResult = (TestResult) stream.nextElement();
    double lastCount = lastResult.getTestTime();
    PerformanceComparisonTestResult testResult =
        (PerformanceComparisonTestResult) ((TestCase) test).getTestResult();
    testResult.getBaselineVersionResults().add(new Double(lastCount));
    // Average last 5 runs.
    int numberOfRuns = 0;
    while (stream.hasMoreElements() && (numberOfRuns < 4)) {
      TestResult nextResult = (TestResult) stream.nextElement();
      testResult.getBaselineVersionResults().add(new Double(nextResult.getTestTime()));
      numberOfRuns++;
    }
    stream.close();
    double baselineAverage =
        PerformanceComparisonTestResult.averageResults(testResult.getBaselineVersionResults());
    double currentCount = ((TestCase) test).getTestResult().getTestTime();
    testResult.baselineVersion = lastResult.getLoadBuildSummary().getToplinkVersion();
    testResult.percentageDifferenceLastRun =
        PerformanceComparisonTestResult.percentageDifference(currentCount, lastCount);

    // Query the current version last 5 runs for averaging.
    query = new ReadAllQuery(TestResult.class);
    result = new ExpressionBuilder();
    query.setSelectionCriteria(
        result
            .get("name")
            .equal(((TestCase) test).getName())
            .and(
                result
                    .get("loadBuildSummary")
                    .get("machine")
                    .equal(LoadBuildSystem.getSummary().getMachine()))
            .and(
                result
                    .get("loadBuildSummary")
                    .get("loginChoice")
                    .equal(LoadBuildSystem.getSummary().getLoginChoice()))
            .and(result.get("loadBuildSummary").get("toplinkVersion").equal(currentVersion)));
    query.addOrdering(result.get("loadBuildSummary").get("timestamp").descending());
    query.useCursoredStream(1, 1);
    stream = (CursoredStream) session.executeQuery(query);
    // Average last 5 runs.
    testResult.getCurrentVersionResults().add(new Double(currentCount));
    numberOfRuns = 0;
    while (stream.hasMoreElements() && (numberOfRuns < 4)) {
      TestResult nextResult = (TestResult) stream.nextElement();
      testResult.getCurrentVersionResults().add(new Double(nextResult.getTestTime()));
      numberOfRuns++;
    }
    stream.close();
    double currentAverage =
        PerformanceComparisonTestResult.averageResults(testResult.getCurrentVersionResults());
    testResult.percentageDifferenceAverage =
        PerformanceComparisonTestResult.percentageDifference(currentAverage, baselineAverage);

    testResult.baselineStandardDeviation =
        PerformanceComparisonTestResult.standardDeviationResults(
            testResult.getBaselineVersionResults());
    testResult.currentStandardDeviation =
        PerformanceComparisonTestResult.standardDeviationResults(
            testResult.getCurrentVersionResults());

    if (testResult.percentageDifferenceAverage < test.getAllowableDecrease()) {
      throw new TestErrorException(
          "Test is "
              + ((long) testResult.percentageDifferenceAverage)
              + "% slower than last successful execution.");
    }
  }