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