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 th...@apache.org on 2014/06/23 18:20:43 UTC
svn commit: r1604849 - in /jackrabbit/oak/trunk:
oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategy.java
oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryPlanTest.java
Author: thomasm
Date: Mon Jun 23 16:20:43 2014
New Revision: 1604849
URL: http://svn.apache.org/r1604849
Log:
OAK-1903 PropertyIndex applies 10x penalty to is not null queries even when the node count is known
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategy.java
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryPlanTest.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategy.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategy.java?rev=1604849&r1=1604848&r2=1604849&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategy.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategy.java Mon Jun 23 16:20:43 2014
@@ -168,8 +168,10 @@ public class ContentMirrorStoreStrategy
CountingNodeVisitor v = new CountingNodeVisitor(max);
v.visit(index);
count = v.getEstimatedCount();
- // "is not null" queries typically read more data
- count *= 10;
+ if (count >= max) {
+ // "is not null" queries typically read more data
+ count *= 10;
+ }
} else {
int size = values.size();
if (size == 0) {
Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryPlanTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryPlanTest.java?rev=1604849&r1=1604848&r2=1604849&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryPlanTest.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryPlanTest.java Mon Jun 23 16:20:43 2014
@@ -44,6 +44,43 @@ public class QueryPlanTest extends Abstr
public QueryPlanTest(NodeStoreFixture fixture) {
super(fixture);
}
+
+ @Test
+ // OAK-1903
+ public void propertyEqualsVersusPropertyNotNull() throws Exception {
+ Session session = getAdminSession();
+ QueryManager qm = session.getWorkspace().getQueryManager();
+ Node testRootNode = session.getRootNode().addNode("testroot");
+ createPropertyIndex(session, "notNull");
+ createPropertyIndex(session, "equals");
+ for (int i = 0; i < 100; i++) {
+ Node n = testRootNode.addNode("n" + i, "oak:Unstructured");
+ if (i % 2 == 0) {
+ n.setProperty("notNull", i);
+ }
+ n.setProperty("equals", 1);
+ }
+ session.save();
+
+ String xpath = "/jcr:root//*[@notNull and @equals=1]";
+
+ Query q;
+ QueryResult result;
+ RowIterator it;
+
+ q = qm.createQuery("explain " + xpath, "xpath");
+ result = q.execute();
+ it = result.getRows();
+ assertTrue(it.hasNext());
+ String plan = it.nextRow().getValue("plan").getString();
+ // System.out.println("plan: " + plan);
+ // should not use the index on "jcr:uuid"
+ assertEquals("[nt:base] as [a] /* property notNull " +
+ "where (([a].[notNull] is not null) " +
+ "and ([a].[equals] = cast('1' as long))) " +
+ "and (isdescendantnode([a], [/])) */",
+ plan);
+ }
@Test
// OAK-1898