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