Author: tommaso
Date: Wed Feb 11 15:12:44 2015
New Revision: 1658983

URL: http://svn.apache.org/r1658983
Log:
OAK-2473 - added ACL checks for suggestions in Lucene and Solr indexes

Modified:
    
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
    
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndex.java

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=1658983&r1=1658982&r2=1658983&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
 Wed Feb 11 15:12:44 2015
@@ -65,6 +65,7 @@ import org.apache.jackrabbit.oak.spi.que
 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;
@@ -347,11 +348,26 @@ public class LucenePropertyIndex impleme
                         noDocs = true;
                     } else if (luceneRequestFacade.getLuceneRequest() 
instanceof SuggestHelper.SuggestQuery) {
                         SuggestHelper.SuggestQuery suggestQuery = 
(SuggestHelper.SuggestQuery) luceneRequestFacade.getLuceneRequest();
+
                         List<Lookup.LookupResult> lookupResults = 
SuggestHelper.getSuggestions(suggestQuery);
+
+                        // ACL filter suggestions
                         Collection<String> suggestedWords = new 
ArrayList<String>(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, 100);
+                            if (topDocs.totalHits > 0) {
+                                for (ScoreDoc doc : topDocs.scoreDocs) {
+                                    Document retrievedDoc = 
searcher.doc(doc.doc);
+                                    if 
(filter.isAccessible(retrievedDoc.get(FieldNames.PATH))) {
+                                        suggestedWords.add("{term=" + 
suggestion.key + ",weight=" + suggestion.value + "}");
+                                        break;
+                                    }
+                                }
+                            }
                         }
+
                         queue.add(new LuceneResultRow(suggestedWords));
                         noDocs = true;
                     }

Modified: 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndex.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndex.java?rev=1658983&r1=1658982&r2=1658983&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndex.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndex.java
 Wed Feb 11 15:12:44 2015
@@ -49,6 +49,7 @@ import org.apache.jackrabbit.oak.spi.que
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrServer;
+import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.response.QueryResponse;
 import org.apache.solr.client.solrj.response.SpellCheckResponse;
 import org.apache.solr.common.SolrDocument;
@@ -298,26 +299,7 @@ public class SolrQueryIndex implements F
                         if (suggest != null) {
                             Set<Map.Entry<String, Object>> suggestEntries = 
suggest.entrySet();
                             if (!suggestEntries.isEmpty()) {
-                                SolrDocument fakeDoc = new SolrDocument();
-                                for (Map.Entry<String, Object> suggestor : 
suggestEntries) {
-                                    SimpleOrderedMap<Object> 
suggestionResponses = ((SimpleOrderedMap) suggestor.getValue());
-                                    for (Map.Entry<String, Object> 
suggestionResponse : suggestionResponses) {
-                                        SimpleOrderedMap<Object> 
suggestionResults = ((SimpleOrderedMap) suggestionResponse.getValue());
-                                        for (Map.Entry<String, Object> 
suggestionResult : suggestionResults) {
-                                            if 
("suggestions".equals(suggestionResult.getKey())) {
-                                                
ArrayList<SimpleOrderedMap<Object>> suggestions = 
((ArrayList<SimpleOrderedMap<Object>>) suggestionResult.getValue());
-                                                if (suggestions.isEmpty()) {
-                                                    
fakeDoc.addField(QueryImpl.REP_SUGGEST, "[]");
-                                                }
-                                                else {
-                                                    for 
(SimpleOrderedMap<Object> suggestion : suggestions) {
-                                                        
fakeDoc.addField(QueryImpl.REP_SUGGEST, "{term=" + suggestion.get("term") + 
",weight=" + suggestion.get("weight") + "}");
-                                                    }
-                                                }
-                                            }
-                                        }
-                                    }
-                                }
+                                SolrDocument fakeDoc = 
getSuggestions(suggestEntries, filter);
                                 queue.add(new SolrResultRow("/", 1.0, 
fakeDoc));
                                 noDocs = true;
                             }
@@ -342,22 +324,49 @@ public class SolrQueryIndex implements F
         return cursor;
     }
 
