/*
 * Copyright (c) 2005, 2020 Oracle and/or its affiliates. All rights reserved.
 * Copyright (c) 2005, 2015 SAP. 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:
//     SAP - initial API and implementation

package org.eclipse.persistence.testing.tests.wdf.jpa1.query;

import java.util.Calendar;
import java.util.HashSet;
import java.util.Set;

import jakarta.persistence.TemporalType;

import org.eclipse.persistence.testing.framework.wdf.Bugzilla;
import org.eclipse.persistence.testing.framework.wdf.ToBeInvestigated;
import org.junit.Test;

public class TestConditionalExpressions extends QueryTest {

    @Test
    public void testNumericComparisons() {
        assertValidQuery("SELECT c FROM City c WHERE 5 > 6");
        assertValidQuery("SELECT c FROM City c WHERE 5 < 6");
        assertValidQuery("SELECT c FROM City c WHERE 5 >= 6");
        assertValidQuery("SELECT c FROM City c WHERE 5 <= 6");
        assertValidQuery("SELECT c FROM City c WHERE 5 = 6");
        assertValidQuery("SELECT c FROM City c WHERE 5 <> 6");
    }

    @Test
    @ToBeInvestigated
    public void testEnumComparison0() {
        assertInvalidQuery("SELECT c FROM City c WHERE c.type < org.eclipse.persistence.testing.models.wdf.jpa1.jpql.Scale.RUSH_PIGSTY");
    }

    @Test
    @ToBeInvestigated
    public void testEnumComparison1() {
        assertInvalidQuery("SELECT c FROM City c WHERE c.type >= org.eclipse.persistence.testing.models.wdf.jpa1.jpql.Scale.RUSH_PIGSTY");
    }

    @Test
    @ToBeInvestigated
    public void testEnumComparison2() {
        assertInvalidQuery("SELECT c FROM City c WHERE c.type <= org.eclipse.persistence.testing.models.wdf.jpa1.jpql.Scale.RUSH_PIGSTY");
    }

    @Test
    public void testEnumComparison3() {
        assertValidQuery("SELECT c FROM City c WHERE c.type = org.eclipse.persistence.testing.models.wdf.jpa1.jpql.Scale.RUSH_PIGSTY");
    }

    @Test
    public void testEnumComparison4() {
        assertValidQuery("SELECT c FROM City c WHERE c.type <> org.eclipse.persistence.testing.models.wdf.jpa1.jpql.Scale.RUSH_PIGSTY");
    }

    @Test
    public void testEnumComparison5() {
        assertValidQuery("SELECT c FROM City c WHERE c.id IN (SELECT min(c2.id) FROM City c2 WHERE c2.cityEnum = org.eclipse.persistence.testing.models.wdf.jpa1.jpql.City.CityEnum.BLI)");
    }

    @Test
    @ToBeInvestigated
    public void testBooleanComparison0() {
        assertInvalidQuery("SELECT c FROM City c WHERE c.cool > true");
    }

    @Test
    @ToBeInvestigated
    public void testBooleanComparison1() {
        assertInvalidQuery("SELECT c FROM City c WHERE c.cool < true");
    }

    @Test
    @ToBeInvestigated
    public void testBooleanComparison2() {
        assertInvalidQuery("SELECT c FROM City c WHERE c.cool >= true");
    }

    @Test
    @ToBeInvestigated
    public void testBooleanComparison3() {
        assertInvalidQuery("SELECT c FROM City c WHERE c.cool <= true");
    }

    @Test
    public void testBooleanComparison4() {
        assertValidQuery("SELECT c FROM City c WHERE c.cool = true");
    }

    @Test
    public void testBooleanComparison5() {
        assertValidQuery("SELECT c FROM City c WHERE c.cool <> true");
    }

    @Test
    // @TestProperties(unsupportedDatabaseVendors = { DatabaseVendor.OPEN_SQL,
    // DatabaseVendor.ORACLE })
    public void testCurrentDateTimeComparison() {
        assertValidQuery("SELECT c FROM City c WHERE current_time > current_time");
        assertValidQuery("SELECT c FROM City c WHERE current_time < current_time");
        assertValidQuery("SELECT c FROM City c WHERE current_date >= current_date");
        assertValidQuery("SELECT c FROM City c WHERE current_timestamp <= current_timestamp");
        assertValidQuery("SELECT c FROM City c WHERE current_time = current_time");
        assertValidQuery("SELECT c FROM City c WHERE current_time <> current_time");
    }

    @Test
    public void testPersistentObjectComparison0() {
        assertInvalidQuery("SELECT c FROM City c WHERE c > c");
    }

    @Test
    public void testPersistentObjectComparison1() {
        assertInvalidQuery("SELECT c FROM City c WHERE c < c");
    }

    @Test
    public void testPersistentObjectComparison2() {
        assertInvalidQuery("SELECT c FROM City c WHERE c >= c");
    }

    @Test
    public void testPersistentObjectComparison3() {
        assertInvalidQuery("SELECT c FROM City c WHERE c <= c");
    }

    @Test
    public void testPersistentObjectComparison4() {
        assertValidQuery("SELECT c FROM City c WHERE c = c");
    }

    @Test
    public void testPersistentObjectComparison5() {
        assertValidQuery("SELECT c FROM City c WHERE c <> c");
    }

    @Test
    public void testSimpleTypeComparisonHandling() {
        Set<InputParameterHolder> par1 = new HashSet<InputParameterHolder>();
        par1.add(new InputParameterHolder("parameter1", Calendar.getInstance(), TemporalType.TIMESTAMP));
        assertValidQueryWithParameters("SELECT btfa FROM BasicTypesFieldAccess btfa WHERE btfa.utilCalendar = :parameter1",
                par1);

        assertValidQuery("SELECT c FROM City c WHERE (1 + (2 + 3) / 1 * 2) - 5 > -1");
        assertValidQuery("SELECT c FROM City c WHERE 'bla' = (SELECT p.string FROM Person p)");
        assertValidQuery("SELECT c FROM City c WHERE 'bla' = ALL(SELECT p.string FROM Person p)");
        assertValidQuery("SELECT p FROM Person p WHERE 'bla' = p.string");
        assertInvalidQuery("SELECT p FROM Person p WHERE 'bla' = all.com.sap.ejbqlparser.test.Scale.STILL_ROCK");
        assertInvalidQuery("SELECT p FROM Person p WHERE 'bla' = p.integer.p");
        assertValidQuery("SELECT p FROM Person p WHERE 'bla' = ?1");
        assertValidQuery("SELECT p FROM Person p WHERE 'bla' = :one");
        //assertInvalidQuery("SELECT p FROM Person p WHERE 'bla' = org.eclipse.persistence.testing.models.wdf.jpa1.jpql.Scale.STILL_ROCK");
        assertInvalidQuery("SELECT p FROM Person p WHERE 'bla' = org.eclipse.persistence.testing.models.wdf.jpa1.jpql.Scale.NO_FIELD");
        assertInvalidQuery("SELECT p FROM Person p WHERE 'bla' = MAX(p._float)");
        assertInvalidQuery("SELECT p FROM Person p WHERE 'bla' = AVG(p.integer)");
        assertInvalidQuery("SELECT p FROM Person p WHERE 'bla' = SUM(p.bigInteger)");
        assertInvalidQuery("SELECT p FROM Person p WHERE 'bla' = SUM(p.integer)");
        assertInvalidQuery("SELECT p FROM Person p WHERE 'bla' = SUM(p._float)");
        assertInvalidQuery("SELECT p FROM Person p WHERE 'bla' = COUNT(p._float)");
        assertValidQuery("SELECT c FROM City c WHERE (SELECT p.string FROM Person p) = 'bla'");
        assertValidQuery("SELECT p FROM Person p HAVING 'bla' = MIN(p.string)");
        assertValidQuery("SELECT p FROM Person p WHERE p.string = 'bla'");
        assertInvalidQuery("SELECT p FROM Person p WHERE all.com.sap.ejbqlparser.test.Scale.STILL_ROCK = 'bla'");
        assertInvalidQuery("SELECT p FROM Person p WHERE p.integer.p = 'bla'");
        assertValidQuery("SELECT p FROM Person p WHERE ?1 = 'bla'");
        assertValidQuery("SELECT p FROM Person p WHERE :one = 'bla'");
        //assertInvalidQuery("SELECT p FROM Person p WHERE org.eclipse.persistence.testing.models.wdf.jpa1.jpql.Scale.STILL_ROCK = 'bla'");
        assertInvalidQuery("SELECT p FROM Person p WHERE org.eclipse.persistence.testing.models.wdf.jpa1.jpql.Scale.NO_FIELD = 'bla'");
        assertInvalidQuery("SELECT p FROM Person p WHERE MAX(p._float) = 'bla'");
        assertInvalidQuery("SELECT p FROM Person p WHERE AVG(p.integer) = 'bla'");
        assertInvalidQuery("SELECT p FROM Person p WHERE SUM(p.bigInteger) = 'bla'");
        assertInvalidQuery("SELECT p FROM Person p WHERE SUM(p.integer) = 'bla'");
        assertInvalidQuery("SELECT p FROM Person p WHERE SUM(p._float) = 'bla'");
        assertInvalidQuery("SELECT p FROM Person p WHERE COUNT(p._float) = 'bla'");

        // TODO mapper: boolean literal in comparison with subquery
        // assertValidQuery("SELECT c FROM City c WHERE (SELECT p._boolean FROM Person p) = true");
        // assertValidQuery("SELECT c FROM City c WHERE (SELECT p._Boolean FROM Person p) = true");
        // assertValidQuery("SELECT c FROM City c WHERE ALL(SELECT p._Boolean FROM Person p) = true");
        // assertValidQuery("SELECT c FROM City c WHERE SOME(SELECT p._boolean FROM Person p) = true");

        // TODO: mapper/parser: boolean comparison with input parameter
        // assertValidQuery("SELECT p FROM Person p WHERE true = ?1");
        // assertValidQuery("SELECT p FROM Person p WHERE true = :one");
        assertValidQuery("SELECT p FROM Person p WHERE true = p._boolean");
        assertValidQuery("SELECT p FROM Person p WHERE true = p._Boolean");
        // assertValidQuery("SELECT p FROM Person p WHERE ?1 = false");
        // assertValidQuery("SELECT p FROM Person p WHERE :one = false");

        assertValidQuery("SELECT p FROM Person p WHERE p._boolean = false");
        assertValidQuery("SELECT p FROM Person p WHERE p._Boolean = false");

        assertValidQuery("SELECT p FROM Person p WHERE (SELECT p1.integer FROM Person p1) + 1 = 2");
        assertValidQuery("SELECT p FROM Person p WHERE 1 + (SELECT p1.integer FROM Person p1) = 2");
        //assertInvalidQuery("SELECT p FROM Person p WHERE -(SELECT p1.integer FROM Person p1) > 2");

        // TODO fix enum-handling in mapper
        // assertValidQuery("SELECT c FROM City c WHERE org.eclipse.persistence.testing.models.wdf.jpa1.jpql.Scale.RUSH_PIGSTY <> ALL(SELECT c1.type FROM City c1)");
        // assertValidQuery("SELECT c FROM City c WHERE org.eclipse.persistence.testing.models.wdf.jpa1.jpql.Scale.RUSH_PIGSTY <> (SELECT c1.type FROM City c1)");
        // assertValidQuery("SELECT c FROM City c WHERE org.eclipse.persistence.testing.models.wdf.jpa1.jpql.Scale.RUSH_PIGSTY <> c.type");
        // assertValidQuery("SELECT c FROM City c WHERE org.eclipse.persistence.testing.models.wdf.jpa1.jpql.Scale.RUSH_PIGSTY <> ?1");
        // assertValidQuery("SELECT c FROM City c WHERE org.eclipse.persistence.testing.models.wdf.jpa1.jpql.Scale.RUSH_PIGSTY <> :one");
        // assertValidQuery("SELECT c FROM City c WHERE (SELECT c1.type FROM City c1) <> org.eclipse.persistence.testing.models.wdf.jpa1.jpql.Scale.RUSH_PIGSTY");

        assertValidQuery("SELECT c FROM City c WHERE c.type <> org.eclipse.persistence.testing.models.wdf.jpa1.jpql.Scale.RUSH_PIGSTY");

        // TODO check input-parameter and enum-handling of mapper
        // assertValidQuery("SELECT c FROM City c WHERE  org.eclipse.persistence.testing.models.wdf.jpa1.jpql.Scale.RUSH_PIGSTY <> ?1");
        // assertValidQuery("SELECT c FROM City c WHERE :one <> org.eclipse.persistence.testing.models.wdf.jpa1.jpql.Scale.RUSH_PIGSTY");
        // assertValidQuery("SELECT c FROM City c WHERE  org.eclipse.persistence.testing.models.wdf.jpa1.jpql.Scale.RUSH_PIGSTY <> :one");
        // assertValidQuery("SELECT c FROM City c WHERE ?1 <> org.eclipse.persistence.testing.models.wdf.jpa1.jpql.Scale.RUSH_PIGSTY");

        assertValidQuery("SELECT p FROM Person p WHERE p.sqlTime >= (SELECT p1.sqlTime FROM Person p1)");

    }

    @Test
    @ToBeInvestigated
    public void testSimpleTypeComparisonHandling1() {
        assertInvalidQuery("SELECT c FROM City c WHERE 'bla' = (SELECT p.integer FROM Person p)");
    }

    @Test
    @ToBeInvestigated
    public void testSimpleTypeComparisonHandling2() {
        assertInvalidQuery("SELECT c FROM City c WHERE 'bla' = ANY(SELECT p.integer FROM Person p)");
    }

    @Test
    @ToBeInvestigated
    public void testSimpleTypeComparisonHandling3() {
        assertInvalidQuery("SELECT p FROM Person p WHERE 'bla' = p.integer");
    }

    @Test
    @ToBeInvestigated
    public void testSimpleTypeComparisonHandling4() {
        assertInvalidQuery("SELECT p FROM Person p WHERE 'bla' = -(2 + 3)");
    }

    @Test
    @ToBeInvestigated
    public void testSimpleTypeComparisonHandling5() {
        assertInvalidQuery("SELECT c FROM City c WHERE (SELECT p.integer FROM Person p) = 'bla'");
    }

    @Test
    @ToBeInvestigated
    public void testSimpleTypeComparisonHandling6() {
        assertInvalidQuery("SELECT p FROM Person p WHERE p.integer = 'bla'");
    }

    @Test
    @ToBeInvestigated
    public void testSimpleTypeComparisonHandling7() {
        assertInvalidQuery("SELECT p FROM Person p WHERE  -(2 + 3) = 'bla'");
    }

    @Test
    @ToBeInvestigated
    public void testSimpleTypeComparisonHandling8() {
        assertValidQuery("SELECT p FROM Person p WHERE MIN(p.string) = 'bla'");
    }

    @Test
    // @TestProperties(unsupportedDatabaseVendors = { DatabaseVendor.OPEN_SQL })
    public void testSimpleComparisonHandlingExcludingOpenSQL() {
        assertValidQuery("SELECT p FROM Person p WHERE CURRENT_TIMESTAMP >= ALL(SELECT p1.sqlTimestamp FROM Person p1)");
        assertValidQuery("SELECT p FROM Person p WHERE CURRENT_DATE >= SOME(SELECT p1.sqlDate FROM Person p1)");
        assertValidQuery("SELECT p FROM Person p WHERE p.sqlTimestamp <= CURRENT_TIMESTAMP");
        assertValidQuery("SELECT p FROM Person p WHERE 'bla' = LOWER('BLA')");
        assertValidQuery("SELECT p FROM Person p WHERE CURRENT_TIMESTAMP >= p.sqlTimestamp");
        assertValidQuery("SELECT p FROM Person p WHERE CURRENT_TIMESTAMP >= ?1");
        assertValidQuery("SELECT p FROM Person p WHERE CURRENT_TIMESTAMP >= :one");
        assertValidQuery("SELECT p FROM Person p WHERE LOWER('BLA') = 'bla'");

    }

    @Test
    // @TestProperties(unsupportedDatabaseVendors = { DatabaseVendor.OPEN_SQL })
    @ToBeInvestigated
    public void testSimpleComparisonHandlingExcludingOpenSQL1() {
        assertValidQuery("SELECT p FROM Person p WHERE +p.integer + -5 * -(p.integer + 5) / -LENGTH(p.string) * -MAX(p._float) + +?1 = +p.integer + -5 * -(p.integer + 5) / -LOCATE(p.string, 'bla') * -AVG(p._float) + +?1");
    }

    @Test
    // @TestProperties(unsupportedDatabaseVendors = { DatabaseVendor.OPEN_SQL })
    @ToBeInvestigated
    public void testSimpleComparisonHandlingExcludingOpenSQL2() {
        assertValidQuery("SELECT p FROM Person p WHERE MAX(p.sqlDate) <= CURRENT_DATE");
    }

    @Test
    // @TestProperties(unsupportedDatabaseVendors = { DatabaseVendor.OPEN_SQL })
    @ToBeInvestigated
    public void testSimpleComparisonHandlingExcludingOpenSQL3() {
        assertInvalidQuery("SELECT p FROM Person p WHERE 'bla' = CURRENT_DATE");
    }

    @Test
    // @TestProperties(unsupportedDatabaseVendors = { DatabaseVendor.OPEN_SQL })
    @ToBeInvestigated
    public void testSimpleComparisonHandlingExcludingOpenSQL4() {
        assertValidQuery("SELECT p FROM Person p WHERE CURRENT_TIMESTAMP >= MAX(p.sqlTimestamp)");
    }

    @Test
    // @TestProperties(unsupportedDatabaseVendors = { DatabaseVendor.OPEN_SQL })
    @ToBeInvestigated
    public void testSimpleComparisonHandlingExcludingOpenSQL5() {
        assertInvalidQuery("SELECT p FROM Person p WHERE CURRENT_DATE = 'bla'");
    }

    @Test
    // @TestProperties(unsupportedDatabaseVendors = { DatabaseVendor.OPEN_SQL,
    // DatabaseVendor.ORACLE })
    public void testSimpleComparisonHandlingExcludingOpenSQLAndOracle0() {
        assertValidQuery("SELECT p FROM Person p WHERE ?1 <= CURRENT_TIME");
    }

    @Test
    // @TestProperties(unsupportedDatabaseVendors = { DatabaseVendor.OPEN_SQL,
    // DatabaseVendor.ORACLE })
    public void testSimpleComparisonHandlingExcludingOpenSQLAndOracle1() {
        assertValidQuery("SELECT p FROM Person p WHERE :one <= CURRENT_TIME");
    }

    @Test
    // @TestProperties(unsupportedDatabaseVendors = { DatabaseVendor.OPEN_SQL,
    // DatabaseVendor.ORACLE })
    @ToBeInvestigated
    public void testSimpleComparisonHandlingExcludingOpenSQLAndOracle2() {
        assertInvalidQuery("SELECT p FROM Person p WHERE CURRENT_TIME = false");
    }

    @Test
    // @TestProperties(unsupportedDatabaseVendors = { DatabaseVendor.OPEN_SQL,
    // DatabaseVendor.ORACLE })
    @ToBeInvestigated
    public void testSimpleComparisonHandlingExcludingOpenSQLAndOracle3() {
        assertInvalidQuery("SELECT p FROM Person p WHERE true = CURRENT_TIME");
    }

    @Test
    // @TestProperties(unsupportedDatabaseVendors = { DatabaseVendor.OPEN_SQL,
    // DatabaseVendor.ORACLE })
    public void testSimpleComparisonHandlingExcludingOpenSQLAndOracle4() {
        assertValidQuery("SELECT p FROM Person p WHERE (SELECT p1.sqlTime FROM Person p1) <= CURRENT_TIME");
    }

    @Test
    // @TestProperties(unsupportedDatabaseVendors = { DatabaseVendor.OPEN_SQL,
    // DatabaseVendor.ORACLE })
    public void testSimpleComparisonHandlingExcludingOpenSQLAndOracle5() {
        assertValidQuery("SELECT p FROM Person p WHERE CURRENT_TIME >= ANY(SELECT p1.sqlTime FROM Person p1)");
    }

    @Test
    public void testBeanComparisonHandling() {
        assertValidQuery("SELECT p FROM Person p WHERE p.city = ALL(Select c FROM City c)");
        assertValidQuery("SELECT p FROM Person p WHERE p.city = (Select c FROM City c)");
        assertValidQuery("SELECT p FROM Person p, City c WHERE p.city = c");
        assertValidQuery("SELECT p FROM Person p WHERE p.city = ?1");
        assertValidQuery("SELECT p FROM Person p WHERE ?1 = p.city");
        assertValidQuery("SELECT p FROM Person p WHERE p.city = :one");
        assertValidQuery("SELECT p FROM Person p WHERE :one = p.city");
        assertValidQuery("SELECT p FROM Person p, City c WHERE c = p.city");
        assertValidQuery("SELECT p FROM Person p WHERE (Select c FROM City c) = p.city");
        assertValidQuery("SELECT p FROM Person p, City c WHERE p.city = (c) and true = true or (false = true and 5 = 6)");

    }

    @Test
    @ToBeInvestigated
    public void testBetweenHandling0() {
        assertValidQuery("SELECT p FROM Person p WHERE p.id BETWEEN (SELECT p1.integer FROM Person p1) AND AVG(p._float)");
    }

    @Test
    public void testBetweenHandling1() {
        assertValidQuery("SELECT p FROM Person p WHERE 5 BETWEEN 'bla' AND 'bla'");
    }

    @Test
    public void testBetweenHandling2() {
        assertInvalidQuery("SELECT p FROM Person p WHERE p BETWEEN 'bla' AND 'bla'");
    }

    @Test
    public void testBetweenHandling3() {
        assertInvalidQuery("SELECT p FROM Person p WHERE p.city.type BETWEEN 'bla' AND 'bla'");
    }

    @Test
    public void testBetweenHandling4() {
        assertValidQuery("SELECT p FROM Person p WHERE org.eclipse.persistence.testing.models.wdf.jpa1.jpql.Scale.RUSH_PIGSTY BETWEEN 'bla' AND 'bla'");
    }

    @Test
    @ToBeInvestigated
    public void testBetweenHandling5() {
        assertValidQuery("SELECT p FROM Person p WHERE 5 BETWEEN 2 AND MIN(p.integer)");
    }

    @Test
    @ToBeInvestigated
    public void testBetweenHandling6() {
        assertValidQuery("SELECT p FROM Person p WHERE MAX(p.string) BETWEEN ?1 AND (SELECT p1.string FROM Person p1)");
    }

    @Test
    @ToBeInvestigated
    public void testBetweenHandling7() {
        assertValidQuery("SELECT p FROM Person p WHERE p.id NOT BETWEEN (SELECT p1.integer FROM Person p1) AND AVG(p._float)");
    }

    @Test
    public void testBetweenHandling8() {
        assertValidQuery("SELECT p FROM Person p WHERE 5 NOT BETWEEN 'bla' AND 'bla'");
    }

    @Test
    public void testBetweenHandling9() {
        assertInvalidQuery("SELECT p FROM Person p WHERE p NOT BETWEEN 'bla' AND 'bla'");
    }

    @Test
    public void testBetweenHandling10() {
        assertInvalidQuery("SELECT p FROM Person p WHERE p.city.type NOT BETWEEN 'bla' AND 'bla'");
    }

    @Test
    public void testBetweenHandling11() {
        assertValidQuery("SELECT p FROM Person p WHERE org.eclipse.persistence.testing.models.wdf.jpa1.jpql.Scale.RUSH_PIGSTY NOT BETWEEN 'bla' AND 'bla'");
    }

    @Test
    @ToBeInvestigated
    public void testBetweenHandling12() {
        assertValidQuery("SELECT p FROM Person p WHERE 5 NOT BETWEEN 2 AND MIN(p.integer)");
    }

    @Test
    @ToBeInvestigated
    public void testBetweenHandling13() {
        assertValidQuery("SELECT p FROM Person p WHERE MAX(p.string) NOT BETWEEN ?1 AND (SELECT p1.string FROM Person p1)");
    }

    @Test
    public void testPlatformDependendBetweenHandling0() {
        assertValidQuery("SELECT p FROM Person p WHERE 2 + 3 BETWEEN LENGTH('bla') AND ?1");
    }

    @Test
    @ToBeInvestigated
    public void testPlatformDependendBetweenHandling1() {
        assertValidQuery("SELECT p FROM Person p WHERE p.sqlTimestamp BETWEEN CURRENT_TIMESTAMP AND p.sqlTimestamp");
    }

    @Test
    @ToBeInvestigated
    public void testPlatformDependendBetweenHandling2() {
        assertValidQuery("SELECT p FROM Person p WHERE (SELECT p1.string FROM Person p1) BETWEEN MIN(p.string) AND LOWER('bla')");
    }

    @Test
    public void testPlatformDependendBetweenHandling3() {
        assertValidQuery("SELECT p FROM Person p WHERE p.sqlTimestamp NOT BETWEEN CURRENT_TIMESTAMP AND p.sqlTimestamp");
    }

    @Test
    @ToBeInvestigated
    public void testPlatformDependendBetweenHandling4() {
        assertValidQuery("SELECT p FROM Person p WHERE (SELECT p1.string FROM Person p1) NOT BETWEEN MIN(p.string) AND LOWER('bla')");
    }

    @Test
    @ToBeInvestigated
    public void testLikeHandling00() {
        assertInvalidQuery("SELECT p FROM Person p WHERE 5 LIKE 'bla' ESCAPE 'c'");
    }

    @Test
    @ToBeInvestigated
    public void testLikeHandling01() {
        assertInvalidQuery("SELECT p FROM Person p WHERE p.city.type LIKE 'bla' ESCAPE 'c'");
    }

    @Test
    public void testLikeHandling02() {
        assertValidQuery("SELECT p FROM Person p WHERE p.string LIKE 'bla' ESCAPE 'c'");
    }

    @Test
    public void testLikeHandling03() {
        assertValidQuery("SELECT p FROM Person p WHERE (SELECT p1.string FROM Person p1) LIKE 'bla' ESCAPE 'c'");
    }

    @Test
    @ToBeInvestigated
    public void testLikeHandling04() {
        assertValidQuery("SELECT p FROM Person p WHERE MAX(p.string) LIKE 'bla'");
    }

    @Test
    public void testLikeHandling05() {
        assertValidQuery("SELECT p FROM Person p WHERE 'bla' LIKE ?1");
    }

    @Test
    public void testLikeHandling06() {
        assertValidQuery("SELECT p FROM Person p WHERE 'bla' LIKE ?1");
    }

    @Test
    public void testLikeHandling07() {
        assertInvalidQuery("SELECT p FROM Person p WHERE 'bla' LIKE 'bla' ESCAPE 'bla'");
    }

    @Test
    public void testLikeHandling08() {
        assertValidQuery("SELECT p FROM Person p WHERE 'bla' LIKE 'bla' ESCAPE ?1");
    }

    @Test
    @ToBeInvestigated
    public void testLikeHandling09() {
        assertInvalidQuery("SELECT p FROM Person p WHERE 5 NOT LIKE 'bla' ESCAPE 'c'");
    }

    @Test
    @ToBeInvestigated
    public void testLikeHandling10() {
        assertInvalidQuery("SELECT p FROM Person p WHERE p.city.type NOT LIKE 'bla' ESCAPE 'c'");
    }

    @Test
    public void testLikeHandling11() {
        assertValidQuery("SELECT p FROM Person p WHERE p.string NOT LIKE 'bla' ESCAPE 'c'");
    }

    @Test
    public void testLikeHandling12() {
        assertValidQuery("SELECT p FROM Person p WHERE (SELECT p1.string FROM Person p1) NOT LIKE 'bla' ESCAPE 'c'");
    }

    @Test
    @ToBeInvestigated
    public void testLikeHandling13() {
        assertValidQuery("SELECT p FROM Person p WHERE MAX(p.string) NOT LIKE 'bla'");
    }

    @Test
    public void testLikeHandling14() {
        assertValidQuery("SELECT p FROM Person p WHERE 'bla' NOT LIKE ?1");
    }

    @Test
    public void testLikeHandling15() {
        assertInvalidQuery("SELECT p FROM Person p WHERE 'bla' NOT LIKE 'bla' ESCAPE 'bla'");
    }

    @Test
    public void testLikeHandling16() {
        assertValidQuery("SELECT p FROM Person p WHERE 'bla' NOT LIKE 'bla' ESCAPE ?1");
    }

    // @TestProperties(unsupportedDatabaseVendors = { DatabaseVendor.OPEN_SQL,
    // DatabaseVendor.SAPDB })
    public void testLikeHandlingExcludingOpenSQL() {
        assertInvalidQuery("SELECT p FROM Person p WHERE LOWER(p.string) LIKE UPPER(p.string)");
        assertValidQuery("SELECT p FROM Person p WHERE LOWER(p.string) LIKE '%foobar%'");
    }

    @Test
    public void testInHandling() {
        assertInvalidQuery("select p from Person as p where p.city in (2, 3, 4)");
        assertInvalidQuery("select p from Person as p where CURRENT_DATE in (2, 3, 4)");
        assertValidQuery("select p from Person as p where p._float in (2, 3, 4.4, :one)");
        //assertInvalidQuery("select p from Person as p where p._float in (2, 'bla', 4.4)");
        //assertInvalidQuery("select p from Person as p where p.city.type in (org.eclipse.persistence.testing.models.wdf.jpa1.jpql.Metal.DEATH)");
        assertValidQuery("select p from Person as p where p.city.type in (select c.type from City as c)");
        assertValidQuery("select p from Person as p where p.string in ('2', '3', '4.4', :one)");
        assertValidQuery("select p from Person as p where p.string in ('2', '3', '4.4', :one)");
        //assertInvalidQuery("select p from Person as p where p.city NOT in (2, 3, 4)");
        //assertInvalidQuery("select p from Person as p where CURRENT_DATE Not in (2, 3, 4)");
        assertValidQuery("select p from Person as p where p._float nOt in (2, 3, 4.4, :one)");
        //assertInvalidQuery("select p from Person as p where p._float noT in (2, 'bla', 4.4)");
        //assertInvalidQuery("select p from Person as p where p.city.type not in (org.eclipse.persistence.testing.models.wdf.jpa1.jpql.Metal.DEATH)");
        assertValidQueryExecution("select p from Person as p where p.city.type not in (select c.type from City as c)");
        assertValidQuery("select p from Person as p where p.string not in ('2', '3', '4.4', :one)");

    }

    @Test
    public void testInBinary() {
        byte[] byteArr1 = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
        byte[] byteArr2 = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
        assertValidQueryExecutionWithArgs("SELECT b FROM BasicTypesFieldAccess b WHERE b.primitiveByteArray2Binary IN(?1,?2)",
                new Object[] { byteArr1, byteArr2 });

    }



    @Test
    @ToBeInvestigated
    public void testInHandling0() {
        assertInvalidQuery("select p from Person as p where 2 in (2, 3, 4)");
    }

    @Test
    public void testInHandling1() {
        assertValidQuery("select p from Person as p where p.city.type in (org.eclipse.persistence.testing.models.wdf.jpa1.jpql.Scale.RUSH_PIGSTY, org.eclipse.persistence.testing.models.wdf.jpa1.jpql.Scale.STUCK_TURTLE, org.eclipse.persistence.testing.models.wdf.jpa1.jpql.Scale.RUNNING_ELEPHAN, :one)");
    }

    @Test
    @ToBeInvestigated
    public void testInHandling2() {
        assertInvalidQuery("select p from Person as p where 2 not in (2, 3, 4)");
    }

    @Test
    public void testInHandling3() {
        assertValidQuery("select p from Person as p where p.city.type not in (org.eclipse.persistence.testing.models.wdf.jpa1.jpql.Scale.RUSH_PIGSTY, org.eclipse.persistence.testing.models.wdf.jpa1.jpql.Scale.STUCK_TURTLE, org.eclipse.persistence.testing.models.wdf.jpa1.jpql.Scale.RUNNING_ELEPHAN, :one)");
    }

    @Test
    @ToBeInvestigated
    public void testInHandling4() {
        byte[] byteArr1 = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8 };
        byte[] byteArr2 = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8 };
        String queryString = "SELECT p FROM PrincipalEntity p WHERE p.taskInstance.taskInstanceId IN (?1,?2)";
        assertValidQueryExecutionWithArgs(queryString, new Object[] { byteArr1, byteArr2 });
    }

    @Test
    public void testIsNullHandling0() {
        assertValidQuery("select p from Person as p where p.city is null");
    }

    @Test
    public void testIsNullHandling1() {
        assertValidQuery("select p from Person as p where :one is null");
    }

    @Test
    public void testIsNullHandling2() {
        assertValidQuery("select p from Person as p where p is null");
    }

    @Test
    public void testIsNullHandling3() {
        assertInvalidQuery("select p from Person as p where p.city.cops is null");
    }

    @Test
    @ToBeInvestigated
    public void testIsNullHandling4() {
        assertInvalidQuery("select p from Person as p where 2 + 3 is null");
    }

    @Test
    public void testIsNullHandling5() {
        assertValidQuery("select p from Person as p where p.city is not null");
    }

    @Test
    public void testIsNullHandling6() {
        assertValidQuery("select p from Person as p where :one is not null");
    }

    @Test
    public void testIsNullHandling7() {
        assertValidQuery("select p from Person as p where p is not null");
    }

    @Test
    public void testIsNullHandling8() {
        assertInvalidQuery("select p from Person as p where p.city.cops is NOT null");
    }

    @Test
    @ToBeInvestigated
    public void testIsNullHandling9() {
        assertInvalidQuery("select p from Person as p where 2 + 3 is not null");
    }

    @Test
    public void testIsEmptyHandling0() {
        assertInvalidQuery("select p from Person p where p.city is empty");
    }

    @Test
    @ToBeInvestigated
    public void testIsEmptyHandling1() {
        assertInvalidQuery("select p from Person p where p is empty");
    }

    @Test
    public void testIsEmptyHandling2() {
        assertValidQuery("select c from Criminal c where c.attachedCop.partner.partner.partner.attachedCriminals is empty");
    }

    @Test
    @ToBeInvestigated
    public void testIsEmptyHandling3() {
        assertInvalidQuery("select p from Person p where (2 * 4) is empty");
    }

    @Test
    public void testIsEmptyHandling4() {
        assertInvalidQuery("select p from Person p where p.city.rivers is empty");
    }

    @Test
    public void testIsEmptyHandling5() {
        assertInvalidQuery("select p from Person p where p.city is not empty");
    }

    @Test
    @ToBeInvestigated
    public void testIsEmptyHandling6() {
        assertInvalidQuery("select p from Person p where p is NOT empty");
    }

    @Test
    public void testIsEmptyHandling7() {
        assertValidQuery("select c from Criminal c where c.attachedCop.partner.partner.partner.informers is not empty");
    }

    @Test
    @ToBeInvestigated
    public void testIsEmptyHandling8() {
        assertInvalidQuery("select p from Person p where (2 * 4) is not empty");
    }

    @Test
    public void testIsEmptyHandling9() {
        assertInvalidQuery("select p from Person p where p.city.rivers is not empty");
    }

    @Test
    public void testMemberOfHandling() {
        assertInvalidQuery("select cri from Criminal cri, City c where cri.attachedCop member c.criminals");
        assertInvalidQuery("select cri from Criminal cri, City c where cri member c.rivers");
        assertInvalidQuery("select cri from Criminal cri, City c where 5 member c.rivers");
        assertInvalidQuery("select p from City c, Person p where p.integer member c.criminals");
        assertValidQuery("select c from City c where :one member OF c.criminals");
        assertInvalidQuery("select c from City c where (select p from Person p) member OF c.criminals");
        assertInvalidQuery("select c from City c where avg(c.id) member OF c.criminals");
        assertValidQuery("select cri from Criminal cri, City c where cri.attachedCop not member of c.cops");
        assertInvalidQuery("select cri from Criminal cri, City c where cri.attachedCop not member c.criminals");
        assertValidQuery("select cri from Criminal cri, City c where cri not member c.criminals");
        assertInvalidQuery("select cri from Criminal cri, City c where cri not member c.rivers");
        assertInvalidQuery("select cri from Criminal cri, City c where 5 NOT member c.rivers");
        assertInvalidQuery("select p from City c, Person p where p.integer not member c.criminals");
        assertValidQuery("select c from City c where :one not member OF c.criminals");
        assertInvalidQuery("select c from City c where (select p from Person p) not member OF c.criminals");
        assertInvalidQuery("select c from City c where avg(c.id) not member OF c.criminals");
    }

    @Test
    public void testMemberOfHandling0() {
      assertValidQuery("select cri from Criminal cri, City c where cri.attachedCop member of c.cops");
    }

    @Test
    public void testMemberOfHandling4() {
        assertValidQuery("select cri from Criminal cri, City c where cri member c.criminals");
    }

    @Test
    @ToBeInvestigated
    public void testMemberOfHandling1() {
        assertInvalidQuery("select p from City c, Person p where p.city.criminals member OF c.criminals");
    }

    @Test
    public void testMemberOfHandling2() {
        assertInvalidQuery("select p from City c, Person p where p.city.criminals not member OF c.criminals");
    }

    @Test
    public void testExistsHandling() {
        assertValidQuery("select c from City c where exists (select p from Person p)");
        assertValidQuery("select c from City c where not exists (select p from Person p)");
    }

}
