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

import java.sql.Date;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Map;

import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.descriptors.DescriptorQueryManager;
import org.eclipse.persistence.descriptors.invalidation.DailyCacheInvalidationPolicy;
import org.eclipse.persistence.descriptors.invalidation.NoExpiryCacheInvalidationPolicy;
import org.eclipse.persistence.descriptors.invalidation.TimeToLiveCacheInvalidationPolicy;
import org.eclipse.persistence.expressions.Expression;
import org.eclipse.persistence.expressions.ExpressionBuilder;
import org.eclipse.persistence.queries.DataReadQuery;
import org.eclipse.persistence.queries.DatabaseQuery;
import org.eclipse.persistence.queries.InMemoryQueryIndirectionPolicy;
import org.eclipse.persistence.queries.QueryResultsCachePolicy;
import org.eclipse.persistence.queries.ReadAllQuery;
import org.eclipse.persistence.queries.ReadObjectQuery;
import org.eclipse.persistence.queries.ReportQuery;
import org.eclipse.persistence.sessions.Project;
import org.eclipse.persistence.testing.framework.TestExecutor;
import org.eclipse.persistence.testing.models.employee.domain.Address;
import org.eclipse.persistence.testing.models.employee.domain.Employee;
import org.eclipse.persistence.testing.models.employee.domain.LargeProject;
import org.eclipse.persistence.testing.models.employee.domain.PhoneNumber;
import org.eclipse.persistence.testing.models.employee.domain.SmallProject;
import org.eclipse.persistence.testing.models.employee.relational.EmployeeProject;
import org.eclipse.persistence.testing.models.employee.relational.EmployeeSystem;

/**
 *  This test system uses the Employee test system to test the integration
 *  between the Mapping Workbench and the Foundation Library. To do this, it
 *  writes our test project to an XML file and then reads the XML file and runs
 *  the employee tests on it.
 *  @author Tom Ware
 */
public class EmployeeWorkbenchIntegrationSystem extends EmployeeSystem {
    public static String PROJECT_FILE = "MWIntegrationTestEmployeeProject";

    // A large enough value to ensure queries do not timeout, but a value we can test for
    public static int QUERY_MANAGER_TIMEOUT = 250;

    private Project initialProject;

    /**
     * Override the constructor for employee system to allow us to read and write XML
     */
    public EmployeeWorkbenchIntegrationSystem() {
        super();

        buildInitialProject();
        buildProject();
    }

    protected void buildProject() {
        project = WorkbenchIntegrationSystemHelper.buildProjectXML(getInitialProject(), PROJECT_FILE);
    }

    public org.eclipse.persistence.sessions.Project getInitialProject() {
        return initialProject;
    }

