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."); } }