diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EnumerateJoinsRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EnumerateJoinsRule.java
index de28bbc..4a37007 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EnumerateJoinsRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EnumerateJoinsRule.java
@@ -431,11 +431,9 @@
     public static void printPlan(IPlanPrettyPrinter pp, AbstractLogicalOperator op, String text)
             throws AlgebricksException {
         if (LOGGER.isTraceEnabled()) {
-            LOGGER.trace("---------------------------- " + text);
             pp.reset();
             pp.printOperator(op, true);
-            LOGGER.trace(pp);
-            LOGGER.trace("---------------------------- ");
+            LOGGER.trace("---------------------------- {}\n{}\n----------------------------", text, pp);
         }
     }
 
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinEnum.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinEnum.java
index 24509c2..306bad9 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinEnum.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinEnum.java
@@ -742,27 +742,29 @@
         JoinNode lastJn = jnArray[lastJnNum];
         if (LOGGER.isTraceEnabled()) {
             EnumerateJoinsRule.printPlan(pp, op, "Original Whole plan in JN END");
-            dumpJoinNodes(lastJnNum);
+            LOGGER.trace(dumpJoinNodes(lastJnNum));
         }
 
         // find the cheapest plan
         int cheapestPlanIndex = lastJn.cheapestPlanIndex;
         if (LOGGER.isTraceEnabled() && cheapestPlanIndex > 0) {
-            LOGGER.trace("Cheapest Plan is " + cheapestPlanIndex + " number of terms is " + numberOfTerms
-                    + " joinNodes " + lastJnNum);
+            LOGGER.trace("Cheapest Plan is {} number of terms is {} joinNodes {}", cheapestPlanIndex, numberOfTerms,
+                    lastJnNum);
         }
 
         return cheapestPlanIndex;
     }
 
-    private void dumpJoinNodes(int numJoinNodes) {
-        LOGGER.trace(LocalDateTime.now());
+    private String dumpJoinNodes(int numJoinNodes) {
+        StringBuilder sb = new StringBuilder(128);
+        sb.append(LocalDateTime.now());
         for (int i = 1; i <= numJoinNodes; i++) {
             JoinNode jn = jnArray[i];
-            LOGGER.trace(jn);
+            sb.append(jn);
         }
-        LOGGER.trace("Printing cost of all Final Plans");
-        jnArray[numJoinNodes].printCostOfAllPlans();
+        sb.append('\n').append("Printing cost of all Final Plans").append('\n');
+        jnArray[numJoinNodes].printCostOfAllPlans(sb);
+        return sb.toString();
     }
 
     public static boolean getForceJoinOrderMode(IOptimizationContext context) {
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinNode.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinNode.java
index b0733c7..cf4fcad 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinNode.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinNode.java
@@ -769,20 +769,6 @@
         return new Pair<>(this.cheapestPlanIndex, this.cheapestPlanCost);
     }
 
-    protected int findCheapestPlan() {
-        List<PlanNode> allPlans = joinEnum.allPlans;
-        ICost cheapestCost = joinEnum.getCostHandle().maxCost();
-        int cheapestIndex = PlanNode.NO_PLAN;
-
-        for (int planIndex : this.planIndexesArray) {
-            if (allPlans.get(planIndex).totalCost.costLT(cheapestCost)) {
-                cheapestCost = allPlans.get(planIndex).totalCost;
-                cheapestIndex = planIndex;
-            }
-        }
-        return cheapestIndex;
-    }
-
     @Override
     public String toString() {
         if (planIndexesArray.isEmpty()) {
@@ -851,10 +837,11 @@
         return sb.toString();
     }
 
-    public void printCostOfAllPlans() {
+    public void printCostOfAllPlans(StringBuilder sb) {
         List<PlanNode> allPlans = joinEnum.allPlans;
         for (int planIndex : planIndexesArray) {
-            LOGGER.trace("plan " + planIndex + " cost is " + allPlans.get(planIndex).totalCost.computeTotalCost());
+            sb.append("plan ").append(planIndex).append(" cost is ")
+                    .append(allPlans.get(planIndex).totalCost.computeTotalCost()).append('\n');
         }
     }
 }
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java
index 64aa2e0..cf96c83 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java
@@ -99,7 +99,6 @@
     private static final String CONDITION_FIELD = "condition";
     private static final String MISSING_VALUE_FIELD = "missing-value";
     private static final String OP_CARDINALITY = "cardinality";
-    private static final String OP_COST = "cost";
 
     private final Map<AbstractLogicalOperator, String> operatorIdentity = new HashMap<>();
     private final IdCounter idCounter = new IdCounter();
@@ -142,8 +141,7 @@
                 stringPrefix = stringPrefix.isEmpty() ? val.toString() : stringPrefix + "." + val.toString();
             }
             if (!operatorIdentity.containsKey(op)) {
-                String opId = stringPrefix.isEmpty() ? "" + Integer.toString(++id)
-                        : stringPrefix + "." + Integer.toString(++id);
+                String opId = stringPrefix.isEmpty() ? "" + (++id) : stringPrefix + "." + (++id);
                 operatorIdentity.put(op, opId);
             }
             return operatorIdentity.get(op);
