blob: 776500f8146d24f773f66378af37463c90a948c7 [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;
import java.util.List;
import org.eclipse.persistence.jpa.jpql.AbstractGrammarValidator;
import org.eclipse.persistence.jpa.jpql.EclipseLinkGrammarValidator;
import org.eclipse.persistence.jpa.jpql.JPQLQueryProblem;
import org.junit.Test;
import static org.eclipse.persistence.jpa.jpql.JPQLQueryProblemMessages.*;
/**
* The unit-test class used for testing a JPQL query grammatically when the JPA version is 1.0 and
* 2.0 and EclipseLink is the persistence provider. The EclipseLink version supported is 2.0, 2.1,
* 2.2 and 2.3.
*
* @version 2.5.1
* @since 2.4
* @author Pascal Filion
*/
@SuppressWarnings("nls")
public class EclipseLinkGrammarValidatorTest extends AbstractGrammarValidatorTest {
@Override
protected AbstractGrammarValidator buildValidator() {
return new EclipseLinkGrammarValidator(jpqlGrammar);
}
@Override
protected boolean isJoinFetchIdentifiable() {
return EclipseLinkVersionTools.isNewerThanOrEqual2_4(jpqlGrammar);
}
@Override
protected boolean isSubqueryAllowedAnywhere() {
return EclipseLinkVersionTools.isNewerThanOrEqual2_4(jpqlGrammar);
}
@Test
public void test_AggregateFunction_WrongClause_5() throws Exception {
String query = "SELECT e FROM Employee e GROUP BY AVG(e.age)";
List<JPQLQueryProblem> problems = validate(query);
if (EclipseLinkVersionTools.isEquals2_0(jpqlGrammar)) {
int startPosition = "SELECT e FROM Employee e GROUP BY ".length();
int endPosition = query.length();
testHasOnlyOneProblem(problems, BadExpression_InvalidExpression, startPosition, endPosition);
}
else {
testHasNoProblems(problems);
}
}
@Test
public void test_GroupByClause_GroupByItemIsMissingComma_3() throws Exception {
String query = "SELECT e FROM Employee e GROUP BY AVG(e.age) e.name";
int startPosition = "SELECT e FROM Employee e GROUP BY AVG(e.age)".length();
int endPosition = "SELECT e FROM Employee e GROUP BY AVG(e.age) ".length();
List<JPQLQueryProblem> problems = validate(query);
if (EclipseLinkVersionTools.isEquals2_0(jpqlGrammar)) {
int startPosition1 = "SELECT e FROM Employee e GROUP BY ".length();
int endPosition1 = "SELECT e FROM Employee e GROUP BY AVG(e.age)".length();
testHasProblem(
problems,
BadExpression_InvalidExpression,
startPosition1,
endPosition1
);
testHasProblem(
problems,
GroupByClause_GroupByItemIsMissingComma,
startPosition,
endPosition
);
}
else {
testHasOnlyOneProblem(
problems,
GroupByClause_GroupByItemIsMissingComma,
startPosition,
endPosition
);
}
}
@Test
public void test_InExpression_InvalidExpression() throws Exception {
String jpqlQuery = "SELECT e FROM Employee e WHERE ABS(e.salary) IN :age";
List<JPQLQueryProblem> problems = validate(jpqlQuery);
if (EclipseLinkVersionTools.isNewerThanOrEqual2_1(jpqlGrammar)) {
testHasNoProblems(problems);
}
else {
int startPosition = "SELECT e FROM Employee e WHERE ".length();
int endPosition = "SELECT e FROM Employee e WHERE ABS(e.salary)".length();
testHasOnlyOneProblem(
problems,
InExpression_InvalidExpression,
startPosition,
endPosition
);
}
}
@Test
public void test_OrderByClause_GroupByItemIsMissingComma_3() throws Exception {
String query = "SELECT e FROM Employee e ORDER BY LENGTH(e.age) e.name";
List<JPQLQueryProblem> problems = validate(query);
if (EclipseLinkVersionTools.isNewerThanOrEqual2_0(jpqlGrammar)) {
int startPosition1 = "SELECT e FROM Employee e ORDER BY ".length();
int endPosition1 = "SELECT e FROM Employee e ORDER BY LENGTH(e.age)be.name".length();
testHasProblem(
problems,
OrderByItem_InvalidExpression,
startPosition1,
endPosition1
);
}
else {
int startPosition = "SELECT e FROM Employee e ORDER BY LENGTH(e.age)".length();
int endPosition = "SELECT e FROM Employee e ORDER BY LENGTH(e.age) ".length();
testHasOnlyOneProblem(
problems,
OrderByClause_OrderByItemIsMissingComma,
startPosition,
endPosition
);
}
}
}