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;
+ }
+ }
}