/*
 * TestAccessPathsOfSubqueries.java
 *
 * Created on October 17, 2006, 2:51 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.openjpa.persistence.query;

import java.util.Arrays;
import java.util.Collection;

import org.apache.openjpa.kernel.Broker;
import org.apache.openjpa.kernel.Query;
import org.apache.openjpa.kernel.jpql.JPQLParser;
import org.apache.openjpa.meta.ClassMetaData;
import org.apache.openjpa.persistence.query.common.apps.RuntimeTest1;
import org.apache.openjpa.persistence.query.common.apps.RuntimeTest4;
import org.apache.openjpa.persistence.query.common.apps.RuntimeTest5;

public class TestAccessPathsOfSubqueries extends BaseQueryTest {

    /**
     * Creates a new instance of TestAccessPathsOfSubqueries
     */

    public TestAccessPathsOfSubqueries(String name) {
        super(name);
    }

    public void testSimpleSubqueryAccessPath() {
        Broker broker = getBrokerFactory().newBroker();
        Query q = broker.newQuery(JPQLParser.LANG_JPQL,
            "SELECT o FROM RuntimeTest1 o WHERE EXISTS ("
            + "SELECT rt5.name FROM RuntimeTest5 rt5 "
            + "WHERE rt5.name IS NOT NULL)");
        ClassMetaData[] metas = q.getAccessPathMetaDatas();
        Collection c = Arrays.asList(metas);
        ClassMetaData rt1 = broker.getConfiguration().
            getMetaDataRepositoryInstance().getMetaData(RuntimeTest1.class,
            broker.getClassLoader(), true);
        ClassMetaData rt5 = broker.getConfiguration().
            getMetaDataRepositoryInstance().getMetaData(RuntimeTest5.class,
            broker.getClassLoader(), true);
        assertTrue(c.contains(rt1));
        assertTrue(c.contains(rt5));
        assertEquals(2, c.size());
    }

    public void testRelationTraversalSubqueryAccessPath() {
        Broker broker = getBrokerFactory().newBroker();
        Query q = broker.newQuery(JPQLParser.LANG_JPQL,
            "SELECT o FROM RuntimeTest1 o WHERE EXISTS ("
            + "SELECT rt5.runtimeTest4.name FROM RuntimeTest5 rt5 "
            + "WHERE rt5.name IS NOT NULL)");

        ClassMetaData[] metas = q.getAccessPathMetaDatas();
        Collection c = Arrays.asList(metas);
        ClassMetaData rt1 = broker.getConfiguration().
            getMetaDataRepositoryInstance().getMetaData(RuntimeTest1.class,
            broker.getClassLoader(), true);
        ClassMetaData rt4 = broker.getConfiguration().
            getMetaDataRepositoryInstance().getMetaData(RuntimeTest4.class,
            broker.getClassLoader(), true);
        ClassMetaData rt5 = broker.getConfiguration().
            getMetaDataRepositoryInstance().getMetaData(RuntimeTest5.class,
            broker.getClassLoader(), true);
        assertTrue(c.contains(rt1));
        assertTrue(c.contains(rt4));
        assertTrue(c.contains(rt5));
        assertEquals(3, c.size());
    }
}
