You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by tf...@apache.org on 2017/07/17 19:58:27 UTC
lucene-solr:branch_7x: SOLR-11073: Fix overflow in interval faceting
when querying Long limits
Repository: lucene-solr
Updated Branches:
refs/heads/branch_7x 2cac0a732 -> f55ed9cba
SOLR-11073: Fix overflow in interval faceting when querying Long limits
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/f55ed9cb
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/f55ed9cb
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/f55ed9cb
Branch: refs/heads/branch_7x
Commit: f55ed9cba7fe0690a61192628dde7a6032ff8afd
Parents: 2cac0a7
Author: Tomas Fernandez Lobbe <tf...@apache.org>
Authored: Fri Jul 14 17:27:11 2017 -0700
Committer: Tomas Fernandez Lobbe <tf...@apache.org>
Committed: Mon Jul 17 12:55:47 2017 -0700
----------------------------------------------------------------------
solr/CHANGES.txt | 3 ++
.../org/apache/solr/request/IntervalFacets.java | 31 ++++++++++++++++----
.../solr/request/TestIntervalFaceting.java | 15 ++++++++--
3 files changed, 42 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f55ed9cb/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 78b4333..ae5f64e 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -337,6 +337,9 @@ Bug Fixes
* SOLR-11043: Fix facet.range.method=dv and interval facets on single-valued float fields with negative values.
(Tomás Fernández Löbbe, Steve Rowe)
+* SOLR-11073: Fix overflow in interval faceting when querying Long limits (e.g. (Long.MAX_VALUE TO Long.MAX_VALUE])
+ (Tomás Fernández Löbbe)
+
Optimizations
----------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f55ed9cb/solr/core/src/java/org/apache/solr/request/IntervalFacets.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/request/IntervalFacets.java b/solr/core/src/java/org/apache/solr/request/IntervalFacets.java
index 1f7cd42..c2d6ab0 100644
--- a/solr/core/src/java/org/apache/solr/request/IntervalFacets.java
+++ b/solr/core/src/java/org/apache/solr/request/IntervalFacets.java
@@ -439,12 +439,12 @@ public class IntervalFacets implements Iterable<FacetInterval> {
INCLUDED,
GREATER_THAN_END,
}
-
+
/**
* Helper class to match and count of documents in specified intervals
*/
public static class FacetInterval {
-
+
/**
* Key to represent this interval
*/
@@ -504,6 +504,11 @@ public class IntervalFacets implements Iterable<FacetInterval> {
* The current count of documents in that match this interval
*/
private int count;
+
+ /**
+ * If this field is set to true, this interval {@code #getCount()} will always return 0.
+ */
+ private boolean includeNoDocs = false;
/**
*
@@ -646,7 +651,14 @@ public class IntervalFacets implements Iterable<FacetInterval> {
throw new AssertionError();
}
if (startOpen) {
- startLimit++;
+ if (startLimit == Long.MAX_VALUE) {
+ /*
+ * This interval can match no docs
+ */
+ includeNoDocs = true;
+ } else {
+ startLimit++;
+ }
}
}
@@ -674,7 +686,14 @@ public class IntervalFacets implements Iterable<FacetInterval> {
throw new AssertionError();
}
if (endOpen) {
- endLimit--;
+ if (endLimit == Long.MIN_VALUE) {
+ /*
+ * This interval can match no docs
+ */
+ includeNoDocs = true;
+ } else {
+ endLimit--;
+ }
}
}
}
@@ -882,6 +901,9 @@ public class IntervalFacets implements Iterable<FacetInterval> {
* @return The count of document that matched this interval
*/
public int getCount() {
+ if (includeNoDocs) {
+ return 0;
+ }
return this.count;
}
@@ -906,7 +928,6 @@ public class IntervalFacets implements Iterable<FacetInterval> {
*/
@Override
public Iterator<FacetInterval> iterator() {
-
return new ArrayList<FacetInterval>(Arrays.asList(intervals)).iterator();
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f55ed9cb/solr/core/src/test/org/apache/solr/request/TestIntervalFaceting.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/request/TestIntervalFaceting.java b/solr/core/src/test/org/apache/solr/request/TestIntervalFaceting.java
index 042eb2e..0421e03 100644
--- a/solr/core/src/test/org/apache/solr/request/TestIntervalFaceting.java
+++ b/solr/core/src/test/org/apache/solr/request/TestIntervalFaceting.java
@@ -664,11 +664,19 @@ public class TestIntervalFaceting extends SolrTestCaseJ4 {
assertU(adoc("id", "12", "test_l_dv", String.valueOf(Long.MAX_VALUE - 3)));
assertU(adoc("id", "13", "test_l_dv", String.valueOf(Long.MAX_VALUE - 2)));
assertU(adoc("id", "14", "test_l_dv", String.valueOf(Long.MAX_VALUE - 1)));
+ assertU(adoc("id", "15", "test_l_dv", String.valueOf(Long.MAX_VALUE)));
+ assertU(adoc("id", "16", "test_l_dv", String.valueOf(Long.MIN_VALUE)));
assertU(commit());
assertIntervalQuery("test_l_dv", "[0," + Integer.MAX_VALUE + "]", "10");
- assertIntervalQuery("test_l_dv", "[" + Integer.MAX_VALUE + "," + Long.MAX_VALUE + "]", "3");
- assertIntervalQuery("test_l_dv", "[" + Integer.MAX_VALUE + ",*]", "3");
+ assertIntervalQuery("test_l_dv", "(10," + Long.MAX_VALUE + "]", "4");
+ assertIntervalQuery("test_l_dv", "[" + Long.MAX_VALUE + "," + Long.MAX_VALUE + "]", "1");
+ assertIntervalQuery("test_l_dv", "[" + Long.MAX_VALUE + ",*]", "1");
+ assertIntervalQuery("test_l_dv", "(" + Long.MAX_VALUE + ",*]", "0");
+ assertIntervalQuery("test_l_dv", "(*, " + Long.MIN_VALUE + "]", "1");
+ assertIntervalQuery("test_l_dv", "(*, " + Long.MIN_VALUE + ")", "0");
+ assertIntervalQuery("test_l_dv", "(" + (Long.MAX_VALUE - 1) + ",*]", "1");
+ assertIntervalQuery("test_l_dv", "[" + (Long.MAX_VALUE - 1) + ",*]", "2");
}
@Test
@@ -732,6 +740,9 @@ public class TestIntervalFaceting extends SolrTestCaseJ4 {
assertIntervalQuery(field, "(0, " + Float.MAX_VALUE + "]", "2");
assertIntervalQuery(field, "(0, " + Float.POSITIVE_INFINITY + ")", "2");
assertIntervalQuery(field, "(0, " + Float.POSITIVE_INFINITY + "]", "3");
+ assertIntervalQuery(field, "[-0.0, 0.0]", "2");
+ assertIntervalQuery(field, "[-0.0, 0.0)", "1");
+ assertIntervalQuery(field, "(-0.0, 0.0]", "1");
if (testDouble) {
clearIndex();