Author: tommaso
Date: Tue Mar 22 10:30:17 2016
New Revision: 1736177

URL: http://svn.apache.org/viewvc?rev=1736177&view=rev
Log:
OAK-4126 - avoid loops when suggest/spellcheck query throws exception 
(backported to branch 1.4)

Modified:
    jackrabbit/oak/branches/1.4/   (props changed)
    
jackrabbit/oak/branches/1.4/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java
    
jackrabbit/oak/branches/1.4/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
    
jackrabbit/oak/branches/1.4/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexSuggestionTest.java

Propchange: jackrabbit/oak/branches/1.4/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Mar 22 10:30:17 2016
@@ -1,3 +1,3 @@
 /jackrabbit/oak/branches/1.0:1665962
-/jackrabbit/oak/trunk:1733615,1733875,1733913,1734230,1734254,1735052,1735405,1735484,1735549,1735622,1735638,1735919,1735983
+/jackrabbit/oak/trunk:1733615,1733875,1733913,1734230,1734254,1735052,1735405,1735484,1735549,1735622,1735638,1735919,1735983,1736176
 /jackrabbit/trunk:1345480

Modified: 
jackrabbit/oak/branches/1.4/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.4/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java?rev=1736177&r1=1736176&r2=1736177&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.4/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java
 (original)
+++ 
jackrabbit/oak/branches/1.4/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java
 Tue Mar 22 10:30:17 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/branches/1.4/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.4/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java?rev=1736177&r1=1736176&r2=1736177&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.4/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
 (original)
+++ 
jackrabbit/oak/branches/1.4/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
 Tue Mar 22 10:30:17 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/branches/1.4/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexSuggestionTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.4/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexSuggestionTest.java?rev=1736177&r1=1736176&r2=1736177&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.4/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexSuggestionTest.java
 (original)
+++ 
jackrabbit/oak/branches/1.4/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexSuggestionTest.java
 Tue Mar 22 10:30:17 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 {


Reply via email to