diff --git a/CHANGES.md b/CHANGES.md index fea05af65a88ecc974e102aa4806ceacac5cd53c..9790ed76339ea1d90e35095b26a1fa63769733e9 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -71,6 +71,7 @@ Release Notes. * Support Alarm to feishu * Add the implementation of ConfigurationDiscovery on the OAP side. * Fix bug in `parseInternalErrorCode` where some error codes are never reached. +* OAL supports multiple values when as numeric #### UI * Fix un-removed tags in trace query. diff --git a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/ConditionExpression.java b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/ConditionExpression.java index a9466f4d0ba1c6749b5ed95f193b27e3ab15c2a3..8a1efaf7796c270c7bff85d01bb30fb10d3ea2bc 100644 --- a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/ConditionExpression.java +++ b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/ConditionExpression.java @@ -35,6 +35,7 @@ public class ConditionExpression { private List attributes = new ArrayList<>(); private String value; private List values; + private boolean number; public ConditionExpression(final String expressionType, final String attributes, final String value) { this.expressionType = expressionType; @@ -50,11 +51,17 @@ public class ConditionExpression { } } + public void isNumber() { + number = true; + } + public void enterMultiConditionValue() { values = new LinkedList<>(); } public void exitMultiConditionValue() { - value = "new Object[]{" + String.join(",", values) + "}"; + value = number ? + "new long[]{" + String.join(",", values) + "}" : + "new Object[]{" + String.join(",", values) + "}"; } } diff --git a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/OALListener.java b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/OALListener.java index ef93b778540edde4ab8777cc4782aee4d28d80c8..4bc80ce7e8e2caaf50063ddc7b4d37087b9aa135 100644 --- a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/OALListener.java +++ b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/OALListener.java @@ -196,6 +196,7 @@ public class OALListener extends OALParserBaseListener { @Override public void enterNumberConditionValue(OALParser.NumberConditionValueContext ctx) { + conditionExpression.isNumber(); enterConditionValue(ctx.getText()); } diff --git a/oap-server/oal-rt/src/test/java/org/apache/skywalking/oal/rt/parser/ScriptParserTest.java b/oap-server/oal-rt/src/test/java/org/apache/skywalking/oal/rt/parser/ScriptParserTest.java index 1d28d13735a9c555168881396e6398db17e27969..10c9322c0616790686d3f48700e04d0f5f8d51b8 100644 --- a/oap-server/oal-rt/src/test/java/org/apache/skywalking/oal/rt/parser/ScriptParserTest.java +++ b/oap-server/oal-rt/src/test/java/org/apache/skywalking/oal/rt/parser/ScriptParserTest.java @@ -227,11 +227,31 @@ public class ScriptParserTest { "org.apache.skywalking.oap.server.core.analysis.metrics.expression.InMatch", expression.getExpressionObject() ); - Assert.assertEquals("new Object[]{1,2,3}", expression.getRight()); + Assert.assertEquals("new long[]{1,2,3}", expression.getRight()); } @Test public void testParse8() throws IOException { + ScriptParser parser = ScriptParser.createFromScriptText( + "service_response_s4_summary = from(Service.latency).filter(latency != 1).filter(latency in [\"1\",\"2\", \"3\"]).sum();", + TEST_SOURCE_PACKAGE + ); + List results = parser.parse().getMetricsStmts(); + Assert.assertEquals(1, results.size()); + AnalysisResult result = results.get(0); + List expressions = result.getFilterExpressions(); + Assert.assertEquals(2, expressions.size()); + Expression expression = expressions.get(1); + Assert.assertEquals("source.getLatency()", expression.getLeft()); + Assert.assertEquals( + "org.apache.skywalking.oap.server.core.analysis.metrics.expression.InMatch", + expression.getExpressionObject() + ); + Assert.assertEquals("new Object[]{\"1\",\"2\",\"3\"}", expression.getRight()); + } + + @Test + public void testParse9() throws IOException { ScriptParser parser = ScriptParser.createFromScriptText( "ServicePercent = from(Service.sidecar.internalError).filter(sidecar.internalError == \"abc\").percent(sidecar.internalError != \"\");", TEST_SOURCE_PACKAGE); List results = parser.parse().getMetricsStmts(); diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/InMatch.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/InMatch.java index 897bd000ea5236edf95fee4410f5f82b0ac4d09a..8745645241e7a9129516c6571a8451330eef3253 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/InMatch.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/InMatch.java @@ -22,6 +22,25 @@ import org.apache.skywalking.oap.server.core.analysis.metrics.annotation.FilterM @FilterMatcher public class InMatch { + + public boolean match(int left, long[] rights) { + for (long right : rights) { + if (left == right) { + return true; + } + } + return false; + } + + public boolean match(long left, long[] rights) { + for (long right : rights) { + if (left == right) { + return true; + } + } + return false; + } + public boolean match(Object left, Object[] rights) { for (Object right : rights) { if (right instanceof String) { diff --git a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/InMatchTest.java b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/InMatchTest.java index 60530dfd95738350142f68575b76a817c18cfdea..6597bf1db54b6b5c9c44d982c33aa35a9510a2cd 100644 --- a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/InMatchTest.java +++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/InMatchTest.java @@ -48,26 +48,26 @@ public class InMatchTest { } )); - Assert.assertTrue(new InMatch().match(1, new Object[] { + Assert.assertTrue(new InMatch().match(1, new long[] { 1, 2, 3 })); - Assert.assertFalse(new InMatch().match(4, new Object[] { + Assert.assertFalse(new InMatch().match(4, new long[] { 1, 2, 3 })); - Assert.assertTrue(new InMatch().match(1.0D, new Object[] { - 1.0D, - 2.0D, - 3.0D + Assert.assertTrue(new InMatch().match(1L, new long[] { + 1, + 2, + 3 })); - Assert.assertFalse(new InMatch().match(4.0D, new Object[] { - 1.0D, - 2.0D, - 3.0D + Assert.assertFalse(new InMatch().match(4L, new long[] { + 1, + 2, + 3 })); } }