/*******************************************************************************
 * 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.aggregate;

import java.util.Collection;

import org.eclipse.persistence.expressions.Expression;
import org.eclipse.persistence.expressions.ExpressionBuilder;
import org.eclipse.persistence.queries.ReadAllQuery;
import org.eclipse.persistence.sessions.UnitOfWork;

import org.eclipse.persistence.testing.framework.TestCase;
import org.eclipse.persistence.testing.models.aggregate.GolfClub;
import org.eclipse.persistence.testing.models.aggregate.GolfClubShaft;

/**
 * Test querying on a manual QueryKey defined in an aggregate object
 * EL Bug 326977
 */
public class QueryKeyInAggregateTest extends TestCase {
    
    protected boolean conforming;
    protected Exception exception;
    protected Collection results;
    protected GolfClub originalClub;
    protected GolfClub originalClub2;
    
    public QueryKeyInAggregateTest(boolean shouldConform) {
        super();
        this.conforming = shouldConform;
        setName(getName() + " conforming: " + shouldConform);
        setDescription("Test querying on a manual QueryKey defined in an aggregate object");
    }
    
    public void setup() {
        UnitOfWork uow = getSession().acquireUnitOfWork();
        
        originalClub = (GolfClub)uow.registerObject(new GolfClub());
        GolfClubShaft shaft = new GolfClubShaft();
        shaft.setStiffnessRating("LX");
        originalClub.setShaft(shaft);
        
        originalClub2 = (GolfClub)uow.registerObject(new GolfClub());
        GolfClubShaft shaft2 = new GolfClubShaft();
        shaft2.setStiffnessRating("LX");
        originalClub2.setShaft(shaft2);
        uow.commit();

        getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
    }
    
    public void test() {
        UnitOfWork uow = getSession().acquireUnitOfWork();
        
        if (conforming) {
            // create an object to be included in the conforming query
            GolfClub uncommittedClub = (GolfClub)uow.registerObject(new GolfClub());
            GolfClubShaft shaft = new GolfClubShaft();
            shaft.setStiffnessRating("LX");
            uncommittedClub.setShaft(shaft);
        }
        
        ReadAllQuery query = new ReadAllQuery(GolfClub.class);
        ExpressionBuilder builder = query.getExpressionBuilder();
        // using manual 'flexibility' query key
        Expression expression = builder.get("shaft").get("flexibility").equal("LX");
        query.setSelectionCriteria(expression);
        
        if (conforming) {
            query.conformResultsInUnitOfWork();
        }
        
        try {
            results = (Collection<GolfClub>) uow.executeQuery(query);
        } catch (Exception e) {
            this.exception = e;
        } finally {
            uow.release();
        }

    }
    
    public void verify() {
        if (exception != null) {
            throwError("An exception occurred whilst executing the query: " + exception);
        } else if (results == null || results.isEmpty()) {
            throwError("The query results were null or empty: " + results);
        } 
        
        int expectedSize;
        if (conforming) {
            expectedSize = 3;
        } else {
            expectedSize = 2;
        }
        if (results.size() != expectedSize) {
            throwError("Incorrect results size: " + results.size() + " " + results);
        }
    }
    
    public void reset() {
        UnitOfWork uow = getSession().acquireUnitOfWork();
        uow.deleteObject(originalClub);
        uow.deleteObject(originalClub2);
        uow.commit();
        this.originalClub = null;
        this.originalClub2 = null;
        this.exception = null;
        this.results = null;
    }

}
