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/04/16 22:46:54 UTC

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

Author: alexparvulescu
Date: Wed Apr 16 20:46:54 2014
New Revision: 1588066

URL: http://svn.apache.org/r1588066
Log:
OAK-1740 Add a custom Lucene field visitor for the path

Modified:
    jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java
    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/LuceneIndex.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java?rev=1588066&r1=1588065&r2=1588066&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java Wed Apr 16 20:46:54 2014
@@ -26,7 +26,6 @@ import static org.apache.jackrabbit.oak.
 import static org.apache.jackrabbit.oak.commons.PathUtils.getName;
 import static org.apache.jackrabbit.oak.commons.PathUtils.getParentPath;
 import static org.apache.jackrabbit.oak.plugins.index.lucene.FieldNames.PATH;
-import static org.apache.jackrabbit.oak.plugins.index.lucene.FieldNames.PATH_SELECTOR;
 import static org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.EXCLUDE_PROPERTY_NAMES;
 import static org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.INCLUDE_PROPERTY_TYPES;
 import static org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.VERSION;
@@ -55,6 +54,7 @@ import javax.jcr.PropertyType;
 import com.google.common.collect.AbstractIterator;
 import com.google.common.collect.Queues;
 import com.google.common.collect.Sets;
+
 import org.apache.jackrabbit.oak.api.PropertyValue;
 import org.apache.jackrabbit.oak.plugins.index.aggregate.NodeAggregator;
 import org.apache.jackrabbit.oak.plugins.index.lucene.util.MoreLikeThisHelper;
@@ -78,8 +78,10 @@ import org.apache.lucene.analysis.Analyz
 import org.apache.lucene.analysis.TokenStream;
 import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
 import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;
+import org.apache.lucene.index.FieldInfo;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.MultiFields;
+import org.apache.lucene.index.StoredFieldVisitor;
 import org.apache.lucene.index.Term;
 import org.apache.lucene.index.Terms;
 import org.apache.lucene.index.TermsEnum;
@@ -302,8 +304,10 @@ public class LuceneIndex implements Full
             }
 
             private LuceneResultRow convertToRow(ScoreDoc doc, IndexSearcher searcher) throws IOException {
-                String path = searcher.getIndexReader().document(doc.doc,
-                        PATH_SELECTOR).get(PATH);
+                IndexReader reader = searcher.getIndexReader();
+                PathStoredFieldVisitor visitor = new PathStoredFieldVisitor();
+                reader.document(doc.doc, visitor);
+                String path = visitor.getPath();
                 if (path != null) {
                     if ("".equals(path)) {
                         path = "/";
@@ -964,7 +968,33 @@ public class LuceneIndex implements Full
                 
             };
         }
-        
+    }
+
+    private static class PathStoredFieldVisitor extends StoredFieldVisitor {
+
+        private String path;
+        private boolean pathVisited;
+
+        @Override
+        public Status needsField(FieldInfo fieldInfo) throws IOException {
+            if (PATH.equals(fieldInfo.name)) {
+                return Status.YES;
+            }
+            return pathVisited ? Status.STOP : Status.NO;
+        }
+
+        @Override
+        public void stringField(FieldInfo fieldInfo, String value)
+                throws IOException {
+            if (PATH.equals(fieldInfo.name)) {
+                path = value;
+                pathVisited = true;
+            }
+        }
+
+        public String getPath() {
+            return path;
+        }
     }
 
 }

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=1588066&r1=1588065&r2=1588066&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 Apr 16 20:46:54 2014
@@ -27,6 +27,8 @@ import static org.apache.jackrabbit.oak.
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
 
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.oak.api.Blob;
@@ -40,6 +42,7 @@ import org.apache.jackrabbit.oak.spi.sta
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Field;
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.search.PrefixQuery;
 import org.apache.tika.metadata.Metadata;
@@ -188,7 +191,7 @@ public class LuceneIndexEditor implement
     }
 
     private Document makeDocument(String path, NodeState state, boolean isUpdate) throws CommitFailedException {
-        Document document = new Document();
+        List<Field> fields = new ArrayList<Field>();
         boolean dirty = false;
         for (PropertyState property : state.getProperties()) {
             String pname = property.getName();
@@ -197,15 +200,15 @@ public class LuceneIndexEditor implement
                             .tag())) != 0 && context.includeProperty(pname)) {
                 if (Type.BINARY.tag() == property.getType().tag()) {
                     this.context.indexUpdate();
-                    addBinaryValue(document, property, state);
+                    fields.addAll(newBinary(property, state));
                     dirty = true;
                 } else {
                     for (String value : property.getValue(Type.STRINGS)) {
                         this.context.indexUpdate();
-                        document.add(newPropertyField(pname, value,
+                        fields.add(newPropertyField(pname, value,
                                 !skipTokenization(pname),
                                 context.isStored(pname)));
-                        document.add(newFulltextField(value));
+                        fields.add(newFulltextField(value));
                         dirty = true;
                     }
                 }
@@ -216,11 +219,15 @@ public class LuceneIndexEditor implement
             // updated the state but had no relevant changes
             return null;
         }
+        Document document = new Document();
         document.add(newPathField(path));
         String name = getName(path);
         if (name != null) {
             document.add(newFulltextField(name));
         }
+        for (Field f : fields) {
+            document.add(f);
+        }
         return document;
     }
 
@@ -228,8 +235,9 @@ public class LuceneIndexEditor implement
         return name.charAt(0) != ':';
     }
 
-    private void addBinaryValue(
-            Document doc, PropertyState property, NodeState state) {
+    private List<Field> newBinary(
+            PropertyState property, NodeState state) {
+        List<Field> fields = new ArrayList<Field>();
         Metadata metadata = new Metadata();
         if (JCR_DATA.equals(property.getName())) {
             String type = state.getString(JcrConstants.JCR_MIMETYPE);
@@ -243,8 +251,9 @@ public class LuceneIndexEditor implement
         }
 
         for (Blob v : property.getValue(Type.BINARIES)) {
-            doc.add(newFulltextField(parseStringValue(v, metadata)));
+            fields.add(newFulltextField(parseStringValue(v, metadata)));
         }
+        return fields;
     }
 
     private String parseStringValue(Blob v, Metadata metadata) {