blob: 046f58ae105d4dfb9feda94635612a2ec3a1aecd [file] [log] [blame]
/*
* Copyright (c) 1998, 2021 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 v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// 07/16/2009 Andrei Ilitchev
// - Bug 282553: JPA 2.0 JoinTable support for OneToOne and ManyToOne
package org.eclipse.persistence.testing.tests.onetoonejointable;
import java.util.List;
import java.util.Vector;
import org.eclipse.persistence.expressions.Expression;
import org.eclipse.persistence.expressions.ExpressionBuilder;
import org.eclipse.persistence.expressions.ExpressionMath;
import org.eclipse.persistence.internal.sessions.AbstractSession;
import org.eclipse.persistence.platform.database.TimesTenPlatform;
import org.eclipse.persistence.queries.Call;
import org.eclipse.persistence.queries.ReadAllQuery;
import org.eclipse.persistence.queries.ReportQuery;
import org.eclipse.persistence.queries.SQLCall;
import org.eclipse.persistence.sessions.UnitOfWork;
import org.eclipse.persistence.tools.schemaframework.PopulationManager;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.testing.models.onetoonejointable.*;
import org.eclipse.persistence.testing.tests.expressions.ReadObjectExpressionTest;
import org.eclipse.persistence.testing.tests.writing.ComplexUpdateTest;
/**
* This model tests reading/writing/deleting through using the employee demo.
*/
public class OneToOneJoinTableEmployeeBasicTestModel extends TestModel {
/**
* Return the JUnit suite to allow JUnit runner to find it.
* Unfortunately JUnit only allows suite methods to be static,
* so it is not possible to generically do this.
*/
public static junit.framework.TestSuite suite() {
return new OneToOneJoinTableEmployeeBasicTestModel();
}
public OneToOneJoinTableEmployeeBasicTestModel() {
setDescription("This model tests reading/writing/deleting using the employee demo.");
}
public OneToOneJoinTableEmployeeBasicTestModel(boolean isSRG) {
this();
this.isSRG = isSRG;
}
@Override
public void addRequiredSystems() {
addRequiredSystem(new EmployeeSystem());
}
@Override
public void addTests() {
addTest(getReadObjectTestSuite());
addTest(getUpdateObjectTestSuite());
addTest(getInsertObjectTestSuite());
addTest(getUOWInsertObjectTestSuite());
addTest(getDeleteObjectTestSuite());
addTest(getReadAllTestSuite());
addTest(new ExpressionTestSuite());
}
public static TestSuite getDeleteObjectTestSuite() {
TestSuite suite = getSRGDeleteObjectTestSuite();
//Add new tests here ...
return suite;
}
//SRG test set is maintained by QA only, do NOT add any new tests into it.
public static TestSuite getSRGDeleteObjectTestSuite() {
TestSuite suite = new TestSuite();
suite.setName("EmployeeDeleteObjectTestSuite");
suite.setDescription("This suite tests the deletion of each object in the employee demo.");
Class<Employee> employeeClass = Employee.class;
Class<LargeProject> largeProjectClass = LargeProject.class;
Class<SmallProject> smallProjectClass = SmallProject.class;
PopulationManager manager = PopulationManager.getDefaultManager();
suite.addTest(new EmployeeDeleteTest(manager.getObject(employeeClass, "0001")));
suite.addTest(new EmployeeDeleteTest(manager.getObject(employeeClass, "0002")));
suite.addTest(new EmployeeDeleteTest(manager.getObject(employeeClass, "0003")));
suite.addTest(new EmployeeDeleteTest(manager.getObject(employeeClass, "0004")));
suite.addTest(new EmployeeDeleteTest(manager.getObject(employeeClass, "0005")));
suite.addTest(new ProjectDeleteTest(manager.getObject(smallProjectClass, "0001")));
suite.addTest(new ProjectDeleteTest(manager.getObject(smallProjectClass, "0002")));
suite.addTest(new ProjectDeleteTest(manager.getObject(smallProjectClass, "0003")));
suite.addTest(new ProjectDeleteTest(manager.getObject(largeProjectClass, "0001")));
suite.addTest(new ProjectDeleteTest(manager.getObject(largeProjectClass, "0002")));
suite.addTest(new ProjectDeleteTest(manager.getObject(largeProjectClass, "0003")));
return suite;
}
public static TestSuite getInsertObjectTestSuite() {
TestSuite suite = getSRGInsertObjectTestSuite();
//Add new tests here ...
return suite;
}
//SRG test set is maintained by QA only, do NOT add any new tests into it.
public static TestSuite getSRGInsertObjectTestSuite() {
TestSuite suite = new TestSuite();
suite.setName("EmployeeInsertObjectTestSuite");
suite.setDescription("This suite tests the insertion of each object in the employee demo.");
EmployeePopulator system = new EmployeePopulator();
suite.addTest(new InsertObjectTest(system.basicEmployeeExample1()));
suite.addTest(new InsertObjectTest(system.basicEmployeeExample2()));
suite.addTest(new InsertObjectTest(system.basicEmployeeExample3()));
suite.addTest(new InsertObjectTest(system.basicEmployeeExample4()));
suite.addTest(new InsertObjectTest(system.basicEmployeeExample5()));
suite.addTest(new InsertObjectTest(system.basicSmallProjectExample1()));
suite.addTest(new InsertObjectTest(system.basicSmallProjectExample2()));
suite.addTest(new InsertObjectTest(system.basicSmallProjectExample3()));
suite.addTest(new InsertObjectTest(system.basicLargeProjectExample1()));
suite.addTest(new InsertObjectTest(system.basicLargeProjectExample2()));
suite.addTest(new InsertObjectTest(system.basicLargeProjectExample3()));
return suite;
}
public static TestSuite getReadAllTestSuite() {
TestSuite suite = getSRGReadAllTestSuite();
//Add new tests here ...
Expression orderBy = new ExpressionBuilder().get("firstName").ascending();
Call call = new SQLCall("SELECT t0.VERSION, t1.EMP_ID, t0.L_NAME, t0.F_NAME, t1.SALARY, t0.EMP_ID, t0.GENDER FROM OTOJT_EMPLOYEE t0, OTOJT_SALARY t1 WHERE t1.EMP_ID = t0.EMP_ID");
suite.addTest(new ReadAllCallWithOrderingTest(Employee.class, 12, call, orderBy));
suite.addTest(new JoinTest());
suite.addTest(new JoinTest_SelectByFirstName());
suite.addTest(new BatchReadingTest());
suite.addTest(new BatchReadingTest_SelectByFirstName());
return suite;
}
//SRG test set is maintained by QA only, do NOT add any new tests into it.
public static TestSuite getSRGReadAllTestSuite() {
TestSuite suite = new TestSuite();
suite.setName("EmployeeReadAllTestSuite");
suite.setDescription("This suite tests the reading of all the objects of each class in the employee demo.");
suite.addTest(new ReadAllTest(Employee.class, 12));
suite.addTest(new ReadAllTest(Project.class, 15));
suite.addTest(new ReadAllTest(LargeProject.class, 5));
suite.addTest(new ReadAllTest(SmallProject.class, 10));
suite.addTest(new ReadAllCallTest(Employee.class, 12, new SQLCall("SELECT t0.VERSION, t1.EMP_ID, t0.L_NAME, t0.F_NAME, t1.SALARY, t0.EMP_ID, t0.GENDER FROM OTOJT_EMPLOYEE t0, OTOJT_SALARY t1 WHERE t1.EMP_ID = t0.EMP_ID")));
return suite;
}
public static TestSuite getReadObjectTestSuite() {
TestSuite suite = getSRGReadObjectTestSuite();
//Add new tests here ...
return suite;
}
//SRG test set is maintained by QA only, do NOT add any new tests into it.
public static TestSuite getSRGReadObjectTestSuite() {
TestSuite suite = new TestSuite();
suite.setName("EmployeeReadObjectTestSuite");
suite.setDescription("This suite test the reading of each object in the employee demo.");
Class<Employee> employeeClass = Employee.class;
Class<LargeProject> largeProjectClass = LargeProject.class;
Class<SmallProject> smallProjectClass = SmallProject.class;
PopulationManager manager = PopulationManager.getDefaultManager();
suite.addTest(new ReadObjectTest(manager.getObject(employeeClass, "0001")));
suite.addTest(new ReadObjectTest(manager.getObject(employeeClass, "0002")));
suite.addTest(new ReadObjectTest(manager.getObject(employeeClass, "0003")));
suite.addTest(new ReadObjectTest(manager.getObject(employeeClass, "0004")));
suite.addTest(new ReadObjectTest(manager.getObject(employeeClass, "0005")));
Employee employee = (Employee)manager.getObject(employeeClass, "0001");
suite.addTest(new ReadObjectCallTest(employeeClass, new SQLCall("SELECT t0.VERSION, t1.EMP_ID, t0.L_NAME, t0.F_NAME, t1.SALARY, t0.EMP_ID, t0.GENDER FROM OTOJT_EMPLOYEE t0, OTOJT_SALARY t1 WHERE t1.EMP_ID = t0.EMP_ID AND t0.F_NAME = '"+employee.getFirstName()+"' AND t0.L_NAME = '"+employee.getLastName()+"'")));
employee = (Employee)manager.getObject(employeeClass, "0002");
suite.addTest(new ReadObjectCallTest(employeeClass, new SQLCall("SELECT t0.VERSION, t1.EMP_ID, t0.L_NAME, t0.F_NAME, t1.SALARY, t0.EMP_ID, t0.GENDER FROM OTOJT_EMPLOYEE t0, OTOJT_SALARY t1 WHERE t1.EMP_ID = t0.EMP_ID AND t0.F_NAME = '"+employee.getFirstName()+"' AND t0.L_NAME = '"+employee.getLastName()+"'")));
employee = (Employee)manager.getObject(employeeClass, "0003");
suite.addTest(new ReadObjectCallTest(employeeClass, new SQLCall("SELECT t0.VERSION, t1.EMP_ID, t0.L_NAME, t0.F_NAME, t1.SALARY, t0.EMP_ID, t0.GENDER FROM OTOJT_EMPLOYEE t0, OTOJT_SALARY t1 WHERE t1.EMP_ID = t0.EMP_ID AND t0.F_NAME = '"+employee.getFirstName()+"' AND t0.L_NAME = '"+employee.getLastName()+"'")));
Project project = (Project)manager.getObject(largeProjectClass, "0001");
ReadObjectTest test = new ReadObjectTest(project);
test.setQuery(new org.eclipse.persistence.queries.ReadObjectQuery(Project.class, new org.eclipse.persistence.expressions.ExpressionBuilder().get("id").equal(project.getId())));
suite.addTest(test);
suite.addTest(new ReadObjectTest(manager.getObject(smallProjectClass, "0001")));
suite.addTest(new ReadObjectTest(manager.getObject(smallProjectClass, "0002")));
suite.addTest(new ReadObjectTest(manager.getObject(smallProjectClass, "0003")));
suite.addTest(new ReadObjectTest(manager.getObject(largeProjectClass, "0001")));
suite.addTest(new ReadObjectTest(manager.getObject(largeProjectClass, "0002")));
suite.addTest(new ReadObjectTest(manager.getObject(largeProjectClass, "0003")));
return suite;
}
public static TestSuite getUpdateObjectTestSuite() {
TestSuite suite = getSRGUpdateObjectTestSuite();
//Add new tests here ...
suite.addTest(new ManyToManyReadOnlyMappingUpdateTest());
suite.addTest(new AddRemoveTest());
return suite;
}
//SRG test set is maintained by QA only, do NOT add any new tests into it.
public static TestSuite getSRGUpdateObjectTestSuite() {
TestSuite suite = new TestSuite();
suite.setName("EmployeeUpdateObjectTestSuite");
suite.setDescription("This suite tests the updating of each object in the employee demo.");
Class<Employee> employeeClass = Employee.class;
Class<LargeProject> largeProjectClass = LargeProject.class;
Class<SmallProject> smallProjectClass = SmallProject.class;
PopulationManager manager = PopulationManager.getDefaultManager();
suite.addTest(new WriteObjectTest(manager.getObject(employeeClass, "0001")));
suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(employeeClass, "0001")));
suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(employeeClass, "0002")));
suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(employeeClass, "0003")));
suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(employeeClass, "0004")));
suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(employeeClass, "0005")));
suite.addTest(new WriteObjectTest(manager.getObject(smallProjectClass, "0001")));
suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(smallProjectClass, "0001")));
suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(smallProjectClass, "0002")));
suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(smallProjectClass, "0003")));
suite.addTest(new WriteObjectTest(manager.getObject(largeProjectClass, "0001")));
suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(largeProjectClass, "0001")));
suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(largeProjectClass, "0002")));
suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(largeProjectClass, "0003")));
return suite;
}
static class ManyToManyReadOnlyMappingUpdateTest extends ComplexUpdateTest {
ManyToManyReadOnlyMappingUpdateTest() {
super();
usesUnitOfWork = true;
setName("ManyToManyReadOnlyMappingUpdateTest");
}
@Override
public void setup() {
// find Project with at least one Employee
List<Project> projects = getSession().readAllObjects(Project.class);
for(int i=0; i < projects.size(); i++) {
if(projects.get(i).getEmployees().size() > 0) {
originalObject = projects.get(i);
break;
}
}
super.setup();
}
// remove all employees
@Override
protected void changeObject() {
Project project = (Project)this.workingCopy;
int size = project.getEmployees().size();
if(size == 0) {
throw new TestProblemException("Project was supposed to have Employees, but doesn't have any.");
} else {
for(int i = size-1; 0 <= i; i--) {
project.removeEmployee(project.getEmployees().get(i));
}
}
}
}
static class AddRemoveTest extends TestCase {
Employee employee;
Address address1, address2;
Project project1, project2;
boolean useAddress;
boolean useProjects;
AddRemoveTest() {
super();
setName("AddRemoveTest");
}
@Override
public void setup() {
useAddress = true;
useProjects = true;
}
@Override
public void test() {
employee = new Employee();
employee.setFirstName("AddRemoveTest");
if(useAddress) {
address1 = new Address();
address1.setCity("city1");
}
if(useProjects) {
project1 = new SmallProject("project1");
}
// insert employee with address/project
UnitOfWork uow = getSession().acquireUnitOfWork();
Employee employeeClone = (Employee)uow.registerObject(employee);
if(useAddress) {
Address address1Clone = (Address)uow.registerObject(address1);
employeeClone.setAddress(address1Clone);
}
if(useProjects) {
Project project1Clone = (Project)uow.registerObject(project1);
employeeClone.addProject(project1Clone);
}
uow.commit();
// remove address/project from employee
uow = getSession().acquireUnitOfWork();
employeeClone = (Employee)uow.registerObject(employee);
if(useAddress) {
employeeClone.setAddress(null);
}
if(useProjects) {
employeeClone.removeProject(employeeClone.getProjects().get(0));
}
uow.commit();
// set address/project into employee
uow = getSession().acquireUnitOfWork();
employeeClone = (Employee)uow.registerObject(employee);
if(useAddress) {
Address address1Clone = (Address)uow.registerObject(address1);
employeeClone.setAddress(address1Clone);
}
if(useProjects) {
Project project1Clone = (Project)uow.registerObject(project1);
employeeClone.addProject(project1Clone);
}
uow.commit();
// override address/project in employee
uow = getSession().acquireUnitOfWork();
employeeClone = (Employee)uow.registerObject(employee);
if(useAddress) {
address2 = new Address();
address2.setCity("city2");
Address address2Clone = (Address)uow.registerObject(address2);
employeeClone.setAddress(address2Clone);
}
if(useProjects) {
project2 = new LargeProject("project2");
Project project2Clone = (Project)uow.registerObject(project2);
employeeClone.addProject(project2Clone);
}
uow.commit();
// delete employee
uow = getSession().acquireUnitOfWork();
uow.deleteObject(employee);
uow.commit();
employee = null;
}
@Override
public void reset() {
UnitOfWork uow = getSession().acquireUnitOfWork();
if(employee != null) {
uow.deleteObject(employee);
}
if(useAddress) {
if(address1 != null) {
uow.deleteObject(address1);
}
if(address2 != null) {
uow.deleteObject(address2);
}
}
if(useProjects) {
if(project1 != null) {
uow.deleteObject(project1);
}
if(project2 != null) {
uow.deleteObject(project2);
}
}
uow.commit();
}
}
static class JoinTest extends TestCase {
public JoinTest() {
super();
setName("JoinTest - no selection criteria");
setDescription("Tests reading of Employees with join expressions.");
}
void setSelectionCriteria(ReadAllQuery query) {
}
@Override
public void test() {
ReadAllQuery query = new ReadAllQuery();
query.setReferenceClass(Employee.class);
setSelectionCriteria(query);
ReadAllQuery controlQuery = (ReadAllQuery)query.clone();
Expression address = query.getExpressionBuilder().getAllowingNull("address");
query.addJoinedAttribute(address);
Expression projectLed = query.getExpressionBuilder().getAllowingNull("projectLed");
query.addJoinedAttribute(projectLed);
Expression manager = query.getExpressionBuilder().getAllowingNull("manager");
query.addJoinedAttribute(manager);
Expression managerProjectLed = manager.getAllowingNull("projectLed");
query.addJoinedAttribute(managerProjectLed);
String errorMsg = JoinedAttributeTestHelper.executeQueriesAndCompareResults(controlQuery, query, (AbstractSession)getSession());
if(errorMsg.length() > 0) {
throw new TestErrorException(errorMsg);
}
}
}
static class JoinTest_SelectByFirstName extends JoinTest {
public JoinTest_SelectByFirstName() {
super();
setName("JoinTest - select by first name");
}
@Override
void setSelectionCriteria(ReadAllQuery query) {
query.setSelectionCriteria(query.getExpressionBuilder().get("firstName").like("J%"));
}
}
static class BatchReadingTest extends TestCase {
boolean shouldPrintDebugOutput = false;
public BatchReadingTest() {
setName("EmployeeBatchReadingTest - no selection criteria");
setDescription("Tests batch reading of Employees with batch expression address");
}
void setSelectionCriteria(ReadAllQuery query) {
}
@Override
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 addressExp = query.getExpressionBuilder().get("address");
query.addBatchReadAttribute(addressExp);
// 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 Address 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++) {
Address address = ((Employee)employees.get(i)).getAddress();
if(isConnected) {
// need to instantiate only a single Address to trigger sql that reads data from the db for all Addresses.
// to ensure that no other sql is issued close connection.
((AbstractSession)getSession()).getAccessor().closeConnection();
isConnected = false;
}
}
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++) {
Address address = ((Employee)controlEmployees.get(i)).getAddress();
}
// compare results
String errorMsg = JoinedAttributeTestHelper.compareCollections(employees, controlEmployees, getSession().getClassDescriptor(Employee.class), ((AbstractSession)getSession()));
if(errorMsg.length() > 0) {
throw new TestErrorException(errorMsg);
}
}
void printDebug(String msg) {
if(this.shouldPrintDebugOutput) {
System.out.println(msg);
}
}
}
static class BatchReadingTest_SelectByFirstName extends BatchReadingTest {
public BatchReadingTest_SelectByFirstName() {
super();
setName("EmployeeBatchReadingTest - select by first name");
}
@Override
void setSelectionCriteria(ReadAllQuery query) {
query.setSelectionCriteria(query.getExpressionBuilder().get("firstName").like("J%"));
}
}
// copied 6 methods from org.eclipse.persistence.testing.tests.expressions.ExpressionTestSuite
static class ExpressionTestSuite extends TestSuite {
public ExpressionTestSuite() {
setName("ExpressionTestSuite");
setDescription("This suite tests expressions.");
}
@Override
public void addTests() {
addMultipleAndsTest();
addMultipleAndsTest2();
addMultipleAndsTest3();
addMultipleAndsTest4();
addMultipleAndsTest5();
addMultipleAndsTest6();
addEqualUnneccessaryJoinTest();
addManagersOfWealthyMarriedAtWorkEmployeesTest();
addOneToManyJoin2WithBatchReadTest();
}
private void addMultipleAndsTest() {
ExpressionBuilder builder = new ExpressionBuilder();
//this is a bug, wrong generated SQL like... ADDRESS.ADDRESS_ID = EMPLOYEE.ADDR_ID...
//however, it should be ... ADDRESS.ADDRESS_ID = 0...
Expression expression = builder.get("address").equal(new Address()).and(builder.get("lastName").notEqual("foopoyp"));
ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 0);
test.setExpression(expression);
test.setName("MultipleAndsExpressionTest");
test.setDescription("Test object equality with object will null primary key");
addTest(test);
}
private void addMultipleAndsTest2() {
//there is a bug, generated SQL looks like ... (ADDRESS.ADDRESS_ID = 123456)) AND (ADDRESS.ADDRESS_ID = EMPLOYEE.ADDR_ID)...
//should be: ...EMPLOYEE.ADDR_ID = 123456... no join needed!
ExpressionBuilder builder = new ExpressionBuilder();
Address a = new Address();
a.setId(new java.math.BigDecimal(123456));
Expression expression = builder.get("address").equal(a).and(builder.get("id").greaterThan(800));
ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 0);
test.setQuery(new ReadAllQuery(Employee.class, expression));
test.getQuery().addAscendingOrdering("id");
test.setExpression(expression);
test.setName("MultipleAndsExpressionTest2");
test.setDescription("Test multiple ands with object equality");
addTest(test);
}
private void addMultipleAndsTest3() {
//there is a bug, generated wrong SQL looks like ... FROM ADDRESS t3, SALARY t2, EMPLOYEE t1 WHERE (((((t1.EMP_ID > '800') AND ) AND (t1.EMP_ID = t2.EMP_ID)) AND (t3.ADDRESS_ID = 123456))...
ExpressionBuilder builder = new ExpressionBuilder();
Address a = new Address();
a.setId(new java.math.BigDecimal(123456));
Expression expression = builder.get("id").greaterThan(800).and(builder.get("address").equal(a));
ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 0);
test.setQuery(new ReadAllQuery(Employee.class, expression));
test.getQuery().addAscendingOrdering("id");
test.setExpression(expression);
test.setName("MultipleAndsExpressionTest3");
test.setDescription("Test multiple ands with object equality");
addTest(test);
}
private void addMultipleAndsTest4() {
// This tests the case of a tree where the top-level AND should print, even though
// both branches underneath it are partly suppressed.
ExpressionBuilder builder = new ExpressionBuilder();
Address address1 = new Address();
address1.setId(new java.math.BigDecimal(999999876));
Address address2 = new Address();
address2.setId(new java.math.BigDecimal(999999877));
Expression expression1 = builder.get("address").equal(address1).or(builder.get("lastName").equal("Smith"));
Expression expression2 = builder.get("address").equal(address2).or(builder.get("firstName").equal("Bob"));
ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1);
test.setExpression(expression1.and(expression2));
test.setName("MultipleAndsExpressionTest4");
test.setDescription("Test multiple booleans with supression in each branch");
addTest(test);
}
private void addMultipleAndsTest5() {
ExpressionBuilder builder = new ExpressionBuilder();
//this is a bug, Ill-formed expression in query, attempting to print an object reference into a
//SQL statement for Query Key address{DatabaseTable(t1)=DatabaseTable(ADDRESS)}
//however, it should be ... EMPLOYEE.ADDRESS_ID = 0 (null)...
Expression expression = builder.get("address").equal(null).and(builder.get("lastName").notEqual("foopoyp"));
ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 0);
test.setExpression(expression);
test.setName("MultipleAndsExpressionTest5");
test.setDescription("Test multiple ands expression");
addTest(test);
}
private void addMultipleAndsTest6() {
ExpressionBuilder builder = new ExpressionBuilder();
//this is a bug, Ill-formed expression in query, attempting to print an object reference into a
//SQL statement for Query Key address{DatabaseTable(t1)=DatabaseTable(ADDRESS)}
//however, it should be ... EMPLOYEE.ADDRESS_ID = 0 (null)...
Expression expression = builder.get("address").isNull().and(builder.get("lastName").notEqual("foopoyp"));
ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 0);
test.setExpression(expression);
test.setName("MultipleAndsExpressionTest6");
test.setDescription("Test multiple ands expression");
addTest(test);
}
/*
* bug 5683148/2380: Reducing unnecessary joins on an equality check between the a statement
* and itself
*/
private void addEqualUnneccessaryJoinTest() {
Employee employee = (Employee)PopulationManager.getDefaultManager().getObject(new Employee().getClass(), "0008");
ExpressionBuilder builder = new ExpressionBuilder();
Expression expression = builder.get("firstName").equal("Fred").or(builder.get("manager").notEqual(builder.get("manager")));
ReadObjectExpressionTest test = new ReadObjectExpressionTest(employee, expression);
test.setName("EqualUnneccessaryJoinTest");
test.setDescription("Test = expression does not create an extra unneccessary join");
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. Does not tests batch reading. For 2612185.");
test.addUnsupportedPlatform(TimesTenPlatform.class);
addTest(test);
}
/**
* @bug 2720149 INVALID SQL WHEN USING BATCH READS AND MULTIPLE ANYOFS
*/
private void addOneToManyJoin2WithBatchReadTest() {
ExpressionBuilder builder = new ExpressionBuilder();
Expression expression = builder.anyOf("managedEmployees").get("lastName").like("Sa%");
Expression exp2 = builder.anyOf("managedEmployees").get("firstName").like("B%");
expression = expression.and(exp2);
ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1);
test.setExpression(expression);
test.testBatchAttributesOnEmployee();
test.setName("OneToManyJoin2WithBatchReadTest");
test.setDescription("Test a join across a 1:many relation with 2 anyOf clauses, and test again as part of a batch read.");
addTest(test);
}
}
public static TestSuite getUOWInsertObjectTestSuite() {
TestSuite suite = new TestSuite();
suite.setName("EmployeeUOWBasicInsertObjectTestSuite");
suite.setDescription("This suite tests the insertion of each object in the employee demo using uow.");
EmployeePopulator populator = new EmployeePopulator();
suite.addTest(new UnitOfWorkBasicInsertObjectTest(populator.basicEmployeeExample1()));
suite.addTest(new UnitOfWorkBasicInsertObjectTest(populator.basicEmployeeExample2()));
suite.addTest(new UnitOfWorkBasicInsertObjectTest(populator.basicEmployeeExample3()));
suite.addTest(new UnitOfWorkBasicInsertObjectTest(populator.basicEmployeeExample4()));
suite.addTest(new UnitOfWorkBasicInsertObjectTest(populator.basicEmployeeExample5()));
return suite;
}
static class EmployeeDeleteTest extends DeleteObjectTest {
public EmployeeDeleteTest(Object originalObject) {
super(originalObject);
}
@Override
protected void setup() {
super.setup();
// Must drop references first to appease constraints.
getSession().executeNonSelectingCall(new SQLCall("delete from OTOJT_PROJ_LEADER where EMP_ID = " + ((Employee)getOriginalObject()).getId()));
getSession().executeNonSelectingCall(new SQLCall("delete from OTOJT_EMP_MANAGER where MANAGER_ID = " + ((Employee)getOriginalObject()).getId()));
}
}
static class ProjectDeleteTest extends DeleteObjectTest {
public ProjectDeleteTest(Object originalObject) {
super(originalObject);
}
@Override
protected void setup() {
super.setup();
// Must drop references first to appease constraints.
getSession().executeNonSelectingCall(new SQLCall("delete from OTOJT_PROJ_EMP where PROJ_ID = " + ((Project)getOriginalObject()).getId()));
}
}
static class ReadAllExpressionTest extends org.eclipse.persistence.testing.tests.expressions.ReadAllExpressionTest {
public ReadAllExpressionTest(Class<?> referenceClass, int originalObjectsSize) {
super(referenceClass, originalObjectsSize);
}
@Override
protected void setupBatchAttributes() {
getQuery().addBatchReadAttribute("children");
getQuery().addBatchReadAttribute("address");
getQuery().addBatchReadAttribute("responsibilitiesList");
getQuery().addBatchReadAttribute("projects");
}
@Override
protected void testBatchAttributes() {
Vector result = (Vector) this.objectsFromDatabase;
List<Child> children = ((Employee) result.elementAt(0)).getChildren();
((Employee) result.elementAt(0)).getResponsibilitiesList().size();
((Employee) result.elementAt(0)).getProjects().size();
if ((children == null) || (children.size() == 0)) {
throw new TestErrorException("The original query was corrupted when made part of a batch query.");
}
if (((Employee) result.elementAt(0)).getAddress() == null) {
throw new TestErrorException("The original query was corrupted when made part of a batch query.");
}
}
}
}