/*******************************************************************************
 * Copyright (c) 1998, 2013 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 v1.0 and Eclipse Distribution License v. 1.0 
 * which accompanies this distribution. 
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at 
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *     Oracle - initial API and implementation from Oracle TopLink
 ******************************************************************************/  
package org.eclipse.persistence.testing.tests.performance.reading;

import java.util.*;
import org.eclipse.persistence.queries.*;
import org.eclipse.persistence.expressions.*;
import org.eclipse.persistence.testing.models.performance.toplink.*;
import org.eclipse.persistence.testing.framework.*;

/**
 * This test compares the performance of cache hits and the various in-memory querying options.
 */
public class ReadObjectCachevsDatabaseTest extends PerformanceComparisonTestCase {
    protected List allObjects;
    protected Employee employee;
    protected ReadObjectQuery idQuery;
    protected ReadObjectQuery cacheOnlyNameQuery;
    protected ReadObjectQuery cacheDatabaseNameQuery;

    public ReadObjectCachevsDatabaseTest() {
        setDescription("This test compares the performance of cache hits and the various in-memory querying options.");
        addCachedReadObjectTest();
        addInMemoryReadObjectTest();
        addCacheThenDatabaseMissReadObjectTest();
    }

    /**
     * Find any employee.
     */
    public void setup() {
        Expression expression = new ExpressionBuilder().get("firstName").equal("Bob");
        employee = (Employee)getSession().readObject(Employee.class, expression);
        // Fully load the cache.
        allObjects = getSession().readAllObjects(Employee.class);

        idQuery = new ReadObjectQuery(Employee.class);
        ExpressionBuilder builder = new ExpressionBuilder();
        idQuery.setSelectionCriteria(builder.get("id").equal(employee.getId()));

        cacheOnlyNameQuery = new ReadObjectQuery(Employee.class);
        builder = new ExpressionBuilder();
        cacheOnlyNameQuery.setSelectionCriteria(builder.get("firstName").equal(employee.getFirstName()).and(builder.get("lastName").equal(employee.getLastName())));
        cacheOnlyNameQuery.checkCacheOnly();

        cacheDatabaseNameQuery = new ReadObjectQuery(Employee.class);
        builder = new ExpressionBuilder();
        cacheDatabaseNameQuery.setSelectionCriteria(builder.get("firstName").equal(employee.getFirstName()).and(builder.get("lastName").equal(employee.getLastName())));
        cacheDatabaseNameQuery.checkCacheThenDatabase();
    }

    /**
     * Read employee and clear the cache, test database read.
     */
    public void test() throws Exception {
        getSession().getIdentityMapAccessor().removeFromIdentityMap(employee);
        getSession().executeQuery(idQuery);
    }

    /**
     * Read by primary key and get a cache hit.
     */
    public void addCachedReadObjectTest() {
        PerformanceComparisonTestCase test = new PerformanceComparisonTestCase() {
            public void test() {
                getSession().executeQuery(idQuery);
            }
        };
        test.setName("CachedReadObjectTest");
        test.setAllowableDecrease(10000);
        addTest(test);
    }

    /**
     * Read by first name in memory.
     */
    public void addInMemoryReadObjectTest() {
        PerformanceComparisonTestCase test = new PerformanceComparisonTestCase() {
            public void test() {
                getSession().executeQuery(cacheOnlyNameQuery);
            }
        };
        test.setName("InMemoryReadObjectTest");
        test.setAllowableDecrease(1000);
        addTest(test);
    }

    /**
     * Read by first name in memory then hit the database.
     */
    public void addCacheThenDatabaseMissReadObjectTest() {
        PerformanceComparisonTestCase test = new PerformanceComparisonTestCase() {
            public void test() {
                getSession().getIdentityMapAccessor().removeFromIdentityMap(employee);
                getSession().executeQuery(cacheDatabaseNameQuery);
            }
        };
        test.setName("CacheThenDatabaseMissReadObjectTest");
        test.setAllowableDecrease(-40);
        addTest(test);
    }
}
