This is an automated email from the ASF dual-hosted git repository. luchunliang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/inlong.git
The following commit(s) were added to refs/heads/master by this push: new 5d4128d826 [INLONG-10607][SDK] Transform SQL support arithmetic functions(Including log10, log2, log and exp) (#10615) 5d4128d826 is described below commit 5d4128d8266e745a5df8580e7e1a886308d20b12 Author: LeeWY <61183968+yfsn...@users.noreply.github.com> AuthorDate: Sat Jul 13 16:36:20 2024 +0800 [INLONG-10607][SDK] Transform SQL support arithmetic functions(Including log10, log2, log and exp) (#10615) * [INLONG-10607][SDK] Transform SQL support arithmetic functions(Including log10, log2, log and exp) * [INLONG-10607][SDK] Rename some variables and optimize the test code --------- Co-authored-by: jameswyli <jamesw...@tencent.com> --- .../transform/process/function/AbsFunction.java | 6 +- .../{AbsFunction.java => ExpFunction.java} | 16 ++-- .../sdk/transform/process/function/LnFunction.java | 6 +- .../{AbsFunction.java => Log10Function.java} | 16 ++-- .../{AbsFunction.java => Log2Function.java} | 16 ++-- .../{AbsFunction.java => LogFunction.java} | 33 +++++++-- .../transform/process/function/PowerFunction.java | 12 +-- .../transform/process/function/SqrtFunction.java | 6 +- .../transform/process/operator/OperatorTools.java | 8 ++ .../TestTransformArithmeticFunctionsProcessor.java | 86 +++++++++++++++++++--- 10 files changed, 149 insertions(+), 56 deletions(-) diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/AbsFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/AbsFunction.java index cc56afb85e..a94d662eae 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/AbsFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/AbsFunction.java @@ -31,14 +31,14 @@ import java.math.BigDecimal; */ public class AbsFunction implements ValueParser { - private ValueParser number; + private ValueParser numberParser; /** * Constructor * @param expr */ public AbsFunction(Function expr) { - number = OperatorTools.buildParser(expr.getParameters().getExpressions().get(0)); + numberParser = OperatorTools.buildParser(expr.getParameters().getExpressions().get(0)); } /** @@ -49,7 +49,7 @@ public class AbsFunction implements ValueParser { */ @Override public Object parse(SourceData sourceData, int rowIndex) { - Object numberObj = number.parse(sourceData, rowIndex); + Object numberObj = numberParser.parse(sourceData, rowIndex); BigDecimal numberValue = OperatorTools.parseBigDecimal(numberObj); return numberValue.abs(); } diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/AbsFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ExpFunction.java similarity index 77% copy from inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/AbsFunction.java copy to inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ExpFunction.java index cc56afb85e..5f542413e2 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/AbsFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ExpFunction.java @@ -26,19 +26,19 @@ import net.sf.jsqlparser.expression.Function; import java.math.BigDecimal; /** - * AbsFunction - * description: abs(numeric)--returns the absolute value of numeric + * ExpFunction + * description: exp(numeric)--returns e raised to the power of numeric */ -public class AbsFunction implements ValueParser { +public class ExpFunction implements ValueParser { - private ValueParser number; + private ValueParser numberParser; /** * Constructor * @param expr */ - public AbsFunction(Function expr) { - number = OperatorTools.buildParser(expr.getParameters().getExpressions().get(0)); + public ExpFunction(Function expr) { + numberParser = OperatorTools.buildParser(expr.getParameters().getExpressions().get(0)); } /** @@ -49,8 +49,8 @@ public class AbsFunction implements ValueParser { */ @Override public Object parse(SourceData sourceData, int rowIndex) { - Object numberObj = number.parse(sourceData, rowIndex); + Object numberObj = numberParser.parse(sourceData, rowIndex); BigDecimal numberValue = OperatorTools.parseBigDecimal(numberObj); - return numberValue.abs(); + return Math.exp(numberValue.doubleValue()); } } diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LnFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LnFunction.java index fde53b6db1..d5e5ecf80b 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LnFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LnFunction.java @@ -31,14 +31,14 @@ import java.math.BigDecimal; */ public class LnFunction implements ValueParser { - private ValueParser number; + private ValueParser numberParser; /** * Constructor * @param expr */ public LnFunction(Function expr) { - number = OperatorTools.buildParser(expr.getParameters().getExpressions().get(0)); + numberParser = OperatorTools.buildParser(expr.getParameters().getExpressions().get(0)); } /** @@ -49,7 +49,7 @@ public class LnFunction implements ValueParser { */ @Override public Object parse(SourceData sourceData, int rowIndex) { - Object numberObj = number.parse(sourceData, rowIndex); + Object numberObj = numberParser.parse(sourceData, rowIndex); BigDecimal numberValue = OperatorTools.parseBigDecimal(numberObj); return Math.log(numberValue.doubleValue()); } diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/AbsFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/Log10Function.java similarity index 76% copy from inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/AbsFunction.java copy to inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/Log10Function.java index cc56afb85e..d390893af2 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/AbsFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/Log10Function.java @@ -26,19 +26,19 @@ import net.sf.jsqlparser.expression.Function; import java.math.BigDecimal; /** - * AbsFunction - * description: abs(numeric)--returns the absolute value of numeric + * Log10Function + * description: log10(numeric)--returns the base 10 logarithm of numeric */ -public class AbsFunction implements ValueParser { +public class Log10Function implements ValueParser { - private ValueParser number; + private ValueParser numberParser; /** * Constructor * @param expr */ - public AbsFunction(Function expr) { - number = OperatorTools.buildParser(expr.getParameters().getExpressions().get(0)); + public Log10Function(Function expr) { + numberParser = OperatorTools.buildParser(expr.getParameters().getExpressions().get(0)); } /** @@ -49,8 +49,8 @@ public class AbsFunction implements ValueParser { */ @Override public Object parse(SourceData sourceData, int rowIndex) { - Object numberObj = number.parse(sourceData, rowIndex); + Object numberObj = numberParser.parse(sourceData, rowIndex); BigDecimal numberValue = OperatorTools.parseBigDecimal(numberObj); - return numberValue.abs(); + return Math.log10(numberValue.doubleValue()); } } diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/AbsFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/Log2Function.java similarity index 76% copy from inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/AbsFunction.java copy to inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/Log2Function.java index cc56afb85e..9c502f25a5 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/AbsFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/Log2Function.java @@ -26,19 +26,19 @@ import net.sf.jsqlparser.expression.Function; import java.math.BigDecimal; /** - * AbsFunction - * description: abs(numeric)--returns the absolute value of numeric + * Log2Function + * description: log2(numeric)--returns the base 2 logarithm of numeric */ -public class AbsFunction implements ValueParser { +public class Log2Function implements ValueParser { - private ValueParser number; + private ValueParser numberParser; /** * Constructor * @param expr */ - public AbsFunction(Function expr) { - number = OperatorTools.buildParser(expr.getParameters().getExpressions().get(0)); + public Log2Function(Function expr) { + numberParser = OperatorTools.buildParser(expr.getParameters().getExpressions().get(0)); } /** @@ -49,8 +49,8 @@ public class AbsFunction implements ValueParser { */ @Override public Object parse(SourceData sourceData, int rowIndex) { - Object numberObj = number.parse(sourceData, rowIndex); + Object numberObj = numberParser.parse(sourceData, rowIndex); BigDecimal numberValue = OperatorTools.parseBigDecimal(numberObj); - return numberValue.abs(); + return Math.log(numberValue.doubleValue()) / Math.log(2); } } diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/AbsFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LogFunction.java similarity index 52% copy from inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/AbsFunction.java copy to inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LogFunction.java index cc56afb85e..bc0e200255 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/AbsFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LogFunction.java @@ -21,24 +21,35 @@ import org.apache.inlong.sdk.transform.decode.SourceData; import org.apache.inlong.sdk.transform.process.operator.OperatorTools; import org.apache.inlong.sdk.transform.process.parser.ValueParser; +import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.Function; import java.math.BigDecimal; +import java.util.List; /** - * AbsFunction - * description: abs(numeric)--returns the absolute value of numeric + * LogFunction + * description: log(numeric) or log(numeric1, numeric2)--When called with one argument, returns the natural logarithm + * of numeric. When called with two arguments, this function returns the logarithm of numeric2 to the base numeric1 */ -public class AbsFunction implements ValueParser { +public class LogFunction implements ValueParser { - private ValueParser number; + private ValueParser baseParser; + private ValueParser numberParser; /** * Constructor * @param expr */ - public AbsFunction(Function expr) { - number = OperatorTools.buildParser(expr.getParameters().getExpressions().get(0)); + public LogFunction(Function expr) { + List<Expression> expressions = expr.getParameters().getExpressions(); + // Determine the number of arguments and build parser + if (expressions.size() == 1) { + numberParser = OperatorTools.buildParser(expressions.get(0)); + } else { + baseParser = OperatorTools.buildParser(expressions.get(0)); + numberParser = OperatorTools.buildParser(expressions.get(1)); + } } /** @@ -49,8 +60,14 @@ public class AbsFunction implements ValueParser { */ @Override public Object parse(SourceData sourceData, int rowIndex) { - Object numberObj = number.parse(sourceData, rowIndex); + Object numberObj = numberParser.parse(sourceData, rowIndex); BigDecimal numberValue = OperatorTools.parseBigDecimal(numberObj); - return numberValue.abs(); + if (baseParser != null) { + Object baseObj = baseParser.parse(sourceData, rowIndex); + BigDecimal baseValue = OperatorTools.parseBigDecimal(baseObj); + return Math.log(numberValue.doubleValue()) / Math.log(baseValue.doubleValue()); + } else { + return Math.log(numberValue.doubleValue()); + } } } diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/PowerFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/PowerFunction.java index 598c8c45f1..94835f9d7b 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/PowerFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/PowerFunction.java @@ -31,16 +31,16 @@ import java.math.BigDecimal; */ public class PowerFunction implements ValueParser { - private ValueParser base; - private ValueParser exponent; + private ValueParser baseParser; + private ValueParser exponentParser; /** * Constructor * @param expr */ public PowerFunction(Function expr) { - base = OperatorTools.buildParser(expr.getParameters().getExpressions().get(0)); - exponent = OperatorTools.buildParser(expr.getParameters().getExpressions().get(1)); + baseParser = OperatorTools.buildParser(expr.getParameters().getExpressions().get(0)); + exponentParser = OperatorTools.buildParser(expr.getParameters().getExpressions().get(1)); } /** @@ -51,8 +51,8 @@ public class PowerFunction implements ValueParser { */ @Override public Object parse(SourceData sourceData, int rowIndex) { - Object baseObj = base.parse(sourceData, rowIndex); - Object exponentObj = exponent.parse(sourceData, rowIndex); + Object baseObj = baseParser.parse(sourceData, rowIndex); + Object exponentObj = exponentParser.parse(sourceData, rowIndex); BigDecimal baseValue = OperatorTools.parseBigDecimal(baseObj); BigDecimal exponentValue = OperatorTools.parseBigDecimal(exponentObj); return Math.pow(baseValue.doubleValue(), exponentValue.doubleValue()); diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/SqrtFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/SqrtFunction.java index b3038ecaba..f9e277acbd 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/SqrtFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/SqrtFunction.java @@ -31,14 +31,14 @@ import java.math.BigDecimal; */ public class SqrtFunction implements ValueParser { - private ValueParser number; + private ValueParser numberParser; /** * Constructor * @param expr */ public SqrtFunction(Function expr) { - number = OperatorTools.buildParser(expr.getParameters().getExpressions().get(0)); + numberParser = OperatorTools.buildParser(expr.getParameters().getExpressions().get(0)); } /** @@ -49,7 +49,7 @@ public class SqrtFunction implements ValueParser { */ @Override public Object parse(SourceData sourceData, int rowIndex) { - Object numberObj = number.parse(sourceData, rowIndex); + Object numberObj = numberParser.parse(sourceData, rowIndex); BigDecimal numberValue = OperatorTools.parseBigDecimal(numberObj); return Math.sqrt(numberValue.doubleValue()); } diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/operator/OperatorTools.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/operator/OperatorTools.java index 6e4dbace0f..de8c9b499c 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/operator/OperatorTools.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/operator/OperatorTools.java @@ -19,7 +19,11 @@ package org.apache.inlong.sdk.transform.process.operator; import org.apache.inlong.sdk.transform.process.function.AbsFunction; import org.apache.inlong.sdk.transform.process.function.ConcatFunction; +import org.apache.inlong.sdk.transform.process.function.ExpFunction; import org.apache.inlong.sdk.transform.process.function.LnFunction; +import org.apache.inlong.sdk.transform.process.function.Log10Function; +import org.apache.inlong.sdk.transform.process.function.Log2Function; +import org.apache.inlong.sdk.transform.process.function.LogFunction; import org.apache.inlong.sdk.transform.process.function.NowFunction; import org.apache.inlong.sdk.transform.process.function.PowerFunction; import org.apache.inlong.sdk.transform.process.function.SqrtFunction; @@ -77,6 +81,10 @@ public class OperatorTools { functionMap.put("abs", AbsFunction::new); functionMap.put("sqrt", SqrtFunction::new); functionMap.put("ln", LnFunction::new); + functionMap.put("log10", Log10Function::new); + functionMap.put("log2", Log2Function::new); + functionMap.put("log", LogFunction::new); + functionMap.put("exp", ExpFunction::new); } public static ExpressionOperator buildOperator(Expression expr) { diff --git a/inlong-sdk/transform-sdk/src/test/java/org/apache/inlong/sdk/transform/process/TestTransformArithmeticFunctionsProcessor.java b/inlong-sdk/transform-sdk/src/test/java/org/apache/inlong/sdk/transform/process/TestTransformArithmeticFunctionsProcessor.java index fef3d23e1f..b291d2b685 100644 --- a/inlong-sdk/transform-sdk/src/test/java/org/apache/inlong/sdk/transform/process/TestTransformArithmeticFunctionsProcessor.java +++ b/inlong-sdk/transform-sdk/src/test/java/org/apache/inlong/sdk/transform/process/TestTransformArithmeticFunctionsProcessor.java @@ -61,15 +61,15 @@ public class TestTransformArithmeticFunctionsProcessor { // case1: 2^4 TransformProcessor processor = new TransformProcessor(config); List<String> output1 = processor.transform("2|4|6|8", new HashMap<>()); - Assert.assertTrue(output1.size() == 1); + Assert.assertEquals(1, output1.size()); Assert.assertEquals(output1.get(0), "result=16.0"); // case2: 2^(-2) List<String> output2 = processor.transform("2|-2|6|8", new HashMap<>()); - Assert.assertTrue(output2.size() == 1); + Assert.assertEquals(1, output2.size()); Assert.assertEquals(output2.get(0), "result=0.25"); // case3: 4^(0.5) List<String> output3 = processor.transform("4|0.5|6|8", new HashMap<>()); - Assert.assertTrue(output3.size() == 1); + Assert.assertEquals(1, output3.size()); Assert.assertEquals(output3.get(0), "result=2.0"); } @@ -80,11 +80,11 @@ public class TestTransformArithmeticFunctionsProcessor { // case1: |2| TransformProcessor processor = new TransformProcessor(config); List<String> output1 = processor.transform("2|4|6|8", new HashMap<>()); - Assert.assertTrue(output1.size() == 1); + Assert.assertEquals(1, output1.size()); Assert.assertEquals(output1.get(0), "result=2"); // case2: |-4.25| List<String> output2 = processor.transform("-4.25|4|6|8", new HashMap<>()); - Assert.assertTrue(output2.size() == 1); + Assert.assertEquals(1, output2.size()); Assert.assertEquals(output2.get(0), "result=4.25"); } @@ -95,11 +95,11 @@ public class TestTransformArithmeticFunctionsProcessor { // case1: sqrt(9) TransformProcessor processor = new TransformProcessor(config); List<String> output1 = processor.transform("9|4|6|8", new HashMap<>()); - Assert.assertTrue(output1.size() == 1); + Assert.assertEquals(1, output1.size()); Assert.assertEquals(output1.get(0), "result=3.0"); // case2: sqrt(5) List<String> output2 = processor.transform("5|4|6|8", new HashMap<>()); - Assert.assertTrue(output2.size() == 1); + Assert.assertEquals(1, output2.size()); Assert.assertEquals(output2.get(0), "result=2.23606797749979"); } @@ -110,11 +110,79 @@ public class TestTransformArithmeticFunctionsProcessor { // case1: ln(1) TransformProcessor processor = new TransformProcessor(config); List<String> output1 = processor.transform("1|4|6|8", new HashMap<>()); - Assert.assertTrue(output1.size() == 1); + Assert.assertEquals(1, output1.size()); Assert.assertEquals(output1.get(0), "result=0.0"); // case2: ln(10) List<String> output2 = processor.transform("10|4|6|8", new HashMap<>()); - Assert.assertTrue(output2.size() == 1); + Assert.assertEquals(1, output2.size()); Assert.assertEquals(output2.get(0), "result=2.302585092994046"); } + + @Test + public void testLog10Function() throws Exception { + String transformSql = "select log10(numeric1) from source"; + TransformConfig config = new TransformConfig(csvSource, kvSink, transformSql); + // case1: log10(1) + TransformProcessor processor = new TransformProcessor(config); + List<String> output1 = processor.transform("1|4|6|8", new HashMap<>()); + Assert.assertEquals(1, output1.size()); + Assert.assertEquals(output1.get(0), "result=0.0"); + // case2: log10(1000) + List<String> output2 = processor.transform("1000|4|6|8", new HashMap<>()); + Assert.assertEquals(1, output2.size()); + Assert.assertEquals(output2.get(0), "result=3.0"); + } + + @Test + public void testLog2Function() throws Exception { + String transformSql = "select log2(numeric1) from source"; + TransformConfig config = new TransformConfig(csvSource, kvSink, transformSql); + // case1: log2(1) + TransformProcessor processor = new TransformProcessor(config); + List<String> output1 = processor.transform("1|4|6|8", new HashMap<>()); + Assert.assertEquals(1, output1.size()); + Assert.assertEquals(output1.get(0), "result=0.0"); + // case2: log2(32) + List<String> output2 = processor.transform("32|4|6|8", new HashMap<>()); + Assert.assertEquals(1, output2.size()); + Assert.assertEquals(output2.get(0), "result=5.0"); + } + + @Test + public void testLogFunction() throws Exception { + String transformSql1 = "select log(numeric1) from source"; + TransformConfig config1 = new TransformConfig(csvSource, kvSink, transformSql1); + // case1: ln(1) + TransformProcessor processor1 = new TransformProcessor(config1); + List<String> output1 = processor1.transform("1|4|6|8", new HashMap<>()); + Assert.assertEquals(1, output1.size()); + Assert.assertEquals(output1.get(0), "result=0.0"); + String transformSql2 = "select log(numeric1, numeric2) from source"; + TransformConfig config2 = new TransformConfig(csvSource, kvSink, transformSql2); + // case2: log2(8) + TransformProcessor processor2 = new TransformProcessor(config2); + List<String> output2 = processor2.transform("2|8|6|8", new HashMap<>()); + Assert.assertEquals(1, output2.size()); + Assert.assertEquals(output2.get(0), "result=3.0"); + // case3: log10(100) + TransformProcessor processor3 = new TransformProcessor(config2); + List<String> output3 = processor3.transform("10|100|6|8", new HashMap<>()); + Assert.assertEquals(1, output3.size()); + Assert.assertEquals(output3.get(0), "result=2.0"); + } + + @Test + public void testExpFunction() throws Exception { + String transformSql = "select exp(numeric1) from source"; + TransformConfig config = new TransformConfig(csvSource, kvSink, transformSql); + // case1: e^0 + TransformProcessor processor = new TransformProcessor(config); + List<String> output1 = processor.transform("0|4|6|8", new HashMap<>()); + Assert.assertEquals(1, output1.size()); + Assert.assertEquals(output1.get(0), "result=1.0"); + // case2: e^2 + List<String> output2 = processor.transform("2|4|6|8", new HashMap<>()); + Assert.assertEquals(1, output2.size()); + Assert.assertEquals(output2.get(0), "result=7.38905609893065"); + } }