Browse Source

IP range masks exclude the maximum address of the range. (#22018)

Closes #22005
Adrien Grand 9 years ago
parent
commit
182e119699

+ 13 - 2
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);
             }

+ 37 - 0
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);
+    }
 }