Author: catholicon
Date: Tue Dec 15 22:27:44 2015
New Revision: 1720261

URL: http://svn.apache.org/viewvc?rev=1720261&view=rev
Log:
OAK-3576: Allow custom extension to augment indexed lucene documents

Added:
    
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/indexAugment/
    
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/indexAugment/IndexAugmentorFactory.java
   (with props)
    
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/indexAugment/impl/
    
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/indexAugment/impl/IndexAugmentorFactoryImpl.java
   (with props)
    
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/spi/
    
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/spi/FulltextQueryTermsProvider.java
   (with props)
    
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/spi/IndexFieldProvider.java
   (with props)
Modified:
    jackrabbit/oak/trunk/oak-lucene/pom.xml
    
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditor.java
    
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorContext.java
    
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorProvider.java
    
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProvider.java
    
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java
    
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
    
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/PropertyDefinition.java
    
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/package-info.java

Modified: jackrabbit/oak/trunk/oak-lucene/pom.xml
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/pom.xml?rev=1720261&r1=1720260&r2=1720261&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/pom.xml (original)
+++ jackrabbit/oak/trunk/oak-lucene/pom.xml Tue Dec 15 22:27:44 2015
@@ -112,6 +112,7 @@
                 org.apache.jackrabbit.oak.plugins.index.lucene,
                 org.apache.jackrabbit.oak.plugins.index.lucene.util,
                 org.apache.jackrabbit.oak.plugins.index.lucene.score,
+                org.apache.jackrabbit.oak.plugins.index.lucene.spi,
             </Export-Package>
             <_exportcontents>
                 org.apache.lucene.*;version=${lucene.version}

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=1720261&r1=1720260&r2=1720261&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
 Tue Dec 15 22:27:44 2015
@@ -57,6 +57,7 @@ import org.apache.jackrabbit.oak.plugins
 import org.apache.jackrabbit.oak.plugins.index.fulltext.ExtractedText;
 import 
org.apache.jackrabbit.oak.plugins.index.fulltext.ExtractedText.ExtractionResult;
 import org.apache.jackrabbit.oak.plugins.index.lucene.Aggregate.Matcher;
+import 
org.apache.jackrabbit.oak.plugins.index.lucene.indexAugment.IndexAugmentorFactory;
 import org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState;
 import org.apache.jackrabbit.oak.plugins.tree.TreeFactory;
 import org.apache.jackrabbit.oak.spi.commit.Editor;
@@ -133,12 +134,13 @@ public class LuceneIndexEditor implement
     LuceneIndexEditor(NodeState root, NodeBuilder definition,
                         IndexUpdateCallback updateCallback,
                         @Nullable IndexCopier indexCopier,
-                        ExtractedTextCache extractedTextCache) throws 
CommitFailedException {
+                        ExtractedTextCache extractedTextCache,
+                      IndexAugmentorFactory augmentorFactory) throws 
CommitFailedException {
         this.parent = null;
         this.name = null;
         this.path = "/";
         this.context = new LuceneIndexEditorContext(root, definition,
-                updateCallback, indexCopier, extractedTextCache);
+                updateCallback, indexCopier, extractedTextCache, 
augmentorFactory);
         this.root = root;
         this.isDeleted = false;
         this.matcherState = MatcherState.NONE;
@@ -520,6 +522,9 @@ public class LuceneIndexEditor implement
                 }
             }
         }
+
+        dirty |= augmentCustomFields(path, fields, state, property, pname);
+
         return dirty;
     }
 
@@ -657,6 +662,32 @@ public class LuceneIndexEditor implement
         return fields;
     }
 
+    private boolean augmentCustomFields(final String path, final List<Field> 
fields,
+                                        final NodeState document, final 
PropertyState property,
+                                        final String propertyName) {
+        boolean dirty = false;
+
+        IndexDefinition defn = getDefinition();
+
+        if (defn.getVersion().isAtLeast(IndexFormatVersion.V2)){
+            IndexAugmentorFactory augmentorFactory = 
context.getAugmentorFactory();
+            if (augmentorFactory != null) {
+                Iterable<Field> augmentedFields = 
augmentorFactory.getIndexFieldProvider()
+                        .getAugmentedFields(path, propertyName,
+                                document, property, 
defn.getDefinitionNodeState());
+
+                if (augmentedFields != null) {
+                    for (Field field : augmentedFields) {
+                        fields.add(field);
+                        dirty = true;
+                    }
+                }
+            }
+        }
+
+        return dirty;
+    }
+
     //~-------------------------------------------------------< NullCheck 
