This is an automated email from the ASF dual-hosted git repository.

kezhenxu94 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/skywalking.git


The following commit(s) were added to refs/heads/master by this push:
     new a3317a8  Support for filter filtering of int type values (#7636)
a3317a8 is described below

commit a3317a8238493ee3da9b9ac8d02d207866388877
Author: YczYanchengzhe <[email protected]>
AuthorDate: Thu Sep 2 23:53:05 2021 +0800

    Support for filter filtering of int type values (#7636)
---
 CHANGES.md                                         |  1 +
 .../apache/skywalking/oal/rt/grammar/OALParser.g4  |  6 +-
 .../skywalking/oal/rt/parser/OALListener.java      |  5 ++
 .../skywalking/oal/rt/parser/DeepAnalysisTest.java |  6 +-
 .../skywalking/oal/rt/parser/ScriptParserTest.java | 18 ++++
 .../{EqualMatch.java => NumberMatch.java}          | 25 ++----
 .../{EqualMatch.java => StringMatch.java}          |  2 +-
 .../core/analysis/metrics/PercentMetricsTest.java  | 26 +++---
 .../metrics/expression/NumberMatchTest.java        | 96 ++++++++++++++++++++++
 .../{EqualMatchTest.java => StringMatchTest.java}  | 16 ++--
 10 files changed, 158 insertions(+), 43 deletions(-)

diff --git a/CHANGES.md b/CHANGES.md
index eb3fe2f..bbc698d 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -50,6 +50,7 @@ Release Notes.
 * Fix `LoggingConfigWatcher` return `watch.value` would not consistent with 
the real configuration content.
 * Fix `ZookeeperConfigWatcherRegister.readConfig()` could cause `NPE` when 
`data.getData()` is null.
 * Support nacos grouped dynamic configurations.
+* Support for filter function filtering of int type values.
 
 #### UI
 
diff --git 
a/oap-server/oal-grammar/src/main/antlr4/org/apache/skywalking/oal/rt/grammar/OALParser.g4
 
b/oap-server/oal-grammar/src/main/antlr4/org/apache/skywalking/oal/rt/grammar/OALParser.g4
index 050defc..643e29f 100644
--- 
a/oap-server/oal-grammar/src/main/antlr4/org/apache/skywalking/oal/rt/grammar/OALParser.g4
+++ 
b/oap-server/oal-grammar/src/main/antlr4/org/apache/skywalking/oal/rt/grammar/OALParser.g4
@@ -93,7 +93,7 @@ literalExpression
     ;
 
 expression
-    : booleanMatch | stringMatch | greaterMatch | lessMatch | 
greaterEqualMatch | lessEqualMatch | notEqualMatch | booleanNotEqualMatch | 
likeMatch | inMatch | containMatch | notContainMatch
+    : booleanMatch | numberMatch | stringMatch | greaterMatch | lessMatch | 
greaterEqualMatch | lessEqualMatch | notEqualMatch | booleanNotEqualMatch | 
likeMatch | inMatch | containMatch | notContainMatch
     ;
 
 containMatch
@@ -108,6 +108,10 @@ booleanMatch
     : conditionAttributeStmt DUALEQUALS booleanConditionValue
     ;
 
+numberMatch
+    : conditionAttributeStmt DUALEQUALS numberConditionValue
+    ;
+
 stringMatch
     :  conditionAttributeStmt DUALEQUALS (stringConditionValue | 
enumConditionValue)
     ;
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 4bc80ce..38cc775 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
@@ -115,6 +115,11 @@ public class OALListener extends OALParserBaseListener {
     }
 
     @Override
+    public void enterNumberMatch(OALParser.NumberMatchContext ctx) {
+        conditionExpression.setExpressionType("numberMatch");
+    }
+
+    @Override
     public void enterStringMatch(OALParser.StringMatchContext ctx) {
         conditionExpression.setExpressionType("stringMatch");
     }
diff --git 
a/oap-server/oal-rt/src/test/java/org/apache/skywalking/oal/rt/parser/DeepAnalysisTest.java
 
b/oap-server/oal-rt/src/test/java/org/apache/skywalking/oal/rt/parser/DeepAnalysisTest.java
index 1eb6fa5..58d353c 100644
--- 
a/oap-server/oal-rt/src/test/java/org/apache/skywalking/oal/rt/parser/DeepAnalysisTest.java
+++ 
b/oap-server/oal-rt/src/test/java/org/apache/skywalking/oal/rt/parser/DeepAnalysisTest.java
@@ -22,7 +22,7 @@ import java.io.IOException;
 import java.util.List;
 import 
org.apache.skywalking.oap.server.core.analysis.metrics.expression.BooleanMatch;
 import 
org.apache.skywalking.oap.server.core.analysis.metrics.expression.BooleanNotEqualMatch;
-import 
org.apache.skywalking.oap.server.core.analysis.metrics.expression.EqualMatch;
+import 
org.apache.skywalking.oap.server.core.analysis.metrics.expression.StringMatch;
 import 
org.apache.skywalking.oap.server.core.analysis.metrics.expression.NotEqualMatch;
 import org.apache.skywalking.oap.server.core.annotation.AnnotationScan;
 import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
@@ -127,7 +127,7 @@ public class DeepAnalysisTest {
         List<Expression> filterExpressions = result.getFilterExpressions();
         Assert.assertEquals(1, filterExpressions.size());
         Expression filterExpression = filterExpressions.get(0);
-        Assert.assertEquals(EqualMatch.class.getName(), 
filterExpression.getExpressionObject());
+        Assert.assertEquals(StringMatch.class.getName(), 
filterExpression.getExpressionObject());
         Assert.assertEquals("source.getName()", filterExpression.getLeft());
         Assert.assertEquals("\"/service/prod/save\"", 
filterExpression.getRight());
     }
@@ -157,7 +157,7 @@ public class DeepAnalysisTest {
         result.addFilterExpressionsParserResult(new 
ConditionExpression("stringMatch", "type", ""));
         result = analysis.analysis(result);
         assertTrue(result.getFilterExpressions().size() > 0);
-        assertEquals(EqualMatch.class.getName(), 
result.getFilterExpressions().get(0).getExpressionObject());
+        assertEquals(StringMatch.class.getName(), 
result.getFilterExpressions().get(0).getExpressionObject());
         assertEquals("source.getType()", 
result.getFilterExpressions().get(0).getLeft());
 
         result.setFilterExpressions(null);
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 10c9322..99ee17b 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
@@ -270,6 +270,24 @@ public class ScriptParserTest {
     }
 
     @Test
+    public void testParse10() throws IOException {
+        ScriptParser parser = ScriptParser.createFromScriptText(
+            "ClientCpm = from(ServiceInstanceRelation.*).filter(componentId == 
7).cpm();", TEST_SOURCE_PACKAGE);
+        List<AnalysisResult> results = parser.parse().getMetricsStmts();
+        AnalysisResult clientCpm = results.get(0);
+        Assert.assertEquals("ClientCpm", clientCpm.getMetricsName());
+        Assert.assertEquals("ServiceInstanceRelation", 
clientCpm.getSourceName());
+        Assert.assertEquals("[*]", clientCpm.getSourceAttribute().toString());
+        final List<Expression> filterExpressions = 
clientCpm.getFilterExpressions();
+        Assert.assertEquals(1, filterExpressions.size());
+        Assert.assertEquals("source.getComponentId()", 
filterExpressions.get(0).getLeft());
+        Assert.assertEquals("cpm", clientCpm.getAggregationFunctionName());
+        EntryMethod entryMethod = clientCpm.getEntryMethod();
+        List<Object> methodArgsExpressions = entryMethod.getArgsExpressions();
+        Assert.assertEquals(1, methodArgsExpressions.size());
+    }
+
+    @Test
     public void testDisable() throws IOException {
         ScriptParser parser = 
ScriptParser.createFromScriptText("disable(segment);", TEST_SOURCE_PACKAGE);
         DisableCollection collection = parser.parse().getDisableCollection();
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/EqualMatch.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/NumberMatch.java
similarity index 61%
copy from 
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/EqualMatch.java
copy to 
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/NumberMatch.java
index 32c8a00..17b3629 100644
--- 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/EqualMatch.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/NumberMatch.java
@@ -6,37 +6,28 @@
  * (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
+ *      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.skywalking.oap.server.core.analysis.metrics.expression;
 
-import java.util.Objects;
 import 
org.apache.skywalking.oap.server.core.analysis.metrics.annotation.FilterMatcher;
 
-@FilterMatcher("stringMatch")
-public class EqualMatch {
-
-    public boolean match(String left, String right) {
-        if (left.startsWith("\"") && left.endsWith("\"")) {
-            left = left.substring(1, left.length() - 1);
-        }
+@FilterMatcher
+public class NumberMatch {
 
-        if (right.startsWith("\"") && right.endsWith("\"")) {
-            right = left.substring(1, right.length() - 1);
-        }
-
-        return Objects.equals(left, right);
+    public boolean match(int left, int right) {
+        return left == right;
     }
 
-    public boolean match(Object left, Object right) {
-        return Objects.equals(left, right);
+    public boolean match(long left, long right) {
+        return left == right;
     }
+
 }
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/EqualMatch.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/StringMatch.java
similarity index 98%
rename from 
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/EqualMatch.java
rename to 
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/StringMatch.java
index 32c8a00..d0b6b01 100644
--- 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/EqualMatch.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/StringMatch.java
@@ -22,7 +22,7 @@ import java.util.Objects;
 import 
org.apache.skywalking.oap.server.core.analysis.metrics.annotation.FilterMatcher;
 
 @FilterMatcher("stringMatch")
-public class EqualMatch {
+public class StringMatch {
 
     public boolean match(String left, String right) {
         if (left.startsWith("\"") && left.endsWith("\"")) {
diff --git 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentMetricsTest.java
 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentMetricsTest.java
index eec91eb..51a2dbc 100644
--- 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentMetricsTest.java
+++ 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentMetricsTest.java
@@ -18,7 +18,7 @@
 
 package org.apache.skywalking.oap.server.core.analysis.metrics;
 
-import 
org.apache.skywalking.oap.server.core.analysis.metrics.expression.EqualMatch;
+import 
org.apache.skywalking.oap.server.core.analysis.metrics.expression.StringMatch;
 import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
 import org.junit.Assert;
 import org.junit.Test;
@@ -27,18 +27,18 @@ public class PercentMetricsTest {
     @Test
     public void testEntranceCombine() {
         PercentMetricsImpl impl = new PercentMetricsImpl();
-        impl.combine(new EqualMatch().match(true, true));
-        impl.combine(new EqualMatch().match(true, false));
-        impl.combine(new EqualMatch().match(true, false));
+        impl.combine(new StringMatch().match(true, true));
+        impl.combine(new StringMatch().match(true, false));
+        impl.combine(new StringMatch().match(true, false));
 
         impl.calculate();
 
         Assert.assertEquals(3333, impl.getValue());
 
         impl = new PercentMetricsImpl();
-        impl.combine(new EqualMatch().match(true, true));
-        impl.combine(new EqualMatch().match(true, true));
-        impl.combine(new EqualMatch().match(true, false));
+        impl.combine(new StringMatch().match(true, true));
+        impl.combine(new StringMatch().match(true, true));
+        impl.combine(new StringMatch().match(true, false));
 
         impl.calculate();
 
@@ -48,14 +48,14 @@ public class PercentMetricsTest {
     @Test
     public void testSelfCombine() {
         PercentMetricsImpl impl = new PercentMetricsImpl();
-        impl.combine(new EqualMatch().match(true, true));
-        impl.combine(new EqualMatch().match(true, false));
-        impl.combine(new EqualMatch().match(true, false));
+        impl.combine(new StringMatch().match(true, true));
+        impl.combine(new StringMatch().match(true, false));
+        impl.combine(new StringMatch().match(true, false));
 
         PercentMetricsImpl impl2 = new PercentMetricsImpl();
-        impl2.combine(new EqualMatch().match(true, true));
-        impl2.combine(new EqualMatch().match(true, true));
-        impl2.combine(new EqualMatch().match(true, false));
+        impl2.combine(new StringMatch().match(true, true));
+        impl2.combine(new StringMatch().match(true, true));
+        impl2.combine(new StringMatch().match(true, false));
 
         impl.combine(impl2);
 
diff --git 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/NumberMatchTest.java
 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/NumberMatchTest.java
new file mode 100644
index 0000000..2048f44
--- /dev/null
+++ 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/NumberMatchTest.java
@@ -0,0 +1,96 @@
+/*
+ * 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.skywalking.oap.server.core.analysis.metrics.expression;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
+
+public class NumberMatchTest {
+
+    @Test
+    public void integerShouldEqual() {
+        Integer a = 334;
+        Integer b = 334;
+        boolean match = new NumberMatch().match(a, b);
+        assertTrue(match);
+
+        a = -123;
+        b = -123;
+        match = new NumberMatch().match(a, b);
+        assertTrue(match);
+
+        a = -122;
+        b = -123;
+        match = new NumberMatch().match(a, b);
+        assertFalse(match);
+
+        a = -123;
+        b = -122;
+        match = new NumberMatch().match(a, b);
+        assertFalse(match);
+    }
+
+    @Test
+    public void intShouldEqual() {
+        int a = 334;
+        int b = 334;
+        boolean match = new NumberMatch().match(a, b);
+        assertTrue(match);
+
+        a = -123;
+        b = -123;
+        match = new NumberMatch().match(a, b);
+        assertTrue(match);
+
+        a = -122;
+        b = -123;
+        match = new NumberMatch().match(a, b);
+        assertFalse(match);
+
+        a = -123;
+        b = -122;
+        match = new NumberMatch().match(a, b);
+        assertFalse(match);
+    }
+
+    @Test
+    public void longShouldEqual() {
+        long a = 21474836478L;
+        long b = 21474836478L;
+        boolean match = new NumberMatch().match(a, b);
+        assertTrue(match);
+
+        a = -21474836478L;
+        b = -21474836479L;
+        match = new NumberMatch().match(a, b);
+        assertFalse(match);
+
+        Long c = -123L;
+        Long d = -123L;
+        match = new NumberMatch().match(c, d);
+        assertTrue(match);
+
+        c = -21474836478L;
+        d = -21474836479L;
+        match = new NumberMatch().match(c, d);
+        assertFalse(match);
+    }
+
+}
\ No newline at end of file
diff --git 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/EqualMatchTest.java
 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/StringMatchTest.java
similarity index 79%
rename from 
oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/EqualMatchTest.java
rename to 
oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/StringMatchTest.java
index bce0241..e3b665f 100644
--- 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/EqualMatchTest.java
+++ 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/StringMatchTest.java
@@ -23,13 +23,13 @@ import org.junit.Test;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
-public class EqualMatchTest {
+public class StringMatchTest {
 
     @Test
     public void integerShouldEqualWhenLargerThan128() {
         Integer a = 334;
         Integer b = 334;
-        boolean match = new EqualMatch().match(a, b);
+        boolean match = new StringMatch().match(a, b);
         assertTrue(match);
     }
 
@@ -37,7 +37,7 @@ public class EqualMatchTest {
     public void longShouldEqualWhenLargerThan128() {
         Long a = 334L;
         Long b = 334L;
-        boolean match = new EqualMatch().match(a, b);
+        boolean match = new StringMatch().match(a, b);
         assertTrue(match);
     }
 
@@ -45,7 +45,7 @@ public class EqualMatchTest {
     public void doubleShouldEqualWhenLargerThan128() {
         Double a = 334.0;
         Double b = 334.0;
-        boolean match = new EqualMatch().match(a, b);
+        boolean match = new StringMatch().match(a, b);
         assertTrue(match);
     }
 
@@ -53,14 +53,14 @@ public class EqualMatchTest {
     public void floatShouldEqualWhenLargerThan128() {
         Float a = 334.0F;
         Float b = 334.0F;
-        boolean match = new EqualMatch().match(a, b);
+        boolean match = new StringMatch().match(a, b);
         assertTrue(match);
     }
 
     @Test
     public void stringShouldEqual() {
-        assertTrue(new EqualMatch().match("\"a\"", "a"));
-        assertTrue(new EqualMatch().match("a", "a"));
-        assertFalse(new EqualMatch().match("\"a\"", "ab"));
+        assertTrue(new StringMatch().match("\"a\"", "a"));
+        assertTrue(new StringMatch().match("a", "a"));
+        assertFalse(new StringMatch().match("\"a\"", "ab"));
     }
 }
\ No newline at end of file

Reply via email to