    protected void buildInitialProject() {
        initialProject = new EmployeeProject();
        Map<Class, ClassDescriptor> descriptors = initialProject.getDescriptors();

        // Amend the employee descriptor
        ClassDescriptor employeeDescriptor = descriptors.get(Employee.class);
        DescriptorQueryManager queryManager = employeeDescriptor.getQueryManager();

        queryManager.addQuery("PersistenceTestGetEqual", buildPersistenceTestGetEqualQuery());
        queryManager.addQuery("PersistenceTestAnyOfEqual", buildPersistenceTestAnyOfEqualQuery());
        queryManager.addQuery("PersistenceTestGetAllowingNullEqual", buildPersistenceTestGetAllowingNullEqualQuery());
        queryManager.addQuery("PersistenceTestAnyOfAllowingNoneEqual", buildPersistenceTestAnyOfAllowingNoneEqualQuery());
        queryManager.addQuery("PersistenceTestGetGreaterThan", buildPersistenceTestGetGreaterThanQuery());
        queryManager.addQuery("PersistenceTestGetGreaterThanEqual", buildPersistenceTestGetGreaterThanEqualQuery());
        queryManager.addQuery("PersistenceTestGetIsNull", buildPersistenceTestGetIsNullQuery());
        queryManager.addQuery("PersistenceTestGetEqualIgnoringCase", buildPersistenceTestGetEqualIgnoringCaseQuery());
        queryManager.addQuery("PersistenceTestGetLessThan", buildPersistenceTestGetLessThanQuery());
        queryManager.addQuery("PersistenceTestGetLessThanEqual", buildPersistenceTestGetLessThanEqualQuery());
        queryManager.addQuery("PersistenceTestGetLike", buildPersistenceTestGetLikeQuery());
        queryManager.addQuery("PersistenceTestGetNot", buildPersistenceTestGetNotQuery());
        queryManager.addQuery("PersistenceTestGetNotEqual", buildPersistenceTestGetNotEqualQuery());
        queryManager.addQuery("PersistenceTestGetNotLike", buildPersistenceTestGetNotLikeQuery());
        queryManager.addQuery("PersistenceTestGetNotNull", buildPersistenceTestGetNotNullQuery());
        queryManager.addQuery("PersistenceTestEmptyStringAndNull", buildPersistenceTestEmptyStringAndNull());
        queryManager.addQuery("PersistenceTestGreaterThanEqualDate", buildPersistenceTestGreaterThanEqualDateQuery());

        //ReportQuery
        queryManager.addQuery("AddAttributeReportQuery", buildAddAttributeReportQueryTest());
        queryManager.addQuery("AddAverageReportQuery", buildAddAverageReportQueryTest());
        queryManager.addQuery("AddCountReportQuery", buildAddCountReportQueryTest());
        queryManager.addQuery("AddFunctionItemReportQuery", buildAddFunctionItemReportQueryTest());
        queryManager.addQuery("AddGroupingReportQuery", buildAddGroupingReportQueryTest());
        queryManager.addQuery("AddItemReportQuery", buildAddItemReportQueryTest());
        queryManager.addQuery("AddMaximumReportQuery", buildAddMaximumReportQueryTest());
        queryManager.addQuery("AddMinimumReportQuery", buildAddMinimumReportQueryTest());
        queryManager.addQuery("AddStandardDeviationReportQuery", buildAddStandardDeviationReportQueryTest());
        queryManager.addQuery("AddSumReportQuery", buildAddSumReportQueryTest());
        queryManager.addQuery("AddVarianceReportQuery", buildAddVarianceReportQueryTest());
        queryManager.addQuery("AddJoinedObjectLevelReadQuery", buildAddJoinedReportQueryTest());
        queryManager.addQuery("AddOrderingReadAllQuery", buildAddOrderingReportQueryTest());
        queryManager.addQuery("AddBatchReadReadAllQuery", buildAddBatchReadReportQueryTest());

        // Query options
        buildMemoryQueryReturnConfirmedQuery(queryManager);
        buildMemoryQueryThrowExceptionQuery(queryManager);
        buildMemoryQueryReturnNotConfirmedQuery(queryManager);
        buildMemoryQueryTriggerIndirectionQuery(queryManager);
        buildCacheQueryResultsQuery(queryManager);
        buildRefreshIdentityMapResultsQuery(queryManager);
        buildMaxRowsQuery(queryManager);
        buildFirstResultQuery(queryManager);
        buildQueryTimeOutQuery(queryManager);
        buildUseDistinctQuery(queryManager);
        buildDoNotUseDistinctQuery(queryManager);
        buildShouldPrepareQuery(queryManager);
        buildReadOnlyQuery(queryManager);

        // Amend the project descriptor
        ClassDescriptor projectDescriptor = descriptors.get(org.eclipse.persistence.testing.models.employee.domain.Project.class);
        // Postgres throws an error if you try to set the timeout.
        if (!TestExecutor.getDefaultExecutor().getSession().getPlatform().isPostgreSQL()) {
            projectDescriptor.getQueryManager().setQueryTimeout(QUERY_MANAGER_TIMEOUT);
        }
        projectDescriptor.setCacheSynchronizationType(ClassDescriptor.SEND_NEW_OBJECTS_WITH_CHANGES); // Setting added for validation only - no tests currently run against this setting - Bug 3599101
        projectDescriptor.setCacheInvalidationPolicy(new NoExpiryCacheInvalidationPolicy()); // Setting added for validation only - no tests currently run against this setting - Bug 3599101

        // Query options
        buildJoinSubclassesQuery(projectDescriptor.getQueryManager());

        // Setting invalidation policies
        employeeDescriptor.setCacheInvalidationPolicy(new TimeToLiveCacheInvalidationPolicy(10000000));
        descriptors.get(Address.class).setCacheInvalidationPolicy(new TimeToLiveCacheInvalidationPolicy(10000000));
        descriptors.get(PhoneNumber.class).setCacheInvalidationPolicy(new TimeToLiveCacheInvalidationPolicy(10000000));

        GregorianCalendar calendar = new GregorianCalendar();
        calendar.add(Calendar.HOUR_OF_DAY, 2);
        descriptors.get(LargeProject.class).setCacheInvalidationPolicy(new DailyCacheInvalidationPolicy(calendar.get(Calendar.HOUR_OF_DAY),
                                                                                                                                               calendar.get(Calendar.MINUTE),
                                                                                                                                               calendar.get(Calendar.SECOND),
                                                                                                                                               calendar.get(Calendar.MILLISECOND)));
        descriptors.get(SmallProject.class).setCacheInvalidationPolicy(new DailyCacheInvalidationPolicy(calendar.get(Calendar.HOUR_OF_DAY),
                                                                                                                                               calendar.get(Calendar.MINUTE),
                                                                                                                                               calendar.get(Calendar.SECOND),
                                                                                                                                               calendar.get(Calendar.MILLISECOND)));
    }

