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

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

commit 153eaae6edcd55d83243754dfa126b69a606d5bb
Author: Wu Sheng <[email protected]>
AuthorDate: Wed Jul 17 23:00:33 2019 +0800

    Generate dispatcher all methods.
---
 .../org/apache/skywalking/oal/rt/OALRuntime.java   | 21 ++++++++
 .../skywalking/oal/rt/parser/AnalysisResult.java   |  4 +-
 .../skywalking/oal/rt/parser/DeepAnalysis.java     | 58 ++++++++++++++--------
 .../skywalking/oal/rt/parser/EntryMethod.java      | 25 ++++++++--
 .../{FilterExpression.java => Expression.java}     | 14 +++++-
 .../skywalking/oal/rt/parser/OALListener.java      | 16 ++++--
 .../code-templates/dispatcher/dispatch.ftl         |  5 ++
 .../code-templates/dispatcher/doMetrics.ftl        | 36 ++++++++++++++
 .../oal/rt/output/FileGeneratorTest.java           |  4 +-
 .../skywalking/oal/rt/parser/DeepAnalysisTest.java |  4 +-
 .../skywalking/oal/rt/parser/ScriptParserTest.java |  2 +-
 .../core/analysis/metrics/DoubleAvgMetrics.java    |  4 +-
 .../core/analysis/metrics/LongAvgMetrics.java      |  4 +-
 .../core/analysis/metrics/PercentMetrics.java      |  7 +--
 .../metrics/annotation/ExpressionArg0.java         | 32 ------------
 .../metrics/annotation/ExpressionArg1.java         | 32 ------------
 .../metrics/expression/BinaryMatchExpression.java  | 32 ++++++++++++
 .../metrics/expression/GreaterEqualMatch.java      | 15 ++++++
 .../analysis/metrics/expression/GreaterMatch.java  | 15 ++++++
 .../metrics/expression/LessEqualMatch.java         | 15 ++++++
 .../analysis/metrics/expression/LessMatch.java     | 15 ++++++
 .../core/analysis/metrics/PercentMetricsTest.java  | 24 ++++-----
 22 files changed, 260 insertions(+), 124 deletions(-)

