You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by yo...@apache.org on 2015/10/25 20:54:44 UTC
svn commit: r1710480 - in /lucene/dev/branches/branch_5x: ./ solr/
solr/core/ solr/core/src/java/org/apache/solr/search/
solr/core/src/java/org/apache/solr/search/facet/
solr/core/src/test/org/apache/solr/search/facet/
Author: yonik
Date: Sun Oct 25 19:54:44 2015
New Revision: 1710480
URL: http://svn.apache.org/viewvc?rev=1710480&view=rev
Log:
SOLR-8192: SOLR-8206: fix allBuckets for multi-valued fields, fix limit:0 and normalize offset to 0 when limit==0
Modified:
lucene/dev/branches/branch_5x/ (props changed)
lucene/dev/branches/branch_5x/solr/ (props changed)
lucene/dev/branches/branch_5x/solr/CHANGES.txt (contents, props changed)
lucene/dev/branches/branch_5x/solr/core/ (props changed)
lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/ (props changed)
lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/facet/FacetField.java
lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/facet/FacetFieldProcessorNumeric.java
lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/facet/FacetRequest.java
lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java
Modified: lucene/dev/branches/branch_5x/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/CHANGES.txt?rev=1710480&r1=1710479&r2=1710480&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/CHANGES.txt (original)
+++ lucene/dev/branches/branch_5x/solr/CHANGES.txt Sun Oct 25 19:54:44 2015
@@ -183,6 +183,11 @@ Bug Fixes
* SOLR-7993: Raw json output for fields stopped working in 5.3.0 when requested fields do not include
the unique key field name. (Bill Bell, Ryan McKinley via shalin)
+* SOLR-8192: JSON Facet API allBuckets:true did not work correctly when faceting
+ on a multi-valued field with sub-facets / facet functions. (yonik)
+
+* SOLR-8206: JSON Facet API limit:0 did not always work correctly. (yonik)
+
Optimizations
----------------------
Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/facet/FacetField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/facet/FacetField.java?rev=1710480&r1=1710479&r2=1710480&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/facet/FacetField.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/facet/FacetField.java Sun Oct 25 19:54:44 2015
@@ -271,7 +271,7 @@ abstract class FacetFieldProcessor exten
return;
}
- // create the deffered aggs up front for use by allBuckets
+ // create the deferred aggs up front for use by allBuckets
createOtherAccs(numDocs, 1);
}
@@ -450,6 +450,20 @@ class SpecialSlotAcc extends SlotAcc {
}
@Override
+ public void setNextReader(LeafReaderContext readerContext) throws IOException {
+ // collectAcc and otherAccs will normally have setNextReader called directly on them.
+ // This, however, will be used when collect(DocSet,slot) variant is used on this Acc.
+ if (collectAcc != null) {
+ collectAcc.setNextReader(readerContext);
+ }
+ if (otherAccs != null) {
+ for (SlotAcc otherAcc : otherAccs) {
+ otherAcc.setNextReader(readerContext);
+ }
+ }
+ }
+
+ @Override
public int compare(int slotA, int slotB) {
throw new UnsupportedOperationException();
}
@@ -561,7 +575,7 @@ abstract class FacetFieldProcessorFCBase
// add a modest amount of over-request if this is a shard request
int lim = freq.limit >= 0 ? (fcontext.isShard() ? (int)(freq.limit*1.1+4) : (int)freq.limit) : Integer.MAX_VALUE;
- int maxsize = (int)(freq.limit > 0 ? freq.offset + lim : Integer.MAX_VALUE - 1);
+ int maxsize = (int)(freq.limit >= 0 ? freq.offset + lim : Integer.MAX_VALUE - 1);
maxsize = Math.min(maxsize, nTerms);
final int sortMul = freq.sortDirection.getMultiplier();
@@ -596,7 +610,7 @@ abstract class FacetFieldProcessorFCBase
bottom.slot = i;
bottom = queue.updateTop();
}
- } else {
+ } else if (lim > 0) {
// queue not full
Slot s = new Slot();
s.slot = i;
Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/facet/FacetFieldProcessorNumeric.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/facet/FacetFieldProcessorNumeric.java?rev=1710480&r1=1710479&r2=1710480&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/facet/FacetFieldProcessorNumeric.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/facet/FacetFieldProcessorNumeric.java Sun Oct 25 19:54:44 2015
@@ -342,7 +342,7 @@ class FacetFieldProcessorNumeric extends
// add a modest amount of over-request if this is a shard request
int lim = freq.limit >= 0 ? (fcontext.isShard() ? (int)(freq.limit*1.1+4) : (int)freq.limit) : Integer.MAX_VALUE;
- int maxsize = (int)(freq.limit > 0 ? freq.offset + lim : Integer.MAX_VALUE - 1);
+ int maxsize = (int)(freq.limit >= 0 ? freq.offset + lim : Integer.MAX_VALUE - 1);
maxsize = Math.min(maxsize, table.cardinality);
final int sortMul = freq.sortDirection.getMultiplier();
Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/facet/FacetRequest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/facet/FacetRequest.java?rev=1710480&r1=1710479&r2=1710480&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/facet/FacetRequest.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/facet/FacetRequest.java Sun Oct 25 19:54:44 2015
@@ -523,6 +523,7 @@ class FacetFieldParser extends FacetPars
facet.field = getField(m);
facet.offset = getLong(m, "offset", facet.offset);
facet.limit = getLong(m, "limit", facet.limit);
+ if (facet.limit == 0) facet.offset = 0; // normalize. an offset with a limit of non-zero isn't useful.
facet.mincount = getLong(m, "mincount", facet.mincount);
facet.missing = getBoolean(m, "missing", facet.missing);
facet.numBuckets = getBoolean(m, "numBuckets", facet.numBuckets);
Modified: lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java?rev=1710480&r1=1710479&r2=1710480&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java Sun Oct 25 19:54:44 2015
@@ -802,6 +802,40 @@ public class TestJsonFacets extends Solr
"x:{ buckets:[{val:a, count:3}, {val:b, count:3}] , allBuckets:{count:6} } }"
);
+ // allBuckets for multi-valued field with stats. This can sometimes take a different path of adding complete DocSets to the Acc
+ // also test limit:0
+ client.testJQ(params(p, "q", "*:*"
+ , "json.facet", "{" +
+ " f0:{type:terms, field:${multi_ss}, allBuckets:true, limit:0} " +
+ ",f1:{type:terms, field:${multi_ss}, allBuckets:true, limit:0, offset:1} " + // offset with 0 limit
+ ",f2:{type:terms, field:${multi_ss}, allBuckets:true, limit:0, facet:{x:'sum(${num_d})'}, sort:'x desc' } " +
+ ",f3:{type:terms, field:${multi_ss}, allBuckets:true, limit:0, missing:true, facet:{x:'sum(${num_d})', y:'avg(${num_d})'}, sort:'x desc' } " +
+ "}"
+ )
+ , "facets=={ 'count':6, " +
+ " f0:{allBuckets:{count:6}, buckets:[]}" +
+ ",f1:{allBuckets:{count:6}, buckets:[]}" +
+ ",f2:{allBuckets:{count:6, x:-15.0}, buckets:[]} " +
+ ",f3:{allBuckets:{count:6, x:-15.0, y:-2.5}, buckets:[], missing:{count:2, x:4.0, y:4.0} }} " +
+ "}"
+ );
+
+ // allBuckets with numeric field with stats.
+ // also test limit:0
+ client.testJQ(params(p, "q", "*:*"
+ , "json.facet", "{" +
+ " f0:{type:terms, field:${num_i}, allBuckets:true, limit:0} " +
+ ",f1:{type:terms, field:${num_i}, allBuckets:true, limit:0, offset:1} " + // offset with 0 limit
+ ",f2:{type:terms, field:${num_i}, allBuckets:true, limit:0, facet:{x:'sum(${num_d})'}, sort:'x desc' } " +
+ "}"
+ )
+ , "facets=={ 'count':6, " +
+ " f0:{allBuckets:{count:5}, buckets:[]}" +
+ ",f1:{allBuckets:{count:5}, buckets:[]}" +
+ ",f2:{allBuckets:{count:5, x:3.0}, buckets:[]} " +
+ "}"
+ );
+
//////////////////////////////////////////////////////////////////////////////////////////////////////////
// test converting legacy facets