/******************************************************************************* * Copyright (c) 1998, 2015 Oracle and/or its affiliates. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Oracle - initial API and implementation from Oracle TopLink ******************************************************************************/ package org.eclipse.persistence.testing.tests.expressions; import org.eclipse.persistence.testing.models.employee.domain.*; import org.eclipse.persistence.expressions.*; import org.eclipse.persistence.platform.database.*; import org.eclipse.persistence.queries.*; import org.eclipse.persistence.testing.framework.*; import org.eclipse.persistence.tools.schemaframework.PopulationManager; import org.eclipse.persistence.testing.models.inheritance.Vehicle; public class ExpressionSubSelectTestSuite extends TestSuite { protected PopulationManager manager; public ExpressionSubSelectTestSuite() { setDescription("This suite tests expressions."); } /** * For bug 3105559 Object comparisons do not work with aggregate objects (subtitle: * because aggregate objects don't have a primary key). */ private void addAggregateObjectJoiningTest() { ExpressionBuilder builder = new ExpressionBuilder(); ExpressionBuilder parallelBuilder = new ExpressionBuilder(Employee.class); Expression expression = builder.get("period").equal(parallelBuilder.get("period")).and(builder.notEqual(parallelBuilder)); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 9); test.setExpression(expression); test.getQuery(true).useDistinct(); test.setName("AggregateObjectJoiningTest"); test.setDescription("Test .period.equal(parallelBuilder.period). a.k.a. employees with same employment period as someone else."); addTest(test); } /** * For bug 3105559 Object comparisons do not work with aggregate objects (subtitle: * because aggregate objects don't have a primary key). */ private void addAggregateObjectComparisonTest() { ExpressionBuilder builder = new ExpressionBuilder(); ExpressionBuilder parallelBuilder = new ExpressionBuilder(Employee.class); Expression expression = builder.notEqual(parallelBuilder).and(builder.get("period").get("startDate").equal(parallelBuilder.get("period").get("startDate")).and(builder.get("period").get("endDate").equal(parallelBuilder.get("period").get("endDate")))); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 9); test.setExpression(expression); test.getQuery(true).useDistinct(); test.setName("AggregateObjectComparisonTest"); test.setDescription("Test .period.startDate.equal(parallelBuilder.period.startDate).and(...) a.k.a. employees with same employment period as someone else."); addTest(test); } private void addCorrelatedSubSelectTest() { ExpressionBuilder manager = new ExpressionBuilder(Employee.class); Expression employee = manager.anyOf("managedEmployees"); Expression outerExpression = employee.anyOf("projects").get("name").equal("Problem Reporter"); ReportQuery subQuery = new ReportQuery(Project.class, new ExpressionBuilder()); subQuery.addCount(); ExpressionBuilder swirlyDirlProject = subQuery.getExpressionBuilder(); Expression correlateExpression = swirlyDirlProject.equal(employee.anyOf("projects")); Expression innerExpression = swirlyDirlProject.get("name").in(new Object[] { "Swirly Dirly", "Swirly Dirl" }); subQuery.setSelectionCriteria(correlateExpression.and(innerExpression)); Expression expression = outerExpression.and(manager.subQuery(subQuery).greaterThan(0)); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1); test.setExpression(expression); test.setName("Correlated SubSelect Test"); test.setDescription("Tests correlated subselects, using attributes selected in enclosing query to refine the subquery. In this test find managers with an employee working on the problem reporter project. Refine the query with a subselect to check if this employee also works on the Swirly Dirly project."); test.addUnsupportedPlatform(TimesTenPlatform.class); addTest(test); } /** * this test added for bug 3252935. When fixed the workaround should be * removed from this test (i.e. query.usedDistinct()). */ private void addSameManagerTest() { ExpressionBuilder emp = new ExpressionBuilder(); ExpressionBuilder coworker = new ExpressionBuilder(Employee.class); Expression exp = emp.get("manager").equal(coworker.get("manager")).and(emp.notEqual(coworker)); ReadAllQuery query = new ReadAllQuery(Employee.class, exp); query.useDistinct(); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 5); test.setExpression(exp); test.setQuery(query); test.setName("SameManagerTest"); test.setDescription("Tests whether a parallel select will use distinct."); addTest(test); } /** * Test that outer expressions are normalized inside sub-selects correctly. */ private void addParallelCorrelatedSubSelectsTest() { ExpressionBuilder manager = new ExpressionBuilder(Employee.class); Expression employee = manager.anyOf("managedEmployees"); Expression outerAddress = employee.get("address"); Expression expression = null; String[] cities = new String[] { "Ottawa", "Vancouver" }; for (int i = 0; i < cities.length; i++) { ReportQuery subQuery = new ReportQuery(Address.class, new ExpressionBuilder(Address.class)); ExpressionBuilder address = subQuery.getExpressionBuilder(); subQuery.addAttribute("fish", address.value(1)); Expression correlateExpression = address.equal(outerAddress); Expression innerExpression = address.get("city").equal(cities[i]); subQuery.setSelectionCriteria(correlateExpression.and(innerExpression)); expression = manager.exists(subQuery).or(expression); } ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 2); test.setExpression(expression); test.getQuery(true).addNonFetchJoin(employee); test.setName("Parallel Correlated SubSelect Test"); test.setDescription("Finds managers with an employee in Ottawa or an employee in Vancouver. For bug 3381830."); addTest(test); } private void addCorrelatedSubSelectExpressionsReorderedTest() { ExpressionBuilder manager = new ExpressionBuilder(Employee.class); Expression employee = manager.anyOf("managedEmployees"); Expression outerExpression = employee.anyOf("projects").get("name").equal("Problem Reporter"); ReportQuery subQuery = new ReportQuery(Project.class, new ExpressionBuilder()); subQuery.addCount(); ExpressionBuilder swirlyDirlProject = subQuery.getExpressionBuilder(); Expression correlateExpression = swirlyDirlProject.equal(employee.anyOf("projects")); Expression innerExpression = swirlyDirlProject.get("name").in(new Object[] { "Swirly Dirly", "Swirly Dirl" }); subQuery.setSelectionCriteria(correlateExpression.and(innerExpression)); // This is the only change from CorrelatedSubSelectExpressionsTest... Expression expression = manager.subQuery(subQuery).greaterThan(0).and(outerExpression); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1); test.setExpression(expression); test.setName("Correlated SubSelect Expressions Reordered Test"); test.setDescription("Tests correlated subselects, with the expressions to be correlated normalized by the subselect first."); test.addUnsupportedPlatform(TimesTenPlatform.class); addTest(test); } private void addObjectEqualOrObjectEqualTest() { ExpressionBuilder employee = new ExpressionBuilder(Employee.class); Expression employeeProject = employee.anyOf("projects"); ExpressionBuilder project = new ExpressionBuilder(Project.class); ReportQuery subQuery = new ReportQuery(Project.class, project); subQuery.addAttribute("id"); Expression condition1 = project.equal(employeeProject).and(project.get("name").equal("Problem Reporter")); Expression condition2 = project.equal(employeeProject).and(project.get("name").equal("Sales Reporter")); subQuery.setSelectionCriteria(condition1.or(condition2)); Expression expression = employee.exists(subQuery); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 4); test.setExpression(expression); test.setName("Object Equal Or Object Equal Test"); test.setDescription("Finds employees working on one of two projects. Trying to break CR2456 with bizarre expression structure."); addTest(test); } /* * The following test is from the Oracle 9i online SQL reference. * It selects all employees who make more than the average for their region (or * department, etc.). */ private void addOracleExampleCorrelatedSubSelectTest() { ExpressionBuilder wellpaidEmployee = new ExpressionBuilder(Employee.class); ExpressionBuilder averageEmployee = new ExpressionBuilder(Employee.class); ReportQuery subQuery = new ReportQuery(Employee.class, averageEmployee); subQuery.addAverage("salary"); subQuery.setSelectionCriteria(averageEmployee.get("address").get("province").equal(wellpaidEmployee.get("address").get("province"))); Expression expression = wellpaidEmployee.subQuery(subQuery).lessThan(wellpaidEmployee.get("salary")); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 2); test.setExpression(expression); test.setName("Oracle Example Correlated SubSelect Test"); test.setDescription("Tests correlated subselects, finds all employees who make more on average than other employees in their city."); test.addUnsupportedPlatform(TimesTenPlatform.class); addTest(test); } private void addParralelSelectCityTest() { ExpressionBuilder builder = new ExpressionBuilder(); ExpressionBuilder otherBuilder = new ExpressionBuilder(Address.class); Expression expression = builder.get("address").get("city").equal(otherBuilder.get("city")).and(otherBuilder.get("country").equalsIgnoreCase("canada")); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 12); test.setExpression(expression); test.setName("ParralelSelectCityTest"); test.setDescription("Test using two object builds in one expression"); addTest(test); } private void addParralelSelectSameCityTest() { ExpressionBuilder builder = new ExpressionBuilder(); ExpressionBuilder otherBuilder = new ExpressionBuilder(Employee.class); Expression expression = builder.get("address").get("city").equal(otherBuilder.get("address").get("city")).and(builder.notEqual(otherBuilder)); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 0); test.setExpression(expression); test.setName("ParralelSelectSameCityTest"); test.setDescription("Test using two object builds in one expression"); addTest(test); } private void addParralelSelectObjectComparisonTest() { ExpressionBuilder builder = new ExpressionBuilder(); ExpressionBuilder otherBuilder = new ExpressionBuilder(LargeProject.class); Expression expression = builder.anyOf("managedEmployees").equal(otherBuilder.get("teamLeader")); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 2); test.setExpression(expression); test.setName("ParralelSelectObjectComparisonTest"); test.setDescription("Test using two object builders in one expression and comparing with an object comparison"); addTest(test); } /** * @bug 2639318 PARALLEL EXPRESSION INSIDE SUBSELECT OMITS SECOND BUILDER */ private void addParralelSelectSameNameInsideSubSelectTest() { ExpressionBuilder innerBuilder = new ExpressionBuilder(Employee.class); ExpressionBuilder otherBuilder = new ExpressionBuilder(Employee.class); ExpressionBuilder outerBuilder = new ExpressionBuilder(Employee.class); Expression parallelExpression = innerBuilder.get("lastName").equal(otherBuilder.get("lastName")).and(innerBuilder.notEqual(otherBuilder)); // The subselect is quite trivial: this just moves the original parallel // select test into a subselect. Expression correlatingExpression = innerBuilder.equal(outerBuilder); Expression innerExpression = correlatingExpression.and(parallelExpression); ReportQuery subQuery = new ReportQuery(Employee.class, innerBuilder); subQuery.setSelectionCriteria(innerExpression); subQuery.addAttribute("id"); Expression expression = outerBuilder.exists(subQuery); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 6); test.setExpression(expression); test.setName("ParralelSelectSameNameInsideSubSelectTest"); test.setDescription("Tests using two object builders in one subselect expression, for 2639318"); addTest(test); } private void addParralelSelectSameNameTest() { ExpressionBuilder builder = new ExpressionBuilder(); ExpressionBuilder otherBuilder = new ExpressionBuilder(Employee.class); Expression expression = builder.get("lastName").equal(otherBuilder.get("lastName")).and(builder.notEqual(otherBuilder)); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 6); test.setExpression(expression); test.setName("ParralelSelectSameNameTest"); test.setDescription("Test using two object builds in one expression"); addTest(test); } /** * Tests a common usage of parallel selects: to avoid defining a mapping between * tables. * @bug 2637484 INVALID QUERY KEY EXCEPTION THROWN USING BATCH READS AND PARALLEL EXPRESSIONS */ private void addParallelSelectWithBatchAttributeTest() { ExpressionBuilder builder = new ExpressionBuilder(); ExpressionBuilder otherBuilder = new ExpressionBuilder(Address.class); Expression expression = builder.getField("ADDR_ID").equal(otherBuilder.getField("ADDRESS_ID")); expression = expression.and(otherBuilder.get("province").equal("ONT")); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 6); test.setExpression(expression); test.testBatchAttributesOnEmployee(); test.setName("ParallelSelectWithBatchAttributeTest"); test.setDescription("Test batch reading attributes from query with parallel selects. For 2637484"); addTest(test); } /** * @bug 2612185 Support ReportItems,OrderBy Expressions from Parallel Builders. * Find all managers of employees who have a spouse at work and a family * income in excess of 100,000. */ private void addManagersOfWealthyMarriedAtWorkEmployeesTest() { ExpressionBuilder builder = new ExpressionBuilder(); ExpressionBuilder innerBuilder = new ExpressionBuilder(Employee.class); ExpressionBuilder innerSpouses = new ExpressionBuilder(Employee.class); Expression innerExpression = innerBuilder.get("manager").equal(builder); innerExpression = innerExpression.and(innerBuilder.get("lastName").equal(innerSpouses.get("lastName"))); innerExpression = innerExpression.and(innerBuilder.get("gender").notEqual(innerSpouses.get("gender"))); ReportQuery subquery = new ReportQuery(Employee.class, innerBuilder); subquery.addAverage("family income", ExpressionMath.add(innerBuilder.get("salary"), innerSpouses.get("salary"))); subquery.setSelectionCriteria(innerExpression); Expression expression = builder.subQuery(subquery).equal(140000); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 2); test.setExpression(expression); test.testBatchAttributesOnEmployee(); test.setName("ManagersOfWealthyMarriedAtWorkEmployeesTest"); test.setDescription("Test executing query where subselect is a ReportQuery with ReportItems from multiple builders. Tests batch reading too. For 2612185."); test.addUnsupportedPlatform(TimesTenPlatform.class); addTest(test); } /** * @bug 2611850 Support notIn(subquery). */ private void addNotInTest() { ReadAllQuery query = new ReadAllQuery(Employee.class); ExpressionBuilder emp = new ExpressionBuilder(Employee.class); ExpressionBuilder phone = new ExpressionBuilder(); ReportQuery subquery = new ReportQuery(PhoneNumber.class, phone); Expression subexp = phone.get("areaCode").equal("613"); subquery.setSelectionCriteria(subexp); subquery.addAttribute("id"); Expression expression = emp.get("id").notIn(subquery); query.setSelectionCriteria(expression); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 2); test.setExpression(expression); test.setName("NotInTest"); test.setDescription("Finds all employees who are not within the 613 area code."); addTest(test); } /** * @bug 2718460 QUERY EXCEPTION THROWN USING BATCH READS AND OBJECT COMPARISONS */ private void addObjectComparisonWithBatchAttributeTest() { ExpressionBuilder builder = new ExpressionBuilder(); ExpressionBuilder otherBuilder = new ExpressionBuilder(Employee.class); Expression expression = builder.get("lastName").equal(otherBuilder.get("lastName")).and(builder.notEqual(otherBuilder)); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 6); test.setExpression(expression); test.testBatchAttributesOnEmployee(); test.setName("ObjectComparisonWithBatchAttributeTest"); test.setDescription("Test batch reading attributes from query with object comparisons. Bug 2718460."); addTest(test); } /** * @bug 2612140 CR2973- BATCHATTRIBUTE QUERIES WILL FAIL WHEN THE INITIAL QUERY HAS A SUBQUERY */ private void addExistsWithBatchAttributeTest() { ExpressionBuilder builder = new ExpressionBuilder(Employee.class); ExpressionBuilder innerBuilder = new ExpressionBuilder(Address.class); Expression innerExpression = innerBuilder.equal(builder.get("address")); innerExpression = innerExpression.and(innerBuilder.get("province").equal("ONT")); ReportQuery subquery = new ReportQuery(Address.class, innerBuilder); subquery.addAttribute("id"); subquery.setSelectionCriteria(innerExpression); Expression expression = builder.exists(subquery); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 6); test.setExpression(expression); test.testBatchAttributesOnEmployee(); test.setName("ExistsWithBatchAttributeTest"); test.setDescription("Test batch reading attributes from query with exists (correlatedsub selects). For 2612140."); addTest(test); } /** * @bug 2612567 CR4298- NULLPOINTEREXCEPTION WHEN USING SUBQUERY AND BATCH READING IN 4.6 */ private void addSubSelectInWithBatchAttributeTest() { ExpressionBuilder innerBuilder = new ExpressionBuilder(); ExpressionBuilder outerBuilder = new ExpressionBuilder(); ReportQuery subQuery = new ReportQuery(Employee.class, innerBuilder); subQuery.addAttribute("lastName"); subQuery.setSelectionCriteria(innerBuilder.get("firstName").like("B%")); Expression expression = outerBuilder.get("lastName").in(subQuery); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 4); test.setExpression(expression); test.testBatchAttributesOnEmployee(); test.setName("SubSelectInWithBatchAttributeTest"); test.setDescription("Regression test batch reading attributes from query with IN sub select, for 2612567."); addTest(test); } private void addSubSelectCountTest() { ExpressionBuilder builder = new ExpressionBuilder(); ExpressionBuilder innerBuilder = new ExpressionBuilder(); ReportQuery subQuery = new ReportQuery(Employee.class, innerBuilder); subQuery.addCount("Count", innerBuilder.anyOf("projects").distinct()); subQuery.setSelectionCriteria(innerBuilder.equal(builder.anyOf("managedEmployees"))); Expression expression = builder.subQuery(subQuery).greaterThanEqual(4); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 2); test.setExpression(expression); test.setName("SubSelectCountTest"); test.setDescription("Test subselects with count on an object attribute. All managers whose employees work on 4 or more projects."); test.addUnsupportedPlatform(TimesTenPlatform.class); addTest(test); } private void addSubSelectCustomSQLTest() { ExpressionBuilder builder = new ExpressionBuilder(); ReportQuery subQuery = new ReportQuery(Employee.class, new ExpressionBuilder()); subQuery.addMinimum("salary"); subQuery.setSQLString("Select Min(s.SALARY) from EMPLOYEE e, SALARY s where e.EMP_ID = s.EMP_ID"); Expression expression = builder.get("salary").equal(subQuery); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1); test.setExpression(expression); test.setName("SubSelectCustomSQLTest"); test.setDescription("Test subselects with max salary through custom SQL"); addTest(test); } private void addSubSelectEmployeeWithBusyManagerTest() { ExpressionBuilder employee = new ExpressionBuilder(Employee.class); Expression manager = employee.get("manager"); ExpressionBuilder otherEmployee = new ExpressionBuilder(Employee.class); ReportQuery subQuery = new ReportQuery(Employee.class, otherEmployee); subQuery.addAttribute("id"); subQuery.setSelectionCriteria(otherEmployee.get("manager").equal(manager).and(otherEmployee.equal(employee).not())); Expression expression = employee.exists(subQuery); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 5); test.setExpression(expression); test.setName("SubSelect Employee With Busy Manager Test"); test.setDescription("Tests obj equals obj with 1:1 join optimization. Finds employees whos managers manage at least one other."); addTest(test); } private void addSubSelectMaxManagerSalaryTest() { ExpressionBuilder builder = new ExpressionBuilder(); ReportQuery subQuery = new ReportQuery(Employee.class, new ExpressionBuilder()); subQuery.addMaximum("salary"); Expression expression = builder.get("manager").get("salary").equal(subQuery); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 0); test.setExpression(expression); test.setName("SubSelectMaxManagerSalaryTest"); test.setDescription("Test subselects with max and equals"); addTest(test); } private void addSubSelectMaxPostalCodeTest() { ExpressionBuilder builder = new ExpressionBuilder(); ReportQuery subQuery = new ReportQuery(Address.class, new ExpressionBuilder()); subQuery.addMaximum("postalCode"); Expression expression = builder.get("postalCode").equal(subQuery); ReadAllExpressionTest test = new ReadAllExpressionTest(Address.class, 1); test.setExpression(expression); test.setName("SubSelectMaxPostalCodeTest"); test.setDescription("Test subselects with max and equals"); addTest(test); } private void addSubSelectMaxSalaryInOttawaTest() { ExpressionBuilder builder = new ExpressionBuilder(); ReportQuery subQuery = new ReportQuery(Employee.class, new ExpressionBuilder()); subQuery.addMaximum("salary"); subQuery.setSelectionCriteria(subQuery.getExpressionBuilder().get("address").get("city").equal("Ottawa")); Expression expression = builder.get("salary").equal(subQuery); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1); test.setExpression(expression); test.setName("SubSelectMaxSalaryInOttawaTest"); test.setDescription("Test subselects with max and equals with values"); addTest(test); } private void addSubSelectMaxSalaryTest() { ExpressionBuilder builder = new ExpressionBuilder(); ReportQuery subQuery = new ReportQuery(Employee.class, new ExpressionBuilder()); subQuery.addMaximum("salary"); Expression expression = builder.get("salary").equal(subQuery); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1); test.setExpression(expression); test.setName("SubSelectMaxSalaryTest"); test.setDescription("Test subselects with max and equals"); addTest(test); } private void addSubSelectNestedSalaryTest() { ExpressionBuilder builder = new ExpressionBuilder(); ReportQuery subQuery1 = new ReportQuery(Address.class, new ExpressionBuilder()); subQuery1.addAttribute("city"); subQuery1.setSelectionCriteria(subQuery1.getExpressionBuilder().get("country").likeIgnoreCase("canada")); ReportQuery subQuery2 = new ReportQuery(Employee.class, new ExpressionBuilder()); subQuery2.addMaximum("salary"); subQuery2.setSelectionCriteria(subQuery2.getExpressionBuilder().get("address").get("city").in(subQuery1)); Expression expression = builder.get("salary").greaterThan(subQuery2).and((builder.get("address").get("country").likeIgnoreCase("canada")).not()); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 0); test.setExpression(expression); test.setName("SubSelectNestedSalaryTest"); test.setDescription("Test nested subselects with max salary and in cities"); addTest(test); } private void addSubSelectNoProjectsTest() { ExpressionBuilder builder = new ExpressionBuilder(); ReportQuery subQuery = new ReportQuery(Project.class, new ExpressionBuilder()); subQuery.addAttribute("id"); subQuery.setSelectionCriteria(subQuery.getExpressionBuilder().equal(builder.anyOf("projects"))); Expression expression = builder.notExists(subQuery); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 6); test.setExpression(expression); test.setName("SubSelectNoProjectsTest"); test.setDescription("Test subselects with employees with no projects"); addTest(test); } /** * @bug 2627019 NON-UNIQUE TABLE ALIASES ASSIGNED FOR NESTED SUBSELECTS * With an expression containing two nested parallel subselects, the nested * subquery will absolutely have to have unique aliases assigned to it. */ private void addSubSelectCorrelatedNestedTest() { ExpressionBuilder builder = new ExpressionBuilder(); ExpressionBuilder subQueryBuilder = new ExpressionBuilder(); ReportQuery nestedSubQuery = new ReportQuery(Employee.class, new ExpressionBuilder()); nestedSubQuery.addCount(); nestedSubQuery.setSelectionCriteria(nestedSubQuery.getExpressionBuilder().equal(subQueryBuilder.anyOf("managedEmployees"))); ReportQuery subQuery = new ReportQuery(Employee.class, subQueryBuilder); subQuery.addCount(); subQuery.setSelectionCriteria(subQueryBuilder.equal(builder.anyOf("managedEmployees")).and(subQueryBuilder.subQuery(nestedSubQuery).greaterThan(0))); Expression expression = builder.subQuery(subQuery).greaterThan(0); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 3); test.setExpression(expression); test.setName("SubSelectCorrelatedNestedTest"); test.setDescription("Finds all managers of managers. Tests nested correlated subselects for bug 2627019"); test.addUnsupportedPlatform(TimesTenPlatform.class); addTest(test); } private void addSubSelectTwoManagedEmployeesAnyOfTest() { ExpressionBuilder builder = new ExpressionBuilder(); ReportQuery subQuery = new ReportQuery(Employee.class, new ExpressionBuilder()); subQuery.addCount(); subQuery.setSelectionCriteria(subQuery.getExpressionBuilder().equal(builder.anyOf("managedEmployees"))); Expression expression = builder.subQuery(subQuery).greaterThan(2); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1); test.setExpression(expression); test.setName("SubSelectTwoManagedEmployeesAnyOfTest"); test.setDescription("Test subselects with employees with more than 2 managed employees"); test.addUnsupportedPlatform(TimesTenPlatform.class); addTest(test); } private void addSubSelectTwoManagedEmployeesTest() { ExpressionBuilder builder = new ExpressionBuilder(); ReportQuery subQuery = new ReportQuery(Employee.class, new ExpressionBuilder()); subQuery.addCount(); subQuery.setSelectionCriteria(subQuery.getExpressionBuilder().get("manager").equal(builder)); Expression expression = builder.subQuery(subQuery).greaterThan(2); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1); test.setExpression(expression); test.setName("SubSelectTwoManagedEmployeesTest"); test.setDescription("Test subselects with employees with more than 2 managed employees"); test.addUnsupportedPlatform(AccessPlatform.class); test.addUnsupportedPlatform(TimesTenPlatform.class); addTest(test); } private void addSubSelectTwoProjectsTest() { ExpressionBuilder builder = new ExpressionBuilder(); ReportQuery subQuery = new ReportQuery(Project.class, new ExpressionBuilder()); subQuery.addCount(); subQuery.setSelectionCriteria(subQuery.getExpressionBuilder().equal(builder.anyOf("projects"))); Expression expression = builder.subQuery(subQuery).lessThan(2).not(); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 4); test.setExpression(expression); test.setName("SubSelectTwoProjectsTest"); test.setDescription("Test subselects with employees with 2 projects"); test.addUnsupportedPlatform(TimesTenPlatform.class); addTest(test); } private void addSubSelectUnderpaidManagersTest() { ExpressionBuilder manager = new ExpressionBuilder(Employee.class); ExpressionBuilder employee = new ExpressionBuilder(Employee.class); ReportQuery subQuery = new ReportQuery(Employee.class, employee); subQuery.addAttribute("id"); Expression managedCriteria = employee.get("manager").equal(manager); Expression overPaidCriteria = employee.get("salary").greaterThan(manager.get("salary")); subQuery.setSelectionCriteria(managedCriteria.and(overPaidCriteria)); Expression underpaidManager = manager.exists(subQuery); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 3); test.setExpression(underpaidManager); test.setName("SubSelect Underpaid Managers Test"); test.setDescription("Tests correlated subselects, finds all managers who make less than an employee they manage."); addTest(test); } private void addVehicleViewTest() { ExpressionBuilder builder = new ExpressionBuilder(); Expression expression = ((builder.get("owner").get("name").equal("ABC")).and(builder.get("owner").get("name").equal("ABC"))).and((builder.get("passengerCapacity").equal(-1)).not()); ExpressionBuilder sub = new ExpressionBuilder(Vehicle.class); ReportQuery subQuery = new ReportQuery(Vehicle.class, sub); subQuery.addAttribute("passengerCapacity"); Expression subExpression = ((sub.get("owner").get("name").equal("ABC")).and(sub.get("owner").get("name").equal("ABC"))).and((sub.get("passengerCapacity").equal(-1)).not()).and(builder.equal(sub)); subQuery.setSelectionCriteria(subExpression); expression = expression.and(builder.exists(subQuery)); ReadAllExpressionTest test = new ReadAllExpressionTest(Vehicle.class, 5); ReadAllQuery query = new ReadAllQuery(Vehicle.class, expression); query.addOrdering(builder.get("owner").get("name")); query.addJoinedAttribute("owner"); query.useDistinct(); test.setQuery(query); test.setName("VehicleViewOrderByJoinTest"); test.setDescription("Test inheritance view with ordering and joining."); test.addSupportedPlatform(OraclePlatform.class); addTest(test); } public void addTests() { setManager(PopulationManager.getDefaultManager()); addAggregateObjectJoiningTest(); addAggregateObjectComparisonTest(); addCorrelatedSubSelectTest(); addCorrelatedSubSelectExpressionsReorderedTest(); addParallelCorrelatedSubSelectsTest(); addExistsWithBatchAttributeTest(); addManagersOfWealthyMarriedAtWorkEmployeesTest(); addNotInTest(); addObjectComparisonWithBatchAttributeTest(); addObjectEqualOrObjectEqualTest(); addOracleExampleCorrelatedSubSelectTest(); addParralelSelectCityTest(); addParralelSelectSameCityTest(); addParralelSelectSameNameInsideSubSelectTest(); addParralelSelectSameNameTest(); addParallelSelectWithBatchAttributeTest(); addParralelSelectObjectComparisonTest(); addSubSelectCorrelatedNestedTest(); addSubSelectCountTest(); addSubSelectEmployeeTest(); addSubSelectEmployeeWithBusyManagerTest(); addSubSelectInWithBatchAttributeTest(); addSubSelectMaxSalaryTest(); addSubSelectMaxPostalCodeTest(); addSubSelectMaxSalaryInOttawaTest(); addSubSelectMaxManagerSalaryTest(); addSubSelectNoProjectsTest(); addSubSelectCustomSQLTest(); addSubSelectTwoManagedEmployeesTest(); addSubSelectTwoManagedEmployeesAnyOfTest(); addSubSelectNestedSalaryTest(); addSubSelectTwoProjectsTest(); addSubSelectUnderpaidManagersTest(); addVehicleViewTest(); addUpperCaseTest(); addVehicleViewTest1(); addSameManagerTest(); addSubSelectSelectClauseTest(); addSubSelectSelectClauseTest2(); addSubSelectFromClauseTest(); addSubSelectFromClauseTest2(); addSubSelectObjectEqualsTest(); } private void addSubSelectEmployeeTest() { ReadAllQuery query = new ReadAllQuery(Employee.class); ExpressionBuilder raqb = new ExpressionBuilder(Employee.class); ExpressionBuilder rqb = new ExpressionBuilder(); ReportQuery rq = new ReportQuery(PhoneNumber.class, rqb); Expression exp = rqb.get("id").equal(raqb.get("id")); rq.setSelectionCriteria(exp); rq.addAttribute("id"); Expression expression = raqb.get("id").in(rq); query.setSelectionCriteria(expression); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 12); test.setExpression(expression); test.setName("SubSelectEmployeeTest"); test.setDescription("Test subselects with employees and PhoneNumbers"); addTest(test); } /** * This test was removed, not sure why? Added back. */ private void addUpperCaseTest() { Employee employee = (Employee)getManager().getObject(new org.eclipse.persistence.testing.models.employee.domain.Employee().getClass(), "0002"); ExpressionBuilder builder = new ExpressionBuilder(); Expression expression = builder.get("address").get("city").toUpperCase().equal("OTTAWA"); ReadObjectExpressionTest test = new ReadObjectExpressionTest(employee, expression); test.setName("UpperCaseExpressionTest"); test.setDescription("Test UPPER expression"); addTest(test); } /** * This test was removed? Added back. */ private void addVehicleViewTest1() { ExpressionBuilder builder = new ExpressionBuilder(); Expression expression = ((builder.get("owner").get("name").equal("ABC")).and(builder.get("owner").get("name").equal("ABC"))).and((builder.get("passengerCapacity").equal(-1)).not()); ReadAllExpressionTest test = new ReadAllExpressionTest(Vehicle.class, 5); test.setExpression(expression); test.setName("VehicleViewTest1"); test.setDescription("Test expression against view, or multiple table subclass read."); addTest(test); } private void addSubSelectObjectEqualsTest() { ExpressionBuilder builder = new ExpressionBuilder(Employee.class); ReportQuery subQuery = new ReportQuery(Project.class, new ExpressionBuilder(Project.class)); subQuery.addCount("id"); subQuery.setSelectionCriteria(subQuery.getExpressionBuilder().equal(builder.anyOf("projects"))); ReportQuery query = new ReportQuery(Employee.class, builder); query.addAttribute("id"); query.addAttribute("firstName"); query.setSelectionCriteria(builder.exists(subQuery)); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 12); // Derby seems to ignore the count when it is 0, needs an outer join for some reason. test.addUnsupportedPlatform(DerbyPlatform.class); test.setQuery(query); test.setName("SubSelectObjectEqualsTest"); test.setDescription("Test subselects that uses an object eqauls"); addTest(test); } private void addSubSelectSelectClauseTest() { ExpressionBuilder builder = new ExpressionBuilder(Employee.class); ReportQuery subQuery = new ReportQuery(Project.class, new ExpressionBuilder(Project.class)); subQuery.addCount("id"); subQuery.setSelectionCriteria(subQuery.getExpressionBuilder().equal(builder.anyOf("projects"))); ReportQuery query = new ReportQuery(Employee.class, builder); query.addAttribute("id"); query.addAttribute("firstName"); query.addItem("count", builder.subQuery(subQuery)); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 12); // Symfoware does not allow specifying a subquery in the select list // for a query specification or for the single-row SELECT statement. (bug 372172) test.addUnsupportedPlatform(SymfowarePlatform.class); test.setQuery(query); test.setName("SubSelectSelectClauseTest"); test.setDescription("Test subselects in the select clause"); addTest(test); } private void addSubSelectSelectClauseTest2() { ExpressionBuilder builder = new ExpressionBuilder(Employee.class); ReportQuery subQuery = new ReportQuery(Project.class, new ExpressionBuilder(Project.class)); subQuery.addCount("id"); subQuery.setSelectionCriteria(subQuery.getExpressionBuilder().get("id").equal(builder.anyOf("projects").get("id"))); ReportQuery query = new ReportQuery(Employee.class, builder); query.addAttribute("id"); query.addAttribute("firstName"); query.addItem("count", builder.subQuery(subQuery)); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 12); // Symfoware does not allow specifying a subquery in the select list // for a query specification or for the single-row SELECT statement. (bug 372172) test.addUnsupportedPlatform(SymfowarePlatform.class); test.setQuery(query); test.setName("SubSelectSelectClauseTest2"); test.setDescription("Test subselects in the select clause"); addTest(test); } private void addSubSelectFromClauseTest() { ExpressionBuilder builder = new ExpressionBuilder(Employee.class); ReportQuery subQuery = new ReportQuery(LargeProject.class, new ExpressionBuilder(LargeProject.class)); subQuery.addAttribute("id"); ReportQuery query = new ReportQuery(Employee.class, builder); query.addAttribute("id"); query.addAttribute("firstName"); Expression alias = builder.getAlias(builder.subQuery(subQuery)); query.addNonFetchJoin(alias); query.setSelectionCriteria(builder.get("id").equal(alias.get("id")).and(builder.get("id").notEqual(alias.get("id")))); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 0); test.setQuery(query); test.setName("SubSelectFromClauseTest"); test.setDescription("Test subselects in the from clause"); addTest(test); } private void addSubSelectFromClauseTest2() { ExpressionBuilder builder = new ExpressionBuilder(Employee.class); ReportQuery subQuery = new ReportQuery(LargeProject.class, new ExpressionBuilder(LargeProject.class)); subQuery.addItem("id", subQuery.getExpressionBuilder().get("id").average()); subQuery.addItem("id2", subQuery.getExpressionBuilder().get("id").maximum()); ReportQuery query = new ReportQuery(Employee.class, builder); query.addItem("e", builder); Expression alias = builder.getAlias(builder.subQuery(subQuery)); query.addNonFetchJoin(alias); query.setSelectionCriteria(builder.get("id").equal(alias.get("id")).and(builder.get("id").notEqual(alias.get("id2")))); ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 0); test.setQuery(query); test.setName("SubSelectFromClauseTest2"); test.setDescription("Test subselects in the from clause"); addTest(test); } protected PopulationManager getManager() { return manager; } protected void setManager(PopulationManager theManager) { manager = theManager; } }