/******************************************************************************* | |
* 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; | |
import java.util.Vector; | |
import org.eclipse.persistence.sessions.UnitOfWork; | |
import org.eclipse.persistence.testing.framework.*; | |
import org.eclipse.persistence.testing.models.employee.domain.*; | |
import org.eclipse.persistence.queries.*; | |
/** | |
* Bug 5501751: USING GETALLOWINGNULL() WITH ADDPARTIALATTRIBUTE() BROKEN IN 10.1.3 | |
*/ | |
@SuppressWarnings("deprecation") | |
public class FourPartialAttributeTestsWithJoinAttribute extends TestCase { | |
static String lastName = "PartialAttributeTest"; | |
Vector[] results = new Vector[4]; | |
public FourPartialAttributeTestsWithJoinAttribute() { | |
setDescription("A partial attribute query where the partial attribute is also joined - 4 tests: all combinations of (inner join vs outer join) and (get(address) vs get(address).get(city))."); | |
} | |
public void setup() { | |
// remove Employees with the lastName in case they exist. | |
cleanup(); | |
// create two Employees with the lastName: one with an address another without. | |
Employee empA = new Employee(); | |
empA.setLastName(lastName); | |
empA.setFirstName("A"); | |
Address address = new Address(); | |
address.setCountry("Canada"); | |
address.setCity("Ottawa"); | |
address.setStreet("O'Connor"); | |
// Employee A has Address | |
empA.setAddress(address); | |
// Employee B doesn't have an Address | |
Employee empB = new Employee(); | |
empB.setLastName(lastName); | |
empB.setFirstName("B"); | |
// save the created objects | |
UnitOfWork uow = getSession().acquireUnitOfWork(); | |
uow.registerNewObject(empA); | |
uow.registerNewObject(empB); | |
uow.commit(); | |
// clear the cache | |
getSession().getIdentityMapAccessor().initializeAllIdentityMaps(); | |
} | |
public void test() { | |
ReadAllQuery[] queries = {createQuery(), createQuery(), createQuery(), createQuery()}; | |
// The same as PartialAttributeTestWithJoinAttribute, but without changing any settings on the mapping. | |
// Inner join: should return | |
// empA's first and last names and it's address. | |
queries[0].addPartialAttribute("address"); | |
// Inner join: should return | |
// empA's first and last names and it's address's city. | |
queries[1].addPartialAttribute(queries[1].getExpressionBuilder().get("address").get("city")); | |
// Outer join: should return | |
// empA's first and last names and it's address; | |
// empB's first and last names and null address. | |
queries[2].addPartialAttribute(queries[2].getExpressionBuilder().getAllowingNull("address")); | |
// Outer join: should return | |
// empA's first and last names and it's address's city; | |
// empB's first and last names and address containing all nulls. | |
queries[3].addPartialAttribute(queries[3].getExpressionBuilder().getAllowingNull("address").get("city")); | |
for(int i=0; i<4; i++) { | |
results[i] = (Vector)getSession().executeQuery(queries[i]); | |
} | |
} | |
protected void verify() { | |
String errorMsg = ""; | |
for(int i=0; i<4; i++) { | |
Employee empA = null; | |
if(results[i].size() >= 1) { | |
empA = (Employee)results[i].elementAt(0); | |
} | |
Employee empB = null; | |
if(results[i].size() >= 2) { | |
empB = (Employee)results[i].elementAt(1); | |
} | |
if(empA == null) { | |
errorMsg = errorMsg + "query"+i+" hasn't returned Employee A; "; | |
} else { | |
if(empA.getAddress() == null) { | |
errorMsg = errorMsg + "query"+i+" returned Employee A with null Address; "; | |
} | |
} | |
if(i==0 || i==1) { | |
// i==0 || i==1 - Inner join | |
if(empB != null) { | |
errorMsg = errorMsg + "query"+i+" has returned Employee B; "; | |
} | |
} else { | |
// i==2 || i==3 - Outer join | |
if(empB == null) { | |
errorMsg = errorMsg + "query"+i+" has not returned Employee B; "; | |
} else { | |
if(i==2) { | |
// builder.getAllowingNull("address") | |
if(empB.getAddress() != null) { | |
errorMsg = errorMsg + "query"+i+" has returned Employee B's address; "; | |
} | |
} else { | |
// builder.getAllowingNull("address").get("city") | |
if(empB.getAddress() == null) { | |
errorMsg = errorMsg + "query"+i+" has not returned Employee B's address; "; | |
} else { | |
if(empB.getAddress().getCity() != null) { | |
errorMsg = errorMsg + "query"+i+" has returned Employee B's address with city != null; "; | |
} | |
} | |
} | |
} | |
} | |
} | |
if(errorMsg.length() > 0) { | |
throw new TestErrorException(errorMsg); | |
} | |
} | |
public void reset() { | |
cleanup(); | |
getSession().getIdentityMapAccessor().initializeAllIdentityMaps(); | |
} | |
protected ReadAllQuery createQuery() { | |
ReadAllQuery query = new ReadAllQuery(Employee.class); | |
query.dontMaintainCache(); | |
query.setSelectionCriteria(query.getExpressionBuilder().get("lastName").equal(lastName)); | |
query.addPartialAttribute("firstName"); | |
query.addPartialAttribute("lastName"); | |
query.addOrdering(query.getExpressionBuilder().get("firstName").ascending()); | |
return query; | |
} | |
protected void cleanup() { | |
ReadAllQuery query = new ReadAllQuery(Employee.class); | |
query.setSelectionCriteria(query.getExpressionBuilder().get("lastName").equal(lastName)); | |
Vector result = (Vector)getSession().executeQuery(query); | |
if(!result.isEmpty()) { | |
UnitOfWork uow = getSession().acquireUnitOfWork(); | |
for(int i=0; i<result.size(); i++) { | |
uow.deleteObject(result.elementAt(i)); | |
} | |
uow.commit(); | |
} | |
} | |
} |