/*
 * Copyright (c) 2006, 2020 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.junit.Test;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.*;
import static org.eclipse.persistence.jpa.tests.jpql.parser.JPQLParserTester.*;

@SuppressWarnings("nls")
public final class JoinTest extends JPQLParserTest {

    private void test_Join(String identifier, JoinTester join) {

        String jpqlQuery = "SELECT e FROM Employee e " + identifier;

        SelectStatementTester selectStatement = selectStatement(
            select(variable("e")),
            from("Employee", "e", join)
        );

        join.hasSpaceAfterJoin = false;

        testInvalidQuery(jpqlQuery, selectStatement);
    }

    @Test
    public void test_Join_01() {

        String jpqlQuery = "SELECT pub FROM Publisher pub JOIN pub.magazines mag WHERE pub.revenue > 1000000";

        SelectStatementTester selectStatement = selectStatement(
            select(variable("pub")),
            from("Publisher", "pub", join("pub.magazines", "mag")),
            where(path("pub.revenue").greaterThan(numeric(1000000)))
        );

        testQuery(jpqlQuery, selectStatement);
    }

    @Test
    public void test_Join_02() {

        String jpqlQuery = "SELECT pub FROM Publisher pub JOIN pub.magazines AS mag WHERE pub.revenue > 1000000";

        SelectStatementTester selectStatement = selectStatement(
            select(variable("pub")),
            from("Publisher", "pub", joinAs("pub.magazines", "mag")),
            where(path("pub.revenue").greaterThan(numeric(1000000)))
        );

        testQuery(jpqlQuery, selectStatement);
    }

    @Test
    public void test_Join_03() {

        String jpqlQuery = "SELECT pub FROM Publisher pub JOIN pub.magazines WHERE pub.revenue > 1000000";

        SelectStatementTester selectStatement = selectStatement(
            select(variable("pub")),
            from("Publisher", "pub", join(collectionPath("pub.magazines"), nullExpression())),
            where(path("pub.revenue").greaterThan(numeric(1000000)))
        );

        testInvalidQuery(jpqlQuery, selectStatement);
    }

    @Test
    public void test_Join_04() {

        String jpqlQuery = "SELECT pub FROM Publisher pub JOIN WHERE pub.revenue > 1000000";

        SelectStatementTester selectStatement = selectStatement(
            select(variable("pub")),
            from("Publisher", "pub", join(nullExpression(), nullExpression())),
            where(path("pub.revenue").greaterThan(numeric(1000000)))
        );

        selectStatement.hasSpaceAfterFrom = false;

        testInvalidQuery(jpqlQuery, selectStatement);
    }

    @Test
    public void test_Join_05() {

        String jpqlQuery = "SELECT pub FROM Publisher pub JOIN AS HAVING pub.revenue > 1000000";

        SelectStatementTester selectStatement = selectStatement(
            select(variable("pub")),
            from("Publisher", "pub", joinAs(nullExpression(), nullExpression())),
            having(path("pub.revenue").greaterThan(numeric(1000000)))
        );

        selectStatement.hasSpaceAfterFrom = false;

        testInvalidQuery(jpqlQuery, selectStatement);
    }

    @Test
    public void test_Join_06() {

        String jpqlQuery = "SELECT pub FROM Publisher pub JOIN AS mag WHERE pub.revenue > 1000000";

        SelectStatementTester selectStatement = selectStatement(
            select(variable("pub")),
            from("Publisher", "pub", joinAs(nullExpression(), variable("mag"))),
            where(path("pub.revenue").greaterThan(numeric(1000000)))
        );

        testInvalidQuery(jpqlQuery, selectStatement);
    }

    @Test
    public void test_Join_07() {

        String jpqlQuery = "SELECT pub " +
                           "FROM Publisher pub " +
                           "     LEFT JOIN pub.magazines mag " +
                           "WHERE pub.revenue > 1000000";

        SelectStatementTester selectStatement = selectStatement(
            select(variable("pub")),
            from("Publisher", "pub", leftJoin(collectionPath("pub.magazines"), variable("mag"))),
            where(path("pub.revenue").greaterThan(numeric(1000000)))
        );

        testQuery(jpqlQuery, selectStatement);
    }

    @Test
    public void test_Join_08() {

        String jpqlQuery = "SELECT pub " +
                           "FROM Publisher pub " +
                           "     INNER JOIN pub.magazines mag " +
                           "WHERE pub.revenue > 1000000";

        SelectStatementTester selectStatement = selectStatement(
            select(variable("pub")),
            from("Publisher", "pub", innerJoin(collectionPath("pub.magazines"), variable("mag"))),
            where(path("pub.revenue").greaterThan(numeric(1000000)))
        );

        testQuery(jpqlQuery, selectStatement);
    }

    @Test
    public void test_Join_09() {

        String jpqlQuery = "SELECT pub " +
                           "FROM Publisher pub " +
                           "     LEFT OUTER JOIN pub.magazines mag " +
                           "WHERE pub.revenue > 1000000";


        SelectStatementTester selectStatement = selectStatement(
            select(variable("pub")),
            from("Publisher", "pub", leftOuterJoin(collectionPath("pub.magazines"), variable("mag"))),
            where(path("pub.revenue").greaterThan(numeric(1000000)))
        );

        testQuery(jpqlQuery, selectStatement);
    }

    @Test
    public void test_Join_10() {

        String jpqlQuery = "Delete from Employee e join e.address a where e.id < 0";

        DeleteStatementTester deleteStatement = deleteStatement(
            delete(
                spacedCollection(
                    rangeVariableDeclaration("Employee", "e"),
                    bad(join("e.address", "a"))
                )
            ),
            where(path("e.id").lowerThan(numeric(0)))
        );

        testInvalidQuery(jpqlQuery, deleteStatement);
    }

    @Test
    public void test_Join_11() {
        JoinTester join = join(nullExpression(), nullExpression());
        test_Join(JOIN, join);
    }

    @Test
    public void test_Join_12() {
        JoinTester join = leftJoin(nullExpression(), nullExpression());
        test_Join(LEFT_JOIN, join);
    }

    @Test
    public void test_Join_13() {
        JoinTester join = leftOuterJoin(nullExpression(), nullExpression());
        test_Join(LEFT_OUTER_JOIN, join);
    }

    @Test
    public void test_Join_14() {
        JoinTester join = innerJoin(nullExpression(), nullExpression());
        test_Join(INNER_JOIN, join);
    }

    @Test
    public void test_Join_15() {
        JoinTester join = join("OUTER JOIN", nullExpression(), nullExpression());
        test_Join("OUTER JOIN", join);
    }

    @Test
    public void test_Join_16() {
        JoinTester join = joinFetch(nullExpression(), nullExpression());
        test_Join(JOIN_FETCH, join);
    }

    @Test
    public void test_Join_17() {
        JoinTester join = leftJoinFetch(nullExpression(), nullExpression());
        test_Join(LEFT_JOIN_FETCH, join);
    }

    @Test
    public void test_Join_18() {
        JoinTester join = leftOuterJoinFetch(nullExpression(), nullExpression());
        test_Join(LEFT_OUTER_JOIN_FETCH, join);
    }

    @Test
    public void test_Join_19() {
        JoinTester join = innerJoinFetch(nullExpression(), nullExpression());
        test_Join(INNER_JOIN_FETCH, join);
    }

    @Test
    public void test_Join_20() {
        JoinTester join = join("OUTER JOIN FETCH", nullExpression(), nullExpression());
        test_Join("OUTER JOIN FETCH", join);
    }

    @Test
    public void test_Join_21() {
        JoinTester join = join("LEFT INNER JOIN", nullExpression(), nullExpression());
        test_Join("LEFT INNER JOIN", join);
    }

    @Test
    public void test_Join_22() {
        JoinTester join = join("LEFT INNER JOIN FETCH", nullExpression(), nullExpression());
        test_Join("LEFT INNER JOIN FETCH", join);
    }

    @Test
    public void test_JoinFetch_01() {

        String jpqlQuery = "SELECT pub FROM Publisher pub JOIN FETCH pub.magazines mag WHERE pub.revenue > 1000000";

        SelectStatementTester selectStatement = selectStatement(
            select(variable("pub")),
            from("Publisher", "pub", joinFetch("pub.magazines", "mag")),
            where(path("pub.revenue").greaterThan(numeric(1000000)))
        );

        testQuery(jpqlQuery, selectStatement);
    }

    @Test
    public void test_JoinFetch_02() {

        String jpqlQuery = "SELECT pub FROM Publisher pub JOIN FETCH pub.magazines AS mag WHERE pub.revenue > 1000000";

        SelectStatementTester selectStatement = selectStatement(
            select(variable("pub")),
            from("Publisher", "pub", joinFetchAs("pub.magazines", "mag")),
            where(path("pub.revenue").greaterThan(numeric(1000000)))
        );

        testQuery(jpqlQuery, selectStatement);
    }

    @Test
    public void test_JoinFetch_03() {

        String jpqlQuery = "SELECT pub FROM Publisher pub JOIN FETCH pub.magazines WHERE pub.revenue > 1000000";

        SelectStatementTester selectStatement = selectStatement(
            select(variable("pub")),
            from("Publisher", "pub", joinFetch(collectionPath("pub.magazines"))),
            where(path("pub.revenue").greaterThan(numeric(1000000)))
        );

        testInvalidQuery(jpqlQuery, selectStatement);
    }

    @Test
    public void test_JoinFetch_04() {

        String jpqlQuery = "SELECT pub FROM Publisher pub JOIN FETCH WHERE pub.revenue > 1000000";

        SelectStatementTester selectStatement = selectStatement(
            select(variable("pub")),
            from("Publisher", "pub", joinFetch(nullExpression())),
            where(path("pub.revenue").greaterThan(numeric(1000000)))
        );

        selectStatement.hasSpaceAfterFrom = false;

        testInvalidQuery(jpqlQuery, selectStatement);
    }

    @Test
    public void test_JoinFetch_05() {

        String jpqlQuery = "SELECT pub FROM Publisher pub JOIN FETCH AS HAVING pub.revenue > 1000000";

        SelectStatementTester selectStatement = selectStatement(
            select(variable("pub")),
            from("Publisher", "pub", joinFetchAs(nullExpression(), nullExpression())),
            having(path("pub.revenue").greaterThan(numeric(1000000)))
        );

        selectStatement.hasSpaceAfterFrom = false;

        testInvalidQuery(jpqlQuery, selectStatement);
    }

    @Test
    public void test_JoinFetch_06() {

        String jpqlQuery = "SELECT pub FROM Publisher pub JOIN FETCH AS mag WHERE pub.revenue > 1000000";

        SelectStatementTester selectStatement = selectStatement(
            select(variable("pub")),
            from("Publisher", "pub", joinFetchAs(nullExpression(), variable("mag"))),
            where(path("pub.revenue").greaterThan(numeric(1000000)))
        );

        testInvalidQuery(jpqlQuery, selectStatement);
    }

    @Test
    public void test_JoinFetch_07() {

        String jpqlQuery = "SELECT pub " +
                           "FROM Publisher pub " +
                           "     LEFT JOIN FETCH pub.magazines mag " +
                           "WHERE pub.revenue > 1000000";

        SelectStatementTester selectStatement = selectStatement(
            select(variable("pub")),
            from("Publisher", "pub", leftJoinFetch(collectionPath("pub.magazines"), variable("mag"))),
            where(path("pub.revenue").greaterThan(numeric(1000000)))
        );

        testQuery(jpqlQuery, selectStatement);
    }

    @Test
    public void test_JoinFetch_08() {

        String jpqlQuery = "SELECT pub " +
                           "FROM Publisher pub " +
                           "     INNER JOIN FETCH pub.magazines mag " +
                           "WHERE pub.revenue > 1000000";

        SelectStatementTester selectStatement = selectStatement(
            select(variable("pub")),
            from("Publisher", "pub", innerJoinFetch(collectionPath("pub.magazines"), variable("mag"))),
            where(path("pub.revenue").greaterThan(numeric(1000000)))
        );

        testQuery(jpqlQuery, selectStatement);
    }

    @Test
    public void test_JoinFetch_09() {

        String jpqlQuery = "SELECT pub " +
                           "FROM Publisher pub " +
                           "     LEFT OUTER JOIN FETCH pub.magazines mag " +
                           "WHERE pub.revenue > 1000000";


        SelectStatementTester selectStatement = selectStatement(
            select(variable("pub")),
            from("Publisher", "pub", leftOuterJoinFetch(collectionPath("pub.magazines"), variable("mag"))),
            where(path("pub.revenue").greaterThan(numeric(1000000)))
        );

        testQuery(jpqlQuery, selectStatement);
    }

    @Test
    public void test_JoinFetch_10() {

        String jpqlQuery = "SELECT pub " +
                           "FROM Publisher pub " +
                           "     LEFT OUTER JOIN FETCH pub.magazines " +
                           "WHERE pub.revenue > 1000000";


        SelectStatementTester selectStatement = selectStatement(
            select(variable("pub")),
            from("Publisher", "pub", leftOuterJoinFetch(collectionPath("pub.magazines"))),
            where(path("pub.revenue").greaterThan(numeric(1000000)))
        );

        testQuery(jpqlQuery, selectStatement);
    }

    @Test
    public void test_JoinFetch_11() {

        String jpqlQuery = "SELECT pub " +
                           "FROM Publisher pub " +
                           "     LEFT JOIN FETCH pub.magazines " +
                           "WHERE pub.revenue > 1000000";


        SelectStatementTester selectStatement = selectStatement(
            select(variable("pub")),
            from("Publisher", "pub", leftJoinFetch(collectionPath("pub.magazines"))),
            where(path("pub.revenue").greaterThan(numeric(1000000)))
        );

        testQuery(jpqlQuery, selectStatement);
    }

    @Test
    public void test_JoinFetch_12() {

        String jpqlQuery = "SELECT pub " +
                           "FROM Publisher pub " +
                           "     JOIN FETCH pub.magazines " +
                           "WHERE pub.revenue > 1000000";


        SelectStatementTester selectStatement = selectStatement(
            select(variable("pub")),
            from("Publisher", "pub", joinFetch(collectionPath("pub.magazines"))),
            where(path("pub.revenue").greaterThan(numeric(1000000)))
        );

        testQuery(jpqlQuery, selectStatement);
    }
}