    public static DatabaseQuery buildPersistenceTestGetEqualQuery() {
        ExpressionBuilder builder = new ExpressionBuilder(Employee.class);
        Expression expression = builder.get("address").get("city").equal("Toronto");
        ReadObjectQuery query = new ReadObjectQuery(Employee.class);
        query.setSelectionCriteria(expression);
        return query;
    }

    public static DatabaseQuery buildPersistenceTestGetEqualIgnoringCaseQuery() {
        ExpressionBuilder builder = new ExpressionBuilder(Employee.class);
        Expression expression = builder.get("address").get("city").equalsIgnoreCase("Toronto");
        ReadObjectQuery query = new ReadObjectQuery(Employee.class);
        query.setSelectionCriteria(expression);
        return query;
    }

    public static DatabaseQuery buildPersistenceTestAnyOfEqualQuery() {
        ExpressionBuilder builder = new ExpressionBuilder(Employee.class);
        Expression expression = builder.anyOf("phoneNumbers").get("areaCode").equal("613");
        ReadAllQuery query = new ReadAllQuery(Employee.class);
        query.setSelectionCriteria(expression);
        return query;
    }

    public static DatabaseQuery buildPersistenceTestGetAllowingNullEqualQuery() {
        ExpressionBuilder builder = new ExpressionBuilder(Employee.class);
        Expression expression = builder.getAllowingNull("address").get("city").equal("Toronto");
        ReadAllQuery query = new ReadAllQuery(Employee.class);
        query.setSelectionCriteria(expression);
        return query;
    }

    public static DatabaseQuery buildPersistenceTestAnyOfAllowingNoneEqualQuery() {
        ExpressionBuilder builder = new ExpressionBuilder(Employee.class);
        Expression expression = builder.anyOfAllowingNone("phoneNumbers").get("areaCode").equal("613");
        ReadAllQuery query = new ReadAllQuery(Employee.class);
        query.setSelectionCriteria(expression);
        return query;
    }

    public static DatabaseQuery buildPersistenceTestGetGreaterThanQuery() {
        ExpressionBuilder builder = new ExpressionBuilder(Employee.class);
        Expression expression = builder.get("salary").greaterThan(0);
        ReadObjectQuery query = new ReadObjectQuery(Employee.class);
        query.setSelectionCriteria(expression);
        return query;
    }

    public static DatabaseQuery buildPersistenceTestGetGreaterThanEqualQuery() {
        ExpressionBuilder builder = new ExpressionBuilder(Employee.class);
        Expression expression = builder.get("salary").greaterThanEqual(0);
        ReadObjectQuery query = new ReadObjectQuery(Employee.class);
        query.setSelectionCriteria(expression);
        return query;
    }

    public static DatabaseQuery buildPersistenceTestGetIsNullQuery() {
        ExpressionBuilder builder = new ExpressionBuilder(Employee.class);
        Expression expression = builder.get("address").isNull();
        ReadObjectQuery query = new ReadObjectQuery(Employee.class);
        query.setSelectionCriteria(expression);
        return query;
    }

