diff options
author | Adrien Grand <jpountz@gmail.com> | 2016-12-08 15:58:32 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-12-08 15:58:32 +0100 |
commit | 182e11969952fcc157d306e991214462d1a47ba2 (patch) | |
tree | 7dd12a32f736f4e3a78ee7075df0770efa9d1d6c /core | |
parent | 30bcb06606e19d91ddc5785d39d8879ab27dc769 (diff) |
IP range masks exclude the maximum address of the range. (#22018)
Closes #22005
Diffstat (limited to 'core')
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); + } } |