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/28 12:48:53 UTC
svn commit: r1634852 - in /jackrabbit/oak/trunk/oak-lucene/src:
main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java
Author: chetanm
Date: Tue Oct 28 11:48:52 2014
New Revision: 1634852
URL: http://svn.apache.org/r1634852
Log:
OAK-2234 - Support property existence query
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=1634852&r1=1634851&r2=1634852&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 Tue Oct 28 11:48:52 2014
@@ -596,19 +596,6 @@ public class LucenePropertyIndex impleme
}
for (PropertyRestriction pr : filter.getPropertyRestrictions()) {
-
- if (pr.first == null && pr.last == null && pr.list == null) {
- // ignore property existence checks, Lucene can't to 'property
- // is not null' queries (OAK-1208)
-
- //TODO May be this can be relaxed if we have an index which
- //maintains the list of propertyName present in a node say
- //against :propNames. Only configured set of properties would
- //be
-
- continue;
- }
-
// check excluded properties and types
if (isExcludedProperty(pr, indexDefinition)) {
continue;
@@ -729,6 +716,9 @@ public class LucenePropertyIndex impleme
in.add(NumericRangeQuery.newLongRange(pr.propertyName, dateVal, dateVal, true, true), BooleanClause.Occur.SHOULD);
}
return in;
+ } else if (pr.first == null && pr.last == null ) {
+ // not null. For date lower bound of zero can be used
+ return NumericRangeQuery.newLongRange(pr.propertyName, 0L, Long.MAX_VALUE, true, true);
}
break;
@@ -756,6 +746,9 @@ public class LucenePropertyIndex impleme
in.add(NumericRangeQuery.newDoubleRange(pr.propertyName, doubleVal, doubleVal, true, true), BooleanClause.Occur.SHOULD);
}
return in;
+ } else if (pr.first == null && pr.last == null ) {
+ // not null.
+ return NumericRangeQuery.newDoubleRange(pr.propertyName, Double.MIN_VALUE, Double.MAX_VALUE, true, true);
}
break;
}
@@ -782,6 +775,9 @@ public class LucenePropertyIndex impleme
in.add(NumericRangeQuery.newLongRange(pr.propertyName, longVal, longVal, true, true), BooleanClause.Occur.SHOULD);
}
return in;
+ } else if (pr.first == null && pr.last == null ) {
+ // not null.
+ return NumericRangeQuery.newLongRange(pr.propertyName, Long.MIN_VALUE, Long.MAX_VALUE, true, true);
}
break;
}
@@ -811,6 +807,8 @@ public class LucenePropertyIndex impleme
in.add(new TermQuery(new Term(pr.propertyName, strVal)), BooleanClause.Occur.SHOULD);
}
return in;
+ } else if (pr.first == null && pr.last == null ) {
+ return new TermRangeQuery(pr.propertyName, null, null, true, true);
}
}
}
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=1634852&r1=1634851&r2=1634852&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 Tue Oct 28 11:48:52 2014
@@ -213,6 +213,21 @@ public class LucenePropertyIndexTest ext
}
@Test
+ public void propertyExistenceQuery() throws Exception {
+ Tree idx = createIndex("test1", of("propa", "propb"));
+ idx.addChild(PROP_NODE).addChild("propa");
+ root.commit();
+
+ Tree test = root.getTree("/").addChild("test");
+ test.addChild("a").setProperty("propa", "a");
+ test.addChild("b").setProperty("propa", "c");
+ test.addChild("c").setProperty("propb", "e");
+ root.commit();
+
+ assertQuery("select [jcr:path] from [nt:base] where propa is not null", asList("/test/a", "/test/b"));
+ }
+
+ @Test
public void rangeQueriesWithLong() throws Exception {
Tree idx = createIndex("test1", of("propa", "propb"));
Tree propIdx = idx.addChild(PROP_NODE).addChild("propa");
@@ -237,6 +252,7 @@ public class LucenePropertyIndexTest ext
assertQuery("select [jcr:path] from [nt:base] where [propa] = 20 or [propa] = 10 ", asList("/test/b", "/test/a"));
assertQuery("select [jcr:path] from [nt:base] where [propa] > 10 and [propa] < 30", asList("/test/b"));
assertQuery("select [jcr:path] from [nt:base] where [propa] in (10,20)", asList("/test/b", "/test/a"));
+ assertQuery("select [jcr:path] from [nt:base] where propa is not null", asList("/test/a", "/test/b", "/test/c"));
}
@Test
@@ -259,6 +275,7 @@ public class LucenePropertyIndexTest ext
assertQuery("select [jcr:path] from [nt:base] where [propa] <= 20.5", asList("/test/b", "/test/a"));
assertQuery("select [jcr:path] from [nt:base] where [propa] < 20.4", asList("/test/a"));
assertQuery("select [jcr:path] from [nt:base] where [propa] > 10.5 and [propa] < 30", asList("/test/b"));
+ assertQuery("select [jcr:path] from [nt:base] where propa is not null", asList("/test/a", "/test/b", "/test/c"));
}
@Test
@@ -284,6 +301,7 @@ public class LucenePropertyIndexTest ext
assertQuery("select [jcr:path] from [nt:base] where [propb] <= 'f'", asList("/test/c", "/test/d"));
assertQuery("select [jcr:path] from [nt:base] where [propb] > 'e'", asList("/test/d", "/test/e"));
assertQuery("select [jcr:path] from [nt:base] where [propb] < 'g'", asList("/test/c", "/test/d"));
+ assertQuery("select [jcr:path] from [nt:base] where propa is not null", asList("/test/a", "/test/b", "/test/c"));
}
@@ -306,6 +324,7 @@ public class LucenePropertyIndexTest ext
assertQuery("select [jcr:path] from [nt:base] where [propa] <=" + dt("15/03/2014"), asList("/test/b", "/test/a"));
assertQuery("select [jcr:path] from [nt:base] where [propa] < " + dt("14/03/2014"), asList("/test/a"));
assertQuery("select [jcr:path] from [nt:base] where [propa] > "+ dt("15/02/2014") + " and [propa] < " + dt("13/04/2014"), asList("/test/b"));
+ assertQuery("select [jcr:path] from [nt:base] where propa is not null", asList("/test/a", "/test/b", "/test/c"));
}
@Ignore("OAK-2190")