Author: thomasm
Date: Thu Nov 17 14:07:29 2016
New Revision: 1770195

URL: http://svn.apache.org/viewvc?rev=1770195&view=rev
Log:
OAK-4602 IndexOutOfBoundsException when sorting by jcr:score + field

Modified:
    
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
    
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java

Modified: 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java?rev=1770195&r1=1770194&r2=1770195&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
 Thu Nov 17 14:07:29 2016
@@ -698,17 +698,16 @@ public class LucenePropertyIndex impleme
             return null;
         }
 
+        sortOrder = removeNativeSort(sortOrder);
         List<SortField> fieldsList = 
newArrayListWithCapacity(sortOrder.size());
         PlanResult planResult = getPlanResult(plan);
         for (int i = 0; i < sortOrder.size(); i++) {
             OrderEntry oe = sortOrder.get(i);
-            if (!isNativeSort(oe)) {
-                PropertyDefinition pd = planResult.getOrderedProperty(i);
-                boolean reverse = oe.getOrder() != OrderEntry.Order.ASCENDING;
-                String propName = oe.getPropertyName();
-                propName = FieldNames.createDocValFieldName(propName);
-                fieldsList.add(new SortField(propName, toLuceneSortType(oe, 
pd), reverse));
-            }
+            PropertyDefinition pd = planResult.getOrderedProperty(i);
+            boolean reverse = oe.getOrder() != OrderEntry.Order.ASCENDING;
+            String propName = oe.getPropertyName();
+            propName = FieldNames.createDocValFieldName(propName);
+            fieldsList.add(new SortField(propName, toLuceneSortType(oe, pd), 
reverse));
         }
 
         if (fieldsList.isEmpty()) {
@@ -717,6 +716,25 @@ public class LucenePropertyIndex impleme
             return new Sort(fieldsList.toArray(new SortField[0]));
         }
     }
+    
+    /**
+     * Remove all "jcr:score" entries.
+     * 
+     * @param original the original list (is not modified)
+     * @return the list with the entries removed
+     */
+    private static List<OrderEntry> removeNativeSort(List<OrderEntry> 
original) {
+        if (original == null || original.isEmpty()) {
+            return original;
+        }
+        ArrayList<OrderEntry> result = new ArrayList<OrderEntry>();
+        for(OrderEntry oe : original) {
+            if (!isNativeSort(oe)) {
+                result.add(oe);
+            }
+        }
+        return result;
+    }
 
     /**
      * Identifies the default sort order used by the index (@jcr:score 
descending)
@@ -817,17 +835,15 @@ public class LucenePropertyIndex impleme
             //This case indicates that query just had order by and no
             //property restriction defined. In this case property
             //existence queries for each sort entry
-            List<OrderEntry> orders = plan.getSortOrder();
+            List<OrderEntry> orders = removeNativeSort(plan.getSortOrder());
             for (int i = 0; i < orders.size(); i++) {
                 OrderEntry oe = orders.get(i);
-                if (!isNativeSort(oe)) {
-                    PropertyDefinition pd = planResult.getOrderedProperty(i);
-                    PropertyRestriction orderRest = new PropertyRestriction();
-                    orderRest.propertyName = oe.getPropertyName();
-                    Query q = createQuery(orderRest, pd);
-                    if (q != null) {
-                        qs.add(q);
-                    }
+                PropertyDefinition pd = planResult.getOrderedProperty(i);
+                PropertyRestriction orderRest = new PropertyRestriction();
+                orderRest.propertyName = oe.getPropertyName();
+                Query q = createQuery(orderRest, pd);
+                if (q != null) {
+                    qs.add(q);
                 }
             }
         }

Modified: 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java?rev=1770195&r1=1770194&r2=1770195&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java
 Thu Nov 17 14:07:29 2016
@@ -1141,6 +1141,8 @@ public class LucenePropertyIndexTest ext
         propIdx.setProperty(LuceneIndexConstants.PROP_TYPE, 
PropertyType.TYPENAME_LONG);
         root.commit();
 
+        assertThat(explain("select [jcr:path] from [nt:base] order by 
[jcr:score], [foo]"), containsString("lucene:test1"));
+
         assertThat(explain("select [jcr:path] from [nt:base] order by [foo]"), 
containsString("lucene:test1"));
 
         List<Tuple> tuples = createDataForLongProp();


Reply via email to