You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ch...@apache.org on 2016/12/08 05:17:34 UTC
svn commit: r1773176 - in /jackrabbit/oak/trunk/oak-lucene/src:
main/java/org/apache/jackrabbit/oak/plugins/index/lucene/
test/java/org/apache/jackrabbit/oak/plugins/index/lucene/
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);