Author: thomasm
Date: Wed Dec  7 11:28:07 2016
New Revision: 1773055

URL: http://svn.apache.org/viewvc?rev=1773055&view=rev
Log:
OAK-5236 LuceneIndexMBean: JMX method to get fields data

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

Modified: 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexMBean.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexMBean.java?rev=1773055&r1=1773054&r2=1773055&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexMBean.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexMBean.java
 Wed Dec  7 11:28:07 2016
@@ -54,4 +54,12 @@ public interface LuceneIndexMBean {
             int maxPathCount
             ) throws IOException;
 
+    @Description("Retrieves the fields, and number of documents for each 
field, for an index. " +
+            "This allows to investigate what is stored in the index.")
+    String[] getFieldInfo(
+            @Name("indexPath")
+            @Description("The index path (empty for all indexes)")
+            String indexPath
+            ) throws IOException;
+
 }

Modified: 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexMBeanImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexMBeanImpl.java?rev=1773055&r1=1773054&r2=1773055&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexMBeanImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexMBeanImpl.java
 Wed Dec  7 11:28:07 2016
@@ -19,16 +19,20 @@
 
 package org.apache.jackrabbit.oak.plugins.index.lucene;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.apache.jackrabbit.oak.commons.IOUtils.humanReadableByteCount;
+import static 
org.apache.jackrabbit.oak.plugins.index.lucene.TermFactory.newAncestorTerm;
+
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
+import java.util.TreeSet;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
-import javax.management.NotCompliantMBeanException;
 import javax.management.openmbean.CompositeDataSupport;
 import javax.management.openmbean.CompositeType;
 import javax.management.openmbean.OpenDataException;
@@ -38,15 +42,14 @@ import javax.management.openmbean.Tabula
 import javax.management.openmbean.TabularDataSupport;
 import javax.management.openmbean.TabularType;
 
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Sets;
-import com.google.common.collect.TreeTraverser;
 import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.commons.jmx.AnnotatedStandardMBean;
 import 
org.apache.jackrabbit.oak.plugins.index.lucene.BadIndexTracker.BadIndexInfo;
 import 
org.apache.jackrabbit.oak.plugins.index.lucene.LucenePropertyIndex.PathStoredFieldVisitor;
 import org.apache.lucene.index.DirectoryReader;
+import org.apache.lucene.index.Fields;
 import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.MultiFields;
 import org.apache.lucene.search.BooleanClause;
 import org.apache.lucene.search.BooleanQuery;
 import org.apache.lucene.search.IndexSearcher;
@@ -61,15 +64,15 @@ import org.apache.lucene.store.IOContext
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.apache.jackrabbit.oak.commons.IOUtils.humanReadableByteCount;
-import static 
org.apache.jackrabbit.oak.plugins.index.lucene.TermFactory.newAncestorTerm;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Sets;
+import com.google.common.collect.TreeTraverser;
 
 public class LuceneIndexMBeanImpl extends AnnotatedStandardMBean implements 
LuceneIndexMBean {
     private final Logger log = LoggerFactory.getLogger(getClass());
     private final IndexTracker indexTracker;
 
-    public LuceneIndexMBeanImpl(IndexTracker indexTracker) throws 
NotCompliantMBeanException {
+    public LuceneIndexMBeanImpl(IndexTracker indexTracker) {
         super(LuceneIndexMBean.class);
         this.indexTracker = indexTracker;
     }
@@ -177,6 +180,44 @@ public class LuceneIndexMBeanImpl extend
         }
         return new String[0];
     }
+    
+    @Override
+    public String[] getFieldInfo(String indexPath) throws IOException {
+        TreeSet<String> indexes = new TreeSet<String>();
+        if (indexPath == null || indexPath.isEmpty()) {
+            indexes.addAll(indexTracker.getIndexNodePaths());
+        } else {
+            indexes.add(indexPath);
+        }
+        ArrayList<String> list = new ArrayList<String>();
+        for (String path : indexes) {
+            IndexNode indexNode = null;
+            try {
+                indexNode = indexTracker.acquireIndexNode(path);
+                if (indexNode != null) {
+                    IndexSearcher searcher = indexNode.getSearcher();
+                    list.addAll(getFieldInfo(path, searcher));
+                }
+            } finally {
+                if (indexNode != null) {
+                    indexNode.release();
+                }
+            }
+        }
+        return list.toArray(new String[0]);
+    }
+
+    private static ArrayList<String> getFieldInfo(String path, IndexSearcher 
searcher) throws IOException {
+        ArrayList<String> list = new ArrayList<String>();
+        IndexReader reader = searcher.getIndexReader();
+        Fields fields = MultiFields.getFields(reader);
+        if (fields != null) {
+            for(String f : fields) {
+                list.add(path + " " + f + " " + reader.getDocCount(f));
+            }
+        }
+        return list;
+    }
 
     public void dumpIndexContent(String sourcePath, String destPath) throws 
IOException {
         IndexNode indexNode = null;
@@ -202,7 +243,7 @@ public class LuceneIndexMBeanImpl extend
         }
     }
 
-    private String[] determineIndexedPaths(IndexSearcher searcher, final int 
maxLevel, int maxPathCount)
+    private static String[] determineIndexedPaths(IndexSearcher searcher, 
final int maxLevel, int maxPathCount)
             throws IOException {
         Set<String> paths = Sets.newHashSet();
         int startDepth = getStartDepth(searcher, maxLevel);
@@ -210,7 +251,7 @@ public class LuceneIndexMBeanImpl extend
             return createMsg("startDepth cannot be determined after search for 
upto maxLevel ["+maxLevel+"]");
         }
 
-        SearchContext sc = new SearchContext(searcher, maxLevel, maxPathCount);
+        SearchContext sc = new SearchContext(searcher);
         List<LuceneDoc> docs = getDocsAtLevel(startDepth, sc);
         int maxPathLimitBreachedAtLevel = -1;
         topLevel:
@@ -260,7 +301,7 @@ public class LuceneIndexMBeanImpl extend
      * to determine the start depth which needs to be used for query we need 
to find
      * out depth at which we start getting any entry
      */
-    private int getStartDepth(IndexSearcher searcher, int maxLevel) throws 
IOException {
+    private static int getStartDepth(IndexSearcher searcher, int maxLevel) 
throws IOException {
         int depth = 0;
         while(depth < maxLevel){
             //Confirm if we have any hit at current depth
@@ -280,11 +321,9 @@ public class LuceneIndexMBeanImpl extend
 
     private static class SearchContext{
         final IndexSearcher searcher;
-        final int maxLevel;
 
-        private SearchContext(IndexSearcher searcher, int maxLevel, int 
maxPathCount) {
+        SearchContext(IndexSearcher searcher) {
             this.searcher = searcher;
-            this.maxLevel = maxLevel;
         }
     }
 


Reply via email to