/*
 * Copyright (c) 1998, 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 from Oracle TopLink
package org.eclipse.persistence.testing.tests.customsqlstoredprocedures;

import java.util.*;
import org.eclipse.persistence.queries.*;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.testing.models.employee.domain.Employee;

/**
 * <p>
 * <b>Purpose</b>: Execute a ReadAllQuery which uses a custom SQL subquery on the database.
 * <p>
 * <b>Responsibilities</b>:
 * <ul>
 * <li> Execute the read all query with the subquery and verify no errors occurred.
 * <li> Verify the objects returned match the original number of objects.
 * </ul>
 */
public class CustomSQLSubQueryTest extends AutoVerifyTestCase {
    protected ReadAllQuery query;
    protected int numberOfManagedEmployees;
    protected Object objectsFromDatabase;
    protected Class<?> referenceClass;
    protected Employee someManager;

    public CustomSQLSubQueryTest() {
        referenceClass = Employee.class;
        setName("CustomSQLSubQueryTest(" + referenceClass.getName() + ")");
        setDescription("The test runs a ReadAllQuery with a customSQL subquery to the database.");
    }

    @Override
    protected void setup() {
        getSession().getIdentityMapAccessor().initializeIdentityMaps();

        // This employee as a manager
        someManager = (Employee)getSession().readObject(referenceClass/*,
            bldr.get("firstName").equal("Sarah").and(bldr.get("lastName").equal("Way"))*/);
        //number of managed employees
        numberOfManagedEmployees = someManager.getManagedEmployees().size();
    }

    @Override
    protected void test() {
        query = new ReadAllQuery();
        query.setReferenceClass(referenceClass);

        ReportQuery hierarchyQuery = new ReportQuery();
        hierarchyQuery.setReferenceClass(referenceClass);
        // The #employeeId is what would cause the error
        hierarchyQuery.setCall(new SQLCall("SELECT EMP_ID FROM EMPLOYEE WHERE MANAGER_ID=#employeeId"));

        query.setSelectionCriteria(query.getExpressionBuilder().get("id").in(hierarchyQuery));
        // want the argument at the top level query
        query.addArgument("employeeId");
    }

    /**
     * Verify that the query ran successfully, and
     * that the number of objects returned matches the number of managed employees.
     */
    @Override
    protected void verify() throws Exception {
        Vector params = new Vector();
        params.add(someManager.getId());//numberOfManagedEmployees
        try {
            Vector results = (Vector)getSession().executeQuery(query, params);
            if (!(numberOfManagedEmployees == results.size())) {
                throw new TestErrorException(results.size() + " objects were read from the database, but originially there were, " + numberOfManagedEmployees + ".");
            }
        } catch (org.eclipse.persistence.exceptions.DatabaseException e) {
            throw new TestErrorException("Custom SQL subquery with parameters failed with a DatabaseException.");
        }
    }
}
