| /* |
| * 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)); |
| } |
| } |