Github user arina-ielchiieva commented on a diff in the pull request:
https://github.com/apache/drill/pull/971#discussion_r143946222
--- Diff:
exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/NetworkFunctions.java
---
@@ -0,0 +1,668 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.drill.exec.expr.fn.impl;
+
+import io.netty.buffer.DrillBuf;
+import org.apache.commons.net.util.SubnetUtils;
+import org.apache.drill.exec.expr.DrillSimpleFunc;
+import org.apache.drill.exec.expr.annotations.FunctionTemplate;
+import org.apache.drill.exec.expr.annotations.Output;
+import org.apache.drill.exec.expr.annotations.Param;
+import org.apache.drill.exec.expr.annotations.Workspace;
+import org.apache.drill.exec.expr.holders.BigIntHolder;
+import org.apache.drill.exec.expr.holders.BitHolder;
+import org.apache.drill.exec.expr.holders.VarCharHolder;
+
+import javax.inject.Inject;
+
+public class NetworkFunctions{
+ static final org.slf4j.Logger logger =
org.slf4j.LoggerFactory.getLogger(NetworkFunctions.class);
+
+ private NetworkFunctions() {}
+
+ /**
+ * This function takes two arguments, an input IPv4 and a CIDR, and
returns true if the IP is in the given CIDR block
+ *
+ */
+ @FunctionTemplate(
+ name = "in_network",
+ scope = FunctionTemplate.FunctionScope.SIMPLE,
+ nulls = FunctionTemplate.NullHandling.NULL_IF_NULL
+ )
+ public static class InNetworkFunction implements DrillSimpleFunc {
+
+ @Param
+ VarCharHolder inputIP;
+
+ @Param
+ VarCharHolder inputCIDR;
+
+ @Output
+ BitHolder out;
+
+ @Inject
+ DrillBuf buffer;
+
+ @Workspace
+ SubnetUtils utils;
+
+ public void setup() {
+ }
+
+
+ public void eval() {
+
+ String ipString =
org.apache.drill.exec.expr.fn.impl.StringFunctionHelpers.toStringFromUTF8(inputIP.start,
inputIP.end, inputIP.buffer);
+ String cidrString =
org.apache.drill.exec.expr.fn.impl.StringFunctionHelpers.toStringFromUTF8(inputCIDR.start,
inputCIDR.end, inputCIDR.buffer);
+
+ int result = 0;
+ utils = new org.apache.commons.net.util.SubnetUtils(cidrString);
+
+ if( utils.getInfo().isInRange( ipString ) ){
+ result = 1;
+ }
+ else{
+ result = 0;
+ }
+ out.value = result;
+ }
+ }
+
+
+ /**
+ * This function retunrs the number of IP addresses in the input CIDR
block.
+ */
+ @FunctionTemplate(
+ name = "getAddressCount",
+ scope = FunctionTemplate.FunctionScope.SIMPLE,
+ nulls = FunctionTemplate.NullHandling.NULL_IF_NULL
+ )
+ public static class getAddressCountFunction implements DrillSimpleFunc {
+
+ @Param
+ VarCharHolder inputCIDR;
+
+ @Output
+ BigIntHolder out;
+
+ @Inject
+ DrillBuf buffer;
+
+ @Workspace
+ SubnetUtils utils;
+
+ public void setup() {
+ }
+
+ public void eval() {
+
+ String cidrString =
org.apache.drill.exec.expr.fn.impl.StringFunctionHelpers.toStringFromUTF8(inputCIDR.start,
inputCIDR.end, inputCIDR.buffer);
+ utils = new org.apache.commons.net.util.SubnetUtils(cidrString);
+
+ out.value = utils.getInfo().getAddressCount();
+
+ }
+
+ }
+
+ /**
+ * This function returns the broadcast address of a given CIDR block.
+ */
+ @FunctionTemplate(
+ name = "getBroadcastAddress",
+ scope = FunctionTemplate.FunctionScope.SIMPLE,
+ nulls = FunctionTemplate.NullHandling.NULL_IF_NULL
+ )
+ public static class getBroadcastAddressFunction implements
DrillSimpleFunc {
+
+ @Param
+ VarCharHolder inputCIDR;
+
+ @Output
+ VarCharHolder out;
+
+ @Inject
+ DrillBuf buffer;
+
+ @Workspace
+ SubnetUtils utils;
--- End diff --
Same as above.
---