Index: oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java =================================================================== --- oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java (revision 1657511) +++ oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java (working copy) @@ -20,7 +20,6 @@ import java.io.IOException; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Deque; @@ -65,6 +64,7 @@ import org.apache.jackrabbit.oak.spi.query.QueryIndex.AdvanceFulltextQueryIndex; import org.apache.jackrabbit.oak.spi.state.NodeState; import org.apache.lucene.analysis.Analyzer; +import org.apache.lucene.document.Document; import org.apache.lucene.index.FieldInfo; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.MultiFields; @@ -80,6 +80,7 @@ import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.MatchAllDocsQuery; import org.apache.lucene.search.NumericRangeQuery; +import org.apache.lucene.search.PhraseQuery; import org.apache.lucene.search.PrefixQuery; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; @@ -244,7 +245,7 @@ } @Override - public Cursor query(final IndexPlan plan, NodeState rootState) { + public Cursor query(final IndexPlan plan, final NodeState rootState) { final Filter filter = plan.getFilter(); final Sort sort = getSort(plan); final PlanResult pr = getPlanResult(plan); @@ -348,10 +349,25 @@ } else if (luceneRequestFacade.getLuceneRequest() instanceof SuggestHelper.SuggestQuery) { SuggestHelper.SuggestQuery suggestQuery = (SuggestHelper.SuggestQuery) luceneRequestFacade.getLuceneRequest(); List lookupResults = SuggestHelper.getSuggestions(suggestQuery); + + // ACL filter suggestions Collection suggestedWords = new ArrayList(lookupResults.size()); - for (Lookup.LookupResult suggestWord : lookupResults) { - suggestedWords.add("{term=" + suggestWord.key + ",weight=" + suggestWord.value + "}"); + QueryParser qp = new QueryParser(Version.LUCENE_47, FieldNames.FULLTEXT, indexNode.getDefinition().getAnalyzer()); + for (Lookup.LookupResult suggestion : lookupResults) { + Query query = qp.createPhraseQuery(FieldNames.FULLTEXT, suggestion.key.toString()); + + TopDocs topDocs = searcher.search(query, 1); + if (topDocs.totalHits > 0) { + for (ScoreDoc doc : topDocs.scoreDocs) { + Document retrievedDoc = searcher.doc(doc.doc); + if (exists(retrievedDoc.get(FieldNames.PATH), rootState)) { + suggestedWords.add("{term=" + suggestion.key + ",weight=" + suggestion.value + "}"); + break; + } + } + } } + queue.add(new LuceneResultRow(suggestedWords)); noDocs = true; } @@ -371,6 +387,20 @@ return new LucenePathCursor(itr, plan, settings); } + private boolean exists(String path, NodeState root) { + boolean result = true; + NodeState nodeState = root; + for (String n : PathUtils.elements(path)) { + if (nodeState.hasChildNode(n)) { + nodeState = nodeState.getChildNode(n); + } else { + result = false; + break; + } + } + return result; + } + @Override public NodeAggregator getNodeAggregator() { return null;