diff --git 
a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/OALRuntime.java 
b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/OALRuntime.java
index 7c9d5c0..6037892 100644
--- 
a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/OALRuntime.java
+++ 
b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/OALRuntime.java
@@ -395,6 +395,27 @@ public class OALRuntime implements OALEngine {
         /**
          * Generate methods
          */
+        for (AnalysisResult dispatcherContextMetric : 
dispatcherContext.getMetrics()) {
+            StringWriter methodEntity = new StringWriter();
+            try {
+                
configuration.getTemplate("dispatcher/doMetrics.ftl").process(dispatcherContextMetric,
 methodEntity);
+                
dispatcherClass.addMethod(CtNewMethod.make(methodEntity.toString(), 
dispatcherClass));
+            } catch (Exception e) {
+                logger.error("Can't generate method do" + 
dispatcherContextMetric.getMetricsName() + " for " + className + ".", e);
+                logger.error("Method body as following" + 
System.lineSeparator() + "{}", methodEntity);
+                throw new OALCompileException(e.getMessage(), e);
+            }
+        }
+
+        try {
+            StringWriter methodEntity = new StringWriter();
+            
configuration.getTemplate("dispatcher/dispatch.ftl").process(dispatcherContext, 
methodEntity);
+            
dispatcherClass.addMethod(CtNewMethod.make(methodEntity.toString(), 
dispatcherClass));
+        } catch (Exception e) {
+            logger.error("Can't generate method dispatch for " + className + 
".", e);
+            throw new OALCompileException(e.getMessage(), e);
+        }
+
         Class targetClass;
         try {
             targetClass = dispatcherClass.toClass(currentClassLoader, null);
diff --git 
a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/AnalysisResult.java
 
b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/AnalysisResult.java
index 6579e27..70090a9 100644
--- 
a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/AnalysisResult.java
+++ 
b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/AnalysisResult.java
@@ -44,7 +44,7 @@ public class AnalysisResult {
 
     private EntryMethod entryMethod;
 
-    private List<FilterExpression> filterExpressions;
+    private List<Expression> filterExpressions;
 
     private List<ConditionExpression> filterExpressionsParserResult;
 
@@ -74,7 +74,7 @@ public class AnalysisResult {
         funcConditionExpressions.add(conditionExpression);
     }
 
-    public void addFilterExpressions(FilterExpression filterExpression) {
+    public void addFilterExpressions(Expression filterExpression) {
         if (filterExpressions == null) {
             filterExpressions = new LinkedList<>();
         }
diff --git 
a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/DeepAnalysis.java
 
b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/DeepAnalysis.java
index 277d6a3..99622fa 100644
--- 
a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/DeepAnalysis.java
+++ 
b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/DeepAnalysis.java
@@ -39,7 +39,7 @@ public class DeepAnalysis {
         List<ConditionExpression> expressions = 
result.getFilterExpressionsParserResult();
         if (expressions != null && expressions.size() > 0) {
             for (ConditionExpression expression : expressions) {
-                FilterExpression filterExpression = new FilterExpression();
+                Expression filterExpression = new Expression();
                 if ("booleanMatch".equals(expression.getExpressionType())) {
                     filterExpression.setExpressionObject("EqualMatch");
                     filterExpression.setLeft("source." + 
ClassMethodUtil.toIsMethod(expression.getAttribute()) + "()");
@@ -99,39 +99,55 @@ public class DeepAnalysis {
 
         // 4. Use parameter's annotation of entrance method to generate 
aggregation entrance.
         for (Parameter parameter : entranceMethod.getParameters()) {
+            Class<?> parameterType = parameter.getType();
             Annotation[] parameterAnnotations = parameter.getAnnotations();
             if (parameterAnnotations == null || parameterAnnotations.length == 
0) {
                 throw new IllegalArgumentException("Entrance method:" + 
entranceMethod + " doesn't include the annotation.");
             }
             Annotation annotation = parameterAnnotations[0];
             if (annotation instanceof SourceFrom) {
-                entryMethod.addArg("source." + 
ClassMethodUtil.toGetMethod(result.getSourceAttribute()) + "()");
+                entryMethod.addArg(parameterType, "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) {
+                entryMethod.addArg(parameterType, "1");
+            } else if (annotation instanceof 
org.apache.skywalking.oap.server.core.analysis.metrics.annotation.Expression) {
                 if (result.getFuncConditionExpressions().size() == 1) {
-                    ConditionExpression conditionExpression = 
result.getFuncConditionExpressions().get(0);
-                    if 
("booleanMatch".equals(conditionExpression.getExpressionType())) {
-                        entryMethod.addArg("source." + 
ClassMethodUtil.toIsMethod(conditionExpression.getAttribute()) + "()");
-                    } else if 
("stringMatch".equals(conditionExpression.getExpressionType())) {
-                        entryMethod.addArg("source." + 
ClassMethodUtil.toGetMethod(conditionExpression.getAttribute()) + "()");
+                    ConditionExpression expression = 
result.getFuncConditionExpressions().get(0);
+
+                    Expression argExpression = new Expression();
+                    if ("booleanMatch".equals(expression.getExpressionType())) 
{
+                        argExpression.setExpressionObject("EqualMatch");
+                        argExpression.setLeft("source." + 
ClassMethodUtil.toIsMethod(expression.getAttribute()) + "()");
+                        argExpression.setRight(expression.getValue());
+                    } else if 
("stringMatch".equals(expression.getExpressionType())) {
+                        argExpression.setExpressionObject("EqualMatch");
+                        argExpression.setLeft("source." + 
ClassMethodUtil.toGetMethod(expression.getAttribute()) + "()");
+                        argExpression.setRight(expression.getValue());
+                    } else if 
("greaterMatch".equals(expression.getExpressionType())) {
+                        argExpression.setExpressionObject("GreaterMatch");
+                        argExpression.setLeft("source." + 
ClassMethodUtil.toGetMethod(expression.getAttribute()) + "()");
+                        argExpression.setRight(expression.getValue());
+                    } else if 
("lessMatch".equals(expression.getExpressionType())) {
+                        argExpression.setExpressionObject("LessMatch");
+                        argExpression.setLeft("source." + 
ClassMethodUtil.toGetMethod(expression.getAttribute()) + "()");
+                        argExpression.setRight(expression.getValue());
+                    } else if 
("greaterEqualMatch".equals(expression.getExpressionType())) {
+                        argExpression.setExpressionObject("GreaterEqualMatch");
+                        argExpression.setLeft("source." + 
ClassMethodUtil.toGetMethod(expression.getAttribute()) + "()");
+                        argExpression.setRight(expression.getValue());
+                    } else if 
("lessEqualMatch".equals(expression.getExpressionType())) {
+                        argExpression.setExpressionObject("LessEqualMatch");
+                        argExpression.setLeft("source." + 
ClassMethodUtil.toGetMethod(expression.getAttribute()) + "()");
+                        argExpression.setRight(expression.getValue());
                     } else {
-                        throw new IllegalArgumentException("Entrance method:" 
+ entranceMethod + " argument has @ExpressionArg0, but expression type is not 
supported");
+                        throw new IllegalArgumentException("filter expression 
[" + expression.getExpressionType() + "] not found");
                     }
+
+                    entryMethod.addArg(argExpression);
                 } 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.");
+                    throw new IllegalArgumentException("Entrance method:" + 
entranceMethod + " argument can't find funcParamExpression.");
                 }
             } else if (annotation instanceof Arg) {
-                entryMethod.addArg(result.getNextFuncArg());
+                entryMethod.addArg(parameterType, result.getNextFuncArg());
             } else {
                 throw new IllegalArgumentException("Entrance method:" + 
entranceMethod + " doesn't the expected annotation.");
             }
diff --git 
a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/EntryMethod.java
 
b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/EntryMethod.java
index 000b3e2..8f08e24 100644
--- 
a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/EntryMethod.java
+++ 
b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/EntryMethod.java
@@ -24,14 +24,29 @@ import lombok.*;
 @Getter(AccessLevel.PUBLIC)
 @Setter(AccessLevel.PUBLIC)
 public class EntryMethod {
-    private String methodName;
+    private static final int LITERAL_TYPE = 1;
+    private static final int EXPRESSION_TYPE = 2;
 
-    private List<String> argsExpressions;
+    private String methodName;
+    private List<Integer> argTypes = new ArrayList<>();
+    private List<Object> argsExpressions = new ArrayList<>();
 
-    public void addArg(String expression) {
-        if (argsExpressions == null) {
-            argsExpressions = new LinkedList<>();
+    public void addArg(Class<?> parameterType, String expression) {
+        if (parameterType.equals(int.class)) {
+            expression = "(int)(" + expression + ")";
+        } else if (parameterType.equals(long.class)) {
+            expression = "(long)(" + expression + ")";
+        } else if (parameterType.equals(double.class)) {
+            expression = "(double)(" + expression + ")";
+        } else if (parameterType.equals(float.class)) {
+            expression = "(float)(" + expression + ")";
         }
+        argTypes.add(LITERAL_TYPE);
+        argsExpressions.add(expression);
+    }
+
+    public void addArg(Expression expression) {
+        argTypes.add(EXPRESSION_TYPE);
         argsExpressions.add(expression);
     }
 }
diff --git 
a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/FilterExpression.java
 
b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/Expression.java
similarity index 80%
rename from 
oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/FilterExpression.java
rename to 
oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/Expression.java
index d83973a..ccd1856 100644
--- 
a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/FilterExpression.java
+++ 
b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/Expression.java
@@ -18,12 +18,22 @@
 
 package org.apache.skywalking.oal.rt.parser;
 
-import lombok.*;
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.Setter;
 
 @Getter(AccessLevel.PUBLIC)
 @Setter(AccessLevel.PUBLIC)
-public class FilterExpression {
+public class Expression {
     private String expressionObject;
     private String left;
     private String right;
+
+    public void setLeft(String left) {
+        this.left = left;
+    }
+
+    public void setRight(String right) {
+        this.right = right;
+    }
 }
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 fb5b3cd..a43d723 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
@@ -120,19 +120,27 @@ public class OALListener extends OALParserBaseListener {
     }
 
     @Override public void 
enterBooleanConditionValue(OALParser.BooleanConditionValueContext ctx) {
-        conditionExpression.setValue(ctx.getText());
+        enterConditionValue(ctx.getText());
     }
 
     @Override public void 
enterStringConditionValue(OALParser.StringConditionValueContext ctx) {
-        conditionExpression.setValue(ctx.getText());
+        enterConditionValue(ctx.getText());
     }
 
     @Override public void 
enterEnumConditionValue(OALParser.EnumConditionValueContext ctx) {
-        conditionExpression.setValue(ctx.getText());
+        enterConditionValue(ctx.getText());
     }
 
     @Override public void 
enterNumberConditionValue(OALParser.NumberConditionValueContext ctx) {
-        conditionExpression.setValue(ctx.getText());
+        enterConditionValue(ctx.getText());
+    }
+
+    private void enterConditionValue(String value) {
+        if (value.split("\\.").length == 2 && !value.startsWith("\"")) {
+            // Value is an enum.
+            value = "org.apache.skywalking.oap.server.core.source." + value;
+        }
+        conditionExpression.setValue(value);
     }
 
     /////////////
diff --git 
a/oap-server/oal-rt/src/main/resources/code-templates/dispatcher/dispatch.ftl 
b/oap-server/oal-rt/src/main/resources/code-templates/dispatcher/dispatch.ftl
new file mode 100644
index 0000000..c04c26e
--- /dev/null
+++ 
b/oap-server/oal-rt/src/main/resources/code-templates/dispatcher/dispatch.ftl
@@ -0,0 +1,5 @@
+public void dispatch(org.apache.skywalking.oap.server.core.source.${source} 
source) {
+    <#list metrics as metrics>
+        do${metrics.metricsName}(source);
+    </#list>
+}
\ No newline at end of file
diff --git 
a/oap-server/oal-rt/src/main/resources/code-templates/dispatcher/doMetrics.ftl 
b/oap-server/oal-rt/src/main/resources/code-templates/dispatcher/doMetrics.ftl
new file mode 100644
index 0000000..6e7c6f4
--- /dev/null
+++ 
b/oap-server/oal-rt/src/main/resources/code-templates/dispatcher/doMetrics.ftl
@@ -0,0 +1,36 @@
+private void 
do${metricsName}(org.apache.skywalking.oap.server.core.source.${sourceName} 
source) {
+    org.apache.skywalking.oal.rt.metrics.${metricsName}Metrics metrics = new 
org.apache.skywalking.oal.rt.metrics.${metricsName}Metrics();
+
+    <#if filterExpressions??>
+        <#list filterExpressions as filterExpression>
+            <#if filterExpression.expressionObject == "GreaterMatch" || 
filterExpression.expressionObject == "LessMatch" || 
filterExpression.expressionObject == "GreaterEqualMatch" || 
filterExpression.expressionObject == "LessEqualMatch">
+                if (!new 
org.apache.skywalking.oap.server.core.analysis.metrics.expression.${filterExpression.expressionObject}().match(${filterExpression.left},
 ${filterExpression.right})) {
+                    return;
+                }
+            <#else>
+                if (!new 
org.apache.skywalking.oap.server.core.analysis.metrics.expression.${filterExpression.expressionObject}().setLeft(${filterExpression.left}).setRight(${filterExpression.right}).match())
 {
+                    return;
+                }
+            </#if>
+        </#list>
+    </#if>
+
+    metrics.setTimeBucket(source.getTimeBucket());
+    <#list fieldsFromSource as field>
+        metrics.${field.fieldSetter}(source.${field.fieldGetter}());
+    </#list>
+    metrics.${entryMethod.methodName}(
+        <#list entryMethod.argsExpressions as arg>
+            <#if entryMethod.argTypes[arg_index] == 1>
+                ${arg}
+            <#else>
+                <#if arg.expressionObject == "GreaterMatch" || 
arg.expressionObject == "LessMatch" || arg.expressionObject == 
"GreaterEqualMatch" || arg.expressionObject == "LessEqualMatch">
+                    new 
org.apache.skywalking.oap.server.core.analysis.metrics.expression.${arg.expressionObject}().match(${arg.left},
 ${arg.right})
+                <#else>
+                    new 
org.apache.skywalking.oap.server.core.analysis.metrics.expression.${arg.expressionObject}().setLeft(${arg.left}).setRight(${arg.right}).match()
+                </#if>
+            </#if><#if arg_has_next>, </#if>
+        </#list>);
+
+    
org.apache.skywalking.oap.server.core.analysis.worker.MetricsStreamProcessor.getInstance().in(metrics);
+}
diff --git 
a/oap-server/oal-rt/src/test/java/org/apache/skywalking/oal/rt/output/FileGeneratorTest.java
 
b/oap-server/oal-rt/src/test/java/org/apache/skywalking/oal/rt/output/FileGeneratorTest.java
index 21069ae..2acd6b5 100644
--- 
a/oap-server/oal-rt/src/test/java/org/apache/skywalking/oal/rt/output/FileGeneratorTest.java
+++ 
b/oap-server/oal-rt/src/test/java/org/apache/skywalking/oal/rt/output/FileGeneratorTest.java
@@ -46,13 +46,13 @@ public class FileGeneratorTest {
         result.setAggregationFunctionName("avg");
         result.setMetricsClassName("LongAvgMetrics");
 
-        FilterExpression equalExpression = new FilterExpression();
+        Expression equalExpression = new Expression();
         equalExpression.setExpressionObject("EqualMatch");
         equalExpression.setLeft("source.getName()");
         equalExpression.setRight("\"/service/prod/save\"");
         result.addFilterExpressions(equalExpression);
 
-        FilterExpression greaterExpression = new FilterExpression();
+        Expression greaterExpression = new Expression();
         greaterExpression.setExpressionObject("GreaterMatch");
         greaterExpression.setLeft("source.getLatency()");
         greaterExpression.setRight("1000");
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 b4abfd2..7701c13 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
@@ -109,9 +109,9 @@ public class DeepAnalysisTest {
         List<DataColumn> persistentFields = result.getPersistentFields();
         Assert.assertEquals(4, persistentFields.size());
 
-        List<FilterExpression> filterExpressions = 
result.getFilterExpressions();
+        List<Expression> filterExpressions = result.getFilterExpressions();
         Assert.assertEquals(1, filterExpressions.size());
-        FilterExpression filterExpression = filterExpressions.get(0);
+        Expression filterExpression = filterExpressions.get(0);
         Assert.assertEquals("EqualMatch", 
filterExpression.getExpressionObject());
         Assert.assertEquals("source.getName()", filterExpression.getLeft());
         Assert.assertEquals("\"/service/prod/save\"", 
filterExpression.getRight());
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 e27ac02..7748d4f 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
@@ -80,7 +80,7 @@ public class ScriptParserTest {
         Assert.assertEquals("*", endpointPercent.getSourceAttribute());
         Assert.assertEquals("percent", 
endpointPercent.getAggregationFunctionName());
         EntryMethod entryMethod = endpointPercent.getEntryMethod();
-        List<String> methodArgsExpressions = entryMethod.getArgsExpressions();
+        List<Object> methodArgsExpressions = entryMethod.getArgsExpressions();
         Assert.assertEquals(3, methodArgsExpressions.size());
         Assert.assertEquals("source.isStatus()", methodArgsExpressions.get(1));
         Assert.assertEquals("true", methodArgsExpressions.get(2));
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/DoubleAvgMetrics.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/DoubleAvgMetrics.java
index 9e70800..850c580 100644
--- 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/DoubleAvgMetrics.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/DoubleAvgMetrics.java
@@ -34,11 +34,11 @@ public abstract class DoubleAvgMetrics extends Metrics 
implements DoubleValueHol
     protected static final String VALUE = "value";
 
     @Getter @Setter @Column(columnName = SUMMATION) private double summation;
-    @Getter @Setter @Column(columnName = COUNT) private int count;
+    @Getter @Setter @Column(columnName = COUNT) private long count;
     @Getter @Setter @Column(columnName = VALUE, isValue = true, function = 
Function.Avg) private double value;
 
     @Entrance
-    public final void combine(@SourceFrom double summation, @ConstOne int 
count) {
+    public final void combine(@SourceFrom double summation, @ConstOne long 
count) {
         this.summation += summation;
         this.count += count;
     }
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/LongAvgMetrics.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/LongAvgMetrics.java
index fce1e58..a0d5c3a 100644
--- 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/LongAvgMetrics.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/LongAvgMetrics.java
@@ -34,11 +34,11 @@ public abstract class LongAvgMetrics extends Metrics 
implements LongValueHolder
     protected static final String VALUE = "value";
 
     @Getter @Setter @Column(columnName = SUMMATION) private long summation;
-    @Getter @Setter @Column(columnName = COUNT) private int count;
+    @Getter @Setter @Column(columnName = COUNT) private long count;
     @Getter @Setter @Column(columnName = VALUE, isValue = true, function = 
Function.Avg) private long value;
 
     @Entrance
-    public final void combine(@SourceFrom long summation, @ConstOne int count) 
{
+    public final void combine(@SourceFrom long summation, @ConstOne long 
count) {
         this.summation += summation;
         this.count += count;
     }
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentMetrics.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentMetrics.java
index 1224d92..1f8654f 100644
--- 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentMetrics.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentMetrics.java
@@ -38,11 +38,8 @@ public abstract class PercentMetrics extends Metrics 
implements IntValueHolder {
     @Getter @Setter @Column(columnName = MATCH) private long match;
 
     @Entrance
-    public final void combine(@Expression EqualMatch expression, 
@ExpressionArg0 Object leftValue,
-        @ExpressionArg1 Object rightValue) {
-        expression.setLeft(leftValue);
-        expression.setRight(rightValue);
-        if (expression.match()) {
+    public final void combine(@Expression boolean isMatch) {
+        if (isMatch) {
             match++;
         }
         total++;
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/annotation/ExpressionArg0.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/annotation/ExpressionArg0.java
deleted file mode 100644
index 1e4384f..0000000
--- 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/annotation/ExpressionArg0.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * @author wusheng
- */
-@Target(ElementType.PARAMETER)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface ExpressionArg0 {
-}
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/annotation/ExpressionArg1.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/annotation/ExpressionArg1.java
deleted file mode 100644
index 364ac7e..0000000
--- 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/annotation/ExpressionArg1.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * @author wusheng
- */
-@Target(ElementType.PARAMETER)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface ExpressionArg1 {
-}
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/BinaryMatchExpression.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/BinaryMatchExpression.java
index db7422a..f2985e5 100644
--- 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/BinaryMatchExpression.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/BinaryMatchExpression.java
@@ -33,10 +33,42 @@ public abstract class BinaryMatchExpression {
         return this;
     }
 
+    public BinaryMatchExpression setLeft(boolean left) {
+        return setLeft(left);
+    }
+
+    public BinaryMatchExpression setLeft(int left) {
+        return setLeft(left);
+    }
+
+    public BinaryMatchExpression setLeft(long left) {
+        return setLeft(left);
+    }
+
+    public BinaryMatchExpression setLeft(double left) {
+        return setLeft(left);
+    }
+
     public BinaryMatchExpression setRight(Object right) {
         this.right = right;
         return this;
     }
 
+    public BinaryMatchExpression setRight(boolean left) {
+        return setLeft(left);
+    }
+
+    public BinaryMatchExpression setRight(int left) {
+        return setLeft(left);
+    }
+
+    public BinaryMatchExpression setRight(long left) {
+        return setLeft(left);
+    }
+
+    public BinaryMatchExpression setRight(double left) {
+        return setLeft(left);
+    }
+
     public abstract boolean match();
 }
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/GreaterEqualMatch.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/GreaterEqualMatch.java
index f26aac7..7c8f455 100644
--- 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/GreaterEqualMatch.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/GreaterEqualMatch.java
@@ -22,6 +22,21 @@ package 
org.apache.skywalking.oap.server.core.analysis.metrics.expression;
  * @author peng-yongsheng
  */
 public class GreaterEqualMatch {
+    public boolean match(int left, int right) {
+        return left >= right;
+    }
+
+    public boolean match(long left, long right) {
+        return left >= right;
+    }
+
+    public boolean match(float left, float right) {
+        return left >= right;
+    }
+
+    public boolean match(double left, double right) {
+        return left >= right;
+    }
 
     public boolean match(Integer left, Integer right) {
         return left >= right;
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/GreaterMatch.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/GreaterMatch.java
index 87b06c5..7a82dc0 100644
--- 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/GreaterMatch.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/GreaterMatch.java
@@ -22,6 +22,21 @@ package 
org.apache.skywalking.oap.server.core.analysis.metrics.expression;
  * @author peng-yongsheng
  */
 public class GreaterMatch {
+    public boolean match(int left, int right) {
+        return left > right;
+    }
+
+    public boolean match(long left, long right) {
+        return left > right;
+    }
+
+    public boolean match(float left, float right) {
+        return left > right;
+    }
+
+    public boolean match(double left, double right) {
+        return left > right;
+    }
 
     public boolean match(Integer left, Integer right) {
         return left > right;
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/LessEqualMatch.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/LessEqualMatch.java
index 00f64f1..4590dab 100644
--- 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/LessEqualMatch.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/LessEqualMatch.java
@@ -22,6 +22,21 @@ package 
org.apache.skywalking.oap.server.core.analysis.metrics.expression;
  * @author peng-yongsheng
  */
 public class LessEqualMatch {
+    public boolean match(int left, int right) {
+        return left <= right;
+    }
+
+    public boolean match(long left, long right) {
+        return left <= right;
+    }
+
+    public boolean match(float left, float right) {
+        return left <= right;
+    }
+
+    public boolean match(double left, double right) {
+        return left <= right;
+    }
 
     public boolean match(Integer left, Integer right) {
         return left <= right;
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/LessMatch.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/LessMatch.java
index 5583def..924d2fb 100644
--- 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/LessMatch.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/LessMatch.java
@@ -22,6 +22,21 @@ package 
org.apache.skywalking.oap.server.core.analysis.metrics.expression;
  * @author peng-yongsheng
  */
 public class LessMatch {
+    public boolean match(int left, int right) {
+        return left < right;
+    }
+
+    public boolean match(long left, long right) {
+        return left < right;
+    }
+
+    public boolean match(float left, float right) {
+        return left < right;
+    }
+
+    public boolean match(double left, double right) {
+        return left < right;
+    }
 
     public boolean match(Integer left, Integer right) {
         return left < right;
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 b5bb0f0..97a3f0d 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
@@ -30,18 +30,18 @@ public class PercentMetricsTest {
     @Test
     public void testEntranceCombine() {
         PercentMetricsImpl impl = new PercentMetricsImpl();
-        impl.combine(new EqualMatch(), true, true);
-        impl.combine(new EqualMatch(), true, false);
-        impl.combine(new EqualMatch(), true, false);
+        impl.combine(new EqualMatch().setLeft(true).setRight(true).match());
+        impl.combine(new EqualMatch().setLeft(true).setRight(false).match());
+        impl.combine(new EqualMatch().setLeft(true).setRight(false).match());
 
         impl.calculate();
 
         Assert.assertEquals(3333, impl.getValue());
 
         impl = new PercentMetricsImpl();
-        impl.combine(new EqualMatch(), true, true);
-        impl.combine(new EqualMatch(), true, true);
-        impl.combine(new EqualMatch(), true, false);
+        impl.combine(new EqualMatch().setLeft(true).setRight(true).match());
+        impl.combine(new EqualMatch().setLeft(true).setRight(true).match());
+        impl.combine(new EqualMatch().setLeft(true).setRight(false).match());
 
         impl.calculate();
 
@@ -51,14 +51,14 @@ public class PercentMetricsTest {
     @Test
     public void testSelfCombine() {
         PercentMetricsImpl impl = new PercentMetricsImpl();
-        impl.combine(new EqualMatch(), true, true);
-        impl.combine(new EqualMatch(), true, false);
-        impl.combine(new EqualMatch(), true, false);
+        impl.combine(new EqualMatch().setLeft(true).setRight(true).match());
+        impl.combine(new EqualMatch().setLeft(true).setRight(false).match());
+        impl.combine(new EqualMatch().setLeft(true).setRight(false).match());
 
         PercentMetricsImpl impl2 = new PercentMetricsImpl();
-        impl2.combine(new EqualMatch(), true, true);
-        impl2.combine(new EqualMatch(), true, true);
-        impl2.combine(new EqualMatch(), true, false);
+        impl2.combine(new EqualMatch().setLeft(true).setRight(true).match());
+        impl2.combine(new EqualMatch().setLeft(true).setRight(true).match());
+        impl2.combine(new EqualMatch().setLeft(true).setRight(false).match());
 
         impl.combine(impl2);
 

Reply via email to