Author: tommaso
Date: Tue Mar 22 10:23:43 2016
New Revision: 1736176
URL: http://svn.apache.org/viewvc?rev=1736176&view=rev
Log:
OAK-4126 - avoid loops when suggest/spellcheck query throws exception
Modified:
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexSuggestionTest.java
Modified:
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java?rev=1736176&r1=1736175&r2=1736176&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java
(original)
+++
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java
Tue Mar 22 10:23:43 2016
@@ -390,6 +390,7 @@ public class LuceneIndex implements Adva
}
} else if (luceneRequestFacade.getLuceneRequest()
instanceof SpellcheckHelper.SpellcheckQuery) {
SpellcheckHelper.SpellcheckQuery spellcheckQuery =
(SpellcheckHelper.SpellcheckQuery) luceneRequestFacade.getLuceneRequest();
+ noDocs = true;
SuggestWord[] suggestWords =
SpellcheckHelper.getSpellcheck(spellcheckQuery);
// ACL filter spellchecks
@@ -410,9 +411,9 @@ public class LuceneIndex implements Adva
}
queue.add(new LuceneResultRow(suggestedWords));
- noDocs = true;
} else if (luceneRequestFacade.getLuceneRequest()
instanceof SuggestHelper.SuggestQuery) {
SuggestHelper.SuggestQuery suggestQuery =
(SuggestHelper.SuggestQuery) luceneRequestFacade.getLuceneRequest();
+ noDocs = true;
List<Lookup.LookupResult> lookupResults =
SuggestHelper.getSuggestions(indexNode.getLookup(), suggestQuery);
// ACL filter suggestions
@@ -433,7 +434,6 @@ public class LuceneIndex implements Adva
}
queue.add(new LuceneResultRow(suggestedWords));
- noDocs = true;
}
} catch (IOException e) {
LOG.warn("query via {} failed.", LuceneIndex.this, e);
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=1736176&r1=1736175&r2=1736176&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 Mar 22 10:23:43 2016
@@ -98,6 +98,7 @@ import org.apache.lucene.index.Term;
import org.apache.lucene.queries.CustomScoreQuery;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
+import org.apache.lucene.queryparser.classic.QueryParserBase;
import org.apache.lucene.queryparser.flexible.core.QueryNodeException;
import org.apache.lucene.queryparser.flexible.standard.StandardQueryParser;
import
org.apache.lucene.queryparser.flexible.standard.config.StandardQueryConfigHandler;
@@ -448,13 +449,14 @@ public class LucenePropertyIndex impleme
}
} else if (luceneRequestFacade.getLuceneRequest()
instanceof SpellcheckHelper.SpellcheckQuery) {
String aclCheckField =
indexNode.getDefinition().isFullTextEnabled() ? FieldNames.FULLTEXT :
FieldNames.SPELLCHECK;
+ noDocs = true;
SpellcheckHelper.SpellcheckQuery spellcheckQuery =
(SpellcheckHelper.SpellcheckQuery) luceneRequestFacade.getLuceneRequest();
SuggestWord[] suggestWords =
SpellcheckHelper.getSpellcheck(spellcheckQuery);
// ACL filter spellchecks
QueryParser qp = new QueryParser(Version.LUCENE_47,
aclCheckField, indexNode.getDefinition().getAnalyzer());
for (SuggestWord suggestion : suggestWords) {
- Query query = qp.createPhraseQuery(aclCheckField,
qp.escape(suggestion.string));
+ Query query = qp.createPhraseQuery(aclCheckField,
QueryParserBase.escape(suggestion.string));
query = addDescendantClauseIfRequired(query, plan);
@@ -470,9 +472,9 @@ public class LucenePropertyIndex impleme
}
}
- noDocs = true;
} else if (luceneRequestFacade.getLuceneRequest()
instanceof SuggestHelper.SuggestQuery) {
SuggestHelper.SuggestQuery suggestQuery =
(SuggestHelper.SuggestQuery) luceneRequestFacade.getLuceneRequest();
+ noDocs = true;
List<Lookup.LookupResult> lookupResults =
SuggestHelper.getSuggestions(indexNode.getLookup(), suggestQuery);
@@ -482,7 +484,7 @@ public class LucenePropertyIndex impleme
// ACL filter suggestions
for (Lookup.LookupResult suggestion : lookupResults) {
- Query query = qp.parse("\"" +
qp.escape(suggestion.key.toString()) + "\"");
+ Query query = qp.parse("\"" +
QueryParserBase.escape(suggestion.key.toString()) + "\"");
query = addDescendantClauseIfRequired(query, plan);
@@ -497,8 +499,6 @@ public class LucenePropertyIndex impleme
}
}
}
-
- noDocs = true;
}
} catch (Exception e) {
LOG.warn("query via {} failed.", LucenePropertyIndex.this,
e);
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=1736176&r1=1736175&r2=1736176&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
Tue Mar 22 10:23:43 2016
@@ -233,6 +233,34 @@ public class LuceneIndexSuggestionTest {
suggestQueryText, shouldSuggest, false);
}
+ @Test
+ public void avoidInfiniteSuggestions() throws Exception {
+ final String nodeType = "nt:unstructured";
+ final String indexPropName = "description";
+ final String higherRankPropValue = "DD DD DD DD";
+ final String exceptionThrowingPropValue =
"DD~@#$%^&*()_+{}\":?><`1234567890-=[]";
+ final String suggestQueryText = "dd";
+
+ createSuggestIndex("lucene-suggest", nodeType, indexPropName);
+
+ root.addNode("higherRankNode", nodeType).setProperty(indexPropName,
higherRankPropValue);
+ root.addNode("exceptionThrowingNode",
nodeType).setProperty(indexPropName, exceptionThrowingPropValue);
+ session.save();
+
+ String suggQuery = createSuggestQuery(nodeType, suggestQueryText);
+ QueryManager queryManager = session.getWorkspace().getQueryManager();
+ QueryResult result = queryManager.createQuery(suggQuery,
Query.JCR_SQL2).execute();
+ RowIterator rows = result.getRows();
+
+ int count = 0;
+ while (count < 3 && rows.hasNext()) {
+ count++;
+ rows.nextRow();
+ }
+
+ assertTrue("There must not be more than 2 suggestions", count <= 2);
+ }
+
//OAK-3156
@Test
public void testSuggestQueryWithUserAccess() throws Exception {