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 to...@apache.org on 2018/09/24 12:53:24 UTC

svn commit: r1841838 - in /jackrabbit/oak/trunk/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search: FulltextIndexConstants.java IndexDefinition.java spi/query/FulltextIndexPlanner.java

Author: tommaso
Date: Mon Sep 24 12:53:23 2018
New Revision: 1841838

URL: http://svn.apache.org/viewvc?rev=1841838&view=rev
Log:
OAK-7739 - added support in oak-search

Modified:
    jackrabbit/oak/trunk/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/FulltextIndexConstants.java
    jackrabbit/oak/trunk/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/IndexDefinition.java
    jackrabbit/oak/trunk/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/spi/query/FulltextIndexPlanner.java

Modified: jackrabbit/oak/trunk/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/FulltextIndexConstants.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/FulltextIndexConstants.java?rev=1841838&r1=1841837&r2=1841838&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/FulltextIndexConstants.java (original)
+++ jackrabbit/oak/trunk/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/FulltextIndexConstants.java Mon Sep 24 12:53:23 2018
@@ -334,4 +334,11 @@ public interface FulltextIndexConstants
      * should be indexed
      */
     String PROP_INDEX_NODE_TYPE = "nodeTypeIndex";
+
+    /**
+     * The property of an index. If the given node or property exists, then the
+     * index is used for queries; otherwise, it is not used (returns infinite
+     * cost). The value is: nodes, the path. For properties, the path of the node, then '@' property.
+     */
+     String USE_IF_EXISTS = "useIfExists";
 }

Modified: jackrabbit/oak/trunk/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/IndexDefinition.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/IndexDefinition.java?rev=1841838&r1=1841837&r2=1841838&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/IndexDefinition.java (original)
+++ jackrabbit/oak/trunk/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/IndexDefinition.java Mon Sep 24 12:53:23 2018
@@ -267,6 +267,8 @@ public class IndexDefinition implements
 
     private final boolean syncPropertyIndexes;
 
+    private final String useIfExists;
+
     private final boolean testMode;
 
     public boolean isTestMode() {
@@ -421,12 +423,33 @@ public class IndexDefinition implements
         this.nrtIndexMode = supportsNRTIndexing(defn);
         this.syncIndexMode = supportsSyncIndexing(defn);
         this.syncPropertyIndexes = definedRules.stream().anyMatch(ir -> !ir.syncProps.isEmpty());
+        this.useIfExists = getOptionalValue(defn, IndexConstants.USE_IF_EXISTS, null);
     }
 
     public NodeState getDefinitionNodeState() {
         return definition;
     }
 
+    public boolean isEnabled() {
+        if (useIfExists == null) {
+            return true;
+        }
+        if (!PathUtils.isValid(useIfExists)) {
+            return false;
+        }
+        NodeState nodeState = root;
+        for (String element : PathUtils.elements(useIfExists)) {
+            if (element.startsWith("@")) {
+                return nodeState.hasProperty(element.substring(1));
+            }
+            nodeState = nodeState.getChildNode(element);
+            if (!nodeState.exists()) {
+                return false;
+            }
+        }
+        return true;
+    }
+
     public boolean isFullTextEnabled() {
         return fullTextEnabled;
     }

Modified: jackrabbit/oak/trunk/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/spi/query/FulltextIndexPlanner.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/spi/query/FulltextIndexPlanner.java?rev=1841838&r1=1841837&r2=1841838&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/spi/query/FulltextIndexPlanner.java (original)
+++ jackrabbit/oak/trunk/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/spi/query/FulltextIndexPlanner.java Mon Sep 24 12:53:23 2018
@@ -340,6 +340,10 @@ public class FulltextIndexPlanner {
     private boolean wrongIndex() {
         // REMARK: similar code is used in oak-core, PropertyIndex
         // skip index if "option(index ...)" doesn't match
+        if (!definition.isEnabled()) {
+            return true;
+        }
+
         PropertyRestriction indexName = filter.getPropertyRestriction(IndexConstants.INDEX_NAME_OPTION);
         boolean wrong = false;
         if (indexName != null && indexName.first != null) {