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/11/27 12:37:04 UTC

svn commit: r1642113 - in /jackrabbit/oak/branches/1.0: ./ oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/ oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/

Author: chetanm
Date: Thu Nov 27 11:37:04 2014
New Revision: 1642113

URL: http://svn.apache.org/r1642113
Log:
OAK-2276 - Support for index format version

Merging revisions 1641599

Modified:
    jackrabbit/oak/branches/1.0/   (props changed)
    jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinition.java
    jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexFormatVersion.java
    jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorContext.java
    jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinitionTest.java
    jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorTest.java

Propchange: jackrabbit/oak/branches/1.0/
------------------------------------------------------------------------------
  Merged /jackrabbit/oak/trunk:r1641599

Modified: jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinition.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinition.java?rev=1642113&r1=1642112&r2=1642113&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinition.java (original)
+++ jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinition.java Thu Nov 27 11:37:04 2014
@@ -39,6 +39,7 @@ import com.google.common.collect.Immutab
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Sets;
+import com.google.common.primitives.Ints;
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Tree;
@@ -65,6 +66,7 @@ import static org.apache.jackrabbit.oak.
 import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.ENTRY_COUNT_PROPERTY_NAME;
 import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.REINDEX_COUNT;
 import static org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.BLOB_SIZE;
+import static org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.COMPAT_MODE;
 import static org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.EVALUATE_PATH_RESTRICTION;
 import static org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.EXCLUDE_PROPERTY_NAMES;
 import static org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.EXPERIMENTAL_STORAGE;
