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();