You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by da...@apache.org on 2018/12/07 09:57:41 UTC

[26/37] lucene-solr:jira/http2: Add 'prelim_sort' helper to SolrJ's TermsFacetMap

Add 'prelim_sort' helper to SolrJ's TermsFacetMap


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/a5fb6f8a
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/a5fb6f8a
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/a5fb6f8a

Branch: refs/heads/jira/http2
Commit: a5fb6f8adc6a0d65b11c4738c5bbf751fc01cffe
Parents: 868e005
Author: Jason Gerlowski <ge...@apache.org>
Authored: Tue Dec 4 12:49:02 2018 -0500
Committer: Jason Gerlowski <ge...@apache.org>
Committed: Tue Dec 4 14:29:29 2018 -0500

----------------------------------------------------------------------
 .../solrj/request/json/TermsFacetMap.java       | 26 ++++++++++++++++++++
 ...JsonQueryRequestFacetingIntegrationTest.java | 23 +++++++++++++++++
 2 files changed, 49 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a5fb6f8a/solr/solrj/src/java/org/apache/solr/client/solrj/request/json/TermsFacetMap.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/request/json/TermsFacetMap.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/json/TermsFacetMap.java
index e28f8a8..ea7c2fd 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/request/json/TermsFacetMap.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/json/TermsFacetMap.java
@@ -67,6 +67,12 @@ public class TermsFacetMap extends JsonFacetMap<TermsFacetMap> {
    *
    * Values can be based on 'count' (the number of results in each bucket), 'index' (the natural order of bucket values),
    * or on any stat facet that occurs in the bucket.  Defaults to "count desc" if not specified.
+   *
+   * By default, {@code sort} is calculated for all buckets generated by all shards.  If {@code sort} is expensive a
+   * cheaper approximation can be provided using {@link #setPreliminarySort(String)} that will be run instead during
+   * bucket collection.
+   *
+   * @see TermsFacetMap#setPreliminarySort(String)
    */
   public TermsFacetMap setSort(String sortString) {
     if (sortString == null) {
@@ -77,6 +83,26 @@ public class TermsFacetMap extends JsonFacetMap<TermsFacetMap> {
   }
 
   /**
+   * Indicates an approximate sort calculation to be performed during initial bucket generation and collection.
+   *
+   * Values can be based on 'count' (the number of results in each bucket), 'index' (the natural order of bucket values),
+   * or on any stat facet that occurs in the bucket.  Defaults to "count desc" if not specified.
+   *
+   * When no {@code prelim_sort} is provided, {@code sort} is calculated on all buckets generated by all shards.  If
+   * {@code sort} is expensive, {@code prelim_sort} can be used to provide a cheaper approximation calculation that is
+   * run instead on initial bucket collection.  {@code sort} is still used when assembling the final list of buckets.
+   *
+   * @see TermsFacetMap#setSort(String)
+   */
+  public TermsFacetMap setPreliminarySort(String preliminarySort) {
+    if (preliminarySort == null) {
+      throw new IllegalArgumentException("Parameter 'preliminarySort' must be non-null");
+    }
+    put("prelim_sort", preliminarySort);
+    return this;
+  }
+
+  /**
    * Indicates the number of additional buckets to request internally beyond those required by {@link #setLimit(int)}.
    *
    * Defaults to -1 if not specified, which triggers some heuristic guessing based on other settings.

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a5fb6f8a/solr/solrj/src/test/org/apache/solr/client/solrj/request/json/JsonQueryRequestFacetingIntegrationTest.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/request/json/JsonQueryRequestFacetingIntegrationTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/request/json/JsonQueryRequestFacetingIntegrationTest.java
index 344fdd2..4852c76 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/request/json/JsonQueryRequestFacetingIntegrationTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/request/json/JsonQueryRequestFacetingIntegrationTest.java
@@ -93,6 +93,29 @@ public class JsonQueryRequestFacetingIntegrationTest extends SolrCloudTestCase {
   }
 
   @Test
+  public void testTermsFacetWithPrelimSort() throws Exception {
+    final TermsFacetMap categoriesFacetMap = new TermsFacetMap("cat")
+        .setPreliminarySort("count desc")
+        .setSort("index desc")
+        .setLimit(3);
+    final JsonQueryRequest request = new JsonQueryRequest()
+        .setQuery("*:*")
+        .withFacet("top_cats", categoriesFacetMap);
+
+    QueryResponse response = request.process(cluster.getSolrClient(), COLLECTION_NAME);
+
+    assertExpectedDocumentsFoundAndReturned(response, NUM_TECHPRODUCTS_DOCS, 10);
+    final NestableJsonFacet topLevelFacetData = response.getJsonFacetingResponse();
+    assertEquals(NUM_TECHPRODUCTS_DOCS, topLevelFacetData.getCount());
+    //The prelim_sort/sort combination should give us the 3 most popular categories in reverse-alpha order
+    assertHasFacetWithBucketValues(topLevelFacetData, "top_cats",
+        new FacetBucket("memory", NUM_MEMORY),
+        new FacetBucket("electronics", NUM_ELECTRONICS),
+        new FacetBucket("currency", NUM_CURRENCY));
+
+  }
+
+  @Test
   public void testTermsFacetWithNumBucketsRequested() throws Exception {
     final TermsFacetMap categoriesFacetMap = new TermsFacetMap("cat")
         .includeTotalNumBuckets(true)