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

wusheng pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/incubator-skywalking-oal-tool.git


The following commit(s) were added to refs/heads/master by this push:
     new 4f78130  Support percent in OAL tool
4f78130 is described below

commit 4f78130a92b4e49e77722728e874bbb7bec03bbe
Author: Wu Sheng <[email protected]>
AuthorDate: Tue Aug 14 23:43:51 2018 +0800

    Support percent in OAL tool
---
 .../skywalking/oal/tool/parser/AnalysisResult.java | 10 +++-
 .../oal/tool/parser/ConditionExpression.java}      | 14 ++++-
 .../skywalking/oal/tool/parser/DeepAnalysis.java   | 30 +++++++++++
 .../skywalking/oal/tool/parser/OALListener.java    | 27 +++++++++-
 .../skywalking/oal/tool/util/ClassMethodUtil.java  |  4 ++
 .../skywalking/oap/server/core/Indicators.java     |  2 +
 .../core/analysis/indicator/PercentIndicator.java  | 59 ++++++++++++++++++++++
 .../analysis/indicator/annotation/Expression.java  |  2 +-
 .../{ExpressionArg2.java => ExpressionArg0.java}   |  4 +-
 .../indicator/annotation/ExpressionArg1.java       |  2 +-
 .../BinaryMatchExpression.java}                    | 26 ++++++----
 .../BooleanBinaryMatch.java}                       | 15 +++---
 .../oal/tool/parser/DeepAnalysisTest.java          |  1 -
 .../oal/tool/parser/ScriptParserTest.java          | 20 ++++++++
 oal-parser/src/test/resources/oal_test.oal         |  3 +-
 .../apache/skywalking/oal/tool/grammar/OALLexer.g4 |  4 +-
 .../skywalking/oal/tool/grammar/OALLexer.tokens    | 22 ++------
 .../skywalking/oal/tool/grammar/OALParser.g4       | 21 ++++++--
 18 files changed, 215 insertions(+), 51 deletions(-)

diff --git 
a/oal-parser/src/main/java/org/apache/skywalking/oal/tool/parser/AnalysisResult.java
 
b/oal-parser/src/main/java/org/apache/skywalking/oal/tool/parser/AnalysisResult.java
index 8c419fe..c520ac3 100644
--- 
a/oal-parser/src/main/java/org/apache/skywalking/oal/tool/parser/AnalysisResult.java
+++ 
b/oal-parser/src/main/java/org/apache/skywalking/oal/tool/parser/AnalysisResult.java
@@ -23,7 +23,6 @@ import java.util.List;
 import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.Setter;
-import org.apache.skywalking.oap.server.core.remote.selector.Selector;
 
 @Getter(AccessLevel.PUBLIC)
 @Setter(AccessLevel.PUBLIC)
