blob: 4b5e2838c66492efd21fbe41950fb928a5b2532e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 1998, 2013 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.queries.optimization;
import java.util.List;
import org.eclipse.persistence.tools.schemaframework.PopulationManager;
import org.eclipse.persistence.queries.*;
import org.eclipse.persistence.annotations.BatchFetchType;
import org.eclipse.persistence.expressions.*;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.testing.models.employee.domain.*;
import org.eclipse.persistence.testing.models.inheritance.Engineer;
import org.eclipse.persistence.testing.models.ownership.ObjectA;
/**
* Test query optimization features, joining, batch reading, partial object reading.
*/
@SuppressWarnings("deprecation")
public class QueryOptimizationTestSuite extends TestSuite {
public QueryOptimizationTestSuite() {
setDescription("This suite tests query optimization, aggregation and batch reading.");
}
public void addBatchTests() {
addBatchTests(BatchFetchType.JOIN);
addBatchTests(BatchFetchType.EXISTS);
addBatchTests(BatchFetchType.IN);
}
public void addBatchTests(BatchFetchType batchType) {
// Batch reading
ReadAllBatchReadingTest testbb1 = new ReadAllBatchReadingTest(12);
testbb1.setName("ReadAllBatchReadingTestAddressManager" + batchType);
ReadAllQuery querybb1 = new ReadAllQuery();
querybb1.setBatchFetchType(batchType);
querybb1.setReferenceClass(Employee.class);
querybb1.addBatchReadAttribute("address");
querybb1.addBatchReadAttribute("manager");
querybb1.addBatchReadAttribute("phoneNumbers");
querybb1.addBatchReadAttribute("projects");
querybb1.addBatchReadAttribute("responsibilitiesList");
testbb1.setQuery(querybb1);
addTest(testbb1);
ReadAllBatchReadingTest testbb2 = new ReadAllBatchReadingTest(2);
testbb2.setName("ReadAllBatchReadingTestWhereAddressManager" + batchType);
ReadAllQuery querybb2 = new ReadAllQuery();
querybb2.setBatchFetchType(batchType);
querybb2.setReferenceClass(Employee.class);
querybb2.addBatchReadAttribute("address");
querybb2.addBatchReadAttribute("manager");
querybb2.addBatchReadAttribute("phoneNumbers");
querybb2.addBatchReadAttribute("projects");
querybb2.addBatchReadAttribute("responsibilitiesList");
querybb2.setSelectionCriteria(new org.eclipse.persistence.expressions.ExpressionBuilder().get("lastName").equal("Way"));
testbb2.setQuery(querybb2);
addTest(testbb2);
//add the BatchReadingUnitOfWorkTest and BatchReadingUnitOfWorkInTransactionTest
BatchReadingUnitOfWorkTest testbb3 = new BatchReadingUnitOfWorkTest(batchType);
addTest(testbb3);
BatchReadingUnitOfWorkInTransactionTest testbb4 = new BatchReadingUnitOfWorkInTransactionTest(batchType);
addTest(testbb4);
//adding the OneToMany tests
OneToManyBatchReadingTest testbb5 = new OneToManyBatchReadingTest(batchType);
addTest(testbb5);
addTest(new BatchReadingTest(batchType));
OneToManyBatchReadingCustomSelectionQueryTest testbb6 = new OneToManyBatchReadingCustomSelectionQueryTest(batchType);
addTest(testbb6);
ReadAllBatchReadingTest test3 = new ReadAllBatchReadingTest(2);
test3.setName("ReadAllBatchReadingTestWhereAddressManager-cursor" + batchType);
ReadAllQuery query3 = new ReadAllQuery();
query3.setBatchFetchType(batchType);
query3.setReferenceClass(Employee.class);
query3.useCursoredStream();
query3.addBatchReadAttribute("address");
query3.addBatchReadAttribute("manager");
query3.addBatchReadAttribute("phoneNumbers");
query3.addBatchReadAttribute("projects");
querybb1.addBatchReadAttribute("responsibilitiesList");
query3.setSelectionCriteria(new org.eclipse.persistence.expressions.ExpressionBuilder().get("lastName").equal("Way"));
test3.setQuery(query3);
addTest(test3);
NestedOneToManyBatchReadAllTest test3_5 = new NestedOneToManyBatchReadAllTest(org.eclipse.persistence.testing.models.collections.Restaurant.class, 15);
test3_5.setName("NestedOneToManyBatchReadAllTest" + batchType);
ReadAllQuery query3_5 = new ReadAllQuery();
query3_5.setBatchFetchType(batchType);
query3_5.setReferenceClass(org.eclipse.persistence.testing.models.collections.Restaurant.class);
query3_5.addBatchReadAttribute("menus");
test3_5.setQuery(query3_5);
addTest(test3_5);
//Batch testing on 1-1 mapping
ReadAllTest test4 = new ReadAllTest(org.eclipse.persistence.testing.models.insurance.Policy.class, 3);
test4.setName("ReadAllBatchReadingTestPolicyHolder" + batchType);
ReadAllQuery query4 = new ReadAllQuery();
query4.setBatchFetchType(batchType);
query4.setReferenceClass(org.eclipse.persistence.testing.models.insurance.Policy.class);
query4.addBatchReadAttribute("policyHolder");
query4.setSelectionCriteria(new org.eclipse.persistence.expressions.ExpressionBuilder().get("maxCoverage").greaterThan(40000));
test4.setQuery(query4);
addTest(test4);
addTest(new OneToOneBatchReadingTest(batchType));
// Batch testing on 1-M mapping.
ReadAllTest test5 = new ReadAllTest(org.eclipse.persistence.testing.models.insurance.Policy.class, 4);
test5.setName("ReadAllBatchReadingTestClaim" + batchType);
ReadAllQuery query5 = new ReadAllQuery();
query5.setBatchFetchType(batchType);
query5.setReferenceClass(org.eclipse.persistence.testing.models.insurance.Policy.class);
query5.addBatchReadAttribute("claims");
query5.setSelectionCriteria(new org.eclipse.persistence.expressions.ExpressionBuilder().get("maxCoverage").greaterThan(30000));
test5.setQuery(query5);
addTest(test5);
addTest(new OneToManyBatchReadingTest(batchType));
addTest(new NestedBatchReadingTest(batchType));
addTest(new NestedBatchReadingNPETest(batchType));
addTest(new AggregateBatchReadingTest(batchType));
addTest(new BatchReadingBatchReadExpressionTest(batchType));
addTest(new BatchReadingWithInvalidQueryKeyTest(batchType));
addTest(new BatchReadValueholderTest(batchType));
addTest(new BatchReadingStackOverflowTest(batchType));
}
public void addJoinTests() {
PopulationManager manager = PopulationManager.getDefaultManager();
Employee object = (Employee)manager.getObject(Employee.class, "0002");
// Joining
ReadObjectTest test = new ReadObjectTest(object);
test.setName("JoiningReadObjectTestAddress");
ReadObjectQuery query = new ReadObjectQuery();
query.setSelectionObject(object);
query.addJoinedAttribute("address");
test.setQuery(query);
addTest(test);
ReadObjectTest test1a = new ReadObjectTest(object);
test1a.setName("JoiningReadObjectTestAddressManager");
ReadObjectQuery query1a = new ReadObjectQuery();
query1a.setSelectionObject(object);
query1a.addJoinedAttribute("address");
query1a.addJoinedAttribute("manager");
test1a.setQuery(query1a);
addTest(test1a);
ReadObjectTest test1m = new ReadObjectTest(object);
test1m.setName("JoiningReadObjectTestPhones");
ReadObjectQuery query1m = new ReadObjectQuery();
query1m.setSelectionObject(object);
query1m.addJoinedAttribute(query1m.getExpressionBuilder().anyOf("phoneNumbers"));
test1m.setQuery(query1m);
addTest(test1m);
test1m = new ReadObjectTest(object);
test1m.setName("JoiningReadObjectTestPhonesOuter");
query1m = new ReadObjectQuery();
query1m.setSelectionObject(object);
query1m.addJoinedAttribute(query1m.getExpressionBuilder().anyOfAllowingNone("phoneNumbers"));
test1m.setQuery(query1m);
addTest(test1m);
addTest(new ReadAnyObjectJoinPhoneTest());
Object person = manager.getObject(Engineer.class, "example2");
ReadObjectTest test1b = new ReadObjectTest(person);
test1b.setName("JoiningInheritanceRelationshipTest");
ReadObjectQuery query1b = new ReadObjectQuery();
query1b.setSelectionObject(person);
query1b.addJoinedAttribute("bestFriend");
query1b.addJoinedAttribute("representitive");
test1b.setQuery(query1b);
addTest(test1b);
ReadObjectTest test1bx = new ReadObjectTest(person);
test1bx.setName("NestedJoiningInheritanceRelationshipTest");
ReadObjectQuery query1bx = new ReadObjectQuery();
query1bx.setSelectionObject(person);
query1bx.addJoinedAttribute(query1bx.getExpressionBuilder().get("bestFriend"));
query1bx.addJoinedAttribute(query1bx.getExpressionBuilder().get("bestFriend").getAllowingNull("bestFriend"));
query1bx.addJoinedAttribute(query1bx.getExpressionBuilder().get("bestFriend").getAllowingNull("representitive"));
query1bx.addJoinedAttribute(query1bx.getExpressionBuilder().get("representitive"));
test1bx.setQuery(query1bx);
addTest(test1bx);
ReadObjectTest test1c = new ReadObjectTest(object);
test1c.setName("JoiningReadObjectTestAddressManagerManager");
ReadObjectQuery query1c = new ReadObjectQuery();
query1c.setSelectionObject(object);
query1c.addJoinedAttribute("address");
query1c.addJoinedAttribute("manager");
query1c.addJoinedAttribute(query1c.getExpressionBuilder().get("manager").get("manager"));
test1c.setQuery(query1c);
addTest(test1c);
ReadAllTest test2 = new ReadAllTest(Employee.class, 12);
test2.setName("JoiningReadAllTestAddress");
ReadAllQuery query2 = new ReadAllQuery();
query2.setReferenceClass(Employee.class);
query2.addJoinedAttribute("address");
query2.addJoinedAttribute(query2.getExpressionBuilder().getAllowingNull("manager"));
test2.setQuery(query2);
addTest(test2);
ReadAllTest testReadAll1m = new ReadAllTest(Employee.class, 12);
testReadAll1m.setName("JoiningReadAllTestPhones");
ReadAllQuery queryReadAll1m = new ReadAllQuery();
queryReadAll1m.setReferenceClass(Employee.class);
queryReadAll1m.addJoinedAttribute(queryReadAll1m.getExpressionBuilder().anyOf("phoneNumbers"));
testReadAll1m.setQuery(queryReadAll1m);
addTest(testReadAll1m);
ReadAllTest testReadAll21m = new ReadAllTest(Employee.class, 5);
testReadAll21m.setName("JoiningReadAllTestPhonesManagedEmployeesPhones");
ReadAllQuery queryReadAll21m = new ReadAllQuery();
queryReadAll21m.setReferenceClass(Employee.class);
Expression managedEmployee = queryReadAll21m.getExpressionBuilder().anyOf("managedEmployees");
queryReadAll21m.addJoinedAttribute(queryReadAll21m.getExpressionBuilder().anyOf("phoneNumbers"));
queryReadAll21m.addJoinedAttribute(managedEmployee);
queryReadAll21m.addJoinedAttribute(managedEmployee.anyOf("phoneNumbers"));
testReadAll21m.setQuery(queryReadAll21m);
addTest(testReadAll21m);
ReadAllTest test2a = new ReadAllTest(Employee.class, 2);
test2a.setName("JoiningReadAllTestWhereLastNameWay");
ReadAllQuery query2a = new ReadAllQuery();
query2a.setReferenceClass(Employee.class);
query2a.addJoinedAttribute("address");
query2a.setSelectionCriteria(new ExpressionBuilder().get("lastName").equal("Way"));
test2a.setQuery(query2a);
addTest(test2a);
ReadObjectTest test2az = new ReadObjectTest(object);
test2az.setName("JoiningReadObjectTestCustomSQL");
ReadObjectQuery query2az = new ReadObjectQuery();
query2az.setReferenceClass(Employee.class);
query2az.addJoinedAttribute("address");
query2az.setSQLString("Select * from EMPLOYEE E, SALARY S, ADDRESS A WHERE E.EMP_ID = S.EMP_ID AND E.ADDR_ID = A.ADDRESS_ID AND E.EMP_ID = " + object.getId());
test2az.setQuery(query2az);
addTest(test2az);
ReadAllTest test2ax = new ReadAllTest(Employee.class, 2);
test2ax.setName("JoiningReadAllTestCustomSQL");
ReadAllQuery query2ax = new ReadAllQuery();
query2ax.setReferenceClass(Employee.class);
query2ax.addJoinedAttribute("address");
query2ax.setSQLString("Select * from EMPLOYEE E, SALARY S, ADDRESS A WHERE E.EMP_ID = S.EMP_ID AND E.ADDR_ID = A.ADDRESS_ID AND E.L_NAME = 'Way'");
test2ax.setQuery(query2ax);
addTest(test2ax);
ReadAllTest test2aa = new ReadAllTest(Employee.class, 2);
test2aa.setName("JoiningReadAllTestWhereLastNameWay-cursor");
ReadAllQuery query2aa = new ReadAllQuery();
query2aa.setReferenceClass(Employee.class);
query2aa.useCursoredStream();
query2aa.addJoinedAttribute("address");
query2aa.setSelectionCriteria(new org.eclipse.persistence.expressions.ExpressionBuilder().get("lastName").equal("Way"));
test2aa.setQuery(query2aa);
addTest(test2aa);
ReadAllJoinReadingTest test2b = new ReadAllJoinReadingTest(3, "teamLeader-address");
ReadAllQuery query2b = new ReadAllQuery();
query2b.setReferenceClass(LargeProject.class);
query2b.addJoinedAttribute(query2b.getExpressionBuilder().get("teamLeader"));
query2b.addJoinedAttribute(query2b.getExpressionBuilder().get("teamLeader").get("address"));
test2b.setQuery(query2b);
addTest(test2b);
ReadAllTest ownerTest = new ReadAllTest(ObjectA.class, 3);
ownerTest.setName("JoinOwnerA-oneToOne-oneToMany");
ReadAllQuery ownerQuery = new ReadAllQuery();
ownerQuery.setReferenceClass(ObjectA.class);
ownerQuery.addJoinedAttribute(ownerQuery.getExpressionBuilder().get("oneToOne"));
ownerQuery.addJoinedAttribute(ownerQuery.getExpressionBuilder().get("oneToOne").anyOf("oneToMany"));
ownerTest.setQuery(ownerQuery);
addTest(ownerTest);
ReadAllTest ownerTest3 = new ReadAllTest(ObjectA.class, 3);
ownerTest3.setName("JoinOwnerA-oneToOne-oneToMany-oneToOne");
ReadAllQuery ownerQuery3 = new ReadAllQuery();
ownerQuery3.setReferenceClass(ObjectA.class);
ownerQuery3.addJoinedAttribute(ownerQuery.getExpressionBuilder().get("oneToOne"));
Expression join = ownerQuery.getExpressionBuilder().get("oneToOne").anyOf("oneToMany");
ownerQuery3.addJoinedAttribute(join);
ownerQuery3.addJoinedAttribute(join.get("oneToOne"));
ownerTest3.setQuery(ownerQuery3);
addTest(ownerTest3);
ReadAllTest ownerTest2 = new ReadAllTest(ObjectA.class, 3);
ownerTest2.setName("JoinOwnerA-oneToOne(mapping)");
ReadAllQuery ownerQuery2 = new ReadAllQuery();
ownerQuery2.setReferenceClass(ObjectA.class);
ownerTest2.setQuery(ownerQuery2);
addTest(ownerTest2);
ReadAllTest test3 = new ReadAllTest(LargeProject.class, 3);
ReadAllQuery query3 = new ReadAllQuery();
query3.setReferenceClass(LargeProject.class);
query3.useCursoredStream();
query3.addJoinedAttribute(query3.getExpressionBuilder().get("teamLeader"));
query3.addJoinedAttribute(query3.getExpressionBuilder().get("teamLeader").get("address"));
test3.setQuery(query3);
addTest(test3);
addTest(new ReadObjectMappingJoinReadingTest());
addTest(new MultipleJoinedAttributeQueryTest());
addTest(new ComplexJoinedAttributeQueryTest());
}
public void addPartialTests() {
// Partial objects
ReadAllPartialReadingTest test3 = new ReadAllPartialReadingTest(12, "fisrtName");
test3.setName("ReadAllPartialReadingTest-firstName,salary");
ReadAllQuery query3 = new ReadAllQuery();
query3.setReferenceClass(Employee.class);
query3.dontMaintainCache();
query3.addPartialAttribute("firstName");
query3.addPartialAttribute("salary");
test3.setQuery(query3);
addTest(test3);
ReadAllPartialReadingTest test4 = new ReadAllPartialReadingTest(1, "address");
test4.setName("ReadAllPartialReadingTest-address,period");
ReadAllQuery query4 = new ReadAllQuery();
query4.setReferenceClass(Employee.class);
query4.dontMaintainCache();
query4.addPartialAttribute("address");
query4.addPartialAttribute("period");
query4.setSelectionCriteria(new org.eclipse.persistence.expressions.ExpressionBuilder().get("address").get("city").equal("Ottawa"));
test4.setQuery(query4);
addTest(test4);
ReadAllPartialReadingTest test5 = new ReadAllPartialReadingTest(12, "city");
test5.setName("ReadAllPartialReadingTest-city,salary");
ReadAllQuery query5 = new ReadAllQuery();
query5.setReferenceClass(Employee.class);
query5.dontMaintainCache();
query5.addPartialAttribute(query5.getExpressionBuilder().get("address").get("city"));
query5.addPartialAttribute("salary");
test5.setQuery(query5);
addTest(test5);
ReadAllPartialReadingTest test6 = new ReadAllPartialReadingTest(12, "city");
test6.setName("ReadAllPartialReadingTest-city,salary-cursor");
ReadAllQuery query6 = new ReadAllQuery();
query6.useCursoredStream();
query6.setReferenceClass(Employee.class);
query6.dontMaintainCache();
query6.addPartialAttribute(query6.getExpressionBuilder().get("address").get("city"));
query6.addPartialAttribute("salary");
test6.setQuery(query6);
addTest(test6);
ReadAllPartialReadingTest test1m = new ReadAllPartialReadingTest(12, "areaCode");
test1m.setName("ReadAllPartialReadingTest-type-areaCode");
ReadAllQuery query1m = new ReadAllQuery();
query1m.setReferenceClass(Employee.class);
query1m.dontMaintainCache();
Expression phones = query1m.getExpressionBuilder().anyOf("phoneNumbers");
query1m.addPartialAttribute(phones.get("id"));
query1m.addPartialAttribute(phones.get("type"));
query1m.addPartialAttribute(phones.get("areaCode"));
test1m.setQuery(query1m);
addTest(test1m);
ReadAllTest test9 = new ReadAllTest(Employee.class, 12);
test9.setName("ReadAllPartialReadingTest-PolicyMaxCoverage");
ReadAllQuery query9 = new ReadAllQuery();
query9.setReferenceClass(Employee.class);
query9.dontMaintainCache();
query9.addPartialAttribute("normalHours");
//query9.addPartialAttribute("policyHolder");
test9.setQuery(query9);
addTest(test9);
ReadAllPartialReadingTest test10 = new ReadAllPartialReadingTest(12, "id");
test10.setName("ReadAllPartialReadingTest-id-SelectPrimaryKey");
ReadAllQuery query10 = new ReadAllQuery();
query10.setReferenceClass(Employee.class);
query10.dontMaintainCache();
query10.addPartialAttribute("id");
test10.setQuery(query10);
addTest(test10);
ReadAllPartialReadingTest test11 = new ReadAllPartialReadingTest(12, "firstName");
test11.setName("ReadAllPartialReadingTest-firstName-OrderByPrimaryKey");
ReadAllQuery query11 = new ReadAllQuery();
query11.setReferenceClass(Employee.class);
query11.dontMaintainCache();
query11.addPartialAttribute("firstName");
query11.addAscendingOrdering("id");
test11.setQuery(query11);
addTest(test11);
ReadAllPartialReadingTest test12 = new ReadAllPartialReadingTest(12, "id");
test12.setName("ReadAllPartialReadingTest-firstName-SelectAndOrderByPrimaryKey");
ReadAllQuery query12 = new ReadAllQuery();
query12.setReferenceClass(Employee.class);
query12.dontMaintainCache();
query12.addPartialAttribute("id");
query12.addAscendingOrdering("id");
test12.setQuery(query12);
addTest(test12);
ReadAllPartialReadingAddressTest test14 = new ReadAllPartialReadingAddressTest(12, "id");
test14.setName("ReadAllPartialReadingAddressTest - Address - SelectDistinctAndOrderByPrimaryKey");
ReadAllQuery query14 = new ReadAllQuery();
query14.setReferenceClass(Address.class);
query14.dontMaintainCache();
query14.addPartialAttribute("id");
query14.addAscendingOrdering("id");
query14.useDistinct();
test14.setQuery(query14);
addTest(test14);
ReadAllPartialReadingAddressTest test15 = new ReadAllPartialReadingAddressTest(12, "id");
test15.setName("ReadAllPartialReadingAddressTest - Employee - SelectAddressId");
ReadAllQuery query15 = new ReadAllQuery();
query15.setReferenceClass(Employee.class);
query15.dontMaintainCache();
query15.addPartialAttribute("id");
query15.addPartialAttribute(new org.eclipse.persistence.expressions.ExpressionBuilder().get("address").get("id"));
test15.setQuery(query15);
addTest(test15);
ReadAllPartialReadingAddressTest test16 = new ReadAllPartialReadingAddressTest(26, "id");
test16.setName("ReadAllPartialReadingAddressTest - PhoneNumber - Employee - SelectAddressId");
ReadAllQuery query16 = new ReadAllQuery();
query16.setReferenceClass(PhoneNumber.class);
query16.dontMaintainCache();
query16.useDistinct();
query16.addPartialAttribute(new org.eclipse.persistence.expressions.ExpressionBuilder().get("owner").get("address").get("id"));
test16.setQuery(query16);
addTest(test16);
addTest(new QueryValidationTest());
}
public void addTests() {
addJoinTests();
addBatchTests();
addPartialTests();
addTest(new ReadAllBindAllParametersTest());
addTest(buildBatch1mTest());
}
public TestCase buildBatch1mTest() {
TestCase test = new TestCase() {
public void test() {
getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
ReadAllQuery query = new ReadAllQuery();
query.setReferenceClass(Employee.class);
Expression rootExpression = query.getExpressionBuilder();
Expression filterPart1 =
rootExpression.anyOfAllowingNone("phoneNumbers")
.getAllowingNull("owner").get("firstName").like("%");
Expression filterPart2 =
rootExpression.anyOfAllowingNone("phoneNumbers")
.get("number").like("%");
query.setSelectionCriteria(filterPart1.and(filterPart2));
Expression expression = rootExpression.getAllowingNull("address");
query.addBatchReadAttribute(expression);
Expression expression2 = rootExpression.getAllowingNull("phoneNumbers");
query.addBatchReadAttribute(expression2);
List<Employee> result = (List<Employee>) getSession().executeQuery(query);
result.get(0).getPhoneNumbers().size();
getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
for (Employee employee : result) {
if (!compareObjects(employee, getSession().readObject(employee))) {
throwError("Employeee does not match:" + employee);
}
}
}
};
test.setName("Batch1mTest");
return test;
}
}