blob: 81722b7e39054ce0ddf005c9b16cec0e9f6c6db7 [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:
// Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.tests.jpa.inheritance;
import java.util.Vector;
import junit.framework.*;
import org.eclipse.persistence.expressions.Expression;
import org.eclipse.persistence.expressions.ExpressionBuilder;
import org.eclipse.persistence.queries.DeleteAllQuery;
import org.eclipse.persistence.queries.ReportQuery;
import org.eclipse.persistence.sessions.DatabaseSession;
import org.eclipse.persistence.sessions.UnitOfWork;
import org.eclipse.persistence.testing.framework.junit.JUnitTestCase;
import org.eclipse.persistence.testing.models.jpa.inheritance.*;
import org.eclipse.persistence.testing.framework.DeleteAllQueryTestHelper;
public class DeleteAllQueryInheritanceJunitTest extends JUnitTestCase {
static Vector originalVehicleObjects;
static Vector originalCompanyObjects;
static ReportQuery reportQueryVehicles;
static ReportQuery reportQueryCompanies;
{
reportQueryVehicles = new ReportQuery(Vehicle.class, new ExpressionBuilder());
reportQueryVehicles.setShouldRetrievePrimaryKeys(true);
reportQueryCompanies = new ReportQuery(Company.class, new ExpressionBuilder());
reportQueryCompanies.setShouldRetrievePrimaryKeys(true);
}
public DeleteAllQueryInheritanceJunitTest() {
super();
}
public DeleteAllQueryInheritanceJunitTest(String name) {
super(name);
}
@Override
public void setUp() {
super.setUp();
Vector currentVehicleObjects = (Vector)getDbSession().executeQuery(reportQueryVehicles);
Vector currentCompanyObjects = (Vector)getDbSession().executeQuery(reportQueryCompanies);
if(!currentVehicleObjects.equals(originalVehicleObjects) || !currentCompanyObjects.equals(originalCompanyObjects)) {
if(!currentVehicleObjects.isEmpty() || !currentCompanyObjects.isEmpty()) {
clearVehiclesCompanies();
}
populateVehiclesCompanies();
originalVehicleObjects = (Vector)getDbSession().executeQuery(reportQueryVehicles);
originalCompanyObjects = (Vector)getDbSession().executeQuery(reportQueryCompanies);
}
clearCache();
}
protected static DatabaseSession getDbSession() {
return getServerSession();
}
protected static UnitOfWork acquireUnitOfWork() {
return getDbSession().acquireUnitOfWork();
}
protected void clearVehiclesCompanies() {
UnitOfWork uow = acquireUnitOfWork();
// delete all Vechicles
uow.executeQuery(new DeleteAllQuery(Vehicle.class));
// delete all Companies
uow.executeQuery(new DeleteAllQuery(Company.class));
uow.commit();
clearCache();
}
protected static void populateVehiclesCompanies() {
UnitOfWork uow = acquireUnitOfWork();
uow.registerNewObject(InheritanceModelExamples.companyExample1());
uow.registerNewObject(InheritanceModelExamples.companyExample2());
uow.registerNewObject(InheritanceModelExamples.companyExample3());
uow.commit();
}
public static Test suite() {
TestSuite suite = new TestSuite(DeleteAllQueryInheritanceJunitTest.class);
return suite;
}
/**
* The setup is done as a test, both to record its failure, and to allow execution in the server.
*/
public void testSetup() {
new InheritanceTableCreator().replaceTables(JUnitTestCase.getServerSession());
clearCache();
}
// JUnit framework will automatically execute all methods starting with test...
// The test methods' name pattern is a word "test" followed by underscore and the used selectionExpression:
// test_selectionExpression
// ALL Vehicles
public static void test_null() {
deleteAllQueryInternal_Deferred_Children(Vehicle.class, null);
}
// ALL Vehicles - nondeferred (execute deleteAllQuery immediately as opposed to during uow.commit)
public static void test_nullNonDeferred() {
deleteAllQueryInternal_NonDeferred_Children(Vehicle.class, null);
}
// Vehicles owned by TOP Company
public static void test_ownerTOP() {
ExpressionBuilder builder = new ExpressionBuilder();
Expression exp = builder.get("owner").get("name").equal("TOP");
deleteAllQueryInternal_Deferred_Children(Vehicle.class, exp);
}
// FueledVehicles running on Petrol
public static void test_fuelTypePetrol() {
ExpressionBuilder builder = new ExpressionBuilder();
Expression exp = builder.get("fuelType").equalsIgnoreCase("Petrol");
deleteAllQueryInternal_Deferred_Children(FueledVehicle.class, exp);
}
// shchool buses without drivers
public static void test_schoolBusNullDriver() {
ExpressionBuilder builder = new ExpressionBuilder();
Expression exp = builder.get("description").equalsIgnoreCase("School bus").and(builder.get("busDriver").isNull());
deleteAllQueryInternal_Deferred_Children(Bus.class, exp);
}
// FueledVehicles owned by Companies that also own NonFueledVehicles
public static void test_ownerOwnsNonFueledVehicle() {
ExpressionBuilder builder = new ExpressionBuilder();
ExpressionBuilder subBuilder = new ExpressionBuilder();
ReportQuery rq = new ReportQuery(NonFueledVehicle.class, subBuilder);
rq.addAttribute("id");
Expression subExpression = subBuilder.get("owner").equal(builder.get("owner"));
rq.setSelectionCriteria(subExpression);
Expression exp = builder.exists(rq);
deleteAllQueryInternal_Deferred_Children(FueledVehicle.class, exp);
}
protected static void deleteAllQueryInternal_Deferred_Children(Class<?> referenceClass, Expression selectionExpression) {
deleteAllQueryInternal(referenceClass, selectionExpression, true, true);
}
protected static void deleteAllQueryInternal_NonDeferred_Children(Class<?> referenceClass, Expression selectionExpression) {
deleteAllQueryInternal(referenceClass, selectionExpression, false, true);
}
protected static void deleteAllQueryInternal_Deferred_NoChildren(Class<?> referenceClass, Expression selectionExpression) {
deleteAllQueryInternal(referenceClass, selectionExpression, true, false);
}
protected static void deleteAllQueryInternal_NonDeferred_NoChildren(Class<?> referenceClass, Expression selectionExpression) {
deleteAllQueryInternal(referenceClass, selectionExpression, false, false);
}
// referenceClass - the reference class of DeleteAllQuery to be tested
// selectionExpression - selection expression of DeleteAllQuery to be tested
// shouldDeferExecutionInUOW==true causes deferring query execution until uow.commit;
// shouldDeferExecutionInUOW==false causes immediate query execution;
// shouldHandleChildren==true means the test will be executed not only with the specified class,
// but also with all its subclasses.
// Each test will test DeleteAllQuery with the specified reference class
// and all its subclasses
// Example: for Vehicle.class 9 DeleteAllQueries will be tested.
// shouldHandleChildren==false means the test will be executed with the specified class only.
protected static void deleteAllQueryInternal(Class<?> referenceClass, Expression selectionExpression, boolean shouldDeferExecutionInUOW, boolean handleChildren) {
if (getServerSession().getDatasourcePlatform().isSymfoware()) {
getServerSession().logMessage("DeleteAllQueryInheritanceJunitTest test skipped for this platform, "
+ "Symfoware doesn't support UpdateAll/DeleteAll on multi-table objects (see rfe 298193).");
return;
}
String errorMsg = DeleteAllQueryTestHelper.execute(getDbSession(), referenceClass, selectionExpression, shouldDeferExecutionInUOW, handleChildren);
if(errorMsg != null) {
fail(errorMsg);
}
}
}