@@ -44,6 +43,8 @@ public class AnalysisResult {
 
     private EntryMethod entryMethod;
 
+    private List<ConditionExpression> funcConditionExpressions;
+
     private List<DataColumn> persistentFields;
 
     private List<SourceColumn> fieldsFromSource;
@@ -58,6 +59,13 @@ public class AnalysisResult {
         persistentFields.add(dataColumn);
     }
 
+    public void addFuncConditionExpression(ConditionExpression 
conditionExpression) {
+        if (funcConditionExpressions == null) {
+            funcConditionExpressions = new LinkedList<>();
+        }
+        funcConditionExpressions.add(conditionExpression);
+    }
+
     public void generateSerializeFields() {
         serializeFields = new PersistenceColumns();
         serializeFields.addLongField("timeBucket");
diff --git a/oal-parser/src/test/resources/oal_test.oal 
b/oal-parser/src/main/java/org/apache/skywalking/oal/tool/parser/ConditionExpression.java
similarity index 72%
copy from oal-parser/src/test/resources/oal_test.oal
copy to 
oal-parser/src/main/java/org/apache/skywalking/oal/tool/parser/ConditionExpression.java
index 66ad3cc..6b591b2 100644
--- a/oal-parser/src/test/resources/oal_test.oal
+++ 
b/oal-parser/src/main/java/org/apache/skywalking/oal/tool/parser/ConditionExpression.java
@@ -16,6 +16,16 @@
  *
  */
 
-//Service_Avg = from(Service.latency).avg();
+package org.apache.skywalking.oal.tool.parser;
 
-endpoint_Avg = from(Endpoint.latency).avg();
\ No newline at end of file
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter(AccessLevel.PUBLIC)
+@Setter(AccessLevel.PUBLIC)
+public class ConditionExpression {
+    private String expressionType;
+    private String attribute;
+    private String value;
+}
diff --git 
a/oal-parser/src/main/java/org/apache/skywalking/oal/tool/parser/DeepAnalysis.java
 
b/oal-parser/src/main/java/org/apache/skywalking/oal/tool/parser/DeepAnalysis.java
index 2407327..a565750 100644
--- 
a/oal-parser/src/main/java/org/apache/skywalking/oal/tool/parser/DeepAnalysis.java
+++ 
b/oal-parser/src/main/java/org/apache/skywalking/oal/tool/parser/DeepAnalysis.java
@@ -28,6 +28,10 @@ import org.apache.skywalking.oap.server.core.Indicators;
 import org.apache.skywalking.oap.server.core.analysis.indicator.Indicator;
 import 
org.apache.skywalking.oap.server.core.analysis.indicator.annotation.ConstOne;
 import 
org.apache.skywalking.oap.server.core.analysis.indicator.annotation.Entrance;
+import 
org.apache.skywalking.oap.server.core.analysis.indicator.annotation.Expression;
+import 
org.apache.skywalking.oap.server.core.analysis.indicator.annotation.ExpressionArg0;
+import 
org.apache.skywalking.oap.server.core.analysis.indicator.annotation.ExpressionArg1;
+import 
org.apache.skywalking.oap.server.core.analysis.indicator.annotation.IndicatorOperator;
 import 
org.apache.skywalking.oap.server.core.analysis.indicator.annotation.SourceFrom;
 import org.apache.skywalking.oap.server.core.storage.annotation.Column;
 
@@ -38,6 +42,12 @@ public class DeepAnalysis {
 
         Class<? extends Indicator> indicatorClass = 
Indicators.find(result.getAggregationFunctionName());
 
+        // 2. Assert indicator class has IndicatorOperator annotation.
+        IndicatorOperator indicatorClassAnnotation = 
indicatorClass.getAnnotation(IndicatorOperator.class);
+        if (indicatorClassAnnotation == null) {
+            throw new IllegalArgumentException("Can't find IndicatorOperator 
in class: " + indicatorClass.getName());
+        }
+        result.setIndicatorClassName(indicatorClass.getSimpleName());
 
         // 3. Find Entrance method of this indicator
         Class c = indicatorClass;
@@ -71,6 +81,26 @@ public class DeepAnalysis {
                 entryMethod.addArg("source." + 
ClassMethodUtil.toGetMethod(result.getSourceAttribute()) + "()");
             } else if (annotation instanceof ConstOne) {
                 entryMethod.addArg("1");
+            } else if (annotation instanceof Expression) {
+                entryMethod.addArg("new " + parameter.getType().getName() + 
"()");
+            } else if (annotation instanceof ExpressionArg0) {
+                if (result.getFuncConditionExpressions().size() == 1) {
+                    ConditionExpression conditionExpression = 
result.getFuncConditionExpressions().get(0);
+                    if 
("booleanMatch".equals(conditionExpression.getExpressionType())) {
+                        entryMethod.addArg("source." + 
ClassMethodUtil.toIsMethod(conditionExpression.getAttribute()) + "()");
+                    } else {
+                        throw new IllegalArgumentException("Entrance method:" 
+ entranceMethod + " argument has @ExpressionArg0, but expression type is not 
supported");
+                    }
+                } else {
+                    throw new IllegalArgumentException("Entrance method:" + 
entranceMethod + " argument has @ExpressionArg0, but can't find 
funcParamExpression.");
+                }
+            } else if (annotation instanceof ExpressionArg1) {
+                if (result.getFuncConditionExpressions().size() == 1) {
+                    ConditionExpression conditionExpression = 
result.getFuncConditionExpressions().get(0);
+                    entryMethod.addArg(conditionExpression.getValue());
+                } else {
+                    throw new IllegalArgumentException("Entrance method:" + 
entranceMethod + " argument has @ExpressionArg0, but can't find 
funcParamExpression.");
+                }
             } else {
                 throw new IllegalArgumentException("Entrance method:" + 
entranceMethod + " doesn't the expected annotation.");
             }
diff --git 
a/oal-parser/src/main/java/org/apache/skywalking/oal/tool/parser/OALListener.java
 
b/oal-parser/src/main/java/org/apache/skywalking/oal/tool/parser/OALListener.java
index b577954..63f05e4 100644
--- 
a/oal-parser/src/main/java/org/apache/skywalking/oal/tool/parser/OALListener.java
+++ 
b/oal-parser/src/main/java/org/apache/skywalking/oal/tool/parser/OALListener.java
@@ -27,6 +27,8 @@ public class OALListener extends OALParserBaseListener {
     private List<AnalysisResult> results;
     private AnalysisResult current;
 
+    private ConditionExpression conditionExpression;
+
     public OALListener(List<AnalysisResult> results) {
         this.results = results;
     }
@@ -64,6 +66,29 @@ public class OALListener extends OALParserBaseListener {
         current.setAggregationFunctionName(ctx.getText());
     }
 
+    @Override public void 
enterConditionAttribute(OALParser.ConditionAttributeContext ctx) {
+        conditionExpression.setAttribute(ctx.getText());
+    }
+
+    @Override public void 
enterBooleanBinaryMatch(OALParser.BooleanBinaryMatchContext ctx) {
+        conditionExpression.setExpressionType("booleanMatch");
+    }
+
+    @Override public void enterConditionValue(OALParser.ConditionValueContext 
ctx) {
+        conditionExpression.setValue(ctx.getText());
+    }
+
+    @Override public void 
enterFuncParamExpression(OALParser.FuncParamExpressionContext ctx) {
+        conditionExpression = new ConditionExpression();
+    }
+
+    @Override public void 
exitFuncParamExpression(OALParser.FuncParamExpressionContext ctx) {
+        current.addFuncConditionExpression(conditionExpression);
+    }
+
+    @Override public void 
exitBooleanBinaryMatch(OALParser.BooleanBinaryMatchContext ctx) {
+    }
+
     private String metricNameFormat(String source) {
         source = firstLetterUpper(source);
         int idx;
@@ -73,7 +98,7 @@ public class OALListener extends OALParserBaseListener {
         return source;
     }
 
-    private String firstLetterUpper(String source){
+    private String firstLetterUpper(String source) {
         return source.substring(0, 1).toUpperCase() + source.substring(1);
     }
 }
diff --git 
a/oal-parser/src/main/java/org/apache/skywalking/oal/tool/util/ClassMethodUtil.java
 
b/oal-parser/src/main/java/org/apache/skywalking/oal/tool/util/ClassMethodUtil.java
index 081bca5..140ab63 100644
--- 
a/oal-parser/src/main/java/org/apache/skywalking/oal/tool/util/ClassMethodUtil.java
+++ 
b/oal-parser/src/main/java/org/apache/skywalking/oal/tool/util/ClassMethodUtil.java
@@ -26,4 +26,8 @@ public class ClassMethodUtil {
     public static String toSetMethod(String attribute) {
         return "set" + attribute.substring(0, 1).toUpperCase() + 
attribute.substring(1);
     }
+
+    public static String toIsMethod(String attribute) {
+        return "is" + attribute.substring(0, 1).toUpperCase() + 
attribute.substring(1);
+    }
 }
diff --git 
a/oal-parser/src/main/java/org/apache/skywalking/oap/server/core/Indicators.java
 
b/oal-parser/src/main/java/org/apache/skywalking/oap/server/core/Indicators.java
index 4925b95..d68d729 100644
--- 
a/oal-parser/src/main/java/org/apache/skywalking/oap/server/core/Indicators.java
+++ 
b/oal-parser/src/main/java/org/apache/skywalking/oap/server/core/Indicators.java
@@ -22,12 +22,14 @@ import java.util.HashMap;
 import java.util.Map;
 import org.apache.skywalking.oap.server.core.analysis.indicator.AvgIndicator;
 import org.apache.skywalking.oap.server.core.analysis.indicator.Indicator;
+import 
org.apache.skywalking.oap.server.core.analysis.indicator.PercentIndicator;
 
 public class Indicators {
     private static Map<String, Class<? extends Indicator>> REGISTER = new 
HashMap<>();
 
     static {
         REGISTER.put("avg", AvgIndicator.class);
+        REGISTER.put("percent", PercentIndicator.class);
     }
 
     public static Class<? extends Indicator> find(String functionName) {
diff --git 
a/oal-parser/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/PercentIndicator.java
 
b/oal-parser/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/PercentIndicator.java
new file mode 100644
index 0000000..ab590e8
--- /dev/null
+++ 
b/oal-parser/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/PercentIndicator.java
@@ -0,0 +1,59 @@
+/*
+ * 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.indicator;
+
+import lombok.Getter;
+import lombok.Setter;
+import 
org.apache.skywalking.oap.server.core.analysis.indicator.annotation.Entrance;
+import 
org.apache.skywalking.oap.server.core.analysis.indicator.annotation.Expression;
+import 
org.apache.skywalking.oap.server.core.analysis.indicator.annotation.ExpressionArg0;
+import 
org.apache.skywalking.oap.server.core.analysis.indicator.annotation.ExpressionArg1;
+import 
org.apache.skywalking.oap.server.core.analysis.indicator.annotation.IndicatorOperator;
+import 
org.apache.skywalking.oap.server.core.analysis.indicator.expression.BooleanBinaryMatch;
+import org.apache.skywalking.oap.server.core.storage.annotation.Column;
+
+/**
+ * @author wusheng
+ */
+@IndicatorOperator
+public abstract class PercentIndicator extends Indicator {
+    protected static final String TOTAL = "total";
+    protected static final String MATCH = "match";
+    protected static final String PERCENTAGE = "percentage";
+
+    @Getter @Setter @Column(columnName = TOTAL) private long total;
+    @Getter @Setter @Column(columnName = PERCENTAGE) private int percentage;
+    @Getter @Setter @Column(columnName = MATCH) private long match;
+
+    @Entrance
+    public final void combine(@Expression BooleanBinaryMatch expression, 
@ExpressionArg0 Object leftValue,
+        @ExpressionArg1 Object rightValue) {
+        expression.setLeft(leftValue);
+        expression.setRight(rightValue);
+        if (expression.match()) {
+            match++;
+        }
+        total++;
+    }
+
+    @Override public final void combine(Indicator indicator) {
+        total += ((PercentIndicator)indicator).total;
+        match += ((PercentIndicator)indicator).match;
+    }
+}
diff --git 
a/oal-parser/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/annotation/Expression.java
 
b/oal-parser/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/annotation/Expression.java
index 9662fcb..e763bc0 100644
--- 
a/oal-parser/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/annotation/Expression.java
+++ 
b/oal-parser/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/annotation/Expression.java
@@ -27,6 +27,6 @@ import java.lang.annotation.Target;
  * @author wusheng
  */
 @Target(ElementType.PARAMETER)
-@Retention(RetentionPolicy.SOURCE)
+@Retention(RetentionPolicy.RUNTIME)
 public @interface Expression {
 }
diff --git 
a/oal-parser/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/annotation/ExpressionArg2.java
 
b/oal-parser/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/annotation/ExpressionArg0.java
similarity index 93%
copy from 
oal-parser/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/annotation/ExpressionArg2.java
copy to 
oal-parser/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/annotation/ExpressionArg0.java
index 76943a1..8bde31a 100644
--- 
a/oal-parser/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/annotation/ExpressionArg2.java
+++ 
b/oal-parser/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/annotation/ExpressionArg0.java
@@ -27,6 +27,6 @@ import java.lang.annotation.Target;
  * @author wusheng
  */
 @Target(ElementType.PARAMETER)
-@Retention(RetentionPolicy.SOURCE)
-public @interface ExpressionArg2 {
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ExpressionArg0 {
 }
diff --git 
a/oal-parser/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/annotation/ExpressionArg1.java
 
b/oal-parser/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/annotation/ExpressionArg1.java
index 600f06e..70dfc9a 100644
--- 
a/oal-parser/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/annotation/ExpressionArg1.java
+++ 
b/oal-parser/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/annotation/ExpressionArg1.java
@@ -27,6 +27,6 @@ import java.lang.annotation.Target;
  * @author wusheng
  */
 @Target(ElementType.PARAMETER)
-@Retention(RetentionPolicy.SOURCE)
+@Retention(RetentionPolicy.RUNTIME)
 public @interface ExpressionArg1 {
 }
diff --git 
a/oal-parser/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/annotation/ExpressionArg2.java
 
b/oal-parser/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/expression/BinaryMatchExpression.java
similarity index 69%
rename from 
oal-parser/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/annotation/ExpressionArg2.java
rename to 
oal-parser/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/expression/BinaryMatchExpression.java
index 76943a1..ef8cc80 100644
--- 
a/oal-parser/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/annotation/ExpressionArg2.java
+++ 
b/oal-parser/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/expression/BinaryMatchExpression.java
@@ -16,17 +16,25 @@
  *
  */
 
-package org.apache.skywalking.oap.server.core.analysis.indicator.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
+package org.apache.skywalking.oap.server.core.analysis.indicator.expression;
 
 /**
+ * BinaryMatchExpression accepts two calculate factors,
+ * and return the True/False result.
+ *
  * @author wusheng
  */
-@Target(ElementType.PARAMETER)
-@Retention(RetentionPolicy.SOURCE)
-public @interface ExpressionArg2 {
+public abstract class BinaryMatchExpression {
+    protected Object left;
+    protected Object right;
+
+    public void setLeft(Object left) {
+        this.left = left;
+    }
+
+    public void setRight(Object right) {
+        this.right = right;
+    }
+
+    public abstract boolean match();
 }
diff --git 
a/oal-parser/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/annotation/Expression.java
 
b/oal-parser/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/expression/BooleanBinaryMatch.java
similarity index 76%
copy from 
oal-parser/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/annotation/Expression.java
copy to 
oal-parser/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/expression/BooleanBinaryMatch.java
index 9662fcb..dc55b83 100644
--- 
a/oal-parser/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/annotation/Expression.java
+++ 
b/oal-parser/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/expression/BooleanBinaryMatch.java
@@ -16,17 +16,14 @@
  *
  */
 
-package org.apache.skywalking.oap.server.core.analysis.indicator.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
+package org.apache.skywalking.oap.server.core.analysis.indicator.expression;
 
 /**
+ *
  * @author wusheng
  */
-@Target(ElementType.PARAMETER)
-@Retention(RetentionPolicy.SOURCE)
-public @interface Expression {
+public class BooleanBinaryMatch extends BinaryMatchExpression {
+    @Override public boolean match() {
+        return left == right;
+    }
 }
diff --git 
a/oal-parser/src/test/java/org/apache/skywalking/oal/tool/parser/DeepAnalysisTest.java
 
b/oal-parser/src/test/java/org/apache/skywalking/oal/tool/parser/DeepAnalysisTest.java
index 90d5b87..ac4277e 100644
--- 
a/oal-parser/src/test/java/org/apache/skywalking/oal/tool/parser/DeepAnalysisTest.java
+++ 
b/oal-parser/src/test/java/org/apache/skywalking/oal/tool/parser/DeepAnalysisTest.java
@@ -19,7 +19,6 @@
 package org.apache.skywalking.oal.tool.parser;
 
 import java.util.List;
-import org.apache.skywalking.oap.server.core.remote.selector.Selector;
 import org.junit.Assert;
 import org.junit.Test;
 
diff --git 
a/oal-parser/src/test/java/org/apache/skywalking/oal/tool/parser/ScriptParserTest.java
 
b/oal-parser/src/test/java/org/apache/skywalking/oal/tool/parser/ScriptParserTest.java
index 2ebb95d..d5a8146 100644
--- 
a/oal-parser/src/test/java/org/apache/skywalking/oal/tool/parser/ScriptParserTest.java
+++ 
b/oal-parser/src/test/java/org/apache/skywalking/oal/tool/parser/ScriptParserTest.java
@@ -46,4 +46,24 @@ public class ScriptParserTest {
         Assert.assertEquals("latency", serviceAvg.getSourceAttribute());
         Assert.assertEquals("avg", serviceAvg.getAggregationFunctionName());
     }
+
+    @Test
+    public void testParse2() throws IOException {
+        ScriptParser parser = ScriptParser.createFromScriptText(
+            "Endpoint_percent = from(Endpoint.*).percent(status == true);"
+        );
+        List<AnalysisResult> results = parser.parse();
+
+        AnalysisResult endpointPercent = results.get(0);
+        Assert.assertEquals("EndpointPercent", 
endpointPercent.getMetricName());
+        Assert.assertEquals("Endpoint", endpointPercent.getSourceName());
+        Assert.assertEquals("*", endpointPercent.getSourceAttribute());
+        Assert.assertEquals("percent", 
endpointPercent.getAggregationFunctionName());
+        List<ConditionExpression> expressions = 
endpointPercent.getFuncConditionExpressions();
+        EntryMethod entryMethod = endpointPercent.getEntryMethod();
+        List<String> methodArgsExpressions = entryMethod.getArgsExpressions();
+        Assert.assertEquals(3, methodArgsExpressions.size());
+        Assert.assertEquals("source.getStatus()", 
methodArgsExpressions.get(1));
+        Assert.assertEquals("true", methodArgsExpressions.get(2));
+    }
 }
diff --git a/oal-parser/src/test/resources/oal_test.oal 
b/oal-parser/src/test/resources/oal_test.oal
index 66ad3cc..dc98c78 100644
--- a/oal-parser/src/test/resources/oal_test.oal
+++ b/oal-parser/src/test/resources/oal_test.oal
@@ -18,4 +18,5 @@
 
 //Service_Avg = from(Service.latency).avg();
 
-endpoint_Avg = from(Endpoint.latency).avg();
\ No newline at end of file
+endpoint_Avg = from(Endpoint.latency).avg();
+endpoint_percent = from(Endpoint.*).percent(status == true)
\ No newline at end of file
diff --git 
a/oal-syntax/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.g4 
b/oal-syntax/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.g4
index c7811d1..008ac8f 100644
--- 
a/oal-syntax/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.g4
+++ 
b/oal-syntax/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.g4
@@ -103,4 +103,6 @@ LR_BRACKET:                          '(';
 RR_BRACKET:                          ')';
 COMMA:                               ',';
 SEMI:                                ';';
-EQUAL:                               '=';
\ No newline at end of file
+EQUAL:                               '=';
+DUALEQUALS:                          '==';
+ALL:                                 '*';
\ No newline at end of file
diff --git 
a/oal-syntax/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.tokens
 
b/oal-syntax/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.tokens
index 302ec2c..927256f 100644
--- 
a/oal-syntax/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.tokens
+++ 
b/oal-syntax/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.tokens
@@ -1,21 +1,3 @@
-/*
- * 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.
- *
- */
-
 FROM=1
 FILTER=2
 SRC_ALL=3
@@ -42,6 +24,8 @@ RR_BRACKET=23
 COMMA=24
 SEMI=25
 EQUAL=26
+DUALEQUALS=27
+ALL=28
 'from'=1
 'filter'=2
 'All'=3
@@ -58,3 +42,5 @@ EQUAL=26
 ','=24
 ';'=25
 '='=26
+'=='=27
+'*'=28
diff --git 
a/oal-syntax/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALParser.g4
 
b/oal-syntax/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALParser.g4
index fd9859c..e1d621b 100644
--- 
a/oal-syntax/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALParser.g4
+++ 
b/oal-syntax/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALParser.g4
@@ -44,7 +44,7 @@ source
     ;
 
 sourceAttribute
-    : IDENTIFIER
+    : IDENTIFIER | ALL
     ;
 
 variable
@@ -52,13 +52,26 @@ variable
     ;
 
 aggregateFunction
-    : functionName LR_BRACKET (filterExpression)? RR_BRACKET
+    : functionName LR_BRACKET (funcParamExpression)? RR_BRACKET
     ;
 
 functionName
     : IDENTIFIER
     ;
 
-filterExpression
-    :
+funcParamExpression
+    : booleanBinaryMatch
+    ;
+
+booleanBinaryMatch
+    :  conditionAttribute DUALEQUALS conditionValue
+    ;
+
+
+conditionAttribute
+    : IDENTIFIER
+    ;
+
+conditionValue
+    : BOOL_LITERAL
     ;
\ No newline at end of file

Reply via email to