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