Github user sohami commented on a diff in the pull request: https://github.com/apache/drill/pull/753#discussion_r102603020 --- Diff: exec/java-exec/src/test/java/org/apache/drill/test/ProfileParser.java --- @@ -42,44 +48,207 @@ public class ProfileParser { JsonObject profile; + String query; List<String> plans; + List<OpDefInfo> operations; + Map<Integer,FragInfo> fragments = new HashMap<>(); + private List<OpDefInfo> topoOrder; public ProfileParser( File file ) throws IOException { try (FileReader fileReader = new FileReader(file); JsonReader reader = Json.createReader(fileReader)) { profile = (JsonObject) reader.read(); } + + parse(); + } + + private void parse() { + parseQuery(); + parsePlans(); + buildFrags(); + parseFragProfiles(); + mapOpProfiles(); + aggregateOpers(); + buildTree(); + } + + private void parseQuery() { + query = profile.getString("query"); + query = query.replace("//n", "\n"); + } + + /** + * Parse a text version of the plan as it appears in the JSON + * query profile. + */ + + private static class PlanParser { + + List<String> plans = new ArrayList<>(); + List<OpDefInfo> operations = new ArrayList<>(); + List<OpDefInfo> sorted = new ArrayList<>(); + + public void parsePlans(String plan) { + plans = new ArrayList<>( ); + String parts[] = plan.split("\n"); + for (String part : parts) { + plans.add(part); + OpDefInfo opDef = new OpDefInfo( part ); + operations.add(opDef); + } + sortList(); + } + + public void sortList() { + List<OpDefInfo> raw = new ArrayList<>( ); + raw.addAll( operations ); + Collections.sort( raw, new Comparator<OpDefInfo>() { + @Override + public int compare(OpDefInfo o1, OpDefInfo o2) { + int result = Integer.compare(o1.majorId, o2.majorId); + if ( result == 0 ) { + result = Integer.compare(o1.stepId, o2.stepId); + } + return result; + } + }); + int currentFrag = 0; + int currentStep = 0; + for ( OpDefInfo opDef : raw ) { + if ( currentFrag < opDef.majorId ) { + currentFrag++; + OpDefInfo sender = new OpDefInfo( currentFrag, 0 ); + sender.isInferred = true; + sender.name = "Sender"; + sorted.add(sender); + currentStep = 1; + opDef.inferredParent = sender; + sender.children.add( opDef ); + } + if ( opDef.stepId > currentStep ) { + OpDefInfo unknown = new OpDefInfo( currentFrag, currentStep ); + unknown.isInferred = true; + unknown.name = "Unknown"; + sorted.add(unknown); + opDef.inferredParent = unknown; + unknown.children.add( opDef ); + } + sorted.add( opDef ); + currentStep = opDef.stepId + 1; + } + } + } + + /** + * Parse the plan portion of the query profile. + */ + + private void parsePlans() { + PlanParser parser = new PlanParser(); + String plan = getPlan( ); + parser.parsePlans(plan); + plans = parser.plans; + topoOrder = parser.operations; + operations = parser.sorted; + } --- End diff -- wrong assignment ?` topoOrder = parser.sorted` and `operations = parser.operations` ?
--- If your project is set up for it, you can reply to this email and have your reply appear on GitHub as well. If your project does not have this feature enabled and wishes so, or if the feature is enabled but not working, please contact infrastructure at infrastruct...@apache.org or file a JIRA ticket with INFRA. ---