Support >
 
     private boolean indexNotNullCheckEnabledProps(String path, List<Field> 
fields, NodeState state) {
@@ -795,7 +826,6 @@ public class LuceneIndexEditor implement
         });
         return dirtyFlag.get();
     }
-
     /**
      * Create the fulltext field from the aggregated nodes. If result is for 
aggregate for a relative node
      * include then

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=1720261&r1=1720260&r2=1720261&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
 Tue Dec 15 22:27:44 2015
@@ -33,6 +33,7 @@ import org.apache.jackrabbit.oak.api.Com
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.plugins.index.IndexUpdateCallback;
+import 
org.apache.jackrabbit.oak.plugins.index.lucene.indexAugment.IndexAugmentorFactory;
 import org.apache.jackrabbit.oak.plugins.index.lucene.util.SuggestHelper;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
@@ -143,19 +144,23 @@ public class LuceneIndexEditorContext {
     private final TextExtractionStats textExtractionStats = new 
TextExtractionStats();
 
     private final ExtractedTextCache extractedTextCache;
+
+    private final IndexAugmentorFactory augmentorFactory;
     /**
      * The media types supported by the parser used.
      */
     private Set<MediaType> supportedMediaTypes;
 
     LuceneIndexEditorContext(NodeState root, NodeBuilder definition, 
IndexUpdateCallback updateCallback,
-                             @Nullable IndexCopier indexCopier, 
ExtractedTextCache extractedTextCache) {
+                             @Nullable IndexCopier indexCopier, 
ExtractedTextCache extractedTextCache,
+                             IndexAugmentorFactory augmentorFactory) {
         this.definitionBuilder = definition;
         this.indexCopier = indexCopier;
         this.definition = new IndexDefinition(root, definition);
         this.indexedNodes = 0;
         this.updateCallback = updateCallback;
         this.extractedTextCache = extractedTextCache;
+        this.augmentorFactory = augmentorFactory;
         if (this.definition.isOfOldFormat()){
             IndexDefinition.updateDefinition(definition);
         }
@@ -340,6 +345,10 @@ public class LuceneIndexEditorContext {
         return extractedTextCache;
     }
 
+    IndexAugmentorFactory getAugmentorFactory() {
+        return augmentorFactory;
+    }
+
     public boolean isReindex() {
         return reindex;
     }

Modified: 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorProvider.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorProvider.java?rev=1720261&r1=1720260&r2=1720261&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorProvider.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorProvider.java
 Tue Dec 15 22:27:44 2015
@@ -23,6 +23,7 @@ import org.apache.jackrabbit.oak.api.Com
 import org.apache.jackrabbit.oak.plugins.index.IndexEditor;
 import org.apache.jackrabbit.oak.plugins.index.IndexEditorProvider;
 import org.apache.jackrabbit.oak.plugins.index.IndexUpdateCallback;
+import 
org.apache.jackrabbit.oak.plugins.index.lucene.indexAugment.IndexAugmentorFactory;
 import org.apache.jackrabbit.oak.spi.commit.Editor;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
@@ -39,6 +40,7 @@ import static org.apache.jackrabbit.oak.
 public class LuceneIndexEditorProvider implements IndexEditorProvider {
     private final IndexCopier indexCopier;
     private final ExtractedTextCache extractedTextCache;
+    private final IndexAugmentorFactory augmentorFactory;
 
     public LuceneIndexEditorProvider() {
         this(null);
@@ -51,8 +53,15 @@ public class LuceneIndexEditorProvider i
 
     public LuceneIndexEditorProvider(@Nullable IndexCopier indexCopier,
                                      ExtractedTextCache extractedTextCache) {
+        this(indexCopier, extractedTextCache, IndexAugmentorFactory.DEFAULT);
+    }
+
+    public LuceneIndexEditorProvider(@Nullable IndexCopier indexCopier,
+                                     ExtractedTextCache extractedTextCache,
+                                     IndexAugmentorFactory augmentorFactory) {
         this.indexCopier = indexCopier;
         this.extractedTextCache = extractedTextCache;
+        this.augmentorFactory = augmentorFactory;
     }
 
     @Override
@@ -61,7 +70,7 @@ public class LuceneIndexEditorProvider i
             @Nonnull IndexUpdateCallback callback)
             throws CommitFailedException {
         if (TYPE_LUCENE.equals(type)) {
-            return new LuceneIndexEditor(root, definition, callback, 
indexCopier, extractedTextCache);
+            return new LuceneIndexEditor(root, definition, callback, 
indexCopier, extractedTextCache, augmentorFactory);
         }
         return null;
     }

Modified: 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProvider.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProvider.java?rev=1720261&r1=1720260&r2=1720261&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProvider.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProvider.java
 Tue Dec 15 22:27:44 2015
@@ -23,6 +23,7 @@ import javax.annotation.Nonnull;
 
 import org.apache.jackrabbit.oak.plugins.index.aggregate.AggregateIndex;
 import org.apache.jackrabbit.oak.plugins.index.aggregate.NodeAggregator;
+import 
org.apache.jackrabbit.oak.plugins.index.lucene.indexAugment.IndexAugmentorFactory;
 import 
org.apache.jackrabbit.oak.plugins.index.lucene.score.ScorerProviderFactory;
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
 import org.apache.jackrabbit.oak.spi.commit.Observer;
@@ -45,21 +46,24 @@ public class LuceneIndexProvider impleme
 
     ScorerProviderFactory scorerFactory;
 
+    IndexAugmentorFactory augmentorFactory;
+
     public LuceneIndexProvider() {
         this(new IndexTracker());
     }
 
     public LuceneIndexProvider(IndexCopier indexCopier) {
-        this(new IndexTracker(indexCopier), ScorerProviderFactory.DEFAULT);
+        this(new IndexTracker(indexCopier));
     }
 
     public LuceneIndexProvider(IndexTracker tracker) {
-        this(tracker, ScorerProviderFactory.DEFAULT);
+        this(tracker, ScorerProviderFactory.DEFAULT, 
IndexAugmentorFactory.DEFAULT);
     }
 
-    public LuceneIndexProvider(IndexTracker tracker, ScorerProviderFactory 
scorerFactory) {
+    public LuceneIndexProvider(IndexTracker tracker, ScorerProviderFactory 
scorerFactory, IndexAugmentorFactory augmentorFactory) {
         this.tracker = tracker;
         this.scorerFactory = scorerFactory;
+        this.augmentorFactory = augmentorFactory;
     }
 
     public void close() {
@@ -85,7 +89,7 @@ public class LuceneIndexProvider impleme
     }
 
     protected LucenePropertyIndex newLucenePropertyIndex() {
-        return new LucenePropertyIndex(tracker, scorerFactory);
+        return new LucenePropertyIndex(tracker, scorerFactory, 
augmentorFactory);
     }
 
     /**

Modified: 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java?rev=1720261&r1=1720260&r2=1720261&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java
 Tue Dec 15 22:27:44 2015
@@ -52,6 +52,7 @@ import org.apache.jackrabbit.oak.osgi.Os
 import org.apache.jackrabbit.oak.plugins.index.IndexEditorProvider;
 import org.apache.jackrabbit.oak.plugins.index.aggregate.NodeAggregator;
 import 
org.apache.jackrabbit.oak.plugins.index.fulltext.PreExtractedTextProvider;
+import 
org.apache.jackrabbit.oak.plugins.index.lucene.indexAugment.IndexAugmentorFactory;
 import org.apache.jackrabbit.oak.spi.commit.BackgroundObserver;
 import 
org.apache.jackrabbit.oak.plugins.index.lucene.score.ScorerProviderFactory;
 import org.apache.jackrabbit.oak.spi.commit.BackgroundObserverMBean;
@@ -177,6 +178,9 @@ public class LuceneIndexProviderService
     @Reference
     ScorerProviderFactory scorerFactory;
 
+    @Reference
+    IndexAugmentorFactory augmentorFactory;
+
     @Reference(policy = ReferencePolicy.DYNAMIC,
             cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE,
             policyOption = ReferencePolicyOption.GREEDY
@@ -207,7 +211,7 @@ public class LuceneIndexProviderService
         whiteboard = new OsgiWhiteboard(bundleContext);
         threadPoolSize = 
PropertiesUtil.toInteger(config.get(PROP_THREAD_POOL_SIZE), 
PROP_THREAD_POOL_SIZE_DEFAULT);
         initializeExtractedTextCache(bundleContext, config);
-        indexProvider = new LuceneIndexProvider(createTracker(bundleContext, 
config), scorerFactory);
+        indexProvider = new LuceneIndexProvider(createTracker(bundleContext, 
config), scorerFactory, augmentorFactory);
         initializeLogging(config);
         initialize();
 
@@ -288,10 +292,10 @@ public class LuceneIndexProviderService
         LuceneIndexEditorProvider editorProvider;
         if (enableCopyOnWrite){
             initializeIndexCopier(bundleContext, config);
-            editorProvider = new LuceneIndexEditorProvider(indexCopier, 
extractedTextCache);
+            editorProvider = new LuceneIndexEditorProvider(indexCopier, 
extractedTextCache, augmentorFactory);
             log.info("Enabling CopyOnWrite support. Index files would be 
copied under {}", indexDir.getAbsolutePath());
         } else {
-            editorProvider = new LuceneIndexEditorProvider(null, 
extractedTextCache);
+            editorProvider = new LuceneIndexEditorProvider(null, 
extractedTextCache, augmentorFactory);
         }
         
regs.add(bundleContext.registerService(IndexEditorProvider.class.getName(), 
editorProvider, null));
         oakRegs.add(registerMBean(whiteboard,

Modified: 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java?rev=1720261&r1=1720260&r2=1720261&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
 Tue Dec 15 22:27:44 2015
@@ -18,23 +18,6 @@
  */
 package org.apache.jackrabbit.oak.plugins.index.lucene;
 
-import javax.annotation.CheckForNull;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import javax.jcr.PropertyType;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Deque;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicReference;
-
 import com.google.common.collect.AbstractIterator;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Queues;
@@ -46,7 +29,9 @@ import org.apache.jackrabbit.oak.commons
 import org.apache.jackrabbit.oak.plugins.index.aggregate.NodeAggregator;
 import 
org.apache.jackrabbit.oak.plugins.index.lucene.IndexDefinition.IndexingRule;
 import org.apache.jackrabbit.oak.plugins.index.lucene.IndexPlanner.PlanResult;
+import 
org.apache.jackrabbit.oak.plugins.index.lucene.indexAugment.IndexAugmentorFactory;
 import 
org.apache.jackrabbit.oak.plugins.index.lucene.score.ScorerProviderFactory;
+import 
org.apache.jackrabbit.oak.plugins.index.lucene.spi.FulltextQueryTermsProvider;
 import org.apache.jackrabbit.oak.plugins.index.lucene.util.MoreLikeThisHelper;
 import org.apache.jackrabbit.oak.plugins.index.lucene.util.SpellcheckHelper;
 import org.apache.jackrabbit.oak.plugins.index.lucene.util.SuggestHelper;
@@ -124,6 +109,23 @@ import org.apache.lucene.util.Version;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import javax.jcr.PropertyType;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Deque;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicReference;
+
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.collect.Lists.newArrayListWithCapacity;
@@ -142,7 +144,9 @@ import static org.apache.jackrabbit.oak.
 import static org.apache.jackrabbit.oak.query.QueryImpl.JCR_PATH;
 import static 
org.apache.jackrabbit.oak.spi.query.QueryIndex.AdvancedQueryIndex;
 import static org.apache.jackrabbit.oak.spi.query.QueryIndex.NativeQueryIndex;
-import static org.apache.lucene.search.BooleanClause.Occur.*;
+import static org.apache.lucene.search.BooleanClause.Occur.MUST;
+import static org.apache.lucene.search.BooleanClause.Occur.MUST_NOT;
+import static org.apache.lucene.search.BooleanClause.Occur.SHOULD;
 
 /**
  * Provides a QueryIndex that does lookups against a Lucene-based index
@@ -207,14 +211,20 @@ public class LucenePropertyIndex impleme
     private final Highlighter highlighter = new Highlighter(new 
SimpleHTMLFormatter("<strong>", "</strong>"),
             new SimpleHTMLEncoder(), null);
 
+    private final IndexAugmentorFactory augmentorFactory;
+
     public LucenePropertyIndex(IndexTracker tracker) {
-        this.tracker = tracker;
-        this.scorerProviderFactory = ScorerProviderFactory.DEFAULT;
+        this(tracker, ScorerProviderFactory.DEFAULT);
     }
 
     public LucenePropertyIndex(IndexTracker tracker, ScorerProviderFactory 
factory) {
+        this(tracker, factory, IndexAugmentorFactory.DEFAULT);
+    }
+
+    public LucenePropertyIndex(IndexTracker tracker, ScorerProviderFactory 
factory, IndexAugmentorFactory augmentorFactory) {
         this.tracker = tracker;
         this.scorerProviderFactory = factory;
+        this.augmentorFactory = augmentorFactory;
     }
 
     @Override
@@ -274,7 +284,7 @@ public class LucenePropertyIndex impleme
                     .append("(")
                     .append(path)
                     .append(") ");
-            sb.append(getLuceneRequest(plan, null));
+            sb.append(getLuceneRequest(plan, augmentorFactory, null));
             if (plan.getSortOrder() != null && !plan.getSortOrder().isEmpty()) 
{
                 sb.append(" ordering:").append(plan.getSortOrder());
             }
@@ -365,7 +375,7 @@ public class LucenePropertyIndex impleme
                 checkState(indexNode != null);
                 try {
                     IndexSearcher searcher = indexNode.getSearcher();
-                    LuceneRequestFacade luceneRequestFacade = 
getLuceneRequest(plan, searcher.getIndexReader());
+                    LuceneRequestFacade luceneRequestFacade = 
getLuceneRequest(plan, augmentorFactory, searcher.getIndexReader());
                     if (luceneRequestFacade.getLuceneRequest() instanceof 
Query) {
                         Query query = (Query) 
luceneRequestFacade.getLuceneRequest();
 
@@ -547,7 +557,7 @@ public class LucenePropertyIndex impleme
                 checkState(indexNode != null);
                 try {
                     IndexSearcher searcher = indexNode.getSearcher();
-                    LuceneRequestFacade luceneRequestFacade = 
getLuceneRequest(plan, searcher.getIndexReader());
+                    LuceneRequestFacade luceneRequestFacade = 
getLuceneRequest(plan, augmentorFactory, searcher.getIndexReader());
                     if (luceneRequestFacade.getLuceneRequest() instanceof 
Query) {
                         Query query = (Query) 
luceneRequestFacade.getLuceneRequest();
                         TotalHitCountCollector collector = new 
TotalHitCountCollector();
@@ -682,7 +692,8 @@ public class LucenePropertyIndex impleme
      * @param reader the Lucene reader
      * @return the Lucene query
      */
-    private static LuceneRequestFacade getLuceneRequest(IndexPlan plan, 
IndexReader reader) {
+    private static LuceneRequestFacade getLuceneRequest(IndexPlan plan, 
IndexAugmentorFactory augmentorFactory, IndexReader reader) {
+        FulltextQueryTermsProvider augmentor = getIndexAgumentor(plan, 
augmentorFactory);
         List<Query> qs = new ArrayList<Query>();
         Filter filter = plan.getFilter();
         FullTextExpression ft = filter.getFullTextConstraint();
@@ -694,7 +705,7 @@ public class LucenePropertyIndex impleme
             // when using the LowCostLuceneIndexProvider
             // which is used for testing
         } else {
-            qs.add(getFullTextQuery(plan, ft, analyzer));
+            qs.add(getFullTextQuery(plan, ft, analyzer, augmentor));
         }
 
 
@@ -848,6 +859,16 @@ public class LucenePropertyIndex impleme
         }
         return null;
     }
+    private static FulltextQueryTermsProvider getIndexAgumentor(IndexPlan 
plan, IndexAugmentorFactory augmentorFactory) {
+        PlanResult planResult = getPlanResult(plan);
+        IndexDefinition defn = planResult.indexDefinition;
+
+        if (defn.getVersion().isAtLeast(IndexFormatVersion.V2)){
+            return augmentorFactory.getFulltextQueryTermsProvider();
+        }
+
+        return null;
+    }
 
     private static void addNonFullTextConstraints(List<Query> qs,
                                                   IndexPlan plan, IndexReader 
reader) {
@@ -1194,7 +1215,7 @@ public class LucenePropertyIndex impleme
     }
 
     static Query getFullTextQuery(final IndexPlan plan, FullTextExpression ft,
-                                  final Analyzer analyzer) {
+                                  final Analyzer analyzer, final 
FulltextQueryTermsProvider augmentor) {
         final PlanResult pr = getPlanResult(plan);
         // a reference to the query, so it can be set in the visitor
         // (a "non-local return")
@@ -1211,7 +1232,7 @@ public class LucenePropertyIndex impleme
             public boolean visit(FullTextOr or) {
                 BooleanQuery q = new BooleanQuery();
                 for (FullTextExpression e : or.list) {
-                    Query x = getFullTextQuery(plan, e, analyzer);
+                    Query x = getFullTextQuery(plan, e, analyzer, augmentor);
                     q.add(x, SHOULD);
                 }
                 result.set(q);
@@ -1222,7 +1243,7 @@ public class LucenePropertyIndex impleme
             public boolean visit(FullTextAnd and) {
                 BooleanQuery q = new BooleanQuery();
                 for (FullTextExpression e : and.list) {
-                    Query x = getFullTextQuery(plan, e, analyzer);
+                    Query x = getFullTextQuery(plan, e, analyzer, augmentor);
                     /* Only unwrap the clause if MUST_NOT(x) */
                     boolean hasMustNot = false;
                     if (x instanceof BooleanQuery) {
@@ -1249,7 +1270,7 @@ public class LucenePropertyIndex impleme
 
             private boolean visitTerm(String propertyName, String text, String 
boost, boolean not) {
                 String p = getLuceneFieldName(propertyName, pr);
-                Query q = tokenToQuery(text, p, pr.indexingRule, analyzer);
+                Query q = tokenToQuery(text, p, pr.indexingRule, analyzer, 
augmentor);
                 if (q == null) {
                     return false;
                 }
@@ -1295,7 +1316,8 @@ public class LucenePropertyIndex impleme
         return p;
     }
 
-    private static Query tokenToQuery(String text, String fieldName, 
IndexingRule indexingRule, Analyzer analyzer) {
+    private static Query tokenToQuery(String text, String fieldName, 
IndexingRule indexingRule, Analyzer analyzer, FulltextQueryTermsProvider 
augmentor) {
+        Query ret;
         //Expand the query on fulltext field
         if (FieldNames.FULLTEXT.equals(fieldName) &&
                 !indexingRule.getNodeScopeAnalyzedProps().isEmpty()) {
@@ -1309,9 +1331,25 @@ public class LucenePropertyIndex impleme
             //Add the query for actual fulltext field also. That query would
             //not be boosted
             in.add(tokenToQuery(text, fieldName, analyzer), 
BooleanClause.Occur.SHOULD);
-            return in;
+            ret = in;
+        } else {
+            ret = tokenToQuery(text, fieldName, analyzer);
         }
-        return tokenToQuery(text, fieldName, analyzer);
+
+        //Augment query terms if available (as a 'SHOULD' clause)
+        if (augmentor != null && FieldNames.FULLTEXT.equals(fieldName)) {
+            Query subQuery = augmentor.getQueryTerm(text, analyzer);
+            if (subQuery != null) {
+                BooleanQuery query = new BooleanQuery();
+
+                query.add(ret, BooleanClause.Occur.SHOULD);
+                query.add(subQuery, BooleanClause.Occur.SHOULD);
+
+                ret = query;
+            }
+        }
+
+        return ret;
     }
 
     static Query tokenToQuery(String text, String fieldName, Analyzer 
analyzer) {

Modified: 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/PropertyDefinition.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/PropertyDefinition.java?rev=1720261&r1=1720260&r2=1720261&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/PropertyDefinition.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/PropertyDefinition.java
 Tue Dec 15 22:27:44 2015
@@ -190,6 +190,7 @@ class PropertyDefinition {
                 ", boost=" + boost +
                 ", isRegexp=" + isRegexp +
                 ", index=" + index +
+                ", skipDefaultIndexing=" + skipDefaultIndexing +
                 ", stored=" + stored +
                 ", nodeScopeIndex=" + nodeScopeIndex +
                 ", propertyIndex=" + propertyIndex +

Added: 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/indexAugment/IndexAugmentorFactory.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/indexAugment/IndexAugmentorFactory.java?rev=1720261&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/indexAugment/IndexAugmentorFactory.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/indexAugment/IndexAugmentorFactory.java
 Tue Dec 15 22:27:44 2015
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.oak.plugins.index.lucene.indexAugment;
+
+import org.apache.jackrabbit.oak.api.PropertyState;
+import 
org.apache.jackrabbit.oak.plugins.index.lucene.spi.FulltextQueryTermsProvider;
+import org.apache.jackrabbit.oak.plugins.index.lucene.spi.IndexFieldProvider;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.document.Field;
+import org.apache.lucene.search.Query;
+
+import java.util.Collections;
+
+public interface IndexAugmentorFactory {
+    IndexAugmentorFactory DEFAULT = new IndexAugmentorFactory() {
+        @Override
+        public IndexFieldProvider getIndexFieldProvider() {
+            return new IndexFieldProvider() {
+                @Override
+                public Iterable<Field> getAugmentedFields(String path, String 
propertyName,
+                                                      NodeState document, 
PropertyState property,
+                                                      NodeState 
indexDefinition) {
+                    return Collections.emptyList();
+                }
+            };
+        }
+
+        @Override
+        public FulltextQueryTermsProvider getFulltextQueryTermsProvider() {
+            return new FulltextQueryTermsProvider() {
+                @Override
+                public Query getQueryTerm(String text, Analyzer analyzer) {
+                    return null;
+                }
+            };
+        }
+    };
+
+    IndexFieldProvider getIndexFieldProvider();
+
+    FulltextQueryTermsProvider getFulltextQueryTermsProvider();
+}

Propchange: 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/indexAugment/IndexAugmentorFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/indexAugment/impl/IndexAugmentorFactoryImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/indexAugment/impl/IndexAugmentorFactoryImpl.java?rev=1720261&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/indexAugment/impl/IndexAugmentorFactoryImpl.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/indexAugment/impl/IndexAugmentorFactoryImpl.java
 Tue Dec 15 22:27:44 2015
@@ -0,0 +1,162 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.oak.plugins.index.lucene.indexAugment.impl;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.ReferencePolicy;
+import org.apache.felix.scr.annotations.References;
+import org.apache.felix.scr.annotations.Service;
+import org.apache.jackrabbit.oak.api.PropertyState;
+import 
org.apache.jackrabbit.oak.plugins.index.lucene.indexAugment.IndexAugmentorFactory;
+import 
org.apache.jackrabbit.oak.plugins.index.lucene.spi.FulltextQueryTermsProvider;
+import org.apache.jackrabbit.oak.plugins.index.lucene.spi.IndexFieldProvider;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.jackrabbit.oak.util.PerfLogger;
+import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.document.Field;
+import org.apache.lucene.search.BooleanClause;
+import org.apache.lucene.search.BooleanQuery;
+import org.apache.lucene.search.Query;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+import java.util.Set;
+
+@Component(metatype = false, immediate = true)
+@Service(value = IndexAugmentorFactory.class)
+@References({
+        @Reference(name = "IndexFieldProvider",
+                policy = ReferencePolicy.DYNAMIC,
+                cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE,
+                referenceInterface = IndexFieldProvider.class,
+                bind = "bindIndexFieldProvider",
+                unbind = "unbindIndexFieldProvider"),
+        @Reference(name = "FulltextQueryTermsProvider",
+                policy = ReferencePolicy.DYNAMIC,
+                cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE,
+                referenceInterface = FulltextQueryTermsProvider.class,
+                bind = "bindFulltextQueryTermsProvider",
+                unbind = "unbindFulltextQueryTermsProvider")
+})
+public class IndexAugmentorFactoryImpl implements IndexAugmentorFactory {
+
+    private static final Logger LOG = 
LoggerFactory.getLogger(IndexAugmentorFactoryImpl.class);
+    private static final PerfLogger PERFLOG = new PerfLogger(
+            LoggerFactory.getLogger(IndexAugmentorFactoryImpl.class.getName() 
+ ".perf"));
+
+    private Set<IndexFieldProvider> indexFieldProviders =
+            Sets.newConcurrentHashSet();
+
+    private Set<FulltextQueryTermsProvider> fulltextQueryTermsProviders =
+            Sets.newConcurrentHashSet();
+
+    private IndexFieldProvider indexFieldProvider = new 
CompositeIndexFieldProvider();
+    private FulltextQueryTermsProvider fulltextQueryTermsProvider = new 
CompositeFulltextQueryTermsProvider();
+
+    @Deactivate
+    private void deactivate() {
+        indexFieldProviders.clear();
+        fulltextQueryTermsProviders.clear();
+    }
+
+    public IndexFieldProvider getIndexFieldProvider() {
+        return indexFieldProvider;
+    }
+
+    public FulltextQueryTermsProvider getFulltextQueryTermsProvider() {
+        return fulltextQueryTermsProvider;
+    }
+
+    class CompositeIndexFieldProvider implements IndexFieldProvider {
+        @Override
+        public List<Field> getAugmentedFields(final String path, final String 
propertyName,
+                                              final NodeState document, final 
PropertyState property,
+                                              final NodeState indexDefinition) 
{
+            List<Field> fields = Lists.newArrayList();
+            for (IndexFieldProvider indexFieldProvider : indexFieldProviders) {
+                final long start = PERFLOG.start();
+                Iterable<Field> providedFields = 
indexFieldProvider.getAugmentedFields(path, propertyName,
+                        document, property,
+                        indexDefinition);
+                PERFLOG.end(start, 1, "indexFieldProvider: {}, path: {}, 
propertyName: {}",
+                        indexFieldProvider, path, propertyName);
+                if (providedFields != null) {
+                    for (Field f : providedFields) {
+                        fields.add(f);
+                    }
+                }
+            }
+            return fields;
+        }
+    }
+
+    class CompositeFulltextQueryTermsProvider implements 
FulltextQueryTermsProvider {
+        @Override
+        public Query getQueryTerm(final String text, final Analyzer analyzer) {
+            List<Query> subQueries = Lists.newArrayList();
+            for (FulltextQueryTermsProvider fulltextQueryTermsProvider : 
fulltextQueryTermsProviders) {
+                final long start = PERFLOG.start();
+                Query subQuery = fulltextQueryTermsProvider.getQueryTerm(text, 
analyzer);
+                PERFLOG.end(start, 1, "fulltextQueryTermsProvider: {}, text: 
{}", fulltextQueryTermsProvider, text);
+                if (subQuery != null) {
+                    subQueries.add(subQuery);
+                }
+            }
+
+            Query ret;
+            if (subQueries.size() == 0) {
+                ret = null;
+            } else if (subQueries.size() == 1) {
+                ret = subQueries.get(0);
+            } else {
+                BooleanQuery query = new BooleanQuery();
+                for ( Query subQuery : subQueries ) {
+                    query.add(subQuery, BooleanClause.Occur.SHOULD);
+                }
+                ret = query;
+            }
+
+            return ret;
+        }
+    }
+
+    private void bindIndexFieldProvider(IndexFieldProvider indexFieldProvider) 
{
+        indexFieldProviders.add(indexFieldProvider);
+        LOG.info("bindIndexFieldProvider: {}", indexFieldProvider);
+    }
+
+    private void unbindIndexFieldProvider(IndexFieldProvider 
indexFieldProvider) {
+        indexFieldProviders.remove(indexFieldProvider);
+        LOG.info("unbindIndexFieldProvider: {}", indexFieldProvider);
+    }
+
+    private void bindFulltextQueryTermsProvider(FulltextQueryTermsProvider 
fulltextQueryTermsProvider) {
+        fulltextQueryTermsProviders.add(fulltextQueryTermsProvider);
+        LOG.info("bindFulltextQueryTermsProvider: {}", 
fulltextQueryTermsProvider);
+    }
+
+    private void unbindFulltextQueryTermsProvider(FulltextQueryTermsProvider 
fulltextQueryTermsProvider) {
+        fulltextQueryTermsProviders.remove(fulltextQueryTermsProvider);
+        LOG.info("unbindFulltextQueryTermsProvider: {}", 
fulltextQueryTermsProvider);
+    }
+}

Propchange: 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/indexAugment/impl/IndexAugmentorFactoryImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/package-info.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/package-info.java?rev=1720261&r1=1720260&r2=1720261&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/package-info.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/package-info.java
 Tue Dec 15 22:27:44 2015
@@ -14,9 +14,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-@Version("2.9.0")
+@Version("3.0.0")
 @Export(optional = "provide:=true")
 package org.apache.jackrabbit.oak.plugins.index.lucene;
 
 import aQute.bnd.annotation.Version;
-import aQute.bnd.annotation.Export;
\ No newline at end of file
+import aQute.bnd.annotation.Export;

Added: 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/spi/FulltextQueryTermsProvider.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/spi/FulltextQueryTermsProvider.java?rev=1720261&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/spi/FulltextQueryTermsProvider.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/spi/FulltextQueryTermsProvider.java
 Tue Dec 15 22:27:44 2015
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.oak.plugins.index.lucene.spi;
+
+import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.search.Query;
+
+/**
+ * Implementations of this interface would get callbacks while forming lucene 
full text queries.
+ */
+public interface FulltextQueryTermsProvider {
+    /**
+     * This method would get called while forming full text clause for full 
text clause not constrained on a particular
+     * field.
+     * @param text full text term
+     * @param analyzer {@link Analyzer} being used while forming the query. 
Can be used to analyze text consistently.
+     * @return {@link Query} object to be OR'ed with query being prepared. 
{@code null}, if nothing is to be added.
+     */
+    Query getQueryTerm(final String text, final Analyzer analyzer);
+}

Propchange: 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/spi/FulltextQueryTermsProvider.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/spi/IndexFieldProvider.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/spi/IndexFieldProvider.java?rev=1720261&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/spi/IndexFieldProvider.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/spi/IndexFieldProvider.java
 Tue Dec 15 22:27:44 2015
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.oak.plugins.index.lucene.spi;
+
+import org.apache.jackrabbit.oak.api.PropertyState;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.lucene.document.Field;
+
+/**
+ * Implementations of this interface would get callbacks while indexing 
documents. It's the responsibility
+ * of the implementation to exit as early as possible if it doesn't care about 
the document being indexed.
+ */
+public interface IndexFieldProvider {
+    /**
+     * This method would get called while indexing property changes. The 
method would be called once for each property
+     * that is changed.
+     *
+     * @param path path of the document being indexed
+     * @param propertyName property name (including relative path, if any) of 
the changed property
+     * @param document {@link NodeState} of the document being indexed
+     * @param property {@link PropertyState} of changed property
+     * @param indexDefinition {@link NodeState} of index definition
+     * @return {@link Iterable} of fields that are to be added to {@link 
org.apache.lucene.document.Document} being prepared
+     */
+    Iterable<Field> getAugmentedFields(final String path, final String 
propertyName,
+                                   final NodeState document, final 
PropertyState property,
+                                   final NodeState indexDefinition);
+}

Propchange: 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/spi/IndexFieldProvider.java
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to