Skip to content

Commit

Permalink
Initial commit for cidr function
Browse files Browse the repository at this point in the history
Signed-off-by: Hendrik Saly <hendrik.saly@eliatra.com>
  • Loading branch information
salyh committed Sep 27, 2024
1 parent 0e56a46 commit ab51739
Show file tree
Hide file tree
Showing 7 changed files with 123 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -355,6 +355,7 @@ LIKE: 'LIKE';
ISNULL: 'ISNULL';
ISNOTNULL: 'ISNOTNULL';
ISPRESENT: 'ISPRESENT';
CIDR: 'CIDR';

// FLOWCONTROL FUNCTIONS
IFNULL: 'IFNULL';
Expand Down
5 changes: 5 additions & 0 deletions ppl-spark-integration/src/main/antlr4/OpenSearchPPLParser.g4
Original file line number Diff line number Diff line change
Expand Up @@ -362,6 +362,7 @@ positionFunction

booleanExpression
: booleanFunctionCall
| cidrFunctionCall
;

isEmptyExpression
Expand Down Expand Up @@ -441,6 +442,10 @@ booleanFunctionCall
: conditionFunctionBase LT_PRTHS functionArgs RT_PRTHS
;

cidrFunctionCall
: CIDR LT_PRTHS ipAddress = functionArg COMMA cidrBlock = functionArg RT_PRTHS
;

convertedDataType
: typeName = DATE
| typeName = TIME
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import org.opensearch.sql.ast.expression.AttributeList;
import org.opensearch.sql.ast.expression.Between;
import org.opensearch.sql.ast.expression.Case;
import org.opensearch.sql.ast.expression.Cidr;
import org.opensearch.sql.ast.expression.Compare;
import org.opensearch.sql.ast.expression.EqualTo;
import org.opensearch.sql.ast.expression.Field;
Expand Down Expand Up @@ -289,4 +290,7 @@ public T visitExplain(Explain node, C context) {
return visitStatement(node, context);
}

public T visitCidr(Cidr node, C context) {
return visitChildren(node, context);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

package org.opensearch.sql.ast.expression;

import org.opensearch.sql.ast.AbstractNodeVisitor;

import java.util.Arrays;
import java.util.List;

public class Cidr extends UnresolvedExpression {
private UnresolvedExpression ipAddress;
private UnresolvedExpression cidrBlock;

public Cidr(UnresolvedExpression ipAddress, UnresolvedExpression cidrBlock) {
this.ipAddress = ipAddress;
this.cidrBlock = cidrBlock;
}

public UnresolvedExpression getCidrBlock() {
return cidrBlock;
}

public UnresolvedExpression getIpAddress() {
return ipAddress;
}

@Override
public List<UnresolvedExpression> getChild() {
return Arrays.asList(ipAddress, cidrBlock);
}

@Override
public <T, C> T accept(AbstractNodeVisitor<T, C> nodeVisitor, C context) {
return nodeVisitor.visitCidr(this, context);
}

@Override
public String toString() {
return String.format(
"CIDR(%s,%s)",
ipAddress.toString(), cidrBlock.toString());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

package org.opensearch.sql.expression.function;

import scala.Function2;
import scala.Serializable;
import scala.runtime.AbstractFunction2;


public class SerializableUdf {

//this class should not have any fields, only static methods and static classes

private SerializableUdf() {

}

public static Function2<String,String,Boolean> cidrFunction = new SerializableAbstractFunction2<>() {

@Override
public Boolean apply(String ipAddress, String cidrBlock) {
//TODO implement ip address validation and cidr validation for ipv4 and ipv6
return Boolean.FALSE;
}
};

static abstract public class SerializableAbstractFunction2<T1,T2,R> extends AbstractFunction2<T1,T2,R>
implements Serializable {
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import org.apache.spark.sql.catalyst.expressions.Expression;
import org.apache.spark.sql.catalyst.expressions.NamedExpression;
import org.apache.spark.sql.catalyst.expressions.Predicate;
import org.apache.spark.sql.catalyst.expressions.ScalaUDF;
import org.apache.spark.sql.catalyst.expressions.SortDirection;
import org.apache.spark.sql.catalyst.expressions.SortOrder;
import org.apache.spark.sql.catalyst.plans.logical.Aggregate;
Expand Down Expand Up @@ -75,6 +76,7 @@
import org.opensearch.sql.ast.tree.Sort;
import org.opensearch.sql.ast.tree.SubqueryAlias;
import org.opensearch.sql.ast.tree.TopAggregation;
import org.opensearch.sql.expression.function.SerializableUdf;
import org.opensearch.sql.ppl.utils.AggregatorTranslator;
import org.opensearch.sql.ppl.utils.BuiltinFunctionTranslator;
import org.opensearch.sql.ppl.utils.ComparatorTransformer;
Expand All @@ -85,7 +87,11 @@
import scala.Tuple2;
import scala.collection.Seq;

import java.util.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.Stack;
import java.util.function.BiFunction;
import java.util.stream.Collectors;

Expand Down Expand Up @@ -724,5 +730,24 @@ public Expression visitRareTopN(RareTopN node, CatalystPlanContext context) {
public Expression visitWindowFunction(WindowFunction node, CatalystPlanContext context) {
throw new IllegalStateException("Not Supported operation : WindowFunction");
}

@Override
public Expression visitCidr(org.opensearch.sql.ast.expression.Cidr node, CatalystPlanContext context) {
analyze(node.getIpAddress(), context);
Expression ipAddressExpression = context.getNamedParseExpressions().pop();
analyze(node.getCidrBlock(), context);
Expression cidrBlockExpression = context.getNamedParseExpressions().pop();

ScalaUDF udf = new ScalaUDF(SerializableUdf.cidrFunction,
DataTypes.BooleanType,
seq(ipAddressExpression,cidrBlockExpression),
seq(),
Option.empty(),
Option.apply("cidr"),
false,
true);

return context.getNamedParseExpressions().push(udf);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import org.opensearch.sql.ast.expression.And;
import org.opensearch.sql.ast.expression.Argument;
import org.opensearch.sql.ast.expression.Case;
import org.opensearch.sql.ast.expression.Cidr;
import org.opensearch.sql.ast.expression.Compare;
import org.opensearch.sql.ast.expression.DataType;
import org.opensearch.sql.ast.expression.EqualTo;
Expand All @@ -36,6 +37,7 @@
import org.opensearch.sql.ast.expression.UnresolvedExpression;
import org.opensearch.sql.ast.expression.When;
import org.opensearch.sql.ast.expression.Xor;
import org.opensearch.sql.ast.tree.UnresolvedPlan;
import org.opensearch.sql.common.utils.StringUtils;
import org.opensearch.sql.ppl.utils.ArgumentFactory;

Expand Down Expand Up @@ -370,6 +372,12 @@ public UnresolvedExpression visitRightHint(OpenSearchPPLParser.RightHintContext
return new EqualTo(new Literal(ctx.rightHintKey.getText(), DataType.STRING), visit(ctx.rightHintValue));
}


@Override
public UnresolvedExpression visitCidrFunctionCall(OpenSearchPPLParser.CidrFunctionCallContext ctx) {
return new Cidr(visit(ctx.ipAddress), visit(ctx.cidrBlock));
}

private QualifiedName visitIdentifiers(List<? extends ParserRuleContext> ctx) {
return new QualifiedName(
ctx.stream()
Expand Down

0 comments on commit ab51739

Please sign in to comment.