Author: tommaso
Date: Tue Jul 21 14:38:37 2015
New Revision: 1692133

URL: http://svn.apache.org/r1692133
Log:
OAK-3129 - limiting Solr requests per JCR query to 3

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

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=1692133&r1=1692132&r2=1692133&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
 Tue Jul 21 14:38:37 2015
@@ -274,12 +274,19 @@ public class SolrQueryIndex implements F
                     }
                     SolrQuery query = FilterQueryParser.getQuery(filter, 
sortOrder, configuration);
                     if (numFound > 0) {
-                        offset++;
-                        int newOffset = offset * configuration.getRows();
+                        long rows = configuration.getRows();
+                        long maxQueries = numFound / 2;
+                        if (maxQueries > configuration.getRows()) {
+                            // adjust the rows to avoid making more than 3 
Solr requests for this particular query
+                            rows = maxQueries;
+                            query.setParam("rows", String.valueOf(rows));
+                        }
+                        long newOffset = configuration.getRows() + offset * 
rows;
                         if (newOffset >= numFound) {
                             return false;
                         }
                         query.setParam("start", String.valueOf(newOffset));
+                        offset++;
                     }
                     if (log.isDebugEnabled()) {
                         log.debug("sending query {}", query);

Modified: 
jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndexTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndexTest.java?rev=1692133&r1=1692132&r2=1692133&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndexTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndexTest.java
 Tue Jul 21 14:38:37 2015
@@ -32,12 +32,21 @@ import org.apache.jackrabbit.oak.query.a
 import org.apache.jackrabbit.oak.query.index.FilterImpl;
 import org.apache.jackrabbit.oak.spi.query.Cursor;
 import org.apache.jackrabbit.oak.spi.query.Filter;
+import org.apache.jackrabbit.oak.spi.query.IndexRow;
 import org.apache.jackrabbit.oak.spi.query.PropertyValues;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.solr.client.solrj.SolrRequest;
+import org.apache.solr.client.solrj.SolrResponse;
 import org.apache.solr.client.solrj.SolrServer;
+import org.apache.solr.client.solrj.response.QueryResponse;
+import org.apache.solr.common.SolrDocument;
+import org.apache.solr.common.SolrDocumentList;
 import org.apache.solr.common.SolrInputDocument;
+import org.apache.solr.common.params.SolrParams;
+import org.apache.solr.common.util.NamedList;
 import org.junit.Test;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Matchers.any;
@@ -429,4 +438,61 @@ public class SolrQueryIndexTest {
         assertTrue(Math.abs(sizeExact - sizeApprox) < 10);
         assertTrue(Math.abs(sizeExact - sizeFastApprox) > 10000);
     }
+
+    @Test
+    public void testNoMoreThanThreeSolrRequests() throws Exception {
+        NodeState root = mock(NodeState.class);
+        
when(root.getNames(any(String.class))).thenReturn(Collections.<String>emptySet());
+        SelectorImpl selector = new SelectorImpl(root, "a");
+        String sqlQuery = "select [jcr:path], [jcr:score] from [nt:base] as a 
where" +
+                " contains([jcr:content/*], 'founded')";
+        SolrServer solrServer = mock(SolrServer.class);
+        OakSolrConfiguration configuration = new DefaultSolrConfiguration() {
+            @Override
+            public boolean useForPropertyRestrictions() {
+                return true;
+            }
+
+            @Override
+            public int getRows() {
+                return 10;
+            }
+        };
+        SolrQueryIndex solrQueryIndex = new SolrQueryIndex("solr", solrServer, 
configuration);
+        FilterImpl filter = new FilterImpl(selector, sqlQuery, new 
QueryEngineSettings());
+        CountingResponse response = new CountingResponse(0);
+        when(solrServer.query(any(SolrParams.class))).thenReturn(response);
+
+        Cursor cursor = solrQueryIndex.query(filter, root);
+        assertNotNull(cursor);
+        while (cursor.hasNext()) {
+            IndexRow row = cursor.next();
+            assertNotNull(row);
+        }
+        assertEquals(3, response.getCounter());
+    }
+
+    private class CountingResponse extends QueryResponse {
+
+        private int counter;
+
+        public CountingResponse(int counter) {
+            this.counter = counter;
+        }
+
+        @Override
+        public SolrDocumentList getResults() {
+            SolrDocumentList results = new SolrDocumentList();
+            for (int i = 0; i < 1000; i++) {
+                results.add(new SolrDocument());
+            }
+            results.setNumFound(1000);
+            counter++;
+            return results;
+        }
+
+        public int getCounter() {
+            return counter;
+        }
+    }
 }


Reply via email to