/*
 * 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.jdo.tck.query.api;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;

import javax.jdo.Query;

import org.apache.jdo.tck.JDO_Test;
import org.apache.jdo.tck.pc.company.CompanyModelReader;
import org.apache.jdo.tck.pc.company.FullTimeEmployee;
import org.apache.jdo.tck.pc.company.Person;
import org.apache.jdo.tck.query.QueryTest;
import org.apache.jdo.tck.query.result.classes.FullName;
import org.apache.jdo.tck.util.BatchTestRunner;

/**
 *<B>Title:</B> Change Query.
 *<BR>
 *<B>Keywords:</B> query
 *<BR>
 *<B>Assertion ID:</B> A14.5-15.
 *<BR>
 *<B>Assertion Description: </B>
 * The Query instance returned from this method can be modified 
 * by the application, just like any other Query instance.
 */
public class ChangeQuery extends QueryTest {

    /** */
    private static final String ASSERTION_FAILED = 
        "Assertion A14.5-15 (ChangeQuery) failed: ";
    
    /**
     * The <code>main</code> is called when the class
     * is directly executed from the command line.
     * @param args The arguments passed to the program.
     */
    public static void main(String[] args) {
        BatchTestRunner.run(ChangeQuery.class);
    }
    
    /** */
    public void testPositive() {
        Query query = getPM().newNamedQuery(Person.class, "changeQuery");
        
        // change query
        query.setResult("DISTINCT firstname, lastname");
        query.setResultClass(FullName.class);
        query.setClass(FullTimeEmployee.class);
        String filter = "salary > 1000 & projects.contains(p) & " +
                        "p.budget > limit";
        query.setFilter(filter);
        String imports = "import org.apache.jdo.tck.pc.company.Project; " +
                         "import java.math.BigDecimal;";
        query.declareImports(imports);
        query.declareVariables("Project p");
        query.declareParameters("BigDecimal limit");
        query.setOrdering("firstname ASCENDING, lastname ASCENDING");
        query.setRange(0, 5);
        String singleStringQuery = 
            "SELECT DISTINCT firstname, lastname " +
            "INTO FullName FROM FullTimeEmployee " +
            "WHERE salary > 1000 & projects.contains(p) & " +
            "p.budget > limit " +
            "VARIABLES Project p PARAMETERS BigDecimal limit " +
            "ORDER BY firstname ASCENDING, lastname ASCENDING RANGE 0, 5";

        // query parameters
        Object[] parameters = {new BigDecimal("2000")};        
        // expected result
        List expectedResult = Arrays.asList(new Object[] {
            new FullName("emp1First", "emp1Last"), 
            new FullName("emp2First", "emp2Last"),
            new FullName("emp5First", "emp5Last")});

        // execute query
        executeJDOQuery(ASSERTION_FAILED, query, singleStringQuery, true, 
                parameters, expectedResult, true);
    }

    /**
     * @see JDO_Test#localSetUp()
     */
    protected void localSetUp() {
        addTearDownClass(CompanyModelReader.getTearDownClasses());
        loadAndPersistCompanyModel(getPM());
    }
}
