blob: 8eb7539c793bb5c6a8c13f564954c49e37c8240f [file] [log] [blame]
/*
* Copyright (c) 2006, 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
//
package org.eclipse.persistence.jpa.tests.jpql.tools;
import java.util.List;
import org.eclipse.persistence.jpa.jpql.AbstractSemanticValidator;
import org.eclipse.persistence.jpa.jpql.JPQLQueryProblem;
import org.eclipse.persistence.jpa.jpql.SemanticValidatorHelper;
import org.eclipse.persistence.jpa.jpql.parser.JPQLExpression;
import org.eclipse.persistence.jpa.jpql.tools.GenericSemanticValidatorHelper;
import org.eclipse.persistence.jpa.jpql.tools.JPQLQueryContext;
import org.eclipse.persistence.jpa.jpql.tools.spi.IQuery;
import org.eclipse.persistence.jpa.tests.jpql.AbstractValidatorTest;
import org.eclipse.persistence.jpa.tests.jpql.tools.spi.java.JavaQuery;
import org.junit.Ignore;
import org.junit.Test;
import static org.eclipse.persistence.jpa.jpql.JPQLQueryProblemMessages.*;
/**
* The base definition of a test class used for testing a JPQL jpqlQuery semantically.
*
* @see AbstractSemanticValidator
*
* @version 2.5.2
* @since 2.3
* @author Pascal Filion
*/
@SuppressWarnings("nls")
public abstract class AbstractSemanticValidatorTest extends AbstractValidatorTest {
/**
* The instance of {@link JPQLQueryContext} that is used when running the unit-tests defined by
* the subclass. The instance is shared between each the unit-test.
*/
private JPQLQueryContext queryContext;
/**
* Creates a new external form for the given JPQL jpqlQuery.
*
* @param jpqlQuery The JPQL jpqlQuery to wrap with a {@link IQuery}
* @return The external form for the JPQL jpqlQuery
* @throws Exception If a problem was encountered while access the application metadata
*/
protected IQuery buildQuery(String jpqlQuery) throws Exception {
return new JavaQuery(getPersistenceUnit(), jpqlQuery);
}
/**
* Creates a new {@link JPQLQueryContext}.
*
* @return A instance of {@link JPQLQueryContext} that is used to cache information about the
* JPQL jpqlQuery being manipulated
*/
protected abstract JPQLQueryContext buildQueryContext();
/**
* Creates a new {@link SemanticValidatorHelper}, which is used by {@link AbstractSemanticValidator}
* in order to access the JPA metadata. The unit-tests uses {@link GenericSemanticValidatorHelper},
* which simply accesses Hermes SPI and delegates the calls to {@link JPQLQueryContext}.
*
* @return A new instance of {@link GenericSemanticValidatorHelper}
*/
protected SemanticValidatorHelper buildSemanticValidatorHelper() {
return new GenericSemanticValidatorHelper(queryContext);
}
@Override
protected abstract AbstractSemanticValidator buildValidator();
protected final JPQLQueryContext getQueryContext() {
return queryContext;
}
@Override
protected AbstractSemanticValidator getValidator() {
return (AbstractSemanticValidator) super.getValidator();
}
protected abstract boolean isComparisonTypeChecked();
protected abstract boolean isPathExpressionToCollectionMappingAllowed();
@Override
protected void setUpClass() throws Exception {
queryContext = buildQueryContext();
super.setUpClass();
}
@Override
protected void tearDown() throws Exception {
queryContext.dispose();
super.tearDown();
}
@Override
protected void tearDownClass() throws Exception {
queryContext = null;
super.tearDownClass();
}
@Test
public final void test_AbstractFromClause_InvalidFirstIdentificationVariableDeclaration_01() throws Exception {
String jpqlQuery = "select e from Employee e";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_AbstractFromClause_InvalidFirstIdentificationVariableDeclaration_02() throws Exception {
String jpqlQuery = "select e from Employee e where e.managerEmployee IN (select e2 from Employee e2)";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_AbstractFromClause_InvalidFirstIdentificationVariableDeclaration_03() throws Exception {
String jpqlQuery = "select e from Employee e where e.address IN (select a from e.address a)";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_AbstractFromClause_InvalidFirstIdentificationVariableDeclaration_04() throws Exception {
String jpqlQuery = "select e from Employee e where EXISTS(select p from in e.phoneNumbers p)";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_AbstractFromClause_InvalidFirstIdentificationVariableDeclaration_05() throws Exception {
String jpqlQuery = "select e from in(e.address.street) as e";
int startPosition = "select e from ".length();
int endPosition = jpqlQuery.length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasOnlyOneProblem(
problems,
AbstractFromClause_InvalidFirstIdentificationVariableDeclaration,
startPosition,
endPosition
);
}
@Test
public final void test_AbstractFromClause_InvalidFirstIdentificationVariableDeclaration_06() throws Exception {
String jpqlQuery = "select e from e.address.street as e";
int startPosition = "select e from ".length();
int endPosition = jpqlQuery.length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasOnlyOneProblem(
problems,
AbstractFromClause_InvalidFirstIdentificationVariableDeclaration,
startPosition,
endPosition
);
}
@Test
public final void test_AbstractFromClause_WrongOrderOfIdentificationVariableDeclaration() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e JOIN a.people p, Address a";
int startPosition = "SELECT e FROM Employee e JOIN ".length();
int endPosition = startPosition + 1;
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
AbstractFromClause_WrongOrderOfIdentificationVariableDeclaration,
startPosition,
endPosition
);
}
@Test
public final void test_AbstractSchemaName_Invalid_1() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE ABS(e.name)";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testDoesNotHaveProblem(problems, AbstractSchemaName_Invalid);
}
@Test
public final void test_AbstractSchemaName_Invalid_2() throws Exception {
String jpqlQuery = "SELECT e FROM Employee2 e WHERE ABS(e.name)";
int startPosition = "SELECT e FROM ".length();
int endPosition = "SELECT e FROM Employee2".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
AbstractSchemaName_Invalid,
startPosition,
endPosition
);
}
@Test
public final void test_AbstractSchemaName_Invalid_3() throws Exception {
String jpqlQuery = "select e from Employee e where e.empId in (select e.empId from xx x)";
int startPosition = "select e from Employee e where e.empId in(select e.empId from ".length();
int endPosition = "select e from Employee e where e.empId in(select e.empId from xx".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasOnlyOneProblem(
problems,
AbstractSchemaName_Invalid,
startPosition,
endPosition
);
}
@Test
public final void test_AbstractSchemaName_Invalid_4() throws Exception {
String jpqlQuery = "delete aaa aaa a";
int startPosition1 = "delete ".length();
int endPosition1 = "delete aaa".length();
int startPosition2 = "delete aaa aaa ".length();
int endPosition2 = "delete aaa aaa a".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasOnlyTheseProblems(
problems,
new String[] { AbstractSchemaName_Invalid, AbstractSchemaName_Invalid },
new int[] { startPosition1, startPosition2 },
new int[] { endPosition1, endPosition2 }
);
}
@Test
public final void test_AbstractSchemaName_Invalid_5() throws Exception {
String jpqlQuery = "update Employee set name = 'JPQL' " +
"where (select a from address a where a.city = 'Cary') is not null";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_CollectionValuedPathExpression_NotCollectionType_01() throws Exception {
String jpqlQuery = "SELECT a FROM Address a JOIN a.customerList c";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testDoesNotHaveProblem(problems, CollectionValuedPathExpression_NotCollectionType);
}
@Test
public final void test_CollectionValuedPathExpression_NotCollectionType_02() throws Exception {
String jpqlQuery = "SELECT a FROM Address a JOIN a.state c";
int startPosition = "SELECT a FROM Address a JOIN ".length();
int endPosition = "SELECT a FROM Address a JOIN a.state".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
CollectionValuedPathExpression_NotCollectionType,
startPosition,
endPosition
);
}
@Test
public final void test_CollectionValuedPathExpression_NotCollectionType_03() throws Exception {
String jpqlQuery = "SELECT a FROM Address a WHERE a.state IS NOT EMPTY";
int startPosition = "SELECT a FROM Address a WHERE ".length();
int endPosition = "SELECT a FROM Address a WHERE a.state".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
CollectionValuedPathExpression_NotCollectionType,
startPosition,
endPosition
);
}
@Test
public final void test_CollectionValuedPathExpression_NotCollectionType_04() throws Exception {
String jpqlQuery = "SELECT a FROM Address a WHERE a.customerList IS NOT EMPTY";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testDoesNotHaveProblem(problems, CollectionValuedPathExpression_NotCollectionType);
}
@Test
public final void test_CollectionValuedPathExpression_NotCollectionType_05() throws Exception {
String jpqlQuery = "SELECT a FROM Address a, IN(a.zip) c";
int startPosition = "SELECT a FROM Address a, IN(".length();
int endPosition = "SELECT a FROM Address a, IN(a.zip".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
CollectionValuedPathExpression_NotCollectionType,
startPosition,
endPosition
);
}
@Test
public final void test_CollectionValuedPathExpression_NotCollectionType_06() throws Exception {
String jpqlQuery = "SELECT a FROM Address a IN(a.customerList) c";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testDoesNotHaveProblem(problems, CollectionValuedPathExpression_NotCollectionType);
}
@Test
public final void test_CollectionValuedPathExpression_NotCollectionType_07() throws Exception {
String jpqlQuery = "SELECT a FROM Address a, Customer c WHERE c MEMBER OF a.customerList";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testDoesNotHaveProblem(problems, CollectionValuedPathExpression_NotCollectionType);
}
@Test
public final void test_CollectionValuedPathExpression_NotCollectionType_08() throws Exception {
String jpqlQuery = "SELECT a FROM Address a, Customer c WHERE c MEMBER OF a.state";
int startPosition = "SELECT a FROM Address a, Customer c WHERE c MEMBER OF ".length();
int endPosition = "SELECT a FROM Address a, Customer c WHERE c MEMBER OF a.state".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
CollectionValuedPathExpression_NotCollectionType,
startPosition,
endPosition
);
}
@Test
public final void test_CollectionValuedPathExpression_NotCollectionType_09() throws Exception {
String jpqlQuery = "SELECT a FROM Address a WHERE SIZE(a.customerList) = 2";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testDoesNotHaveProblem(problems, CollectionValuedPathExpression_NotCollectionType);
}
@Test
public final void test_CollectionValuedPathExpression_NotCollectionType_10() throws Exception {
String jpqlQuery = "SELECT a FROM Address a WHERE SIZE(a.zip) = 2";
int startPosition = "SELECT a FROM Address a WHERE SIZE(".length();
int endPosition = "SELECT a FROM Address a WHERE SIZE(a.zip".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
CollectionValuedPathExpression_NotCollectionType,
startPosition,
endPosition
);
}
@Test
public final void test_CollectionValuedPathExpression_NotResolvable_1() throws Exception {
String jpqlQuery = "SELECT a FROM Address a JOIN a.customerList c";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testDoesNotHaveProblem(problems, CollectionValuedPathExpression_NotResolvable);
}
@Test
public final void test_CollectionValuedPathExpression_NotResolvable_2() throws Exception {
String jpqlQuery = "SELECT a FROM Address a JOIN a.wrong c";
int startPosition = "SELECT a FROM Address a JOIN ".length();
int endPosition = "SELECT a FROM Address a JOIN a.wrong".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
CollectionValuedPathExpression_NotResolvable,
startPosition,
endPosition
);
}
@Test
public final void test_ComparisonExpression_AssociationField_01() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE e.address < 2";
int startPosition = "SELECT e FROM Employee e WHERE ".length();
int endPosition = "SELECT e FROM Employee e WHERE e.address".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasOnlyOneProblem(problems, ComparisonExpression_AssociationField, startPosition, endPosition);
}
@Test
public final void test_ComparisonExpression_AssociationField_02() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE e.address > 2";
int startPosition = "SELECT e FROM Employee e WHERE ".length();
int endPosition = "SELECT e FROM Employee e WHERE e.address".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasOnlyOneProblem(problems, ComparisonExpression_AssociationField, startPosition, endPosition);
}
@Test
public final void test_ComparisonExpression_AssociationField_03() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE e.address <= 2";
int startPosition = "SELECT e FROM Employee e WHERE ".length();
int endPosition = "SELECT e FROM Employee e WHERE e.address".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasOnlyOneProblem(problems, ComparisonExpression_AssociationField, startPosition, endPosition);
}
@Test
public final void test_ComparisonExpression_AssociationField_04() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE e.address >= 2";
int startPosition = "SELECT e FROM Employee e WHERE ".length();
int endPosition = "SELECT e FROM Employee e WHERE e.address".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasOnlyOneProblem(problems, ComparisonExpression_AssociationField, startPosition, endPosition);
}
@Test
public final void test_ComparisonExpression_AssociationField_05() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE 2 < e.address";
int startPosition = "SELECT e FROM Employee e WHERE 2 < ".length();
int endPosition = "SELECT e FROM Employee e WHERE 2 < e.address".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasOnlyOneProblem(problems, ComparisonExpression_AssociationField, startPosition, endPosition);
}
@Test
public final void test_ComparisonExpression_AssociationField_06() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE 2 > e.address";
int startPosition = "SELECT e FROM Employee e WHERE 2 > ".length();
int endPosition = "SELECT e FROM Employee e WHERE 2 > e.address".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasOnlyOneProblem(problems, ComparisonExpression_AssociationField, startPosition, endPosition);
}
@Test
public final void test_ComparisonExpression_AssociationField_07() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE 2 <= e.address";
int startPosition = "SELECT e FROM Employee e WHERE 2 <= ".length();
int endPosition = "SELECT e FROM Employee e WHERE 2 <= e.address".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasOnlyOneProblem(problems, ComparisonExpression_AssociationField, startPosition, endPosition);
}
@Test
public final void test_ComparisonExpression_AssociationField_08() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE 2 >= e.address";
int startPosition = "SELECT e FROM Employee e WHERE 2 >= ".length();
int endPosition = "SELECT e FROM Employee e WHERE 2 >= e.address".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasOnlyOneProblem(problems, ComparisonExpression_AssociationField, startPosition, endPosition);
}
@Test
public final void test_ComparisonExpression_AssociationField_09() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e, Address a WHERE a = e.address";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_ComparisonExpression_AssociationField_10() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e, Address a WHERE a <> e.address";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_ComparisonExpression_AssociationField_11() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE e.embeddedAddress > 2";
int startPosition = "SELECT e FROM Employee e WHERE ".length();
int endPosition = "SELECT e FROM Employee e WHERE e.embeddedAddress".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
ComparisonExpression_AssociationField,
startPosition,
endPosition
);
}
@Test
public final void test_ComparisonExpression_AssociationField_12() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE e.managerEmployee > 2";
int startPosition = "SELECT e FROM Employee e WHERE ".length();
int endPosition = "SELECT e FROM Employee e WHERE e.managerEmployee".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasOnlyOneProblem(
problems,
ComparisonExpression_AssociationField,
startPosition,
endPosition
);
}
@Test
public final void test_ComparisonExpression_BasicField_01() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE e.roomNumber < 2";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_ComparisonExpression_BasicField_02() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE e.roomNumber > 2";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_ComparisonExpression_BasicField_03() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE e.roomNumber <= 2";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_ComparisonExpression_BasicField_04() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE e.roomNumber >= 2";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_ComparisonExpression_BasicField_05() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE 2 < e.roomNumber";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_ComparisonExpression_BasicField_06() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE 2 > e.roomNumber";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_ComparisonExpression_BasicField_07() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE 2 <= e.roomNumber";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_ComparisonExpression_BasicField_08() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE 2 >= e.roomNumber";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_ComparisonExpression_BasicField_09() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e, Address a WHERE a = e.salary";
int startPosition = "SELECT e FROM Employee e, Address a WHERE a = ".length();
int endPosition = "SELECT e FROM Employee e, Address a WHERE a = e.salary".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasOnlyOneProblem(problems, ComparisonExpression_BasicField, startPosition, endPosition);
}
@Test
public final void test_ComparisonExpression_BasicField_10() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e, Address a WHERE a <> e.salary";
int startPosition = "SELECT e FROM Employee e, Address a WHERE a <> ".length();
int endPosition = "SELECT e FROM Employee e, Address a WHERE a <> e.salary".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasOnlyOneProblem(problems, ComparisonExpression_BasicField, startPosition, endPosition);
}
@Test
public final void test_ComparisonExpression_BasicField_11() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e, Address a WHERE e.salary = a";
int startPosition = "SELECT e FROM Employee e, Address a WHERE ".length();
int endPosition = "SELECT e FROM Employee e, Address a WHERE e.salary".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasOnlyOneProblem(problems, ComparisonExpression_BasicField, startPosition, endPosition);
}
@Test
public final void test_ComparisonExpression_BasicField_12() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e, Address a WHERE e.salary <> a";
int startPosition = "SELECT e FROM Employee e, Address a WHERE ".length();
int endPosition = "SELECT e FROM Employee e, Address a WHERE e.salary".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasOnlyOneProblem(problems, ComparisonExpression_BasicField, startPosition, endPosition);
}
@Test
public final void test_ComparisonExpression_IdentificationVariable_01() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE e > 2";
int startPosition = "SELECT e FROM Employee e WHERE ".length();
int endPosition = "SELECT e FROM Employee e WHERE e".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
ComparisonExpression_IdentificationVariable,
startPosition,
endPosition
);
}
@Test
public final void test_ComparisonExpression_IdentificationVariable_02() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE e < 2";
int startPosition = "SELECT e FROM Employee e WHERE ".length();
int endPosition = "SELECT e FROM Employee e WHERE e".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
ComparisonExpression_IdentificationVariable,
startPosition,
endPosition
);
}
@Test
public final void test_ComparisonExpression_IdentificationVariable_03() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE e >= 2";
int startPosition = "SELECT e FROM Employee e WHERE ".length();
int endPosition = "SELECT e FROM Employee e WHERE e".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
ComparisonExpression_IdentificationVariable,
startPosition,
endPosition
);
}
@Test
public final void test_ComparisonExpression_IdentificationVariable_04() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE e <= 2";
int startPosition = "SELECT e FROM Employee e WHERE ".length();
int endPosition = "SELECT e FROM Employee e WHERE e".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
ComparisonExpression_IdentificationVariable,
startPosition,
endPosition
);
}
@Test
public final void test_ComparisonExpression_IdentificationVariable_05() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE 2 < e";
int startPosition = "SELECT e FROM Employee e WHERE 2 < ".length();
int endPosition = "SELECT e FROM Employee e WHERE 2 < e".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
ComparisonExpression_IdentificationVariable,
startPosition,
endPosition
);
}
@Test
public final void test_ComparisonExpression_IdentificationVariable_06() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE 2 > e";
int startPosition = "SELECT e FROM Employee e WHERE 2 > ".length();
int endPosition = "SELECT e FROM Employee e WHERE 2 > e".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
ComparisonExpression_IdentificationVariable,
startPosition,
endPosition
);
}
@Test
public final void test_ComparisonExpression_IdentificationVariable_07() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE 2 <= e";
int startPosition = "SELECT e FROM Employee e WHERE 2 <= ".length();
int endPosition = "SELECT e FROM Employee e WHERE 2 <= e".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
ComparisonExpression_IdentificationVariable,
startPosition,
endPosition
);
}
@Test
public final void test_ComparisonExpression_IdentificationVariable_08() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE 2 >= e";
int startPosition = "SELECT e FROM Employee e WHERE 2 >= ".length();
int endPosition = "SELECT e FROM Employee e WHERE 2 >= e".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
ComparisonExpression_IdentificationVariable,
startPosition,
endPosition
);
}
@Test
public final void test_ComparisonExpression_IdentificationVariable_09() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE e = e";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_ComparisonExpression_IdentificationVariable_10() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE e <> e";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_ComparisonExpression_IdentificationVariable_11() throws Exception {
String jpqlQuery = "SELECT LENGTH(e.name) AS n FROM Employee e WHERE n > 2";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_ComparisonExpression_IdentificationVariable_12() throws Exception {
String jpqlQuery = "SELECT LENGTH(e.name) AS n FROM Employee e WHERE 2 < n";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_ComparisonExpression_IdentificationVariable_13() throws Exception {
String jpqlQuery = "SELECT LENGTH(e.name) AS n FROM Employee e WHERE n = 2";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_ComparisonExpression_IdentificationVariable_14() throws Exception {
String jpqlQuery = "SELECT LENGTH(e.name) AS n FROM Employee e WHERE 2 = n";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_ComparisonExpression_WrongComparisonType_01() throws Exception {
String jpqlQuery = "SELECT e FROM Address e WHERE e.id = :key AND e.street = (SELECT MAX(c2.street) FROM Address AS c2 WHERE c2.id = :key)";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_ComparisonExpression_WrongComparisonType_02() throws Exception {
String jpqlQuery = "SELECT p FROM Product p WHERE p.id = :key AND p.releaseDate = (SELECT MAX(p2.shelfLife.soldDate) FROM Product AS p2 WHERE p2.id = :key)";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_ComparisonExpression_WrongComparisonType_03() throws Exception {
String jpqlQuery = "SELECT e FROM Address e WHERE e.id = :key AND e.id = (SELECT MAX(c2.street) FROM Address AS c2 WHERE c2.id = :key)";
int startPosition = "SELECT e FROM Address e WHERE e.id = :key AND ".length();
int endPosition = jpqlQuery.length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
if (isComparisonTypeChecked()) {
testHasOnlyOneProblem(
problems,
ComparisonExpression_WrongComparisonType,
startPosition,
endPosition
);
}
else {
testHasNoProblems(problems);
}
}
@Test
public final void test_IdentificationVariable_Invalid_Duplicate_1() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e, Address e";
int startPosition1 = "SELECT e FROM Employee ".length();
int endPosition1 = "SELECT e FROM Employee e".length();
int startPosition2 = "SELECT e FROM Employee e, Address ".length();
int endPosition2 = jpqlQuery.length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblems(
problems,
new String [] { IdentificationVariable_Invalid_Duplicate,
IdentificationVariable_Invalid_Duplicate },
new int[] { startPosition1, startPosition2 },
new int[] { endPosition1, endPosition2 }
);
}
@Test
public final void test_IdentificationVariable_Invalid_Duplicate_2() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE EXISTS(SELECT e.manager FROM Employee e)";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_IdentificationVariable_Invalid_Duplicate_3() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE EXISTS(SELECT e.manager FROM Employee e, Address e)";
int startPosition1 = "SELECT e FROM Employee e WHERE EXISTS(SELECT e.manager FROM Employee ".length();
int endPosition1 = "SELECT e FROM Employee e WHERE EXISTS(SELECT e.manager FROM Employee e".length();
int startPosition2 = "SELECT e FROM Employee e WHERE EXISTS(SELECT e.manager FROM Employee e, Address ".length();
int endPosition2 = "SELECT e FROM Employee e WHERE EXISTS(SELECT e.manager FROM Employee e, Address e".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblems(
problems,
new String [] { IdentificationVariable_Invalid_Duplicate,
IdentificationVariable_Invalid_Duplicate },
new int[] { startPosition1, startPosition2 },
new int[] { endPosition1, endPosition2 }
);
}
@Test
public final void test_IdentificationVariable_Invalid_Duplicate_4() throws Exception {
String jpqlQuery = "SELECT COUNT(e) AS es FROM Employee e ORDER BY es";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_IdentificationVariable_Invalid_Duplicate_5() throws Exception {
String jpqlQuery = "SELECT COUNT(e) AS e FROM Employee e ORDER BY e";
int startPosition1 = "SELECT COUNT(e) AS ".length();
int endPosition1 = "SELECT COUNT(e) AS e".length();
int startPosition2 = "SELECT COUNT(e) AS e FROM Employee ".length();
int endPosition2 = "SELECT COUNT(e) AS e FROM Employee e".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblems(
problems,
new String [] { IdentificationVariable_Invalid_Duplicate,
IdentificationVariable_Invalid_Duplicate },
new int[] { startPosition1, startPosition2 },
new int[] { endPosition1, endPosition2 }
);
}
@Test
public final void test_IdentificationVariable_Invalid_NotDeclared_1() throws Exception {
String jpqlQuery = "SELECT a FROM Employee e";
int startPosition = "SELECT ".length();
int endPosition = "SELECT a".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasOnlyOneProblem(
problems,
IdentificationVariable_Invalid_NotDeclared,
startPosition,
endPosition
);
}
@Test
public final void test_IdentificationVariable_Invalid_NotDeclared_2() throws Exception {
String jpqlQuery = "SELECT a.name FROM Employee e";
int startPosition = "SELECT ".length();
int endPosition = "SELECT a".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
IdentificationVariable_Invalid_NotDeclared,
startPosition,
endPosition
);
}
@Test
public final void test_IdentificationVariable_Invalid_NotDeclared_3() throws Exception {
String jpqlQuery = "select t from TestEntity t where t.id = (select max(tt.id) from TestEntity tt)";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testDoesNotHaveProblem(problems, IdentificationVariable_Invalid_NotDeclared);
}
@Test
public final void test_IdentificationVariable_Invalid_NotDeclared_4() throws Exception {
String jpqlQuery = "select t from TestEntity t where t.id = (select max(t.id) from TestEntity tt)";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testDoesNotHaveProblem(problems, IdentificationVariable_Invalid_NotDeclared);
}
@Test
public final void test_IdentificationVariable_Invalid_NotDeclared_5() throws Exception {
String jpqlQuery = "select t from TestEntity t where t.id = (select max(e.id) from TestEntity tt)";
int startPosition = "select t from TestEntity t where t.id = (select max(".length();
int endPosition = startPosition + 1;
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
IdentificationVariable_Invalid_NotDeclared,
startPosition,
endPosition
);
}
@Test
public final void test_IdentificationVariable_Invalid_NotDeclared_6() throws Exception {
String jpqlQuery = "select e from Employee e where e.empId in (select xx from Employee e)";
int startPosition = "select e from Employee e where e.empId in(select ".length();
int endPosition = "select e from Employee e where e.empId in(select xx".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasOnlyOneProblem(
problems,
IdentificationVariable_Invalid_NotDeclared,
startPosition,
endPosition
);
}
@Test
public final void test_IdentificationVariable_Valid_1() throws Exception {
String jpqlQuery = "SELECT MAX(e.roomNumber) mois, " +
" SUBSTRING(e.department) annee, " +
" e.address.city categ, " +
" SUM(e.salary) " +
"FROM Employee e " +
"GROUP BY annee, mois, categ " +
"ORDER BY annee ASC, mois ASC, categ ASC";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_IndexExpression_WrongVariable_1() throws Exception {
String jpqlQuery = "SELECT c FROM Customer c JOIN c.aliases t WHERE c.holder.name = 'John Doe' AND INDEX(t) BETWEEN 0 AND 9";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testDoesNotHaveProblem(problems, IndexExpression_WrongVariable);
}
@Test
public final void test_IndexExpression_WrongVariable_2() throws Exception {
String jpqlQuery = "SELECT c FROM Customer c, IN(c.aliases) t WHERE c.holder.name = 'John Doe' AND INDEX(t) BETWEEN 0 AND 9";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testDoesNotHaveProblem(problems, IndexExpression_WrongVariable);
}
@Test
public final void test_IndexExpression_WrongVariable_3() throws Exception {
String jpqlQuery = "SELECT c FROM Customer c JOIN c.aliases t WHERE c.holder.name = 'John Doe' AND INDEX(c) BETWEEN 0 AND 9";
int startPosition = "SELECT c FROM Customer c JOIN a.aliases t WHERE c.holder.name = 'John Doe' AND INDEX(".length();
int endPosition = startPosition + 1;
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
IndexExpression_WrongVariable,
startPosition,
endPosition
);
}
@Test
public final void test_IndexExpression_WrongVariable_4() throws Exception {
String jpqlQuery = "SELECT c FROM Customer c, IN(c.aliases) t WHERE c.holder.name = 'John Doe' AND INDEX(c) BETWEEN 0 AND 9";
int startPosition = "SELECT c FROM Customer c, IN(a.aliases) t WHERE c.holder.name = 'John Doe' AND INDEX(".length();
int endPosition = startPosition + 1;
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
IndexExpression_WrongVariable,
startPosition,
endPosition
);
}
@Test
public final void test_IndexExpression_WrongVariable_5() throws Exception {
String jpqlQuery = "SELECT c FROM Customer c, IN(c.aliases) t WHERE EXISTS(SELECT e FROM Employee e WHERE c.holder.name = 'John Doe' AND INDEX(c) BETWEEN 0 AND 9)";
int startPosition = "SELECT c FROM Customer c, IN(a.aliases) t WHERE EXISTS(SELECT e FROM Employee e WHERE c.holder.name = 'John Doe' AND INDEX(".length();
int endPosition = startPosition + 1;
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
IndexExpression_WrongVariable,
startPosition,
endPosition
);
}
@Test
public final void test_InExpression_InvalidExpression_1() throws Exception {
String jpqlQuery = "SELECT prod FROM Product prod WHERE TYPE(prod.project) IN(LargeProject, SmallProject)";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
@Ignore
// The semantic validator does not check the type of the left expression with the items
public final void test_InExpression_InvalidExpression_2() throws Exception {
String jpqlQuery = "SELECT prod FROM Product prod WHERE prod.project IN(2, 3)";
int startPosition1 = "SELECT prod FROM Product prod WHERE prod.project IN(".length();
int endPosition1 = "SELECT prod FROM Product prod WHERE prod.project IN(2".length();
int startPosition2 = "SELECT prod FROM Product prod WHERE prod.project IN(2, ".length();
int endPosition2 = "SELECT prod FROM Product prod WHERE prod.project IN(2, 3".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasOnlyTheseProblems(
problems,
new String[] { InExpression_InvalidExpression, InExpression_InvalidExpression },
new int[] { startPosition1, startPosition2 },
new int[] { endPosition1, endPosition2 }
);
}
@Test
public final void test_InExpression_Valid_01() throws Exception {
String jpqlQuery = "SELECT k FROM Project k WHERE TYPE(k) IN (LargeProject, SmallProject)";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_InvalidQuery_01() throws Exception {
String jpqlQuery = "select e from Employee e where e.empId in (select x.id from xx x)";
int startPosition1 = "select e from Employee e where e.empId in(select ".length();
int endPosition1 = "select e from Employee e where e.empId in(select x.id".length();
int startPosition2 = "select e from Employee e where e.empId in(select x.id from ".length();
int endPosition2 = "select e from Employee e where e.empId in(select x.id from xx".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblems(
problems,
new String[] { StateFieldPathExpression_NotResolvable, AbstractSchemaName_Invalid },
new int[] { startPosition1, startPosition2 },
new int[] { endPosition1, endPosition2 }
);
}
@Test
public final void test_InvalidQuery_02() throws Exception {
String jpqlQuery = "select e from Employee e where e.empId in (select e.empId from emp e)";
int startPosition1 = "select e from Employee e where e.empId in(select ".length();
int endPosition1 = "select e from Employee e where e.empId in(select e.empId".length();
int startPosition2 = "select e from Employee e where e.empId in(select e.empId from ".length();
int endPosition2 = "select e from Employee e where e.empId in(select e.empId from emp".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblems(
problems,
new String[] { StateFieldPathExpression_NotResolvable, AbstractSchemaName_Invalid },
new int[] { startPosition1, startPosition2 },
new int[] { endPosition1, endPosition2 }
);
}
@Test
public final void test_InvalidQuery_03() throws Exception {
String jpqlQuery = "SELECT i FROM Product i WHERE i.enumType=:category ORDER BY i.id\"";
int startPosition = "SELECT i FROM Product i WHERE i.enumType = :category ORDER BY ".length();
int endPosition = "SELECT i FROM Product i WHERE i.enumType = :category ORDER BY i.id\"".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasOnlyOneProblem(
problems,
StateFieldPathExpression_NotResolvable,
startPosition,
endPosition
);
}
@Test
public final void test_StateFieldPathExpression_AssociationField_01() throws Exception {
String jpqlQuery = "SELECT MIN(e.managerEmployee) FROM Employee e";
int startPosition = "SELECT MIN(".length();
int endPosition = "SELECT MIN(e.managerEmployee".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
StateFieldPathExpression_AssociationField,
startPosition,
endPosition
);
}
@Test
public final void test_StateFieldPathExpression_AssociationField_02() throws Exception {
String jpqlQuery = "SELECT e.managerEmployee FROM Employee e";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testDoesNotHaveProblem(problems, StateFieldPathExpression_AssociationField);
}
@Test
public final void test_StateFieldPathExpression_AssociationField_03() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE UPPER(e.address) = 'JPQL'";
int startPosition = "SELECT e FROM Employee e WHERE UPPER(".length();
int endPosition = "SELECT e FROM Employee e WHERE UPPER(e.address".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
StateFieldPathExpression_AssociationField,
startPosition,
endPosition
);
}
@Test
public final void test_StateFieldPathExpression_AssociationField_04() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE LOWER(e.address) = 'JPQL'";
int startPosition = "SELECT e FROM Employee e WHERE LOWER(".length();
int endPosition = "SELECT e FROM Employee e WHERE LOWER(e.address".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
StateFieldPathExpression_AssociationField,
startPosition,
endPosition
);
}
@Test
public final void test_StateFieldPathExpression_AssociationField_05() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE LENGTH(e.address) = 'JPQL'";
int startPosition = "SELECT e FROM Employee e WHERE LENGTH(".length();
int endPosition = "SELECT e FROM Employee e WHERE LENGTH(e.address".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
StateFieldPathExpression_AssociationField,
startPosition,
endPosition
);
}
@Test
public final void test_StateFieldPathExpression_AssociationField_06() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE e.address + 2";
int startPosition = "SELECT e FROM Employee e WHERE ".length();
int endPosition = "SELECT e FROM Employee e WHERE e.address".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
StateFieldPathExpression_AssociationField,
startPosition,
endPosition
);
}
@Test
public final void test_StateFieldPathExpression_AssociationField_07() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE MOD(e.address, 2) > 2";
int startPosition = "SELECT e FROM Employee e WHERE MOD(".length();
int endPosition = "SELECT e FROM Employee e WHERE MOD(e.address".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
StateFieldPathExpression_AssociationField,
startPosition,
endPosition
);
}
@Test
public final void test_StateFieldPathExpression_AssociationField_08() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE TRIM(e.address, 'JPQL') = 'JPQL'";
int startPosition = "SELECT e FROM Employee e WHERE TRIM(".length();
int endPosition = "SELECT e FROM Employee e WHERE TRIM(e.address".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
StateFieldPathExpression_AssociationField,
startPosition,
endPosition
);
}
@Test
public final void test_StateFieldPathExpression_AssociationField_09() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE TRIM(BOTH '_' FROM e.address) = 'JPQL'";
int startPosition = "SELECT e FROM Employee e WHERE TRIM(BOTH '_' FROM ".length();
int endPosition = "SELECT e FROM Employee e WHERE TRIM(BOTH '_' FROM e.address".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
StateFieldPathExpression_AssociationField,
startPosition,
endPosition
);
}
@Test
public final void test_StateFieldPathExpression_AssociationField_10() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE TRIM(e.department, 'JPQL') = 'JPQL'";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testDoesNotHaveProblem(problems, StateFieldPathExpression_AssociationField);
}
@Test
public final void test_StateFieldPathExpression_AssociationField_11() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE LENGTH(e.department) = 2";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testDoesNotHaveProblem(problems, StateFieldPathExpression_AssociationField);
}
@Test
public final void test_StateFieldPathExpression_AssociationField_12() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE LOWER(e.department) = 2";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testDoesNotHaveProblem(problems, StateFieldPathExpression_AssociationField);
}
@Test
public final void test_StateFieldPathExpression_AssociationField_13() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE LOWER(UPPER(e.address)) = 2";
int startPosition = "SELECT e FROM Employee e WHERE LOWER(UPPER(".length();
int endPosition = "SELECT e FROM Employee e WHERE LOWER(UPPER(e.address".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
StateFieldPathExpression_AssociationField,
startPosition,
endPosition
);
}
@Test
public final void test_StateFieldPathExpression_AssociationField_14() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE e.name > 2";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testDoesNotHaveProblem(problems, StateFieldPathExpression_AssociationField);
}
@Test
public final void test_StateFieldPathExpression_AssociationField_19() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE e <> e";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_StateFieldPathExpression_AssociationField_20() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE e = e";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
@Ignore
public final void test_StateFieldPathExpression_BasicField_01() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE e.name IS NOT NULL";
int startPosition = "SELECT e FROM Employee e WHERE ".length();
int endPosition = "SELECT e FROM Employee e WHERE e.name".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
StateFieldPathExpression_BasicField,
startPosition,
endPosition
);
}
@Test
public final void test_StateFieldPathExpression_BasicField_02() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE e.address IS NOT NULL";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testDoesNotHaveProblem(problems, StateFieldPathExpression_BasicField);
}
@Test
public final void test_StateFieldPathExpression_BasicField_03() throws Exception {
String jpqlQuery = "SELECT e.name FROM Employee e ORDER BY e.name";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testDoesNotHaveProblem(problems, StateFieldPathExpression_BasicField);
}
@Test
public final void test_StateFieldPathExpression_BasicField_04() throws Exception {
String jpqlQuery = "SELECT e.address FROM Employee e JOIN e.address";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testDoesNotHaveProblem(problems, StateFieldPathExpression_BasicField);
}
@Test
public final void test_StateFieldPathExpression_BasicField_06() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE e.managerEmployee IS NOT NULL";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testDoesNotHaveProblem(problems, StateFieldPathExpression_BasicField);
}
@Test
public final void test_StateFieldPathExpression_BasicField_07() throws Exception {
String jpqlQuery = "SELECT p FROM Product p WHERE TYPE(p) IN (SmallProject, LargeProject)";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_StateFieldPathExpression_BasicField_08() throws Exception {
String jpqlQuery = "SELECT p FROM Product p WHERE TYPE(p.id) IN (SmallProject, LargeProject)";
int startPosition = "SELECT p FROM Product p WHERE TYPE(".length();
int endPosition = "SELECT p FROM Product p WHERE TYPE(p.id".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasOnlyOneProblem(problems, StateFieldPathExpression_BasicField, startPosition, endPosition);
}
@Test
public final void test_StateFieldPathExpression_BasicField_09() throws Exception {
String jpqlQuery = "SELECT p FROM Product p WHERE TYPE(p.project) IN (SmallProject, LargeProject)";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_StateFieldPathExpression_BasicField_10() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE TYPE(e.embeddedAddress) IN (Address)";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_StateFieldPathExpression_CollectionType_1() throws Exception {
String jpqlQuery = "SELECT a.customerList FROM Address a";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
if (isPathExpressionToCollectionMappingAllowed()) {
testHasNoProblems(problems);
}
else {
int startPosition = "SELECT ".length();
int endPosition = "SELECT a.customerList".length();
testHasProblem(
problems,
StateFieldPathExpression_CollectionType,
startPosition,
endPosition
);
}
}
@Test
public final void test_StateFieldPathExpression_CollectionType_2() throws Exception {
String jpqlQuery = "SELECT COUNT(a.customerList) FROM Address a";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
if (isPathExpressionToCollectionMappingAllowed()) {
testHasNoProblems(problems);
}
else {
int startPosition = "SELECT COUNT(".length();
int endPosition = "SELECT COUNT(a.customerList".length();
testHasProblem(
problems,
StateFieldPathExpression_CollectionType,
startPosition,
endPosition
);
}
}
@Test
public final void test_StateFieldPathExpression_CollectionType_3() throws Exception {
String jpqlQuery = "SELECT c FROM Customer c, Address a WHERE c NOT IN (a.customerList)";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
if (isPathExpressionToCollectionMappingAllowed()) {
testHasNoProblems(problems);
}
else {
int startPosition = "SELECT c FROM Customer c, Address a WHERE c NOT IN(".length();
int endPosition = "SELECT c FROM Customer c, Address a WHERE c NOT IN(a.customerList".length();
testHasProblem(
problems,
StateFieldPathExpression_CollectionType,
startPosition,
endPosition
);
}
}
@Test
public final void test_StateFieldPathExpression_InvalidEnumConstant_1() throws Exception {
String jpqlQuery = "SELECT p FROM Product p WHERE p.enumType = jpql.jpqlQuery.EnumType.FIRST_NAME";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testDoesNotHaveProblem(problems, StateFieldPathExpression_InvalidEnumConstant);
}
@Test
public final void test_StateFieldPathExpression_InvalidEnumConstant_2() throws Exception {
String jpqlQuery = "SELECT p FROM Product p WHERE p.enumType = jpql.query.EnumType.INVALID";
int startPosition = "SELECT p FROM Product p WHERE p.enumType = jpql.query.EnumType.".length();
int endPosition = jpqlQuery.length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasOnlyOneProblem(
problems,
StateFieldPathExpression_InvalidEnumConstant,
startPosition,
endPosition
);
}
@Test
public final void test_StateFieldPathExpression_NoMapping_1() throws Exception {
String jpqlQuery = "SELECT c.title FROM Customer c";
int startPosition = "SELECT ".length();
int endPosition = "SELECT c.title".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
StateFieldPathExpression_NoMapping,
startPosition,
endPosition
);
}
@Test
public final void test_StateFieldPathExpression_NoMapping_2() throws Exception {
String jpqlQuery = "SELECT c.lastName FROM Customer c";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testDoesNotHaveProblem(problems, StateFieldPathExpression_NoMapping);
}
@Test
public final void test_StateFieldPathExpression_NotResolvable_1() throws Exception {
String jpqlQuery = "SELECT e.name.wrong FROM Employee e";
int startPosition = "SELECT ".length();
int endPosition = "SELECT e.name.wrong".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
StateFieldPathExpression_NotResolvable,
startPosition,
endPosition
);
}
@Test
public final void test_StateFieldPathExpression_NotResolvable_2() throws Exception {
String jpqlQuery = "UPDATE Employee WHERE ALL(SELECT e FROM managerEmployee e)";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testDoesNotHaveProblem(problems, StateFieldPathExpression_NotResolvable);
}
@Test
public final void test_StateFieldPathExpression_NotResolvable_3() throws Exception {
String jpqlQuery = "UPDATE Employee WHERE ALL(SELECT e FROM phone e)";
int startPosition = "UPDATE Employee WHERE ALL(SELECT e FROM ".length();
int endPosition = "UPDATE Employee WHERE ALL(SELECT e FROM phone".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
StateFieldPathExpression_NotResolvable,
startPosition,
endPosition
);
}
@Test
public final void test_UpdateItem_RelationshipPathExpression_1() throws Exception {
String jpqlQuery = "UPDATE Employee e SET e.name = 'JPQL'";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testDoesNotHaveProblem(problems, UpdateItem_RelationshipPathExpression);
}
@Test
public final void test_UpdateItem_RelationshipPathExpression_2() throws Exception {
String jpqlQuery = "UPDATE Employee e SET e.managerEmployee = NULL";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testDoesNotHaveProblem(problems, UpdateItem_RelationshipPathExpression);
}
@Test
public final void test_UpdateItem_RelationshipPathExpression_3() throws Exception {
String jpqlQuery = "UPDATE Employee e SET e.phoneNumbers.area = NULL";
int startPosition = "UPDATE Employee e SET ".length();
int endPosition = "UPDATE Employee e SET e.phoneNumbers.area".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
UpdateItem_RelationshipPathExpression,
startPosition,
endPosition
);
}
@Test
public final void test_UpdateItem_RelationshipPathExpression_4() throws Exception {
String jpqlQuery = "UPDATE Employee SET phoneNumbers.area = NULL";
int startPosition = "UPDATE Employee SET ".length();
int endPosition = "UPDATE Employee SET phoneNumbers.area".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
UpdateItem_RelationshipPathExpression,
startPosition,
endPosition
);
}
@Test
public final void test_UpdateItem_RelationshipPathExpression_5() throws Exception {
String jpqlQuery = "UPDATE Employee e SET e.department.invalid = TRUE";
int startPosition = "UPDATE Employee e SET ".length();
int endPosition = "UPDATE Employee e SET e.department.invalid".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
UpdateItem_RelationshipPathExpression,
startPosition,
endPosition
);
}
@Test
public final void test_UpdateItem_RelationshipPathExpression_6() throws Exception {
String jpqlQuery = "UPDATE Employee SET department.invalid = TRUE";
int startPosition = "UPDATE Employee SET ".length();
int endPosition = "UPDATE Employee SET department.invalid".length();
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasProblem(
problems,
UpdateItem_RelationshipPathExpression,
startPosition,
endPosition
);
}
@Test
public final void test_UpdateItem_RelationshipPathExpression_7() throws Exception {
String jpqlQuery = "UPDATE Employee e SET e.embeddedAddress.city = 'Cary'";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testDoesNotHaveProblem(problems, UpdateItem_RelationshipPathExpression);
}
@Test
public final void test_UpdateItem_RelationshipPathExpression_8() throws Exception {
String jpqlQuery = "UPDATE Employee SET embeddedAddress.city = 'Cary'";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testDoesNotHaveProblem(problems, UpdateItem_RelationshipPathExpression);
}
@Test
public final void test_ValidQuery_01() throws Exception {
String jpqlQuery = "select d from Employee d where UPPER(d.name) IN (:keywords) AND UPPER(d.manager) IN (:keywords) order by d.name,d.manager";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_ValidQuery_02() throws Exception {
String jpqlQuery = "SELECT p FROM Product p WHERE TYPE(p.project) <> SmallProject";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_ValidQuery_03() throws Exception {
String jpqlQuery = "SELECT i FROM Customer i WHERE i.home=:category ORDER BY i.id";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_ValidQuery_04() throws Exception {
String jpqlQuery = "select p from Alias p join p.ids m where key(m)=:language and value(m)=:name";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Test
public final void test_ValidQuery_05() throws Exception {
String jpqlQuery = "SELECT r FROM Employee r OUTER JOIN r.phoneNumbers c WHERE c.phoneNumber = :major AND c.area = :name AND r.working = true";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
testHasNoProblems(problems);
}
@Override
protected List<JPQLQueryProblem> validate(String jpqlQuery, JPQLExpression jpqlExpression) throws Exception {
// Update JPQLQueryContext, set JPQLExpression first since it was already parsed
queryContext.setJPQLExpression(jpqlExpression);
queryContext.setQuery(buildQuery(jpqlQuery));
// Now validate semantically the JPQL jpqlQuery
return super.validate(jpqlQuery, jpqlExpression);
}
}