@@ -706,7 +708,7 @@ class IndexDefinition {
         if (!hasIndexingRules(defn)){
             NodeState rulesState = createIndexRules(defn).getNodeState();
             indexDefn.setChildNode(LuceneIndexConstants.INDEX_RULES, rulesState);
-            indexDefn.setProperty(INDEX_VERSION, determineIndexFormatVersion(defn).getVersion());
+            indexDefn.setProperty(INDEX_VERSION, determineIndexFormatVersion(defn, indexDefn).getVersion());
 
             indexDefn.removeProperty(DECLARING_NODE_TYPES);
             indexDefn.removeProperty(INCLUDE_PROPERTY_NAMES);
@@ -985,34 +987,76 @@ class IndexDefinition {
         nb.setProperty(JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_UNSTRUCTURED, Type.NAME);
     }
 
-    private static IndexFormatVersion determineIndexFormatVersion(NodeState defn) {
-        return determineIndexFormatVersion(defn, null);
-    }
-
     private static IndexFormatVersion determineIndexFormatVersion(NodeState defn, NodeBuilder defnb) {
         if (defnb != null && !defnb.getChildNode(INDEX_DATA_CHILD_NAME).exists()){
-            return IndexFormatVersion.getCurrent();
+            return determineVersionForFreshIndex(defnb);
         }
 
-        if (defn.hasProperty(LuceneIndexConstants.COMPAT_MODE)){
-            return IndexFormatVersion.getVersion((int)defn.getLong(LuceneIndexConstants.COMPAT_MODE));
+        //Compat mode version if specified has highest priority
+        if (defn.hasProperty(COMPAT_MODE)){
+            return versionFrom(defn.getProperty(COMPAT_MODE));
         }
 
         if (defn.hasProperty(INDEX_VERSION)){
-            return IndexFormatVersion.getVersion((int)defn.getLong(INDEX_VERSION));
+            return versionFrom(defn.getProperty(INDEX_VERSION));
         }
 
         //No existing index data i.e. reindex or fresh index
         if (!defn.getChildNode(INDEX_DATA_CHILD_NAME).exists()){
-            return IndexFormatVersion.getCurrent();
+            return determineVersionForFreshIndex(defn);
         }
 
         boolean fullTextEnabled = getOptionalValue(defn, FULL_TEXT_ENABLED, true);
+
         //A fulltext index with old indexing format confirms to V1. However
         //a propertyIndex with old indexing format confirms to V2
         return fullTextEnabled ? IndexFormatVersion.V1 : IndexFormatVersion.V2;
     }
 
+    static IndexFormatVersion determineVersionForFreshIndex(NodeState defn){
+        return determineVersionForFreshIndex(defn.getProperty(FULL_TEXT_ENABLED),
+                defn.getProperty(COMPAT_MODE), defn.getProperty(INDEX_VERSION));
+    }
+
+    static IndexFormatVersion determineVersionForFreshIndex(NodeBuilder defnb){
+        return determineVersionForFreshIndex(defnb.getProperty(FULL_TEXT_ENABLED),
+                defnb.getProperty(COMPAT_MODE), defnb.getProperty(INDEX_VERSION));
+    }
+
+    private static IndexFormatVersion determineVersionForFreshIndex(PropertyState fulltext,
+                                                                    PropertyState compat,
+                                                                    PropertyState version){
+        if (compat != null){
+            return versionFrom(compat);
+        }
+
+        IndexFormatVersion defaultToUse = IndexFormatVersion.getDefault();
+        IndexFormatVersion existing = version != null ? versionFrom(version) : null;
+
+        //As per OAK-2290 current might be less than current used version. So
+        //set to current only if it is greater than existing
+
+        //Per setting use default configured
+        IndexFormatVersion result = defaultToUse;
+
+        //If default configured is lesser than existing then prefer existing
+        if (existing != null){
+            result = IndexFormatVersion.max(result,existing);
+        }
+
+        //Check if fulltext is false which indicates its a property index and
+        //hence confirm to V2 or above
+        if (fulltext != null && !fulltext.getValue(Type.BOOLEAN)){
+            return IndexFormatVersion.max(result,IndexFormatVersion.V2);
+        }
+
+        return result;
+    }
+
+    private static IndexFormatVersion versionFrom(PropertyState ps){
+        return IndexFormatVersion.getVersion(Ints.checkedCast(ps.getValue(Type.LONG)));
+    }
+
     private static boolean hasIndexingRules(NodeState defn) {
         return defn.getChildNode(LuceneIndexConstants.INDEX_RULES).exists();
     }

Modified: jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexFormatVersion.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexFormatVersion.java?rev=1642113&r1=1642112&r2=1642113&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexFormatVersion.java (original)
+++ jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexFormatVersion.java Thu Nov 27 11:37:04 2014
@@ -59,8 +59,13 @@ public enum IndexFormatVersion {
         }
     }
 
-    public static IndexFormatVersion getCurrent(){
-        return V2;
+    public static IndexFormatVersion getDefault(){
+        //TODO FIXME Should be V2 or above once OAK-2290 is fixed
+        return V1;
+    }
+
+    public static IndexFormatVersion max(IndexFormatVersion o1, IndexFormatVersion o2){
+        return o1.version > o2.version ? o1 : o2;
     }
 
 }

Modified: jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorContext.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorContext.java?rev=1642113&r1=1642112&r2=1642113&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorContext.java (original)
+++ jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorContext.java Thu Nov 27 11:37:04 2014
@@ -153,8 +153,8 @@ public class LuceneIndexEditorContext {
 
     public void enableReindexMode(){
         reindex = true;
-        definitionBuilder.setProperty(IndexDefinition.INDEX_VERSION,
-                IndexFormatVersion.getCurrent().getVersion());
+        IndexFormatVersion version = IndexDefinition.determineVersionForFreshIndex(definitionBuilder);
+        definitionBuilder.setProperty(IndexDefinition.INDEX_VERSION, version.getVersion());
     }
 
     public long incIndexedNodes() {

Modified: jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinitionTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinitionTest.java?rev=1642113&r1=1642112&r2=1642113&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinitionTest.java (original)
+++ jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinitionTest.java Thu Nov 27 11:37:04 2014
@@ -363,7 +363,7 @@ public class IndexDefinitionTest {
                 "lucene", of(TYPENAME_STRING));
 
         IndexDefinition defn = new IndexDefinition(root, defnb.getNodeState());
-        assertEquals(IndexFormatVersion.getCurrent(), defn.getVersion());
+        assertEquals(IndexFormatVersion.getDefault(), defn.getVersion());
     }
 
     @Test

Modified: jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorTest.java?rev=1642113&r1=1642112&r2=1642113&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorTest.java (original)
+++ jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorTest.java Thu Nov 27 11:37:04 2014
@@ -80,8 +80,9 @@ public class LuceneIndexEditorTest {
     @Test
     public void testLuceneWithFullText() throws Exception {
         NodeBuilder index = builder.child(INDEX_DEFINITIONS_NAME);
-        newLuceneIndexDefinition(index, "lucene",
+        NodeBuilder idxnb = newLuceneIndexDefinition(index, "lucene",
                 of(TYPENAME_STRING));
+        setCompatVersionToV2(idxnb);
 
         NodeState before = builder.getNodeState();
         builder.child("test").setProperty("foo", "fox is jumping");
@@ -277,7 +278,7 @@ public class LuceneIndexEditorTest {
         builder.child(INDEX_DEFINITIONS_NAME).child("lucene").setProperty(IndexConstants.REINDEX_PROPERTY_NAME, true);
         after = builder.getNodeState();
         indexed = HOOK.processCommit(before, after, CommitInfo.EMPTY);
-        assertEquals(IndexFormatVersion.getCurrent(), new IndexDefinition(root,
+        assertEquals(IndexFormatVersion.getDefault(), new IndexDefinition(root,
                 indexed.getChildNode(INDEX_DEFINITIONS_NAME).getChildNode("lucene")).getVersion());
 
     }
@@ -387,4 +388,8 @@ public class LuceneIndexEditorTest {
     static long dateToTime(String dt) throws java.text.ParseException {
         return FieldFactory.dateToLong(ISO8601.format(createCal(dt)));
     }
+
+    private static void setCompatVersionToV2(NodeBuilder idxNb) {
+        idxNb.setProperty(LuceneIndexConstants.COMPAT_MODE, IndexFormatVersion.V2.getVersion());
+    }
 }