-    void onRetrievedDocs(Filter filter, SolrDocumentList docs) {
-        // do nothing
-    }
+    private SolrDocument getSuggestions(Set<Map.Entry<String, Object>> 
suggestEntries, Filter filter) throws SolrServerException {
+        Collection<SimpleOrderedMap<Object>> retrievedSuggestions = new 
HashSet<SimpleOrderedMap<Object>>();
+        SolrDocument fakeDoc = new SolrDocument();
+        for (Map.Entry<String, Object> suggestor : suggestEntries) {
+            SimpleOrderedMap<Object> suggestionResponses = ((SimpleOrderedMap) 
suggestor.getValue());
+            for (Map.Entry<String, Object> suggestionResponse : 
suggestionResponses) {
+                SimpleOrderedMap<Object> suggestionResults = 
((SimpleOrderedMap) suggestionResponse.getValue());
+                for (Map.Entry<String, Object> suggestionResult : 
suggestionResults) {
+                    if ("suggestions".equals(suggestionResult.getKey())) {
+                        ArrayList<SimpleOrderedMap<Object>> suggestions = 
((ArrayList<SimpleOrderedMap<Object>>) suggestionResult.getValue());
+                        if (!suggestions.isEmpty()) {
+                            for (SimpleOrderedMap<Object> suggestion : 
suggestions) {
+                                retrievedSuggestions.add(suggestion);
+                            }
+                        }
+                    }
+                }
+            }
+        }
 
-    private boolean exists(SolrResultRow row, NodeState root) {
-        boolean result = true;
-        NodeState nodeState = root;
-        for (String n : PathUtils.elements(row.path)) {
-            if (nodeState.hasChildNode(n)) {
-                nodeState = nodeState.getChildNode(n);
-            } else {
-                result = false;
-                break;
+        // ACL filter suggestions
+        for (SimpleOrderedMap<Object> suggestion : retrievedSuggestions) {
+            SolrQuery solrQuery = new SolrQuery();
+            solrQuery.setParam("q", String.valueOf(suggestion.get("term")));
+            solrQuery.setParam("df", configuration.getCatchAllField());
+            solrQuery.setParam("q.op", "AND");
+            solrQuery.setParam("rows", "100");
+            QueryResponse suggestQueryResponse = solrServer.query(solrQuery);
+            SolrDocumentList results = suggestQueryResponse.getResults();
+            if (results != null && results.getNumFound() > 0) {
+                for (SolrDocument doc : results) {
+                    if 
(filter.isAccessible(String.valueOf(doc.getFieldValue(configuration.getPathField()))))
 {
+                        fakeDoc.addField(QueryImpl.REP_SUGGEST, "{term=" + 
suggestion.get("term") + ",weight=" + suggestion.get("weight") + "}");
+                        break;
+                    }
+                }
             }
         }
-        return result;
+        return fakeDoc;
+    }
+
+    void onRetrievedDocs(Filter filter, SolrDocumentList docs) {
+        // do nothing
     }
 
     static boolean isIgnoredProperty(String propertyName, OakSolrConfiguration 
configuration) {
@@ -451,8 +460,9 @@ public class SolrQueryIndex implements F
                         return PropertyValues.newDouble(currentRow.score);
                     }
                     // TODO : make inclusion of doc configurable
+                    Collection<Object> fieldValues = 
currentRow.doc.getFieldValues(columnName);
                     return currentRow.doc != null ? PropertyValues.newString(
-                            
String.valueOf(currentRow.doc.getFieldValue(columnName))) : null;
+                            Iterables.toString(fieldValues != null ? 
fieldValues : Collections.emptyList())) : null;
                 }
 
             };


Reply via email to