Author: chetanm
Date: Thu Dec  8 05:17:34 2016
New Revision: 1773176

URL: http://svn.apache.org/viewvc?rev=1773176&view=rev
Log:
OAK-4400 - Correlate index with the index definition used to build it

Add support for "refresh" of stored index definition without reindexing for 
edge cases

Modified:
    
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java
    
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorContext.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/LuceneIndexConstants.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java?rev=1773176&r1=1773175&r2=1773176&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java
 Thu Dec  8 05:17:34 2016
@@ -361,4 +361,9 @@ public interface LuceneIndexConstants {
      * String property: the function to index, for function-based index
      */
     String PROP_FUNCTION = "function";
+
+    /**
+     * Boolean property which signal LuceneIndexEditor to refresh the stored 
index definition
+     */
+    String PROP_REFRESH_DEFN = "refresh";
 }

Modified: 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorContext.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorContext.java?rev=1773176&r1=1773175&r2=1773176&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorContext.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorContext.java
 Thu Dec  8 05:17:34 2016
@@ -112,7 +112,7 @@ public class LuceneIndexEditorContext {
         this.definitionBuilder = definition;
         this.indexWriterFactory = indexWriterFactory;
         this.definition = indexDefinition != null ? indexDefinition :
-                new IndexDefinition(root, 
definition.getBaseState(),indexingContext.getIndexPath());
+                createIndexDefinition(root, definition, indexingContext);
         this.indexedNodes = 0;
         this.updateCallback = updateCallback;
         this.extractedTextCache = extractedTextCache;
@@ -191,8 +191,7 @@ public class LuceneIndexEditorContext {
         //as index definition does not get modified as part of IndexUpdate run 
in most case we rely on base state
         //For case where index definition is rewritten there we get fresh state
         NodeState defnState = indexDefnRewritten ? 
definitionBuilder.getNodeState() : definitionBuilder.getBaseState();
-        definitionBuilder.setChildNode(IndexDefinition.INDEX_DEFINITION_NODE,
-                NodeStateCloner.cloneVisibleState(defnState));
+        definitionBuilder.setChildNode(IndexDefinition.INDEX_DEFINITION_NODE, 
NodeStateCloner.cloneVisibleState(defnState));
         String uid = configureUniqueId(definitionBuilder);
 
         //Refresh the index definition based on update builder state
@@ -276,6 +275,17 @@ public class LuceneIndexEditorContext {
         return uid;
     }
 
+    private static IndexDefinition createIndexDefinition(NodeState root, 
NodeBuilder definition, IndexingContext
+            indexingContext) {
+        NodeState defnState = definition.getBaseState();
+        if (definition.getBoolean(LuceneIndexConstants.PROP_REFRESH_DEFN)){
+            definition.removeProperty(LuceneIndexConstants.PROP_REFRESH_DEFN);
+            definition.setChildNode(IndexDefinition.INDEX_DEFINITION_NODE, 
NodeStateCloner.cloneVisibleState(defnState));
+            log.info("Refreshed the index definition for [{}]", 
indexingContext.getIndexPath());
+        }
+        return new IndexDefinition(root, 
defnState,indexingContext.getIndexPath());
+    }
+
     private static Parser initializeTikaParser(IndexDefinition definition) {
         ClassLoader current = Thread.currentThread().getContextClassLoader();
         try {

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=1773176&r1=1773175&r2=1773176&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
 Thu Dec  8 05:17:34 2016
@@ -2457,6 +2457,41 @@ public class LucenePropertyIndexTest ext
         assertPlanAndQuery(query, "lucene:test1(/oak:index/test1)", 
asList("/b"));
     }
 
+    @Test
+    public void refreshIndexDefinition() throws Exception{
+        IndexDefinitionBuilder idxb = new IndexDefinitionBuilder().noAsync();
+        idxb.indexRule("nt:base").property("foo").propertyIndex();
+        Tree idx = root.getTree("/").getChild("oak:index").addChild("test1");
+        idxb.build(idx);
+
+        Tree rootTree = root.getTree("/");
+        rootTree.addChild("a").setProperty("foo", "bar");
+        rootTree.addChild("b").setProperty("bar", "bar");
+        root.commit();
+
+        String query = "select * from [nt:base] where [foo] = 'bar'";
+        assertPlanAndQuery(query, "lucene:test1(/oak:index/test1)", 
asList("/a"));
+
+        Tree barProp = 
root.getTree("/oak:index/test1/indexRules/nt:base/properties").addChild("bar");
+        barProp.setProperty("name", "bar");
+        barProp.setProperty("propertyIndex", true);
+        root.commit();
+
+        query = "select * from [nt:base] where [bar] = 'bar'";
+        assertThat(explain(query), 
not(containsString("lucene:test1(/oak:index/test1)")));
+
+        //Instead of reindex just refresh the index definition so that new 
index definition gets picked up
+        
root.getTree("/oak:index/test1").setProperty(LuceneIndexConstants.PROP_REFRESH_DEFN,
 true);
+        root.commit();
+
+        //Plan would reflect new defintion
+        assertThat(explain(query), 
containsString("lucene:test1(/oak:index/test1)"));
+        
assertFalse(root.getTree("/oak:index/test1").hasProperty(LuceneIndexConstants.PROP_REFRESH_DEFN));
+
+        //However as reindex was not done query would result in empty set
+        assertPlanAndQuery(query, "lucene:test1(/oak:index/test1)", 
Collections.<String>emptyList());
+    }
+
     private void assertPlanAndQuery(String query, String planExpectation, 
List<String> paths){
         assertThat(explain(query), containsString(planExpectation));
         assertQuery(query, paths);


Reply via email to