/*
 * 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) {

        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() {

        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) {

        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) {

        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() {

        String jpqlQuery = "select e from jpql.query.Employee";

        testDeclarations(
            jpqlQuery,
            true,
            derivedRangeDeclaration("jpql.query.Employee", null)
        );
    }

    private void test_Declaration_006(boolean tolerant) {

        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) {

        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) {

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