blob: e3ef11470a33d45dd5fa5707512de89b616e672b [file] [log] [blame]
/*
* Copyright (c) 2012, 2020 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
//
package org.eclipse.persistence.testing.tests.jpa.jpql;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.internal.jpa.JPAQuery;
import org.eclipse.persistence.internal.jpa.jpql.ConstructorQueryMappings;
import org.eclipse.persistence.internal.jpa.jpql.JPQLQueryHelper;
import org.eclipse.persistence.mappings.DatabaseMapping;
import org.eclipse.persistence.testing.framework.junit.JUnitTestCase;
import org.eclipse.persistence.testing.models.jpa.advanced.Address;
import org.eclipse.persistence.testing.models.jpa.advanced.Employee.SalaryRate;
/**
* Tests for {@link JPQLQueryHelper}.
*
* @version 2.5
* @since 2.5
* @author Pascal Filion
*/
public class JUnitJPQLQueryHelperTestSuite extends JUnitTestCase {
public JUnitJPQLQueryHelperTestSuite() {
super();
}
public JUnitJPQLQueryHelperTestSuite(String name) {
super(name);
}
public static Test suite() {
TestSuite suite = new TestSuite(JUnitJPQLQueryHelperTestSuite.class.getSimpleName());
for (Method method : JUnitJPQLQueryHelperTestSuite.class.getMethods()) {
String name = method.getName();
if (name.startsWith("test_")) {
suite.addTest(new JUnitJPQLQueryHelperTestSuite(name));
}
}
return suite;
}
private int size(Iterable<DatabaseMapping> mappings) {
int count = 0;
for (DatabaseMapping mapping : mappings) {
count++;
}
return count;
}
@Override
public void tearDown() {
super.tearDown();
clearCache();
}
public void test_getClassDescriptors_01() {
String jpqlQuery = "SELECT e FROM Employee e";
Collection<String> entityNames = new ArrayList<String>();
entityNames.add("Employee");
testGetClassDescriptors(jpqlQuery, entityNames);
}
public void test_getClassDescriptors_02() {
String jpqlQuery = "SELECT e FROM Employee e, Address a";
Collection<String> entityNames = new ArrayList<String>();
entityNames.add("Employee");
entityNames.add("Address");
testGetClassDescriptors(jpqlQuery, entityNames);
}
public void test_getClassDescriptors_03() {
String jpqlQuery = "SELECT e FROM Employee e JOIN e.projects p JOIN e.phoneNumbers pn";
Collection<String> entityNames = new ArrayList<String>();
entityNames.add("Employee");
entityNames.add("Project");
entityNames.add("PhoneNumber");
testGetClassDescriptors(jpqlQuery, entityNames);
}
public void test_getClassDescriptors_04() {
String jpqlQuery = "SELECT e FROM Employee e, IN(e.dealers) d";
Collection<String> entityNames = new ArrayList<String>();
entityNames.add("Employee");
entityNames.add("Dealer");
testGetClassDescriptors(jpqlQuery, entityNames);
}
public void test_getClassDescriptors_05() {
String jpqlQuery = "SELECT e FROM Employee e, IN(e.dealers) d WHERE e.name = (SELECT a.version FROM e.address a)";
Collection<String> entityNames = new ArrayList<String>();
entityNames.add("Employee");
entityNames.add("Dealer");
entityNames.add("Address");
testGetClassDescriptors(jpqlQuery, entityNames);
}
public void test_getClassDescriptors_06() {
String jpqlQuery = "UPDATE Employee e SET e.name = 'JPQL'";
Collection<String> entityNames = new ArrayList<String>();
entityNames.add("Employee");
testGetClassDescriptors(jpqlQuery, entityNames);
}
public void test_getClassDescriptors_07() {
String jpqlQuery = "UPDATE Employee e SET e.name = 'JPQL' WHERE NOT EXIST (SELECT e FROM Project p)";
Collection<String> entityNames = new ArrayList<String>();
entityNames.add("Employee");
entityNames.add("Project");
testGetClassDescriptors(jpqlQuery, entityNames);
}
public void test_getClassDescriptors_08() {
String jpqlQuery = "DELETE FROM Employee e WHERE e.name = 'JPQL'";
Collection<String> entityNames = new ArrayList<String>();
entityNames.add("Employee");
testGetClassDescriptors(jpqlQuery, entityNames);
}
public void test_getClassDescriptors_09() {
String jpqlQuery = "DELETE FROM Employee e "+
"WHERE (SELECT e.id FROM Project p) > 2 " +
" AND " +
" NOT EXIST (SELECT b FROM Buyer b)";
Collection<String> entityNames = new ArrayList<String>();
entityNames.add("Employee");
entityNames.add("Project");
entityNames.add("Buyer");
testGetClassDescriptors(jpqlQuery, entityNames);
}
public void test_getConstructorQueryMappings_01() {
String jpqlQuery = "SELECT e FROM Employee e";
JPAQuery query = new JPAQuery(jpqlQuery);
query.setSession(getDatabaseSession());
JPQLQueryHelper helper = new JPQLQueryHelper();
ConstructorQueryMappings constructorQuery = helper.getConstructorQueryMappings(query.getSession(), query);
assertNotNull("ConstructorQueryMappings should not be null", constructorQuery);
assertSame ("The query was not cached correctly", query, constructorQuery.getQuery());
assertFalse ("The query is not a constructor query", constructorQuery.isConstructorQuery());
assertNull ("The class name should be null", constructorQuery.getClassName());
assertNotNull("The list of mappings cannot be null", constructorQuery.mappings());
assertFalse ("The list of mappings should be empty", constructorQuery.mappings().iterator().hasNext());
}
public void test_getConstructorQueryMappings_02() {
String jpqlQuery = "SELECT NEW org.eclipse.persistence.testing.tests.jpa.jpql.JUnitJPQLQueryHelperTestSuite.MyConstructorClass(" +
" e.lastName, e.id, e.address, e.payScale" +
") " +
"FROM Employee e";
JPAQuery query = new JPAQuery(jpqlQuery);
query.setSession(getDatabaseSession());
JPQLQueryHelper helper = new JPQLQueryHelper();
ConstructorQueryMappings constructorQuery = helper.getConstructorQueryMappings(query.getSession(), query);
assertNotNull("ConstructorQueryMappings should not be null", constructorQuery);
assertSame ("The query was not cached correctly", query, constructorQuery.getQuery());
assertTrue ("The query is a constructor query", constructorQuery.isConstructorQuery());
String expectedClassName = MyConstructorClass.class.getName().replace('$', '.');
assertEquals ("The class name should be null", expectedClassName, constructorQuery.getClassName());
Iterable<DatabaseMapping> mappings = constructorQuery.mappings();
assertNotNull("The list of mappings cannot be null", mappings);
assertTrue ("The list of mappings should be empty", mappings.iterator().hasNext());
assertEquals ("The count of mappings should be 4", 4, size(mappings));
int index = 0;
for (DatabaseMapping mapping : mappings) {
switch (index++) {
case 0: {
assertEquals("lastName", mapping.getAttributeName());
break;
}
case 1: {
assertEquals("id", mapping.getAttributeName());
break;
}
case 2: {
assertEquals("address", mapping.getAttributeName());
break;
}
case 3: {
assertEquals("payScale", mapping.getAttributeName());
break;
}
}
}
}
private void testGetClassDescriptors(String jpqlQuery, Collection<String> entityNames) {
JPQLQueryHelper helper = new JPQLQueryHelper();
List<ClassDescriptor> descriptors = helper.getClassDescriptors(jpqlQuery, getDatabaseSession());
assertNotNull("The list of ClassDescriptors cannot be null", descriptors);
assertEquals(entityNames.size(), descriptors.size());
for (ClassDescriptor descriptor : descriptors) {
String alias = descriptor.getAlias();
assertTrue(alias + " is not expected", entityNames.remove(alias));
}
assertTrue(entityNames + " are expected", entityNames.isEmpty());
}
private static final class MyConstructorClass {
private MyConstructorClass(String name, Integer id, Address address, SalaryRate payScale) {
super();
}
}
}