blob: bfed1fa2b882f9b30146038fb0275cf9237a4a62 [file] [log] [blame]
/*
* Copyright (c) 2011, 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.parser;
import org.eclipse.persistence.jpa.jpql.ExpressionTools;
import org.junit.Test;
import static org.eclipse.persistence.jpa.tests.jpql.parser.JPQLParserTester.*;
/**
* Unit-tests for {@link org.eclipse.persistence.jpa.jpql.parser.FunctionExpression FunctionExpression}.
*
* @version 2.5
* @since 2.4
* @author Pascal Filion
*/
@SuppressWarnings("nls")
public abstract class AbstractFunctionExpressionTest extends JPQLParserTest {
private int index;
private JPQLQueryStringFormatter buildQueryStringFormatter_1() {
return new JPQLQueryStringFormatter() {
@Override
public String format(String query) {
return query.replace("(,)", "(, )");
}
};
}
private JPQLQueryStringFormatter buildQueryStringFormatter_2() {
return new JPQLQueryStringFormatter() {
@Override
public String format(String query) {
return query.replace(",)", ", )");
}
};
}
private JPQLQueryStringFormatter buildQueryStringFormatter_3(final String jpqlQuery) {
return new JPQLQueryStringFormatter() {
@Override
public String format(String query) {
return jpqlQuery;
}
};
}
private JPQLQueryStringFormatter buildQueryStringFormatter_4(final String jpqlQuery) {
return new JPQLQueryStringFormatter() {
@Override
public String format(String query) {
return jpqlQuery.replaceAll("=", " = ").replaceAll("\\s+", " ");
}
};
}
protected abstract String functionName(int index);
protected abstract String identifier(int index);
protected boolean isExpression_14_Bad() {
return false;
}
@Override
protected void setUp() throws Exception {
super.setUp();
index++;
}
@Override
protected void setUpClass() throws Exception {
super.setUpClass();
index = -1;
}
@Test
public void test_JPQLQuery_01() {
String identifier = identifier(index);
String functionName = functionName(index);
// SELECT FUNCTION('FUNCTION_NAME') FROM Employee e
String jpqlQuery = "SELECT " + identifier + "(" + functionName + ") " +
"FROM Employee e";
ExpressionTester selectStatement = selectStatement(
select(function(identifier, functionName)),
from("Employee", "e")
);
testQuery(jpqlQuery, selectStatement);
}
@Test
public void test_JPQLQuery_02() {
String identifier = identifier(index);
String variable = identifier.toLowerCase();
String entityName = Character.toUpperCase(identifier.charAt(0)) + identifier.toLowerCase().substring(1);
// SELECT FUNCTION FROM Employee FUNCTION
String jpqlQuery = "SELECT " + variable + " FROM " + entityName + " " + variable;
ExpressionTester selectStatement = selectStatement(
select(variable(variable)),
from(entityName, variable)
);
testQuery(jpqlQuery, selectStatement, buildQueryStringFormatter_3(jpqlQuery));
}
@Test
public void test_JPQLQuery_03() {
String identifier = identifier(index);
String functionName = ExpressionTools.EMPTY_STRING;
// SELECT FUNCTION( FROM Employee e
String jpqlQuery = "SELECT " + identifier + "( FROM Employee e";
FunctionExpressionTester function = function(identifier, functionName);
function.hasComma = false;
function.hasLeftParenthesis = true;
function.hasRightParenthesis = false;
function.hasSpaceAfterComma = false;
ExpressionTester selectStatement = selectStatement(
select(function),
from("Employee", "e")
);
testInvalidQuery(jpqlQuery, selectStatement);
}
@Test
public void test_JPQLQuery_04() {
String identifier = identifier(index);
String functionName = ExpressionTools.EMPTY_STRING;
// SELECT FUNCTION(, FROM Employee e
String jpqlQuery = "SELECT " + identifier + "(, FROM Employee e";
FunctionExpressionTester function = function(identifier, functionName);
function.hasComma = true;
function.hasLeftParenthesis = true;
function.hasRightParenthesis = false;
function.hasSpaceAfterComma = false;
ExpressionTester selectStatement = selectStatement(
select(function),
from("Employee", "e")
);
testInvalidQuery(jpqlQuery, selectStatement);
}
@Test
public void test_JPQLQuery_05() {
String identifier = identifier(index);
String functionName = ExpressionTools.EMPTY_STRING;
// SELECT FUNCTION(,) FROM Employee e
String jpqlQuery = "SELECT " + identifier + "(,) FROM Employee e";
FunctionExpressionTester function = function(identifier, functionName);
function.hasComma = true;
function.hasLeftParenthesis = true;
function.hasRightParenthesis = true;
function.hasSpaceAfterComma = false;
ExpressionTester selectStatement = selectStatement(
select(function),
from("Employee", "e")
);
testInvalidQuery(jpqlQuery, selectStatement);
}
@Test
public void test_JPQLQuery_06() {
String identifier = identifier(index);
String functionName = ExpressionTools.EMPTY_STRING;
// SELECT FUNCTION(, ) FROM Employee e
String jpqlQuery = "SELECT " + identifier + "(, ) FROM Employee e";
FunctionExpressionTester function = function(identifier, functionName);
function.hasComma = true;
function.hasLeftParenthesis = true;
function.hasRightParenthesis = true;
function.hasSpaceAfterComma = true;
ExpressionTester selectStatement = selectStatement(
select(function),
from("Employee", "e")
);
testInvalidQuery(jpqlQuery, selectStatement, buildQueryStringFormatter_1());
}
@Test
public void test_JPQLQuery_07() {
String identifier = identifier(index);
String functionName = ExpressionTools.EMPTY_STRING;
// SELECT FUNCTION(, e) FROM Employee e
String jpqlQuery = "SELECT " + identifier + "(, e) FROM Employee e";
FunctionExpressionTester function = function(identifier, functionName, variable("e"));
function.hasComma = true;
function.hasLeftParenthesis = true;
function.hasRightParenthesis = true;
function.hasSpaceAfterComma = true;
ExpressionTester selectStatement = selectStatement(
select(function),
from("Employee", "e")
);
testInvalidQuery(jpqlQuery, selectStatement);
}
@Test
public void test_JPQLQuery_08() {
String identifier = identifier(index);
String functionName = ExpressionTools.EMPTY_STRING;
// SELECT FUNCTION(e) FROM Employee e
String jpqlQuery = "SELECT " + identifier + "(e) FROM Employee e";
FunctionExpressionTester function = function(identifier, functionName, variable("e"));
function.hasComma = false;
function.hasLeftParenthesis = true;
function.hasRightParenthesis = true;
function.hasSpaceAfterComma = false;
ExpressionTester selectStatement = selectStatement(
select(function),
from("Employee", "e")
);
testInvalidQuery(jpqlQuery, selectStatement);
}
@Test
public void test_JPQLQuery_09() {
String identifier = identifier(index);
String functionName = ExpressionTools.EMPTY_STRING;
// SELECT FUNCTION(e FROM Employee e
String jpqlQuery = "SELECT " + identifier + "(e FROM Employee e";
FunctionExpressionTester function = function(identifier, functionName, variable("e"));
function.hasComma = false;
function.hasLeftParenthesis = true;
function.hasRightParenthesis = false;
function.hasSpaceAfterComma = false;
ExpressionTester selectStatement = selectStatement(
select(function),
from("Employee", "e")
);
testInvalidQuery(jpqlQuery, selectStatement);
}
@Test
public void test_JPQLQuery_10() {
String identifier = identifier(index);
String functionName = functionName(index);
// SELECT FUNCTION('functionName' FROM Employee e
String jpqlQuery = "SELECT " + identifier + "(" + functionName + " FROM Employee e";
FunctionExpressionTester function = function(identifier, functionName);
function.hasComma = false;
function.hasLeftParenthesis = true;
function.hasRightParenthesis = false;
function.hasSpaceAfterComma = false;
ExpressionTester selectStatement = selectStatement(
select(function),
from("Employee", "e")
);
testInvalidQuery(jpqlQuery, selectStatement);
}
@Test
public void test_JPQLQuery_11() {
String identifier = identifier(index);
String functionName = functionName(index);
// SELECT FUNCTION('functionName', FROM Employee e
String jpqlQuery = "SELECT " + identifier + "(" + functionName + ", FROM Employee e";
FunctionExpressionTester function = function(identifier, functionName);
function.hasComma = true;
function.hasLeftParenthesis = true;
function.hasRightParenthesis = false;
function.hasSpaceAfterComma = false;
ExpressionTester selectStatement = selectStatement(
select(function),
from("Employee", "e")
);
testInvalidQuery(jpqlQuery, selectStatement);
}
@Test
public void test_JPQLQuery_12() {
String identifier = identifier(index);
String functionName = functionName(index);
// SELECT FUNCTION('functionName',) FROM Employee e
String jpqlQuery = "SELECT " + identifier + "(" + functionName + ",) FROM Employee e";
FunctionExpressionTester function = function(identifier, functionName);
function.hasComma = true;
function.hasLeftParenthesis = true;
function.hasRightParenthesis = true;
function.hasSpaceAfterComma = false;
ExpressionTester selectStatement = selectStatement(
select(function),
from("Employee", "e")
);
testInvalidQuery(jpqlQuery, selectStatement);
}
@Test
public void test_JPQLQuery_13() {
String identifier = identifier(index);
String functionName = functionName(index);
// SELECT FUNCTION('functionName', ) FROM Employee e
String jpqlQuery = "SELECT " + identifier + "(" + functionName + ", ) FROM Employee e";
FunctionExpressionTester function = function(identifier, functionName);
function.hasComma = true;
function.hasLeftParenthesis = true;
function.hasRightParenthesis = true;
function.hasSpaceAfterComma = true;
ExpressionTester selectStatement = selectStatement(
select(function),
from("Employee", "e")
);
testInvalidQuery(jpqlQuery, selectStatement, buildQueryStringFormatter_2());
}
@Test
public void test_JPQLQuery_14() {
String identifier = identifier(index);
String functionName = functionName(index);
// SELECT FUNCTION('functionName', LENGTH(e.name)) FROM Employee e
String jpqlQuery = "SELECT " + identifier + "(" + functionName + ", LENGTH(e.name)) FROM Employee e";
FunctionExpressionTester function = function(
identifier,
functionName,
isExpression_14_Bad() ? bad(length(path("e.name"))) : length(path("e.name"))
);
function.hasComma = true;
function.hasLeftParenthesis = true;
function.hasRightParenthesis = true;
function.hasSpaceAfterComma = true;
ExpressionTester selectStatement = selectStatement(
select(function),
from("Employee", "e")
);
testInvalidQuery(jpqlQuery, selectStatement);
}
@Test
public void test_JPQLQuery_15() {
String identifier = identifier(index);
String functionName1 = functionName(index++);
String functionName2 = functionName(index);
// SELECT FUNCTION('functionName', e.firstName, 'NoFirstName'),
// FUNCTION('functionName', e.lastName, 'NoLastName')
// FROM Employee e
String jpqlQuery = "SELECT " + identifier + "(" + functionName1 + ", e.firstName, 'NoFirstName')," +
" " + identifier + "(" + functionName2 + ", e.lastName, 'NoLastName' ) " +
"FROM Employee e";
ExpressionTester selectStatement = selectStatement(
select(
function(identifier, functionName1, path("e.firstName"), string("'NoFirstName'")),
function(identifier, functionName2, path("e.lastName"), string("'NoLastName'"))
),
from("Employee", "e")
);
testQuery(jpqlQuery, selectStatement);
}
@Test
public void test_JPQLQuery_16() {
String identifier = identifier(index);
String functionName = functionName(index);
String jpqlQuery = "SELECT a " +
"FROM Asset a, Geography selectedGeography " +
"WHERE selectedGeography.id = :id AND " +
" a.id IN :id_list AND " +
" " + identifier + "(" + functionName + ", a.geometry, selectedGeography.geometry) = 'TRUE'";
ExpressionTester selectStatement = selectStatement(
select(variable("a")),
from("Asset", "a", "Geography", "selectedGeography"),
where(
path("selectedGeography.id").equal(inputParameter(":id"))
.and(
path("a.id").in(":id_list")
).and(
function(identifier, functionName, path("a.geometry"), path("selectedGeography.geometry"))
.equal(
string("'TRUE'"))
)
)
);
testQuery(jpqlQuery, selectStatement);
}
@Test
public void test_JPQLQuery_17() {
String identifier = identifier(index);
String functionName = functionName(index);
String variable = identifier.toLowerCase();
String entityName = Character.toUpperCase(identifier.charAt(0)) + identifier.toLowerCase().substring(1);
// SELECT function FROM Function function
// WHERE function.function=FUNCTION('functionName')
// AND
// function=function
// ORDER BY e.name
String jpqlQuery = "SELECT " + variable + " " +
"FROM " + entityName + " " + variable + " " +
"WHERE " + variable + "." + variable + " = " + identifier + "(" + functionName + ") " +
" AND" +
" " + variable + "=" + variable + " " +
"ORDER BY e.name";
ExpressionTester selectStatement = selectStatement(
select(variable(variable)),
from(entityName, variable),
where(
path(variable + "." + variable).equal(function(identifier, functionName))
.and(
variable(variable).equal(variable(variable))
)
),
orderBy(orderByItem("e.name"))
);
testQuery(jpqlQuery, selectStatement, buildQueryStringFormatter_4(jpqlQuery));
}
}