summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrien Grand <jpountz@gmail.com>2016-12-08 15:58:32 +0100
committerGitHub <noreply@github.com>2016-12-08 15:58:32 +0100
commit182e11969952fcc157d306e991214462d1a47ba2 (patch)
tree7dd12a32f736f4e3a78ee7075df0770efa9d1d6c
parent30bcb06606e19d91ddc5785d39d8879ab27dc769 (diff)
IP range masks exclude the maximum address of the range. (#22018)
Closes #22005
-rw-r--r--core/src/main/java/org/elasticsearch/search/aggregations/bucket/range/ip/IpRangeAggregationBuilder.java15
-rw-r--r--core/src/test/java/org/elasticsearch/search/aggregations/bucket/IpRangeTests.java37
2 files changed, 50 insertions, 2 deletions
diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/bucket/range/ip/IpRangeAggregationBuilder.java b/core/src/main/java/org/elasticsearch/search/aggregations/bucket/range/ip/IpRangeAggregationBuilder.java
index bd2353b509..cc044ed623 100644
--- a/core/src/main/java/org/elasticsearch/search/aggregations/bucket/range/ip/IpRangeAggregationBuilder.java
+++ b/core/src/main/java/org/elasticsearch/search/aggregations/bucket/range/ip/IpRangeAggregationBuilder.java
@@ -55,6 +55,7 @@ public final class IpRangeAggregationBuilder
private static final InternalAggregation.Type TYPE = new InternalAggregation.Type(NAME);
public static class Range implements ToXContent {
+
private final String key;
private final String from;
private final String to;
@@ -94,8 +95,18 @@ public final class IpRangeAggregationBuilder
}
this.key = key;
try {
- this.from = InetAddresses.toAddrString(InetAddress.getByAddress(lower));
- this.to = InetAddresses.toAddrString(InetAddress.getByAddress(upper));
+ InetAddress fromAddress = InetAddress.getByAddress(lower);
+ if (fromAddress.equals(InetAddressPoint.MIN_VALUE)) {
+ this.from = null;
+ } else {
+ this.from = InetAddresses.toAddrString(fromAddress);
+ }
+ InetAddress inclusiveToAddress = InetAddress.getByAddress(upper);
+ if (inclusiveToAddress.equals(InetAddressPoint.MAX_VALUE)) {
+ this.to = null;
+ } else {
+ this.to = InetAddresses.toAddrString(InetAddressPoint.nextUp(inclusiveToAddress));
+ }
} catch (UnknownHostException bogus) {
throw new AssertionError(bogus);
}
diff --git a/core/src/test/java/org/elasticsearch/search/aggregations/bucket/IpRangeTests.java b/core/src/test/java/org/elasticsearch/search/aggregations/bucket/IpRangeTests.java
index 5d86571f08..4e9c1e00ea 100644
--- a/core/src/test/java/org/elasticsearch/search/aggregations/bucket/IpRangeTests.java
+++ b/core/src/test/java/org/elasticsearch/search/aggregations/bucket/IpRangeTests.java
@@ -87,4 +87,41 @@ public class IpRangeTests extends BaseAggregationTestCase<IpRangeAggregationBuil
return factory;
}
+ public void testMask() {
+ IpRangeAggregationBuilder b1 = new IpRangeAggregationBuilder("foo");
+ IpRangeAggregationBuilder b2 = new IpRangeAggregationBuilder("foo");
+ b1.addMaskRange("bar", "192.168.10.12/16");
+ b2.addRange("bar", "192.168.0.0", "192.169.0.0");
+ assertEquals(b1, b2);
+
+ b1 = new IpRangeAggregationBuilder("foo");
+ b2 = new IpRangeAggregationBuilder("foo");
+ b1.addMaskRange("bar", "192.168.0.0/31");
+ b2.addRange("bar", "192.168.0.0", "192.168.0.2");
+ assertEquals(b1, b2);
+
+ b1 = new IpRangeAggregationBuilder("foo");
+ b2 = new IpRangeAggregationBuilder("foo");
+ b1.addMaskRange("bar", "0.0.0.0/0");
+ b2.addRange("bar", "0.0.0.0", "::1:0:0:0");
+ assertEquals(b1, b2);
+
+ b1 = new IpRangeAggregationBuilder("foo");
+ b2 = new IpRangeAggregationBuilder("foo");
+ b1.addMaskRange("bar", "fe80::821f:2ff:fe4a:c5bd/64");
+ b2.addRange("bar", "fe80::", "fe80:0:0:1::");
+ assertEquals(b1, b2);
+
+ b1 = new IpRangeAggregationBuilder("foo");
+ b2 = new IpRangeAggregationBuilder("foo");
+ b1.addMaskRange("bar", "::/16");
+ b2.addRange("bar", null, "1::");
+ assertEquals(b1, b2);
+
+ b1 = new IpRangeAggregationBuilder("foo");
+ b2 = new IpRangeAggregationBuilder("foo");
+ b1.addMaskRange("bar", "::/0");
+ b2.addRange("bar", null, null);
+ assertEquals(b1, b2);
+ }
}