    public static DatabaseQuery buildPersistenceTestGetLessThanQuery() {
        ExpressionBuilder builder = new ExpressionBuilder(Employee.class);
        Expression expression = builder.get("salary").lessThan(15);
        ReadObjectQuery query = new ReadObjectQuery(Employee.class);
        query.setSelectionCriteria(expression);
        return query;
    }

    public static DatabaseQuery buildPersistenceTestGetLessThanEqualQuery() {
        ExpressionBuilder builder = new ExpressionBuilder(Employee.class);
        Expression expression = builder.get("salary").lessThanEqual(15);
        ReadObjectQuery query = new ReadObjectQuery(Employee.class);
        query.setSelectionCriteria(expression);
        return query;
    }

    public static DatabaseQuery buildPersistenceTestGetLikeQuery() {
        ExpressionBuilder builder = new ExpressionBuilder(Employee.class);
        Expression expression = builder.get("address").get("city").like("Toronto");
        ReadObjectQuery query = new ReadObjectQuery(Employee.class);
        query.setSelectionCriteria(expression);
        return query;
    }

    public static DatabaseQuery buildPersistenceTestGetNotQuery() {
        ExpressionBuilder builder = new ExpressionBuilder(Employee.class);
        Expression expression = builder.get("address").get("city").equal("Toronto").not();
        ReadObjectQuery query = new ReadObjectQuery(Employee.class);
        query.setSelectionCriteria(expression);
        return query;
    }

    public static DatabaseQuery buildPersistenceTestGetNotEqualQuery() {
        ExpressionBuilder builder = new ExpressionBuilder(Employee.class);
        Expression expression = builder.get("address").get("city").notEqual("Toronto");
        ReadObjectQuery query = new ReadObjectQuery(Employee.class);
        query.setSelectionCriteria(expression);
        return query;
    }

    public static DatabaseQuery buildPersistenceTestGetNotLikeQuery() {
        ExpressionBuilder builder = new ExpressionBuilder(Employee.class);
        Expression expression = builder.get("address").get("city").notLike("Toronto");
        ReadObjectQuery query = new ReadObjectQuery(Employee.class);
        query.setSelectionCriteria(expression);
        return query;
    }

    public static DatabaseQuery buildPersistenceTestEmptyStringAndNull() {
        ExpressionBuilder builder = new ExpressionBuilder(Employee.class);
        Expression expression = builder.get("firstName").lessThan(null).or(builder.get("firstName").equal(""));
        ReadObjectQuery query = new ReadObjectQuery(Employee.class);
        query.setSelectionCriteria(expression);
        return query;
    }

    public static DatabaseQuery buildPersistenceTestGetNotNullQuery() {
        ExpressionBuilder builder = new ExpressionBuilder(Employee.class);
        Expression expression = builder.get("firstName").notNull();
        ReadObjectQuery query = new ReadObjectQuery(Employee.class);
        query.setSelectionCriteria(expression);
        return query;
    }

    public static DatabaseQuery buildPersistenceTestGreaterThanEqualDateQuery() {
        ExpressionBuilder builder = new ExpressionBuilder(Employee.class);
        Date date = Date.valueOf("2001-07-01");
        Expression expression = builder.get("period").get("startDate").greaterThanEqual(date);
        ReadObjectQuery query = new ReadObjectQuery(Employee.class);
        query.setSelectionCriteria(expression);
        return query;
    }

    public static DatabaseQuery buildAddAttributeReportQueryTest() {
        ReportQuery reportQuery = new ReportQuery(new ExpressionBuilder());
        reportQuery.setReferenceClass(Employee.class);
        reportQuery.addAttribute("gender");
        return reportQuery;
    }

    public static DatabaseQuery buildAddAverageReportQueryTest() {
        ReportQuery reportQuery = new ReportQuery(new ExpressionBuilder());
        reportQuery.setReferenceClass(Employee.class);
        reportQuery.addAverage("salary");
        return reportQuery;
    }

    public static DatabaseQuery buildAddCountReportQueryTest() {
        ReportQuery reportQuery = new ReportQuery(new ExpressionBuilder());
        reportQuery.setReferenceClass(Employee.class);
        reportQuery.addCount("id");
        return reportQuery;
    }

