DRILL-6140: Correctly list Operators in Profiles Page

Operators listed in Profiles Page don't always correspond with operator 
specified in Physical Plan.
This commit fixes that by using the PhysicalPlan as a reference, but reverts to 
the inferred names in the event of an Exchange-based operator

closes #1116


Project: http://git-wip-us.apache.org/repos/asf/drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/drill/commit/58f3b104
Tree: http://git-wip-us.apache.org/repos/asf/drill/tree/58f3b104
Diff: http://git-wip-us.apache.org/repos/asf/drill/diff/58f3b104

Branch: refs/heads/master
Commit: 58f3b10464f5a3b969ce19705750cb163be9b287
Parents: 3314905
Author: Kunal Khatua <kkha...@maprtech.com>
Authored: Tue Feb 6 22:14:58 2018 -0800
Committer: Vitalii Diravka <vitalii.dira...@gmail.com>
Committed: Fri Feb 16 20:21:06 2018 +0000

----------------------------------------------------------------------
 .../server/rest/profile/OperatorWrapper.java    | 17 ++++++++++++++--
 .../server/rest/profile/ProfileWrapper.java     | 21 +++++++++++++++++++-
 2 files changed, 35 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/drill/blob/58f3b104/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/profile/OperatorWrapper.java
----------------------------------------------------------------------
diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/profile/OperatorWrapper.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/profile/OperatorWrapper.java
index 6322435..0df062f 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/profile/OperatorWrapper.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/profile/OperatorWrapper.java
@@ -45,12 +45,25 @@ public class OperatorWrapper {
   private final String operatorName;
   private final int size;
 
-  public OperatorWrapper(int major, 
List<ImmutablePair<ImmutablePair<OperatorProfile, Integer>, String>> 
opsAndHostsList) {
+  public OperatorWrapper(int major, 
List<ImmutablePair<ImmutablePair<OperatorProfile, Integer>, String>> 
opsAndHostsList, Map<String, String> phyOperMap) {
     Preconditions.checkArgument(opsAndHostsList.size() > 0);
     this.major = major;
     firstProfile = opsAndHostsList.get(0).getLeft().getLeft();
     operatorType = CoreOperatorType.valueOf(firstProfile.getOperatorType());
-    operatorName = operatorType == null ? UNKNOWN_OPERATOR : 
operatorType.toString();
+    //Update Name from Physical Map
+    String path = new 
OperatorPathBuilder().setMajor(major).setOperator(firstProfile).build();
+    //Use Plan Extracted Operator Names if available
+    String extractedOpName = phyOperMap.get(path);
+    String inferredOpName = operatorType == null ? UNKNOWN_OPERATOR : 
operatorType.toString();
+    //Revert to inferred names for exceptional cases
+    // 1. Extracted 'FLATTEN' operator is NULL
+    // 2. Extracted 'SCAN' could be a PARQUET_ROW_GROUP_SCAN, or 
KAFKA_SUB_SCAN, or etc.
+    // 3. Extracted 'UNION_EXCHANGE' could be a SINGLE_SENDER or 
UNORDERED_RECEIVER
+    if (extractedOpName == null || inferredOpName.contains(extractedOpName) || 
extractedOpName.endsWith("_EXCHANGE")) {
+      operatorName =  inferredOpName;
+    } else {
+      operatorName =  extractedOpName;
+    }
     this.opsAndHosts = opsAndHostsList;
     size = opsAndHostsList.size();
   }

http://git-wip-us.apache.org/repos/asf/drill/blob/58f3b104/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/profile/ProfileWrapper.java
----------------------------------------------------------------------
diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/profile/ProfileWrapper.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/profile/ProfileWrapper.java
index d59b464..2c964da 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/profile/ProfileWrapper.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/profile/ProfileWrapper.java
@@ -24,6 +24,7 @@ import java.util.List;
 import java.util.Map;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.base.CaseFormat;
 import com.google.common.collect.Maps;
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.drill.common.config.DrillConfig;
@@ -57,10 +58,13 @@ public class ProfileWrapper {
   private final long majorFragmentTallyTotal;
   private final OptionList options;
   private final boolean onlyImpersonationEnabled;
+  private Map<String, String> physicalOperatorMap;
 
   public ProfileWrapper(final QueryProfile profile, DrillConfig drillConfig) {
     this.profile = profile;
     this.id = QueryIdHelper.getQueryId(profile.getId());
+    //Generating Operator Name map (DRILL-6140)
+    generateOpMap(profile.getPlan());
 
     final List<FragmentWrapper> fragmentProfiles = new ArrayList<>();
 
@@ -107,7 +111,7 @@ public class ProfileWrapper {
     Collections.sort(keys);
 
     for (final ImmutablePair<Integer, Integer> ip : keys) {
-      ows.add(new OperatorWrapper(ip.getLeft(), opmap.get(ip)));
+      ows.add(new OperatorWrapper(ip.getLeft(), opmap.get(ip), 
physicalOperatorMap));
     }
     this.operatorProfiles = ows;
 
@@ -322,4 +326,19 @@ public class ProfileWrapper {
   public boolean isOnlyImpersonationEnabled() {
     return onlyImpersonationEnabled;
   }
+
+  //Generates operator names inferred from physical plan
+  private void generateOpMap(String plan) {
+    this.physicalOperatorMap = new HashMap<String,String>();
+    //[e.g ] operatorLine = "01-03 Flatten(flattenField=[$1]) : rowType = 
RecordType(ANY rfsSpecCode, ..."
+    String[] operatorLine = plan.split("\\n");
+    for (String line : operatorLine) {
+      String[] lineToken = line.split("\\s+", 3);
+      //[e.g ] operatorPath = "01-xx-03"
+      String operatorPath = lineToken[0].trim().replaceFirst("-", "-xx-"); 
//Required format for lookup
+      //[e.g ] extractedOperatorName = "FLATTEN"
+      String extractedOperatorName = 
CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, 
lineToken[1].split("\\(", 2)[0].trim());
+      physicalOperatorMap.put(operatorPath, extractedOperatorName);
+    }
+  }
 }

Reply via email to