Author: thomasm
Date: Mon Mar 10 08:31:32 2014
New Revision: 1575869
URL: http://svn.apache.org/r1575869
Log:
OAK-1520 Native pass-through queries combined with other conditions might not
work
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/nodetype/NodeTypeIndex.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndex.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/reference/ReferenceIndex.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/FilterImpl.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingIndex.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Filter.java
jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrIndexQueryTest.java
jackrabbit/oak/trunk/oak-solr-core/src/test/resources/org/apache/jackrabbit/oak/query/native_solr.txt
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/nodetype/NodeTypeIndex.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/nodetype/NodeTypeIndex.java?rev=1575869&r1=1575868&r2=1575869&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/nodetype/NodeTypeIndex.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/nodetype/NodeTypeIndex.java
Mon Mar 10 08:31:32 2014
@@ -42,6 +42,10 @@ class NodeTypeIndex implements QueryInde
// not an appropriate index for full-text search
return Double.POSITIVE_INFINITY;
}
+ if (filter.containsNativeConstraint()) {
+ // not an appropriate index for native search
+ return Double.POSITIVE_INFINITY;
+ }
if (!hasNodeTypeRestriction(filter)) {
// this is not an appropriate index if the filter
// doesn't have a node type restriction
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndex.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndex.java?rev=1575869&r1=1575868&r2=1575869&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndex.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndex.java
Mon Mar 10 08:31:32 2014
@@ -136,6 +136,10 @@ class PropertyIndex implements QueryInde
// not an appropriate index for full-text search
return Double.POSITIVE_INFINITY;
}
+ if (filter.containsNativeConstraint()) {
+ // not an appropriate index for native search
+ return Double.POSITIVE_INFINITY;
+ }
PropertyIndexLookup lookup = getLookup(root);
for (PropertyRestriction pr : filter.getPropertyRestrictions()) {
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/reference/ReferenceIndex.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/reference/ReferenceIndex.java?rev=1575869&r1=1575868&r2=1575869&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/reference/ReferenceIndex.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/reference/ReferenceIndex.java
Mon Mar 10 08:31:32 2014
@@ -65,6 +65,10 @@ class ReferenceIndex implements QueryInd
// not an appropriate index for full-text search
return POSITIVE_INFINITY;
}
+ if (filter.containsNativeConstraint()) {
+ // not an appropriate index for native search
+ return Double.POSITIVE_INFINITY;
+ }
for (PropertyRestriction pr : filter.getPropertyRestrictions()) {
if (pr.propertyType == REFERENCE
|| pr.propertyType == WEAKREFERENCE) {
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/FilterImpl.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/FilterImpl.java?rev=1575869&r1=1575868&r2=1575869&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/FilterImpl.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/FilterImpl.java
Mon Mar 10 08:31:32 2014
@@ -33,6 +33,7 @@ import javax.jcr.PropertyType;
import org.apache.jackrabbit.oak.api.PropertyValue;
import org.apache.jackrabbit.oak.commons.PathUtils;
import org.apache.jackrabbit.oak.query.ast.JoinConditionImpl;
+import org.apache.jackrabbit.oak.query.ast.NativeFunctionImpl;
import org.apache.jackrabbit.oak.query.ast.Operator;
import org.apache.jackrabbit.oak.query.ast.SelectorImpl;
import org.apache.jackrabbit.oak.query.fulltext.FullTextExpression;
@@ -545,7 +546,7 @@ public class FilterImpl implements Filte
// TODO support fulltext conditions on certain properties
return fulltextConditions;
}
-
+
public void restrictFulltextCondition(String condition) {
fulltextConditions.add(condition);
}
@@ -558,6 +559,16 @@ public class FilterImpl implements Filte
public FullTextExpression getFullTextConstraint() {
return fullTextConstraint;
}
+
+ @Override
+ public boolean containsNativeConstraint() {
+ for (String p : propertyRestrictions.keySet()) {
+ if (p.startsWith(NativeFunctionImpl.NATIVE_PREFIX)) {
+ return true;
+ }
+ }
+ return false;
+ }
@Override
@Nullable
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingIndex.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingIndex.java?rev=1575869&r1=1575868&r2=1575869&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingIndex.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingIndex.java
Mon Mar 10 08:31:32 2014
@@ -42,6 +42,10 @@ public class TraversingIndex implements
// not an appropriate index for full-text search
return Double.POSITIVE_INFINITY;
}
+ if (filter.containsNativeConstraint()) {
+ // not an appropriate index for native search
+ return Double.POSITIVE_INFINITY;
+ }
if (filter.isAlwaysFalse()) {
return 0;
}
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Filter.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Filter.java?rev=1575869&r1=1575868&r2=1575869&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Filter.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Filter.java
Mon Mar 10 08:31:32 2014
@@ -63,6 +63,13 @@ public interface Filter {
* @return the condition (null if none)
*/
FullTextExpression getFullTextConstraint();
+
+ /**
+ * Whether the filter contains a native condition.
+ *
+ * @return true if it does
+ */
+ boolean containsNativeConstraint();
/**
* Get the property restriction for the given property, if any.
Modified:
jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrIndexQueryTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrIndexQueryTest.java?rev=1575869&r1=1575868&r2=1575869&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrIndexQueryTest.java
(original)
+++
jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrIndexQueryTest.java
Mon Mar 10 08:31:32 2014
@@ -20,10 +20,14 @@ import java.util.Iterator;
import org.apache.jackrabbit.oak.Oak;
import org.apache.jackrabbit.oak.api.ContentRepository;
import org.apache.jackrabbit.oak.api.Tree;
+import org.apache.jackrabbit.oak.plugins.index.CompositeIndexEditorProvider;
+import
org.apache.jackrabbit.oak.plugins.index.property.PropertyIndexEditorProvider;
+import org.apache.jackrabbit.oak.plugins.index.property.PropertyIndexProvider;
import org.apache.jackrabbit.oak.plugins.index.solr.TestUtils;
import
org.apache.jackrabbit.oak.plugins.index.solr.index.SolrIndexEditorProvider;
import org.apache.jackrabbit.oak.plugins.nodetype.write.InitialContent;
import org.apache.jackrabbit.oak.query.AbstractQueryTest;
+import org.apache.jackrabbit.oak.spi.query.CompositeQueryIndexProvider;
import org.apache.jackrabbit.oak.spi.security.OpenSecurityProvider;
import org.apache.solr.client.solrj.SolrServer;
import org.junit.After;
@@ -63,8 +67,14 @@ public class SolrIndexQueryTest extends
try {
return new Oak().with(new InitialContent())
.with(new OpenSecurityProvider())
- .with(new SolrQueryIndexProvider(provider, provider))
- .with(new SolrIndexEditorProvider(provider, provider))
+ .with(new CompositeQueryIndexProvider(
+ new SolrQueryIndexProvider(provider, provider),
+ new PropertyIndexProvider()
+ ))
+ .with(new CompositeIndexEditorProvider(
+ new SolrIndexEditorProvider(provider, provider),
+ new PropertyIndexEditorProvider()
+ ))
.createContentRepository();
} catch (Exception e) {
throw new RuntimeException(e);
Modified:
jackrabbit/oak/trunk/oak-solr-core/src/test/resources/org/apache/jackrabbit/oak/query/native_solr.txt
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/test/resources/org/apache/jackrabbit/oak/query/native_solr.txt?rev=1575869&r1=1575868&r2=1575869&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-solr-core/src/test/resources/org/apache/jackrabbit/oak/query/native_solr.txt
(original)
+++
jackrabbit/oak/trunk/oak-solr-core/src/test/resources/org/apache/jackrabbit/oak/query/native_solr.txt
Mon Mar 10 08:31:32 2014
@@ -26,6 +26,9 @@
commit / + "test": { "a": { "name": "Hello" }, "b": { "name" : "World" }}
+xpath /jcr:root/test/a[rep:native('solr', 'name:(Hello OR World)')]
+/test/a, null, null
+
xpath //*[rep:native('solr', 'name:(Hello OR World)')]
/test/a, null, null
/test/b, null, null