Author: chetanm
Date: Thu Dec 8 05:17:34 2016
New Revision: 1773176
URL: http://svn.apache.org/viewvc?rev=1773176&view=rev
Log:
OAK-4400 - Correlate index with the index definition used to build it
Add support for "refresh" of stored index definition without reindexing for
edge cases
Modified:
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorContext.java
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java
Modified:
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java?rev=1773176&r1=1773175&r2=1773176&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java
(original)
+++
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java
Thu Dec 8 05:17:34 2016
@@ -361,4 +361,9 @@ public interface LuceneIndexConstants {
* String property: the function to index, for function-based index
*/
String PROP_FUNCTION = "function";
+
+ /**
+ * Boolean property which signal LuceneIndexEditor to refresh the stored
index definition
+ */
+ String PROP_REFRESH_DEFN = "refresh";
}
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=1773176&r1=1773175&r2=1773176&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
Thu Dec 8 05:17:34 2016
@@ -112,7 +112,7 @@ public class LuceneIndexEditorContext {
this.definitionBuilder = definition;
this.indexWriterFactory = indexWriterFactory;
this.definition = indexDefinition != null ? indexDefinition :
- new IndexDefinition(root,
definition.getBaseState(),indexingContext.getIndexPath());
+ createIndexDefinition(root, definition, indexingContext);
this.indexedNodes = 0;
this.updateCallback = updateCallback;
this.extractedTextCache = extractedTextCache;
@@ -191,8 +191,7 @@ public class LuceneIndexEditorContext {
//as index definition does not get modified as part of IndexUpdate run
in most case we rely on base state
//For case where index definition is rewritten there we get fresh state
NodeState defnState = indexDefnRewritten ?
definitionBuilder.getNodeState() : definitionBuilder.getBaseState();
- definitionBuilder.setChildNode(IndexDefinition.INDEX_DEFINITION_NODE,
- NodeStateCloner.cloneVisibleState(defnState));
+ definitionBuilder.setChildNode(IndexDefinition.INDEX_DEFINITION_NODE,
NodeStateCloner.cloneVisibleState(defnState));
String uid = configureUniqueId(definitionBuilder);
//Refresh the index definition based on update builder state
@@ -276,6 +275,17 @@ public class LuceneIndexEditorContext {
return uid;
}
+ private static IndexDefinition createIndexDefinition(NodeState root,
NodeBuilder definition, IndexingContext
+ indexingContext) {
+ NodeState defnState = definition.getBaseState();
+ if (definition.getBoolean(LuceneIndexConstants.PROP_REFRESH_DEFN)){
+ definition.removeProperty(LuceneIndexConstants.PROP_REFRESH_DEFN);
+ definition.setChildNode(IndexDefinition.INDEX_DEFINITION_NODE,
NodeStateCloner.cloneVisibleState(defnState));
+ log.info("Refreshed the index definition for [{}]",
indexingContext.getIndexPath());
+ }
+ return new IndexDefinition(root,
defnState,indexingContext.getIndexPath());
+ }
+
private static Parser initializeTikaParser(IndexDefinition definition) {
ClassLoader current = Thread.currentThread().getContextClassLoader();
try {
Modified:
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java?rev=1773176&r1=1773175&r2=1773176&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java
(original)
+++
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java
Thu Dec 8 05:17:34 2016
@@ -2457,6 +2457,41 @@ public class LucenePropertyIndexTest ext
assertPlanAndQuery(query, "lucene:test1(/oak:index/test1)",
asList("/b"));
}
+ @Test
+ public void refreshIndexDefinition() throws Exception{
+ IndexDefinitionBuilder idxb = new IndexDefinitionBuilder().noAsync();
+ idxb.indexRule("nt:base").property("foo").propertyIndex();
+ Tree idx = root.getTree("/").getChild("oak:index").addChild("test1");
+ idxb.build(idx);
+
+ Tree rootTree = root.getTree("/");
+ rootTree.addChild("a").setProperty("foo", "bar");
+ rootTree.addChild("b").setProperty("bar", "bar");
+ root.commit();
+
+ String query = "select * from [nt:base] where [foo] = 'bar'";
+ assertPlanAndQuery(query, "lucene:test1(/oak:index/test1)",
asList("/a"));
+
+ Tree barProp =
root.getTree("/oak:index/test1/indexRules/nt:base/properties").addChild("bar");
+ barProp.setProperty("name", "bar");
+ barProp.setProperty("propertyIndex", true);
+ root.commit();
+
+ query = "select * from [nt:base] where [bar] = 'bar'";
+ assertThat(explain(query),
not(containsString("lucene:test1(/oak:index/test1)")));
+
+ //Instead of reindex just refresh the index definition so that new
index definition gets picked up
+
root.getTree("/oak:index/test1").setProperty(LuceneIndexConstants.PROP_REFRESH_DEFN,
true);
+ root.commit();
+
+ //Plan would reflect new defintion
+ assertThat(explain(query),
containsString("lucene:test1(/oak:index/test1)"));
+
assertFalse(root.getTree("/oak:index/test1").hasProperty(LuceneIndexConstants.PROP_REFRESH_DEFN));
+
+ //However as reindex was not done query would result in empty set
+ assertPlanAndQuery(query, "lucene:test1(/oak:index/test1)",
Collections.<String>emptyList());
+ }
+
private void assertPlanAndQuery(String query, String planExpectation,
List<String> paths){
assertThat(explain(query), containsString(planExpectation));
assertQuery(query, paths);