You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ch...@apache.org on 2014/10/31 07:46:26 UTC
svn commit: r1635698 - in /jackrabbit/oak/branches/1.0: ./
oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/
oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/
Author: chetanm
Date: Fri Oct 31 06:46:25 2014
New Revision: 1635698
URL: http://svn.apache.org/r1635698
Log:
OAK-2236 - Support queries with only order by specified
Added:
jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlannerTest.java
- copied unchanged from r1634896, jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlannerTest.java
Modified:
jackrabbit/oak/branches/1.0/ (props changed)
jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlanner.java
jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java
Propchange: jackrabbit/oak/branches/1.0/
------------------------------------------------------------------------------
Merged /jackrabbit/oak/trunk:r1634896
Modified: jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlanner.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlanner.java?rev=1635698&r1=1635697&r2=1635698&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlanner.java (original)
+++ jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlanner.java Fri Oct 31 06:46:25 2014
@@ -23,7 +23,6 @@ import java.util.Collections;
import java.util.List;
import java.util.Set;
-import javax.annotation.CheckForNull;
import com.google.common.collect.Sets;
import org.apache.jackrabbit.oak.commons.PathUtils;
@@ -58,6 +57,15 @@ public class IndexPlanner {
return builder != null ? builder.build() : null;
}
+ @Override
+ public String toString() {
+ return "IndexPlanner{" +
+ "indexPath='" + indexPath + '\'' +
+ ", filter=" + filter +
+ ", sortOrder=" + sortOrder +
+ '}';
+ }
+
private IndexPlan.Builder getPlanBuilder() {
FullTextExpression ft = filter.getFullTextConstraint();
@@ -84,11 +92,13 @@ public class IndexPlanner {
}
}
- if (!indexedProps.isEmpty()) {
+ List<OrderEntry> sortOrder = createSortOrder();
+ if (!indexedProps.isEmpty() || !sortOrder.isEmpty()) {
//TODO Need a way to have better cost estimate to indicate that
//this index can evaluate more propertyRestrictions natively (if more props are indexed)
//For now we reduce cost per entry
int costPerEntryFactor = indexedProps.size();
+ costPerEntryFactor += sortOrder.size();
// Restrict matching index when declaringNodeTypes declared
if (defn.hasDeclaredNodeTypes()) {
@@ -102,9 +112,10 @@ public class IndexPlanner {
//this index can evaluate more propertyRestrictions natively (if more props are indexed)
//For now we reduce cost per entry
IndexPlan.Builder plan = defaultPlan();
- if (plan != null) {
- return plan.setCostPerEntry(1.0 / costPerEntryFactor);
+ if (!sortOrder.isEmpty()) {
+ plan.setSortOrder(sortOrder);
}
+ return plan.setCostPerEntry(1.0 / costPerEntryFactor);
}
//TODO Support for property existence queries
@@ -128,7 +139,6 @@ public class IndexPlanner {
.setIncludesNodeData(false) // we should not include node data
.setFilter(filter)
.setPathPrefix(getPathPrefix())
- .setSortOrder(createSortOrder())
.setDelayed(true) //Lucene is always async
.setAttribute(LuceneIndex.ATTR_INDEX_PATH, indexPath)
.setEstimatedEntryCount(Math.min(defn.getEntryCount(), getReader().numDocs()));
@@ -143,7 +153,6 @@ public class IndexPlanner {
return indexNode.getSearcher().getIndexReader();
}
- @CheckForNull
private List<OrderEntry> createSortOrder() {
//TODO Refine later once we make mixed indexes having both
//full text and property index
@@ -152,7 +161,7 @@ public class IndexPlanner {
}
if (sortOrder == null) {
- return null;
+ return Collections.emptyList();
}
List<OrderEntry> orderEntries = newArrayListWithCapacity(sortOrder.size());
Modified: jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java?rev=1635698&r1=1635697&r2=1635698&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java (original)
+++ jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java Fri Oct 31 06:46:25 2014
@@ -535,6 +535,23 @@ public class LucenePropertyIndex impleme
addNonFullTextConstraints(qs, filter, reader, analyzer,
defn);
}
+
+ if (qs.size() == 0
+ && plan.getSortOrder() != null) {
+ //This case indicates that query just had order by and no
+ //property restriction defined. In this case property
+ //existence queries for each sort entry
+
+ for (OrderEntry oe : plan.getSortOrder()) {
+ PropertyRestriction orderRest = new PropertyRestriction();
+ orderRest.propertyName = oe.getPropertyName();
+ Query q = createQuery(orderRest, defn);
+ if (q != null) {
+ qs.add(q);
+ }
+ }
+ }
+
if (qs.size() == 0) {
if (!defn.isFullTextEnabled()) {
throw new IllegalStateException("No query created for filter " + filter);
Modified: jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java?rev=1635698&r1=1635697&r2=1635698&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java (original)
+++ jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java Fri Oct 31 06:46:25 2014
@@ -412,7 +412,28 @@ public class LucenePropertyIndexTest ext
assertSortedLong();
}
+ @Test
+ public void sortQueriesWithLong_NotIndexed() throws Exception {
+ Tree idx = createIndex("test1", Collections.<String>emptySet());
+ idx.setProperty(createProperty(ORDERED_PROP_NAMES, of("foo"), STRINGS));
+ Tree propIdx = idx.addChild(PROP_NODE).addChild("foo");
+ propIdx.setProperty(LuceneIndexConstants.PROP_TYPE, PropertyType.TYPENAME_LONG);
+ root.commit();
+
+ assertThat(explain("select [jcr:path] from [nt:base] order by [foo]"), containsString("lucene:test1"));
+
+ List<Tuple> tuples = createDataForLongProp();
+ assertOrderedQuery("select [jcr:path] from [nt:base] order by [foo]", getSortedPaths(tuples, OrderDirection.ASC));
+ assertOrderedQuery("select [jcr:path] from [nt:base] order by [foo] DESC", getSortedPaths(tuples, OrderDirection.DESC));
+ }
+
void assertSortedLong() throws CommitFailedException {
+ List<Tuple> tuples = createDataForLongProp();
+ assertOrderedQuery("select [jcr:path] from [nt:base] where [bar] = 'baz' order by [foo]", getSortedPaths(tuples, OrderDirection.ASC));
+ assertOrderedQuery("select [jcr:path] from [nt:base] where [bar] = 'baz' order by [foo] DESC", getSortedPaths(tuples, OrderDirection.DESC));
+ }
+
+ private List<Tuple> createDataForLongProp() throws CommitFailedException {
Tree test = root.getTree("/").addChild("test");
List<Long> values = createLongs(NUMBER_OF_NODES);
List<Tuple> tuples = Lists.newArrayListWithCapacity(values.size());
@@ -423,9 +444,7 @@ public class LucenePropertyIndexTest ext
tuples.add(new Tuple(values.get(i), child.getPath()));
}
root.commit();
-
- assertOrderedQuery("select [jcr:path] from [nt:base] where [bar] = 'baz' order by [foo]", getSortedPaths(tuples, OrderDirection.ASC));
- assertOrderedQuery("select [jcr:path] from [nt:base] where [bar] = 'baz' order by [foo] DESC", getSortedPaths(tuples, OrderDirection.DESC));
+ return tuples;
}
@Test