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 al...@apache.org on 2014/01/15 15:59:24 UTC

svn commit: r1558414 - /jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditor.java

Author: alexparvulescu
Date: Wed Jan 15 14:59:23 2014
New Revision: 1558414

URL: http://svn.apache.org/r1558414
Log:
OAK-1324 Optimize node updates in the Lucene index


Modified:
    jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditor.java

Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditor.java?rev=1558414&r1=1558413&r2=1558414&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditor.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditor.java Wed Jan 15 14:59:23 2014
@@ -101,16 +101,11 @@ public class LuceneIndexEditor implement
             throws CommitFailedException {
         if (propertiesChanged || !before.exists()) {
             String path = getPath();
-            try {
-                context.getWriter().updateDocument(newPathTerm(path),
-                        makeDocument(path, after));
-            } catch (IOException e) {
-                throw new CommitFailedException(
-                        "Lucene", 3, "Failed to index the node " + path, e);
-            }
-            long indexed = context.incIndexedNodes();
-            if (indexed % 1000 == 0) {
-                log.debug("Indexed {} nodes...", indexed);
+            if (addOrUpdate(path, after, before.exists())) {
+                long indexed = context.incIndexedNodes();
+                if (indexed % 1000 == 0) {
+                    log.debug("Indexed {} nodes...", indexed);
+                }
             }
         }
 
@@ -172,14 +167,24 @@ public class LuceneIndexEditor implement
         return null; // no need to recurse down the removed subtree
     }
 
-    private Document makeDocument(String path, NodeState state) {
-        Document document = new Document();
-        document.add(newPathField(path));
-        String name = getName(path);
-        if (name != null) {
-            document.add(newFulltextField(name));
+    private boolean addOrUpdate(String path, NodeState state, boolean isUpdate)
+            throws CommitFailedException {
+        try {
+            Document d = makeDocument(path, state, isUpdate);
+            if (d != null) {
+                context.getWriter().updateDocument(newPathTerm(path), d);
+                return true;
+            }
+        } catch (IOException e) {
+            throw new CommitFailedException("Lucene", 3,
+                    "Failed to index the node " + path, e);
         }
+        return false;
+    }
 
+    private Document makeDocument(String path, NodeState state, boolean isUpdate) {
+        Document document = new Document();
+        boolean dirty = false;
         for (PropertyState property : state.getProperties()) {
             String pname = property.getName();
             if (isVisible(pname)
@@ -187,15 +192,26 @@ public class LuceneIndexEditor implement
                             .tag())) != 0 && context.includeProperty(pname)) {
                 if (Type.BINARY.tag() == property.getType().tag()) {
                     addBinaryValue(document, property, state);
+                    dirty = true;
                 } else {
                     for (String value : property.getValue(Type.STRINGS)) {
                         document.add(newPropertyField(pname, value));
                         document.add(newFulltextField(value));
+                        dirty = true;
                     }
                 }
             }
         }
 
+        if (isUpdate && !dirty) {
+            // updated the state but had no relevant changes
+            return null;
+        }
+        document.add(newPathField(path));
+        String name = getName(path);
+        if (name != null) {
+            document.add(newFulltextField(name));
+        }
         return document;
     }