From bed513ed0a5b5c5f76d7732605f18700ff638d0b Mon Sep 17 00:00:00 2001 From: Mohit Verma Date: Fri, 27 Jan 2023 15:48:26 -0800 Subject: [PATCH] Example UDF and its unit test to repro issue: https://github.com/linkedin/transport/issues/120 --- .../StructElementIncrementByOneFunction.java | 46 +++++++++++++++++++ ...stStructElementIncrementByOneFunction.java | 33 +++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 transportable-udfs-examples/transportable-udfs-example-udfs/src/main/java/com/linkedin/transport/examples/StructElementIncrementByOneFunction.java create mode 100644 transportable-udfs-examples/transportable-udfs-example-udfs/src/test/java/com/linkedin/transport/examples/TestStructElementIncrementByOneFunction.java diff --git a/transportable-udfs-examples/transportable-udfs-example-udfs/src/main/java/com/linkedin/transport/examples/StructElementIncrementByOneFunction.java b/transportable-udfs-examples/transportable-udfs-example-udfs/src/main/java/com/linkedin/transport/examples/StructElementIncrementByOneFunction.java new file mode 100644 index 00000000..3a1516ed --- /dev/null +++ b/transportable-udfs-examples/transportable-udfs-example-udfs/src/main/java/com/linkedin/transport/examples/StructElementIncrementByOneFunction.java @@ -0,0 +1,46 @@ +/** + * Copyright 2023 LinkedIn Corporation. All rights reserved. + * Licensed under the BSD-2 Clause license. + * See LICENSE in the project root for license information. + */ +package com.linkedin.transport.examples; + +import com.google.common.collect.ImmutableList; +import com.linkedin.transport.api.data.StdInteger; +import com.linkedin.transport.api.data.StdStruct; +import com.linkedin.transport.api.udf.StdUDF1; +import com.linkedin.transport.api.udf.TopLevelStdUDF; +import java.util.List; + + +public class StructElementIncrementByOneFunction extends StdUDF1 implements TopLevelStdUDF { + + @Override + public List getInputParameterSignatures() { + return ImmutableList.of( + "row(integer, integer)" + ); + } + + @Override + public String getOutputParameterSignature() { + return "row(integer, integer)"; + } + + @Override + public StdStruct eval(StdStruct myStruct) { + int currVal = ((StdInteger) myStruct.getField(0)).get(); + myStruct.setField(0, getStdFactory().createInteger(currVal + 1)); + return myStruct; + } + + @Override + public String getFunctionName() { + return "struct_element_increment_by_one"; + } + + @Override + public String getFunctionDescription() { + return "increment first element by one"; + } +} diff --git a/transportable-udfs-examples/transportable-udfs-example-udfs/src/test/java/com/linkedin/transport/examples/TestStructElementIncrementByOneFunction.java b/transportable-udfs-examples/transportable-udfs-example-udfs/src/test/java/com/linkedin/transport/examples/TestStructElementIncrementByOneFunction.java new file mode 100644 index 00000000..dc9e3e1c --- /dev/null +++ b/transportable-udfs-examples/transportable-udfs-example-udfs/src/test/java/com/linkedin/transport/examples/TestStructElementIncrementByOneFunction.java @@ -0,0 +1,33 @@ +/** + * Copyright 2023 LinkedIn Corporation. All rights reserved. + * Licensed under the BSD-2 Clause license. + * See LICENSE in the project root for license information. + */ +package com.linkedin.transport.examples; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.linkedin.transport.api.udf.StdUDF; +import com.linkedin.transport.api.udf.TopLevelStdUDF; +import com.linkedin.transport.test.AbstractStdUDFTest; +import com.linkedin.transport.test.spi.StdTester; +import java.util.List; +import java.util.Map; +import org.testng.annotations.Test; + + +public class TestStructElementIncrementByOneFunction extends AbstractStdUDFTest { + + @Override + protected Map, List>> getTopLevelStdUDFClassesAndImplementations() { + return ImmutableMap.of( + StructElementIncrementByOneFunction.class, ImmutableList.of(StructElementIncrementByOneFunction.class)); + } + + @Test + public void testStructElementIncrementByOneFunction() { + StdTester tester = getTester(); + tester.check(functionCall("struct_element_increment_by_one", row(1, 3)), row(2, 3), "row(integer,integer)"); + tester.check(functionCall("struct_element_increment_by_one", row(-2, 3)), row(-1, 3), "row(integer,integer)"); + } +} \ No newline at end of file