    public static DatabaseQuery buildAddFunctionItemReportQueryTest() {
        ReportQuery reportQuery = new ReportQuery(new ExpressionBuilder());
        reportQuery.setReferenceClass(Employee.class);
        reportQuery.addFunctionItem("salary", reportQuery.getExpressionBuilder().get("salary"), "AVG");
        return reportQuery;
    }

    public static DatabaseQuery buildAddGroupingReportQueryTest() {
        ReportQuery reportQuery = new ReportQuery(new ExpressionBuilder());
        reportQuery.setReferenceClass(Employee.class);
        reportQuery.addAttribute("gender");
        reportQuery.addGrouping("gender");
        return reportQuery;
    }

    public static DatabaseQuery buildAddItemReportQueryTest() {
        ReportQuery reportQuery = new ReportQuery(new ExpressionBuilder());
        reportQuery.setReferenceClass(Employee.class);
        reportQuery.addItem("name", reportQuery.getExpressionBuilder().get("firstName"));
        return reportQuery;
    }

    public static DatabaseQuery buildAddMaximumReportQueryTest() {
        ReportQuery reportQuery = new ReportQuery(new ExpressionBuilder());
        reportQuery.setReferenceClass(Employee.class);
        reportQuery.addMaximum("salary");
        return reportQuery;
    }

    public static DatabaseQuery buildAddMinimumReportQueryTest() {
        ReportQuery reportQuery = new ReportQuery(new ExpressionBuilder());
        reportQuery.setReferenceClass(Employee.class);
        reportQuery.addMinimum("managerSalary", reportQuery.getExpressionBuilder().get("manager").get("salary"));
        return reportQuery;
    }

    public static DatabaseQuery buildAddStandardDeviationReportQueryTest() {
        ReportQuery reportQuery = new ReportQuery(new ExpressionBuilder());
        reportQuery.setReferenceClass(Employee.class);
        reportQuery.addStandardDeviation("salary");
        return reportQuery;
    }

    public static DatabaseQuery buildAddSumReportQueryTest() {
        ReportQuery reportQuery = new ReportQuery(new ExpressionBuilder());
        reportQuery.setReferenceClass(Employee.class);
        reportQuery.addSum("salary");
        return reportQuery;
    }

    public static DatabaseQuery buildAddVarianceReportQueryTest() {
        ReportQuery reportQuery = new ReportQuery(new ExpressionBuilder());
        reportQuery.setReferenceClass(Employee.class);
        reportQuery.addVariance("id");
        return reportQuery;
    }

    public static DatabaseQuery buildAddJoinedReportQueryTest() {
        ReportQuery reportQuery = new ReportQuery(new ExpressionBuilder());
        reportQuery.setReferenceClass(Employee.class);
        reportQuery.addAttribute("gender");
        reportQuery.addJoinedAttribute("address");
        return reportQuery;
    }

    public static DatabaseQuery buildAddOrderingReportQueryTest() {
        ReportQuery reportQuery = new ReportQuery(new ExpressionBuilder());
        reportQuery.setReferenceClass(Employee.class);
        reportQuery.addAttribute("gender");
        reportQuery.addDescendingOrdering("firstName");
        return reportQuery;
    }

    public static DatabaseQuery buildAddBatchReadReportQueryTest() {
        ReportQuery reportQuery = new ReportQuery(new ExpressionBuilder());
        reportQuery.setReferenceClass(Employee.class);
        reportQuery.addAttribute("gender");
        reportQuery.addBatchReadAttribute("phoneNumbers");
        return reportQuery;
    }

    public void buildMemoryQueryReturnConfirmedQuery(DescriptorQueryManager queryManager) {
        ReadAllQuery namedQuery = new ReadAllQuery(Employee.class);
        namedQuery.setInMemoryQueryIndirectionPolicy(new InMemoryQueryIndirectionPolicy(2));
        queryManager.addQuery("memoryQueryReturnConfirmedQuery", namedQuery);
    }

    public void buildMemoryQueryThrowExceptionQuery(DescriptorQueryManager queryManager) {
        ReadObjectQuery namedQuery = new ReadObjectQuery(Employee.class);
        namedQuery.setInMemoryQueryIndirectionPolicy(new InMemoryQueryIndirectionPolicy(0));
        queryManager.addQuery("memoryQueryThrowExceptionQuery", namedQuery);
    }

