Generate service dispatcher and add tableName.
diff --git a/oal-parser/src/main/java/org/apache/skywalking/oal/tool/output/FileGenerator.java b/oal-parser/src/main/java/org/apache/skywalking/oal/tool/output/FileGenerator.java
index f7590a4..538a7f9 100644
--- a/oal-parser/src/main/java/org/apache/skywalking/oal/tool/output/FileGenerator.java
+++ b/oal-parser/src/main/java/org/apache/skywalking/oal/tool/output/FileGenerator.java
@@ -47,10 +47,23 @@
     public void generate() throws IOException, TemplateException {
         for (AnalysisResult result : results) {
             generate(result, "AggregateWorker.java", (writer) -> generateAggregateWorker(result, writer));
+            generate(result, "Indicator.java", (writer) -> generateIndicatorImplementor(result, writer));
+            generate(result, "PersistentWorker.java", (writer) -> generatePersistentWorker(result, writer));
+            generate(result, "RemoteWorker.java", (writer) -> generateRemoteWorker(result, writer));
         }
 
+        File file = new File(outputPath, "generated/service/ServiceDispatcher.java");
+        if (!file.exists()) {
+            if (!file.getParentFile().exists()) {
+                file.getParentFile().mkdirs();
+            }
+            file.createNewFile();
+        }
+        this.generateServiceDispatcher(new FileWriter(file));
     }
 
+
+
     private void generate(AnalysisResult result, String fileSuffix,
         WriteWrapper writeWrapper) throws IOException, TemplateException {
         File file = new File(outputPath, buildSubFolderName(result, fileSuffix));
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 69ac3c4..f800eed 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
@@ -30,6 +30,8 @@
 public class AnalysisResult {
     private String metricName;
 
+    private String tableName;
+
     private String packageName;
 
     private String sourceName;
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 3d73b3f..b577954 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
@@ -56,14 +56,15 @@
     }
 
     @Override public void exitVariable(OALParser.VariableContext ctx) {
-        current.setMetricName(nameFormat(ctx.getText()));
+        current.setMetricName(metricNameFormat(ctx.getText()));
+        current.setTableName(ctx.getText().toLowerCase());
     }
 
     @Override public void enterFunctionName(OALParser.FunctionNameContext ctx) {
         current.setAggregationFunctionName(ctx.getText());
     }
 
-    private String nameFormat(String source) {
+    private String metricNameFormat(String source) {
         source = firstLetterUpper(source);
         int idx;
         while ((idx = source.indexOf("_")) > -1) {
diff --git a/oal-parser/src/main/resources/code-templates/IndicatorImplementor.ftl b/oal-parser/src/main/resources/code-templates/IndicatorImplementor.ftl
index 714efb8..e095e1d 100644
--- a/oal-parser/src/main/resources/code-templates/IndicatorImplementor.ftl
+++ b/oal-parser/src/main/resources/code-templates/IndicatorImplementor.ftl
@@ -37,7 +37,7 @@
 </#list>
 
     @Override public String name() {
-        return ${metricName};
+        return "${tableName}";
     }
 
     @Override public String id() {
diff --git a/oal-parser/src/test/java/org/apache/skywalking/oal/tool/output/FileGeneratorTest.java b/oal-parser/src/test/java/org/apache/skywalking/oal/tool/output/FileGeneratorTest.java
index 9cd522b..b8d04d9 100644
--- a/oal-parser/src/test/java/org/apache/skywalking/oal/tool/output/FileGeneratorTest.java
+++ b/oal-parser/src/test/java/org/apache/skywalking/oal/tool/output/FileGeneratorTest.java
@@ -37,6 +37,7 @@
         AnalysisResult result = new AnalysisResult();
         result.setSourceName("Service");
         result.setPackageName("service.serviceavg");
+        result.setTableName("service_avg");
         result.setSourceAttribute("latency");
         result.setMetricName("ServiceAvg");
         result.setAggregationFunctionName("avg");
diff --git a/oal-parser/src/test/resources/expectedFiles/IndicatorImplementorExpected.java b/oal-parser/src/test/resources/expectedFiles/IndicatorImplementorExpected.java
index 6e80661..37b2323 100644
--- a/oal-parser/src/test/resources/expectedFiles/IndicatorImplementorExpected.java
+++ b/oal-parser/src/test/resources/expectedFiles/IndicatorImplementorExpected.java
@@ -37,7 +37,7 @@
     @Setter @Getter @Column(columnName = "serviceInstanceId") private int serviceInstanceId;
 
     @Override public String name() {
-        return ServiceAvg;
+        return "service_avg";
     }
 
     @Override public String id() {
diff --git a/oal-parser/src/test/resources/oal_test.oal b/oal-parser/src/test/resources/oal_test.oal
index 53d727a..564cffc 100644
--- a/oal-parser/src/test/resources/oal_test.oal
+++ b/oal-parser/src/test/resources/oal_test.oal
@@ -16,4 +16,4 @@
  *
  */
 
-ServiceAvg = from(Service.latency).avg();
\ No newline at end of file
+Service_Avg = from(Service.latency).avg();
\ No newline at end of file