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 ca...@apache.org on 2016/01/21 14:15:13 UTC
svn commit: r1725941 - 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: catholicon
Date: Thu Jan 21 13:15:13 2016
New Revision: 1725941
URL: http://svn.apache.org/viewvc?rev=1725941&view=rev
Log:
OAK-3825: Including Resource name to suggestions
Overload :nodaName property which is already used for IndexDefinition.indexNodeNames.
Modified:
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinition.java
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/LuceneIndexEditor.java
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/package-info.java
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexSuggestionTest.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/IndexDefinition.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinition.java?rev=1725941&r1=1725940&r2=1725941&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinition.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinition.java Thu Jan 21 13:15:13 2016
@@ -704,7 +704,7 @@ class IndexDefinition implements Aggrega
this.nodeFullTextIndexed = aggregate.hasNodeAggregates() || anyNodeScopeIndexedProperty();
this.propertyIndexEnabled = hasAnyPropertyIndexConfigured();
this.indexesAllNodesOfMatchingType = areAlMatchingNodeByTypeIndexed();
- this.nodeNameIndexed = getOptionalValue(config, LuceneIndexConstants.INDEX_NODE_NAME, false);
+ this.nodeNameIndexed = evaluateNodeNameIndexed(config);
validateRuleDefinition();
}
@@ -1015,6 +1015,21 @@ class IndexDefinition implements Aggrega
return false;
}
+ private boolean evaluateNodeNameIndexed(NodeState config) {
+ //check global config first
+ if (getOptionalValue(config, LuceneIndexConstants.INDEX_NODE_NAME, false)) {
+ return true;
+ }
+
+ //iterate over property definitions
+ for (PropertyDefinition pd : propConfigs.values()){
+ if (LuceneIndexConstants.PROPDEF_PROP_NODE_NAME.equals(pd.name)){
+ return true;
+ }
+ }
+ return false;
+ }
+
private Aggregate combine(Aggregate propAggregate, String nodeTypeName){
Aggregate nodeTypeAgg = IndexDefinition.this.getAggregate(nodeTypeName);
List<Aggregate.Include> includes = newArrayList();
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=1725941&r1=1725940&r2=1725941&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 Jan 21 13:15:13 2016
@@ -272,6 +272,12 @@ public interface LuceneIndexConstants {
String INDEX_NODE_NAME = "indexNodeName";
/**
+ * Property definition name to indicate indexing node name
+ * Its value should match {@link FieldNames#NODE_NAME}
+ */
+ String PROPDEF_PROP_NODE_NAME = ":nodeName";
+
+ /**
* Boolean property indicating that Lucene directory content
* should be saved as part of NodeState itself as a multi value property
* to allow faster reads (OAK-2809)
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=1725941&r1=1725940&r2=1725941&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 Thu Jan 21 13:15:13 2016
@@ -42,9 +42,10 @@ 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.spi.IndexFieldProvider;
import org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState;
+import org.apache.jackrabbit.oak.plugins.memory.StringPropertyState;
import org.apache.jackrabbit.oak.plugins.tree.TreeFactory;
+import org.apache.jackrabbit.oak.query.QueryImpl;
import org.apache.jackrabbit.oak.spi.commit.Editor;
import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
import org.apache.jackrabbit.oak.spi.state.NodeState;
@@ -317,10 +318,15 @@ public class LuceneIndexEditor implement
List<Field> fields = new ArrayList<Field>();
boolean dirty = false;
- for (PropertyState property : state.getProperties()) {
+
+ //We 'intentionally' are indexing node names only on root state as we don't support indexing relative or
+ //regex for node name indexing
+ PropertyState nodenamePS =
+ new StringPropertyState(FieldNames.NODE_NAME, getName(path));
+ for (PropertyState property : Iterables.concat(state.getProperties(), Collections.singleton(nodenamePS))) {
String pname = property.getName();
- if (!isVisible(pname)) {
+ if (!isVisible(pname) && !FieldNames.NODE_NAME.equals(pname)) {
continue;
}
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=1725941&r1=1725940&r2=1725941&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 Thu Jan 21 13:15:13 2016
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-@Version("4.0.0")
+@Version("4.1.0")
@Export(optional = "provide:=true")
package org.apache.jackrabbit.oak.plugins.index.lucene;
Modified: jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexSuggestionTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexSuggestionTest.java?rev=1725941&r1=1725940&r2=1725941&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexSuggestionTest.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexSuggestionTest.java Thu Jan 21 13:15:13 2016
@@ -43,6 +43,7 @@ import static org.apache.jackrabbit.oak.
import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.REINDEX_PROPERTY_NAME;
import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.TYPE_PROPERTY_NAME;
import static org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.INDEX_RULES;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
@@ -70,6 +71,10 @@ public class LuceneIndexSuggestionTest {
session = (JackrabbitSession)repository.login(new SimpleCredentials("admin", "admin".toCharArray()));
root = session.getRootNode();
}
+ private void createSuggestIndex(String name, String indexedNodeType, String indexedPropertyName)
+ throws Exception {
+ createSuggestIndex(name, indexedNodeType, indexedPropertyName, false, false);
+ }
private void createSuggestIndex(String name, String indexedNodeType, String indexedPropertyName, boolean addFullText, boolean suggestAnalyzed)
throws Exception {
@@ -163,6 +168,31 @@ public class LuceneIndexSuggestionTest {
return "SELECT [rep:suggest()] as suggestion, [jcr:score] as score FROM [" + nodeTypeName + "] WHERE suggest('" + suggestFor + "')";
}
+ //OAK-3825
+ @Test
+ public void suggestNodeName() throws Exception {
+ final String nodeType = "nt:unstructured";
+
+ createSuggestIndex("lucene-suggest", nodeType, LuceneIndexConstants.PROPDEF_PROP_NODE_NAME);
+
+ root.addNode("indexedNode", nodeType);
+ session.save();
+
+ String suggQuery = createSuggestQuery(nodeType, "indexedn");
+ QueryManager queryManager = session.getWorkspace().getQueryManager();
+ QueryResult result = queryManager.createQuery(suggQuery, Query.JCR_SQL2).execute();
+ RowIterator rows = result.getRows();
+
+ String value = null;
+ while (rows.hasNext()) {
+ Row firstRow = rows.nextRow();
+ value = firstRow.getValue("suggestion").getString();
+ break;
+ }
+
+ assertEquals("Node name should be suggested", "indexedNode", value);
+ }
+
//OAK-3157
@Test
public void testSuggestQuery() throws Exception {
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=1725941&r1=1725940&r2=1725941&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 Jan 21 13:15:13 2016
@@ -92,7 +92,11 @@ import static org.apache.jackrabbit.oak.
import static org.apache.jackrabbit.oak.plugins.index.PathFilter.PROP_INCLUDED_PATHS;
import static org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.INCLUDE_PROPERTY_NAMES;
import static org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.ORDERED_PROP_NAMES;
+import static org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.PROPDEF_PROP_NODE_NAME;
+import static org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.PROP_NAME;
import static org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.PROP_NODE;
+import static org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.PROP_PROPERTY_INDEX;
+import static org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.PROP_TYPE;
import static org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.TIKA;
import static org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexEditorTest.createCal;
import static org.apache.jackrabbit.oak.plugins.index.lucene.TestUtil.newNodeAggregator;
@@ -394,6 +398,40 @@ public class LucenePropertyIndexTest ext
String propabQuery = "select [jcr:path] from [nt:base] where LOCALNAME() = 'foo'";
assertThat(explain(propabQuery), containsString("lucene:test1(/oak:index/test1) :nodeName:foo"));
assertQuery(propabQuery, asList("/foo"));
+ assertQuery("select [jcr:path] from [nt:base] where LOCALNAME() = 'bar'", asList("/test/bar"));
+ assertQuery("select [jcr:path] from [nt:base] where LOCALNAME() LIKE 'foo'", asList("/foo"));
+ assertQuery("select [jcr:path] from [nt:base] where LOCALNAME() LIKE 'camel%'", asList("/camelCase"));
+
+ assertQuery("select [jcr:path] from [nt:base] where NAME() = 'bar'", asList("/test/bar"));
+ assertQuery("select [jcr:path] from [nt:base] where NAME() LIKE 'foo'", asList("/foo"));
+ assertQuery("select [jcr:path] from [nt:base] where NAME() LIKE 'camel%'", asList("/camelCase"));
+ }
+
+ //OAK-3825
+ @Test
+ public void nodeNameViaPropDefinition() throws Exception{
+ //make index
+ Tree idx = createIndex("test1", Collections.EMPTY_SET);
+ useV2(idx);
+ Tree rules = idx.addChild(LuceneIndexConstants.INDEX_RULES);
+ rules.setOrderableChildren(true);
+ Tree rule = rules.addChild("nt:base");
+ Tree propDef = rule.addChild(PROP_NODE).addChild("nodeName");
+ propDef.setProperty(PROP_NAME, PROPDEF_PROP_NODE_NAME);
+ propDef.setProperty(PROP_PROPERTY_INDEX, true);
+ root.commit();
+
+ //add content
+ Tree test = root.getTree("/");
+ test.addChild("foo");
+ test.addChild("camelCase");
+ test.addChild("test").addChild("bar");
+ root.commit();
+
+ //test
+ String propabQuery = "select [jcr:path] from [nt:base] where LOCALNAME() = 'foo'";
+ assertThat(explain(propabQuery), containsString("lucene:test1(/oak:index/test1) :nodeName:foo"));
+ assertQuery(propabQuery, asList("/foo"));
assertQuery("select [jcr:path] from [nt:base] where LOCALNAME() = 'bar'", asList("/test/bar"));
assertQuery("select [jcr:path] from [nt:base] where LOCALNAME() LIKE 'foo'", asList("/foo"));
assertQuery("select [jcr:path] from [nt:base] where LOCALNAME() LIKE 'camel%'", asList("/camelCase"));