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 2017/07/18 05:13:59 UTC
[07/33] lucene-solr:feature/autoscaling: SOLR-11043: Fix
facet.range.method=dv and interval facets on single-valued float fields with
negative values
SOLR-11043: Fix facet.range.method=dv and interval facets on single-valued float fields with negative values
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/9e4aaf97
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/9e4aaf97
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/9e4aaf97
Branch: refs/heads/feature/autoscaling
Commit: 9e4aaf97809582d2232276d190a4e18197a79923
Parents: d8990db
Author: Tomas Fernandez Lobbe <tf...@apache.org>
Authored: Thu Jul 13 12:27:36 2017 -0700
Committer: Tomas Fernandez Lobbe <tf...@apache.org>
Committed: Thu Jul 13 12:27:36 2017 -0700
----------------------------------------------------------------------
solr/CHANGES.txt | 3 +
.../org/apache/solr/request/IntervalFacets.java | 8 +--
.../apache/solr/request/SimpleFacetsTest.java | 33 ++++++++--
.../solr/request/TestIntervalFaceting.java | 63 +++++++++++++++++++-
.../org/apache/solr/schema/TestPointFields.java | 1 -
5 files changed, 92 insertions(+), 16 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9e4aaf97/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index d6dfe52..f1e975e 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -337,6 +337,9 @@ Bug Fixes
* SOLR-11045: The new replica created by MoveReplica will have to have same name and coreName as the
old one in case of HDFS (Cao Manh Dat)
+* SOLR-11043: Fix facet.range.method=dv and interval facets on negative single-valued float fields.
+ (Tomás Fernández Löbbe, Steve Rowe)
+
Optimizations
----------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9e4aaf97/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 9a23a83..1f7cd42 100644
--- a/solr/core/src/java/org/apache/solr/request/IntervalFacets.java
+++ b/solr/core/src/java/org/apache/solr/request/IntervalFacets.java
@@ -216,9 +216,7 @@ public class IntervalFacets implements Iterable<FacetInterval> {
longs = new FilterNumericDocValues(DocValues.getNumeric(ctx.reader(), fieldName)) {
@Override
public long longValue() throws IOException {
- long bits = super.longValue();
- if (bits < 0) bits ^= 0x7fffffffffffffffL;
- return bits;
+ return NumericUtils.sortableFloatBits((int)super.longValue());
}
};
break;
@@ -227,9 +225,7 @@ public class IntervalFacets implements Iterable<FacetInterval> {
longs = new FilterNumericDocValues(DocValues.getNumeric(ctx.reader(), fieldName)) {
@Override
public long longValue() throws IOException {
- long bits = super.longValue();
- if (bits < 0) bits ^= 0x7fffffffffffffffL;
- return bits;
+ return NumericUtils.sortableDoubleBits(super.longValue());
}
};
break;
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9e4aaf97/solr/core/src/test/org/apache/solr/request/SimpleFacetsTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/request/SimpleFacetsTest.java b/solr/core/src/test/org/apache/solr/request/SimpleFacetsTest.java
index 35a66c3..86c57ff 100644
--- a/solr/core/src/test/org/apache/solr/request/SimpleFacetsTest.java
+++ b/solr/core/src/test/org/apache/solr/request/SimpleFacetsTest.java
@@ -183,6 +183,27 @@ public class SimpleFacetsTest extends SolrTestCaseJ4 {
add_doc("id", "2004", "hotel_s1", "b", "airport_s1", "ams", "duration_i1", "5");
}
+ public void testDvMethodNegativeFloatRangeFacet() throws Exception {
+ String field = "negative_num_f1_dv";
+ assertTrue(h.getCore().getLatestSchema().getField(field).hasDocValues());
+
+ final String[] commonParams = {
+ "q", "*:*", "facet", "true", "facet.range.start", "-2", "facet.range.end", "0", "facet.range.gap", "2"
+ };
+ final String countAssertion
+ = "//lst[@name='facet_counts']/lst[@name='facet_ranges']/lst[@name='%s']/lst[@name='counts']/int[@name='-2.0'][.='1']";
+
+ assertU(adoc("id", "10001", field, "-1.0"));
+ assertU(commit());
+
+ assertQ(req(commonParams, "facet.range", field, "facet.range.method", "filter"),
+ String.format(countAssertion, field)
+ );
+ assertQ(req(commonParams, "facet.range", field, "facet.range.method", "dv"),
+ String.format(countAssertion, field)
+ );
+ }
+
public void testDefaultsAndAppends() throws Exception {
// all defaults
@@ -3385,8 +3406,8 @@ public class SimpleFacetsTest extends SolrTestCaseJ4 {
ModifiableSolrParams params = new ModifiableSolrParams();
Integer[] values = new Integer[2];
do {
- values[0] = random().nextInt(3000);
- values[1] = random().nextInt(3000);
+ values[0] = random().nextInt(3000) * (random().nextBoolean()?-1:1);
+ values[1] = random().nextInt(3000) * (random().nextBoolean()?-1:1);
} while (values[0].equals(values[1]));
Arrays.sort(values);
long gapNum = Math.max(1, random().nextInt(3000));
@@ -3404,8 +3425,8 @@ public class SimpleFacetsTest extends SolrTestCaseJ4 {
ModifiableSolrParams params = new ModifiableSolrParams();
Float[] values = new Float[2];
do {
- values[0] = random().nextFloat() * 3000;
- values[1] = random().nextFloat() * 3000;
+ values[0] = random().nextFloat() * 3000 * (random().nextBoolean()?-1:1);
+ values[1] = random().nextFloat() * 3000 * (random().nextBoolean()?-1:1);
} while (values[0].equals(values[1]));
Arrays.sort(values);
float gapNum = Math.max(1, random().nextFloat() * 3000);
@@ -3425,8 +3446,8 @@ public class SimpleFacetsTest extends SolrTestCaseJ4 {
ModifiableSolrParams params = new ModifiableSolrParams();
Date[] dates = new Date[2];
do {
- dates[0] = new Date((long)(random().nextDouble()*(new Date().getTime())));
- dates[1] = new Date((long)(random().nextDouble()*(new Date().getTime())));
+ dates[0] = new Date((long)(random().nextDouble()*(new Date().getTime()) * (random().nextBoolean()?-1:1)));
+ dates[1] = new Date((long)(random().nextDouble()*(new Date().getTime()) * (random().nextBoolean()?-1:1)));
} while (dates[0].equals(dates[1]));
Arrays.sort(dates);
long dateDiff = (dates[1].getTime() - dates[0].getTime())/1000;
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9e4aaf97/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 df0031f..042eb2e 100644
--- a/solr/core/src/test/org/apache/solr/request/TestIntervalFaceting.java
+++ b/solr/core/src/test/org/apache/solr/request/TestIntervalFaceting.java
@@ -673,10 +673,10 @@ public class TestIntervalFaceting extends SolrTestCaseJ4 {
@Test
public void testFloatFields() {
- doTestFloat("test_f_dv");
+ doTestFloat("test_f_dv", false);
}
- private void doTestFloat(String field) {
+ private void doTestFloat(String field, boolean testDouble) {
assertU(adoc("id", "1", field, "0"));
assertU(adoc("id", "2", field, "1"));
assertU(adoc("id", "3", field, "2"));
@@ -705,11 +705,68 @@ public class TestIntervalFaceting extends SolrTestCaseJ4 {
assertIntervalQuery(field, "(1,1)", "0");
assertIntervalQuery(field, "(4,7)", "4");
assertIntervalQuery(field, "(123,*)", "1");
+
+ clearIndex();
+ assertU(adoc("id", "16", field, "-1.3"));
+ assertU(adoc("id", "17", field, "0.0"));
+ assertU(adoc("id", "18", field, "-0.0"));
+ assertU(adoc("id", "19", field, String.valueOf(Float.MIN_VALUE)));
+ assertU(adoc("id", "20", field, String.valueOf(Float.MAX_VALUE)));
+ assertU(adoc("id", "21", field, String.valueOf(Float.NEGATIVE_INFINITY)));
+ assertU(adoc("id", "22", field, String.valueOf(Float.POSITIVE_INFINITY)));
+ assertU(commit());
+
+ assertIntervalQuery(field, "[*,*]", "7");
+ assertIntervalQuery(field, "(*,*)", "7");
+ assertIntervalQuery(field, "(-1,1)", "3");
+ assertIntervalQuery(field, "(-2,1)", "4");
+ assertIntervalQuery(field, "(-1.3,0)", "1");
+ assertIntervalQuery(field, "[-1.3,0)", "2");
+ assertIntervalQuery(field, "[-1.3,0]", "3");
+ assertIntervalQuery(field, "(" + Float.NEGATIVE_INFINITY + ",0)", "2");
+ assertIntervalQuery(field, "(* ,0)", "3");
+ assertIntervalQuery(field, "[" + Float.NEGATIVE_INFINITY + ",0)", "3");
+ assertIntervalQuery(field, "(0, " + Float.MIN_VALUE + ")", "0");
+ assertIntervalQuery(field, "(0, " + Float.MIN_VALUE + "]", "1");
+ assertIntervalQuery(field, "(0, " + Float.MAX_VALUE + ")", "1");
+ assertIntervalQuery(field, "(0, " + Float.MAX_VALUE + "]", "2");
+ assertIntervalQuery(field, "(0, " + Float.POSITIVE_INFINITY + ")", "2");
+ assertIntervalQuery(field, "(0, " + Float.POSITIVE_INFINITY + "]", "3");
+
+ if (testDouble) {
+ clearIndex();
+ assertU(adoc("id", "16", field, "-1.3"));
+ assertU(adoc("id", "17", field, "0.0"));
+ assertU(adoc("id", "18", field, "-0.0"));
+ assertU(adoc("id", "19", field, String.valueOf(Double.MIN_VALUE)));
+ assertU(adoc("id", "20", field, String.valueOf(Double.MAX_VALUE)));
+ assertU(adoc("id", "21", field, String.valueOf(Double.NEGATIVE_INFINITY)));
+ assertU(adoc("id", "22", field, String.valueOf(Double.POSITIVE_INFINITY)));
+ assertU(commit());
+
+ assertIntervalQuery(field, "[*,*]", "7");
+ assertIntervalQuery(field, "(*,*)", "7");
+ assertIntervalQuery(field, "(-1,1)", "3");
+ assertIntervalQuery(field, "(-2,1)", "4");
+ assertIntervalQuery(field, "(-1.3,0)", "1");
+ assertIntervalQuery(field, "[-1.3,0)", "2");
+ assertIntervalQuery(field, "[-1.3,0]", "3");
+ assertIntervalQuery(field, "(" + Double.NEGATIVE_INFINITY + ",0)", "2");
+ assertIntervalQuery(field, "(* ,0)", "3");
+ assertIntervalQuery(field, "[" + Double.NEGATIVE_INFINITY + ",0)", "3");
+ assertIntervalQuery(field, "(0, " + Double.MIN_VALUE + ")", "0");
+ assertIntervalQuery(field, "(0, " + Double.MIN_VALUE + "]", "1");
+ assertIntervalQuery(field, "(0, " + Double.MAX_VALUE + ")", "1");
+ assertIntervalQuery(field, "(0, " + Double.MAX_VALUE + "]", "2");
+ assertIntervalQuery(field, "(0, " + Double.POSITIVE_INFINITY + ")", "2");
+ assertIntervalQuery(field, "(0, " + Double.POSITIVE_INFINITY + "]", "3");
+ }
+
}
@Test
public void testDoubleFields() {
- doTestFloat("test_d_dv");
+ doTestFloat("test_d_dv", true);
}
@Test
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9e4aaf97/solr/core/src/test/org/apache/solr/schema/TestPointFields.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/schema/TestPointFields.java b/solr/core/src/test/org/apache/solr/schema/TestPointFields.java
index 4c8ff69..d8e9039 100644
--- a/solr/core/src/test/org/apache/solr/schema/TestPointFields.java
+++ b/solr/core/src/test/org/apache/solr/schema/TestPointFields.java
@@ -904,7 +904,6 @@ public class TestPointFields extends SolrTestCaseJ4 {
}
@Test
- @AwaitsFix(bugUrl = "https://issues.apache.org/jira/browse/SOLR-11043")
public void testFloatPointFieldRangeFacet() throws Exception {
String docValuesField = "number_p_f_dv";
String nonDocValuesField = "number_p_f";