You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by to...@apache.org on 2015/06/24 13:10:48 UTC
svn commit: r1687239 -
/jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndex.java
Author: tommaso
Date: Wed Jun 24 11:10:47 2015
New Revision: 1687239
URL: http://svn.apache.org/r1687239
Log:
OAK-2980 - fast result estimate with solr
Modified:
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndex.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=1687239&r1=1687238&r2=1687239&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 Jun 24 11:10:47 2015
@@ -197,12 +197,13 @@ public class SolrQueryIndex implements F
@Override
public Cursor query(final IndexPlan plan, final NodeState root) {
- return query(plan.getFilter(), plan.getSortOrder(), root);
+ return query(plan, plan.getSortOrder(), root);
}
- private Cursor query(Filter filter, List<OrderEntry> sortOrder, NodeState root) {
+ private Cursor query(IndexPlan plan, List<OrderEntry> sortOrder, NodeState root) {
Cursor cursor;
try {
+ Filter filter = plan.getFilter();
final Set<String> relPaths = filter.getFullTextConstraint() != null ? getRelativePaths(filter.getFullTextConstraint())
: Collections.<String>emptySet();
final String parent = relPaths.size() == 0 ? "" : relPaths.iterator().next();
@@ -211,7 +212,7 @@ public class SolrQueryIndex implements F
AbstractIterator<SolrResultRow> iterator = getIterator(filter, sortOrder, parent, parentDepth);
- cursor = new SolrRowCursor(iterator, filter.getQueryEngineSettings());
+ cursor = new SolrRowCursor(iterator, plan, filter.getQueryEngineSettings());
} catch (Exception e) {
throw new RuntimeException(e);
}
@@ -447,8 +448,6 @@ public class SolrQueryIndex implements F
estimator.update(filter, docs);
}
-
-
@Override
public String getPlanDescription(IndexPlan plan, NodeState root) {
return plan.toString();
@@ -456,7 +455,7 @@ public class SolrQueryIndex implements F
@Override
public Cursor query(Filter filter, NodeState rootState) {
- return query(filter, null, rootState);
+ return query(planBuilder(filter).build(), null, rootState);
}
static class SolrResultRow {
@@ -481,12 +480,14 @@ public class SolrQueryIndex implements F
* plus, eventually, the returned stored values if {@link org.apache.solr.common.SolrDocument} is included in the
* {@link org.apache.jackrabbit.oak.plugins.index.solr.query.SolrQueryIndex.SolrResultRow}.
*/
- static class SolrRowCursor implements Cursor {
+ private class SolrRowCursor implements Cursor {
private final Cursor pathCursor;
+ private final IndexPlan plan;
+
SolrResultRow currentRow;
- SolrRowCursor(final Iterator<SolrResultRow> it, QueryEngineSettings settings) {
+ SolrRowCursor(final Iterator<SolrResultRow> it, IndexPlan plan, QueryEngineSettings settings) {
Iterator<String> pathIterator = new Iterator<String>() {
@Override
@@ -506,7 +507,8 @@ public class SolrQueryIndex implements F
}
};
- pathCursor = new Cursors.PathCursor(pathIterator, true, settings);
+ this.plan = plan;
+ this.pathCursor = new Cursors.PathCursor(pathIterator, true, settings);
}
@@ -546,7 +548,28 @@ public class SolrQueryIndex implements F
@Override
public long getSize(SizePrecision precision, long max) {
- return -1;
+ long estimate = -1;
+ switch (precision) {
+ case EXACT:
+ // query solr
+ SolrQuery countQuery = FilterQueryParser.getQuery(plan.getFilter(), null, SolrQueryIndex.this.configuration);
+ countQuery.setRows(0);
+ try {
+ estimate = SolrQueryIndex.this.solrServer.query(countQuery).getResults().getNumFound();
+ } catch (SolrServerException e) {
+ log.warn("could not perform count countQuery {}", countQuery);
+ }
+ break;
+ case APPROXIMATION:
+ // estimate result size
+ estimate = SolrQueryIndex.this.estimator.estimate(plan.getFilter());
+ break;
+ case FAST_APPROXIMATION:
+ // use already computed index plan's estimate
+ estimate = plan.getEstimatedEntryCount();
+ break;
+ }
+ return Math.min(estimate, max);
}
}