/*
 * Copyright 2004-2005 The Apache Software Foundation or its licensors,
 *                     as applicable.
 *
 * Licensed 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.jackrabbit.test.api.query;

import javax.jcr.Node;
import javax.jcr.query.Query;
import javax.jcr.query.QueryResult;

/**
 * Test cases for order by queries on long properties.
 *
 * @tck.config testroot path to node that accepts child nodes of type
 * <code>nodetype</code>
 * @tck.config nodetype name of a node type
 * @tck.config nodename1 name of a child node of type <code>nodetype</code>
 * @tck.config nodename2 name of a child node of type <code>nodetype</code>
 * @tck.config nodename3 name of a child node of type <code>nodetype</code>
 * @tck.config nodename4 name of a child node of type <code>nodetype</code>
 * @tck.config propertyname1 name of a single value String property.
 * @tck.config propertyname2 name of a single value long property.
 * @test
 * @sources OrderByMultiTypeTest.java
 * @executeClass org.apache.jackrabbit.test.api.query.OrderByMultiTypeTest
 * @keywords level2
 */
public class OrderByMultiTypeTest extends AbstractOrderByTest {

    /**
     * Tests order by queries with a String property and a long property.
     */
    public void testMultipleOrder() throws Exception {
        Node n1 = testRootNode.addNode(nodeName1);
        Node n2 = testRootNode.addNode(nodeName2);
        Node n3 = testRootNode.addNode(nodeName3);

        n1.setProperty(propertyName1, "aaa");
        n1.setProperty(propertyName2, 3);
        n2.setProperty(propertyName1, "bbb");
        n2.setProperty(propertyName2, 2);
        n3.setProperty(propertyName1, "ccc");
        n3.setProperty(propertyName2, 2);

        testRootNode.save();

        // both ascending
        String sql = "SELECT " + propertyName2 + " FROM " + testNodeType + " WHERE " +
                jcrPath + " LIKE '" + testRoot + "/%' ORDER BY " + propertyName2 + ", " + propertyName1;
        Query q;
        QueryResult result;
        if (checkSQL) {
            q = superuser.getWorkspace().getQueryManager().createQuery(sql, Query.SQL);
            result = q.execute();
            checkResultOrder(result, new String[]{nodeName2, nodeName3, nodeName1});
        }

        String xpath = "/" + testRoot + "/*[@" + jcrPrimaryType + "='" + testNodeType +
                "'] order by @" + propertyName2 + ", @" + propertyName1;
        q = superuser.getWorkspace().getQueryManager().createQuery(xpath, Query.XPATH);
        result = q.execute();
        checkResultOrder(result, new String[]{nodeName2, nodeName3, nodeName1});

        // both descending
        sql = "SELECT " + propertyName2 + " FROM " + testNodeType + " WHERE " +
                jcrPath + " LIKE '" + testRoot + "/%' ORDER BY " +
                propertyName2 + " DESC, " +
                propertyName1 + " DESC";
        q = superuser.getWorkspace().getQueryManager().createQuery(sql, Query.SQL);
        result = q.execute();
        checkResultOrder(result, new String[]{nodeName1, nodeName3, nodeName2});

        xpath = "/" + jcrRoot + testRoot + "/*[@" + jcrPrimaryType + "='" +
                testNodeType + "'] order by @" +
                propertyName2 + " descending, @" +
                propertyName1 + " descending";
        q = superuser.getWorkspace().getQueryManager().createQuery(xpath, Query.XPATH);
        result = q.execute();
        checkResultOrder(result, new String[]{nodeName1, nodeName3, nodeName2});

        // mixed ascending and descending
        sql = "SELECT " + propertyName2 + " FROM " + testNodeType + " WHERE " +
                jcrPath + " LIKE '" + testRoot + "/%' ORDER BY " +
                propertyName2 + " DESC, " + propertyName1;
        q = superuser.getWorkspace().getQueryManager().createQuery(sql, Query.SQL);
        result = q.execute();
        checkResultOrder(result, new String[]{nodeName1, nodeName2, nodeName3});

        xpath = "/" + jcrRoot + testRoot + "/*[@" + jcrPrimaryType + "='" +
                testNodeType + "'] order by @" + propertyName2 +
                " descending, @" + propertyName1;
        q = superuser.getWorkspace().getQueryManager().createQuery(xpath, Query.XPATH);
        result = q.execute();
        checkResultOrder(result, new String[]{nodeName1, nodeName2, nodeName3});
    }
}

@@ -3377,16 +3377,44 @@
  DESC%22;%0A
+        if (checkSQL) %7B%0A    
         
@@ -3489,32 +3489,36 @@
 y.SQL);%0A        
+    
 result = q.execu
@@ -3523,32 +3523,36 @@
 cute();%0A        
+   
+ 
 checkResultOrder
@@ -3599,32 +3599,42 @@
 e3, nodeName2%7D);
+%0A        %7D
 %0A%0A        xpath 
@@ -4282,32 +4282,60 @@
  propertyName1;%0A
+        if (checkSQL) %7B%0A    
         q = supe
@@ -4402,32 +4402,36 @@
 y.SQL);%0A        
+    
 result = q.execu
@@ -4436,32 +4436,36 @@
 cute();%0A        
+   
+ 
 checkResultOrder
@@ -4520,16 +4520,26 @@
 Name3%7D);
+%0A        %7D
 %0A%0A      

Fix test case. SQL is optional feature and must not be tested if not supported.