    public void buildMemoryQueryReturnNotConfirmedQuery(DescriptorQueryManager queryManager) {
        ReadAllQuery namedQuery = new ReadAllQuery(Employee.class);
        namedQuery.setInMemoryQueryIndirectionPolicy(new InMemoryQueryIndirectionPolicy(3));
        queryManager.addQuery("memoryQueryReturnNotConfirmedQuery", namedQuery);
    }

    public void buildMemoryQueryTriggerIndirectionQuery(DescriptorQueryManager queryManager) {
        ReadAllQuery namedQuery = new ReadAllQuery(Employee.class);
        namedQuery.setInMemoryQueryIndirectionPolicy(new InMemoryQueryIndirectionPolicy(1));
        queryManager.addQuery("memoryQueryTriggerIndirectionQuery", namedQuery);
    }

    public void buildCacheQueryResultsQuery(DescriptorQueryManager queryManager) {
        ReadObjectQuery namedQuery = new ReadObjectQuery(Employee.class);
        namedQuery.setQueryResultsCachePolicy(new QueryResultsCachePolicy());
        queryManager.addQuery("cacheQueryResultsQuery", namedQuery);
    }

    public void buildRefreshIdentityMapResultsQuery(DescriptorQueryManager queryManager) {
        ReadObjectQuery namedQuery = new ReadObjectQuery(Employee.class);
        namedQuery.setShouldRefreshIdentityMapResult(true);
        queryManager.addQuery("refreshIdentityMapResultsQuery", namedQuery);
    }

    public void buildReadOnlyQuery(DescriptorQueryManager queryManager) {
        ReadObjectQuery namedQuery = new ReadObjectQuery(Employee.class);
        namedQuery.setIsReadOnly(true);
        queryManager.addQuery("readOnlyQuery", namedQuery);
    }

    public void buildJoinSubclassesQuery(DescriptorQueryManager queryManager) {
        ReadAllQuery namedQuery = new ReadAllQuery(org.eclipse.persistence.testing.models.employee.domain.Project.class);
        namedQuery.useCursoredStream();
        namedQuery.setShouldOuterJoinSubclasses(true);
        queryManager.addQuery("joinSubclassesQuery", namedQuery);
    }

    public void buildMaxRowsQuery(DescriptorQueryManager queryManager) {
        ReadAllQuery namedQuery = new ReadAllQuery(Employee.class);
        namedQuery.setMaxRows(4);
        queryManager.addQuery("maxRowsQuery", namedQuery);
    }

    public void buildFirstResultQuery(DescriptorQueryManager queryManager) {
        ReadAllQuery namedQuery = new ReadAllQuery(Employee.class);
        namedQuery.setFirstResult(2);
        queryManager.addQuery("firstResultQuery", namedQuery);
    }

    public void buildQueryTimeOutQuery(DescriptorQueryManager queryManager) {
        DataReadQuery namedQuery = new DataReadQuery();
        namedQuery.setSQLString("SELECT SUM(e.EMP_ID) from EMPLOYEE e , EMPLOYEE b, EMPLOYEE c, EMPLOYEE d, EMPLOYEE f, EMPLOYEE g, EMPLOYEE h");
        namedQuery.setQueryTimeout(1);
        queryManager.addQuery("queryTimeOutQuery", namedQuery);
    }

    public void buildUseDistinctQuery(DescriptorQueryManager queryManager) {
        ReadAllQuery namedQuery = new ReadAllQuery(Employee.class);
        namedQuery.setDistinctState((short)1);
        queryManager.addQuery("useDistinctQuery", namedQuery);
    }

    public void buildDoNotUseDistinctQuery(DescriptorQueryManager queryManager) {
        ReadAllQuery namedQuery = new ReadAllQuery(Employee.class);
        namedQuery.setDistinctState((short)2);
        queryManager.addQuery("doNotUseDistinctQuery", namedQuery);
    }

    public void buildShouldPrepareQuery(DescriptorQueryManager queryManager) {
        ReadObjectQuery namedQuery = new ReadObjectQuery(Employee.class);
        queryManager.addQuery("shouldPrepareQuery", namedQuery);
    }
}
