blob: 8e907db30bb6105cd79b253e9416dfa39e279eec [file] [log] [blame]
/*
* Copyright (c) 2012, 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 org.eclipse.persistence.jpa.jpql.ExpressionTools;
import org.eclipse.persistence.jpa.jpql.JPQLQueryDeclaration.Type;
import org.eclipse.persistence.jpa.jpql.tools.EclipseLinkJPQLQueryContext;
import org.eclipse.persistence.jpa.jpql.tools.JPQLQueryContext;
import org.eclipse.persistence.jpa.tests.jpql.parser.JPQLParserTest.RangeVariableDeclarationTester;
import org.eclipse.persistence.jpa.tests.jpql.parser.JPQLParserTest.SimpleSelectStatementTester;
import org.junit.Test;
import static org.eclipse.persistence.jpa.tests.jpql.parser.JPQLParserTester.*;
/**
* @version 2.5
* @since 2.5
* @author Pascal Filion
*/
@SuppressWarnings("nls")
public class EclipseLinkDeclarationTest extends DeclarationTest {
@Override
protected JPQLQueryContext buildQueryContext() {
return new EclipseLinkJPQLQueryContext(jpqlGrammar);
}
protected final SubqueryDeclarationTester subqueryDeclaration(SimpleSelectStatementTester subquery,
String variableName) {
SubqueryDeclarationTester declaration = new SubqueryDeclarationTester();
if (variableName == null) {
declaration.variableName = ExpressionTools.EMPTY_STRING;
declaration.baseExpression = rangeVariableDeclaration(sub(subquery));
}
else {
RangeVariableDeclarationTester rangeVariableDeclaration = rangeVariableDeclaration(
sub(subquery),
variable(variableName)
);
declaration.baseExpression = rangeVariableDeclaration;
if (variableName.length() == 0) {
declaration.variableName = ExpressionTools.EMPTY_STRING;
rangeVariableDeclaration.hasSpaceAfterAbstractSchemaName = false;
}
else {
declaration.variableName = variableName.toUpperCase().intern();
}
}
declaration.declarationExpression = identificationVariableDeclaration(declaration.baseExpression);
declaration.rootPath = ExpressionTools.EMPTY_STRING;
return declaration;
}
protected final TableDeclarationTester tableDeclaration(String tableName,
String variableName) {
TableDeclarationTester declaration = new TableDeclarationTester();
declaration.baseExpression = table(tableName);
declaration.rootPath = tableName;
if (variableName == null) {
declaration.variableName = ExpressionTools.EMPTY_STRING;
declaration.declarationExpression = tableVariableDeclaration(tableName);
}
else {
declaration.declarationExpression = tableVariableDeclaration(tableName, variableName);
declaration.variableName = variableName.toUpperCase().intern();
}
return declaration;
}
private void test_Declaration_001(boolean tolerant) throws Exception {
String jpqlQuery = "select e from Employee e, TABLE('EMP') EMP";
testDeclarations(
jpqlQuery,
tolerant,
rangeDeclaration("Employee", "e"),
tableDeclaration("'EMP'", "EMP")
);
}
@Test
public void test_Declaration_001_1() throws Exception {
test_Declaration_001(false);
}
@Test
public void test_Declaration_001_2() throws Exception {
test_Declaration_001(true);
}
@Test
public void test_Declaration_002() throws Exception {
String jpqlQuery = "select e from Employee e, TABLE('EMP')";
testDeclarations(
jpqlQuery,
true,
rangeDeclaration("Employee", "e"),
tableDeclaration("'EMP'", null)
);
}
private void test_Declaration_003(boolean tolerant) throws Exception {
String jpqlQuery = "select e from TABLE('EMP') EMP";
testDeclarations(
jpqlQuery,
tolerant,
tableDeclaration("'EMP'", "EMP")
);
}
@Test
public void test_Declaration_003_1() throws Exception {
test_Declaration_003(false);
}
@Test
public void test_Declaration_003_2() throws Exception {
test_Declaration_003(true);
}
private void test_Declaration_004(boolean tolerant) throws Exception {
String jpqlQuery = "select e from jpql.query.Employee emp";
testDeclarations(
jpqlQuery,
tolerant,
derivedRangeDeclaration("jpql.query.Employee", "emp")
);
}
@Test
public void test_Declaration_004_1() throws Exception {
test_Declaration_004(false);
}
@Test
public void test_Declaration_004_2() throws Exception {
test_Declaration_004(true);
}
@Test
public void test_Declaration_005() throws Exception {
String jpqlQuery = "select e from jpql.query.Employee";
testDeclarations(
jpqlQuery,
true,
derivedRangeDeclaration("jpql.query.Employee", null)
);
}
private void test_Declaration_006(boolean tolerant) throws Exception {
String jpqlQuery = "select e from (select a from Address a) e";
SimpleSelectStatementTester subquery = subquery(
subSelect(variable("a")),
subFrom("Address", "a")
);
testDeclarations(
jpqlQuery,
tolerant,
subqueryDeclaration(subquery, "e")
);
}
@Test
public void test_Declaration_006_1() throws Exception {
test_Declaration_006(false);
}
@Test
public void test_Declaration_006_2() throws Exception {
test_Declaration_006(true);
}
private void test_Declaration_007(boolean tolerant) throws Exception {
String jpqlQuery = "select e from (select a from Address a)";
SimpleSelectStatementTester subquery = subquery(
subSelect(variable("a")),
subFrom("Address", "a")
);
testDeclarations(
jpqlQuery,
tolerant,
subqueryDeclaration(subquery, tolerant ? null : ExpressionTools.EMPTY_STRING)
);
}
@Test
public void test_Declaration_007_1() throws Exception {
test_Declaration_007(false);
}
@Test
public void test_Declaration_007_2() throws Exception {
test_Declaration_007(true);
}
private void test_Declaration_008(boolean tolerant) throws Exception {
String jpqlQuery = "select e from Employee e, (select a from Address a) a";
SimpleSelectStatementTester subquery = subquery(
subSelect(variable("a")),
subFrom("Address", "a")
);
testDeclarations(
jpqlQuery,
tolerant,
rangeDeclaration("Employee", "e"),
subqueryDeclaration(subquery, "a")
);
}
@Test
public void test_Declaration_008_1() throws Exception {
test_Declaration_008(false);
}
@Test
public void test_Declaration_008_2() throws Exception {
test_Declaration_008(true);
}
protected static class SubqueryDeclarationTester extends DeclarationTester {
@Override
protected Type getType() {
return Type.SUBQUERY;
}
}
protected static class TableDeclarationTester extends DeclarationTester {
@Override
protected Type getType() {
return Type.TABLE;
}
}
}