Make query plans more user-friendly.

Change-Id: I91c15913009295352cf7cccf4a4028f1ff271e3f
Reviewed-on: https://asterix-gerrit.ics.uci.edu/1721
Sonar-Qube: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Steven Jacobs <sjaco002@ucr.edu>
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SimilarityCheckRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SimilarityCheckRule.java
index 5835a21..46e0f7e 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SimilarityCheckRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SimilarityCheckRule.java
@@ -190,9 +190,9 @@
                     .add(new MutableObject<ILogicalOperator>(matchingAssign.getInputs().get(0).getValue()));
             matchingAssign.getInputs().get(0).setValue(newAssign);
 
-            // Replace select condition with a get-item on newVar.
+            // Replace select condition with a get-item on newVarFromExpression.
             List<Mutable<ILogicalExpression>> selectGetItemArgs = new ArrayList<Mutable<ILogicalExpression>>();
-            // First arg is a variable reference expr on newVar.
+            // First arg is a variable reference expr on newVarFromExpression.
             selectGetItemArgs.add(new MutableObject<ILogicalExpression>(new VariableReferenceExpression(newVar)));
             // Second arg is the item index to be accessed, here 0.
             selectGetItemArgs.add(new MutableObject<ILogicalExpression>(
@@ -202,9 +202,10 @@
             // Replace the old similarity function call with the new getItemExpr.
             expRef.setValue(selectGetItemExpr);
 
-            // Replace expr corresponding to original variable in the original assign with a get-item on newVar.
+            // Replace expr corresponding to original variable in the original assign with a get-item on
+            // newVarFromExpression.
             List<Mutable<ILogicalExpression>> assignGetItemArgs = new ArrayList<Mutable<ILogicalExpression>>();
-            // First arg is a variable reference expr on newVar.
+            // First arg is a variable reference expr on newVarFromExpression.
             assignGetItemArgs.add(new MutableObject<ILogicalExpression>(new VariableReferenceExpression(newVar)));
             // Second arg is the item index to be accessed, here 1.
             assignGetItemArgs.add(new MutableObject<ILogicalExpression>(
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/AqlExpressionToPlanTranslator.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/AqlExpressionToPlanTranslator.java
index 62b71df..81c5f4c 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/AqlExpressionToPlanTranslator.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/AqlExpressionToPlanTranslator.java
@@ -79,7 +79,7 @@
     @Override
     public Pair<ILogicalOperator, LogicalVariable> visit(ForClause fc, Mutable<ILogicalOperator> tupSource)
             throws CompilationException {
-        LogicalVariable v = context.newVar(fc.getVarExpr());
+        LogicalVariable v = context.newVarFromExpression(fc.getVarExpr());
         Expression inExpr = fc.getInExpr();
         Pair<ILogicalExpression, Mutable<ILogicalOperator>> eo = langExprToAlgExpression(inExpr, tupSource);
         ILogicalOperator returnedOp;
@@ -87,7 +87,7 @@
         if (fc.getPosVarExpr() == null) {
             returnedOp = new UnnestOperator(v, new MutableObject<ILogicalExpression>(makeUnnestExpression(eo.first)));
         } else {
-            LogicalVariable pVar = context.newVar(fc.getPosVarExpr());
+            LogicalVariable pVar = context.newVarFromExpression(fc.getPosVarExpr());
             // We set the positional variable type as INT64 type.
             returnedOp = new UnnestOperator(v, new MutableObject<ILogicalExpression>(makeUnnestExpression(eo.first)),
                     pVar, BuiltinType.AINT64, new PositionWriter());
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
index 4b4ef8e..2662be8 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
@@ -691,7 +691,7 @@
         ILogicalOperator rootOperator = inputOperator;
 
         //Makes the id of the insert var point to the record variable.
-        context.newVar(compiledInsert.getVar());
+        context.newVarFromExpression(compiledInsert.getVar());
         context.setVar(compiledInsert.getVar(),
                 ((VariableReferenceExpression) insertOp.getPayloadExpression().getValue()).getVariableReference());
         Pair<ILogicalExpression, Mutable<ILogicalOperator>> p =
@@ -744,12 +744,12 @@
         LogicalVariable v;
         ILogicalOperator returnedOp;
         if (lc.getBindingExpr().getKind() == Kind.VARIABLE_EXPRESSION) {
-            v = context.newVar(lc.getVarExpr());
+            v = context.newVarFromExpression(lc.getVarExpr());
             LogicalVariable prev = context.getVar(((VariableExpr) lc.getBindingExpr()).getVar().getId());
             returnedOp = new AssignOperator(v, new MutableObject<>(new VariableReferenceExpression(prev)));
             returnedOp.getInputs().add(tupSource);
         } else {
-            v = context.newVar(lc.getVarExpr());
+            v = context.newVarFromExpression(lc.getVarExpr());
             Pair<ILogicalExpression, Mutable<ILogicalOperator>> eo =
                     langExprToAlgExpression(lc.getBindingExpr(), tupSource);
             returnedOp = new AssignOperator(v, new MutableObject<>(eo.first));
@@ -762,7 +762,7 @@
     public Pair<ILogicalOperator, LogicalVariable> visit(FieldAccessor fa, Mutable<ILogicalOperator> tupSource)
             throws CompilationException {
         Pair<ILogicalExpression, Mutable<ILogicalOperator>> p = langExprToAlgExpression(fa.getExpr(), tupSource);
-        LogicalVariable v = context.newVar();
+        LogicalVariable v = context.newVarFromExpression(fa);
         AbstractFunctionCallExpression fldAccess =
                 new ScalarFunctionCallExpression(FunctionUtil.getFunctionInfo(BuiltinFunctions.FIELD_ACCESS_BY_NAME));
         fldAccess.getArguments().add(new MutableObject<>(p.first));
@@ -922,7 +922,7 @@
                 ILogicalExpression groupFieldExpr = langExprToAlgExpression(groupField.first, topOp).first;
                 groupRecordConstructorArgList.add(new MutableObject<>(groupFieldExpr));
             }
-            LogicalVariable groupVar = context.newVar(gc.getGroupVar());
+            LogicalVariable groupVar = context.newVarFromExpression(gc.getGroupVar());
             AssignOperator groupVarAssignOp = new AssignOperator(groupVar,
                     new MutableObject<>(new ScalarFunctionCallExpression(
                             FunctionUtil.getFunctionInfo(BuiltinFunctions.OPEN_RECORD_CONSTRUCTOR),
@@ -934,14 +934,14 @@
         GroupByOperator gOp = new GroupByOperator();
         for (GbyVariableExpressionPair ve : gc.getGbyPairList()) {
             VariableExpr vexpr = ve.getVar();
-            LogicalVariable v = vexpr == null ? context.newVar() : context.newVar(vexpr);
+            LogicalVariable v = vexpr == null ? context.newVar() : context.newVarFromExpression(vexpr);
             Pair<ILogicalExpression, Mutable<ILogicalOperator>> eo = langExprToAlgExpression(ve.getExpr(), topOp);
             gOp.addGbyExpression(v, eo.first);
             topOp = eo.second;
         }
         for (GbyVariableExpressionPair ve : gc.getDecorPairList()) {
             VariableExpr vexpr = ve.getVar();
-            LogicalVariable v = vexpr == null ? context.newVar() : context.newVar(vexpr);
+            LogicalVariable v = vexpr == null ? context.newVar() : context.newVarFromExpression(vexpr);
             Pair<ILogicalExpression, Mutable<ILogicalOperator>> eo = langExprToAlgExpression(ve.getExpr(), topOp);
             gOp.addDecorExpression(v, eo.first);
             topOp = eo.second;
@@ -1159,7 +1159,7 @@
         for (QuantifiedPair qt : qe.getQuantifiedList()) {
             Pair<ILogicalExpression, Mutable<ILogicalOperator>> eo1 = langExprToAlgExpression(qt.getExpr(), topOp);
             topOp = eo1.second;
-            LogicalVariable uVar = context.newVar(qt.getVarExpr());
+            LogicalVariable uVar = context.newVarFromExpression(qt.getVarExpr());
             ILogicalOperator u = new UnnestOperator(uVar, new MutableObject<>(makeUnnestExpression(eo1.first)));
 
             if (firstOp == null) {
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/SqlppExpressionToPlanTranslator.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/SqlppExpressionToPlanTranslator.java
index f46613b..477d596 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/SqlppExpressionToPlanTranslator.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/SqlppExpressionToPlanTranslator.java
@@ -248,12 +248,12 @@
     @Override
     public Pair<ILogicalOperator, LogicalVariable> visit(FromTerm fromTerm, Mutable<ILogicalOperator> tupSource)
             throws CompilationException {
-        LogicalVariable fromVar = context.newVar(fromTerm.getLeftVariable());
+        LogicalVariable fromVar = context.newVarFromExpression(fromTerm.getLeftVariable());
         Expression fromExpr = fromTerm.getLeftExpression();
         Pair<ILogicalExpression, Mutable<ILogicalOperator>> eo = langExprToAlgExpression(fromExpr, tupSource);
         ILogicalOperator unnestOp;
         if (fromTerm.hasPositionalVariable()) {
-            LogicalVariable pVar = context.newVar(fromTerm.getPositionalVariable());
+            LogicalVariable pVar = context.newVarFromExpression(fromTerm.getPositionalVariable());
             // We set the positional variable type as INT64 type.
             unnestOp =
                     new UnnestOperator(fromVar, new MutableObject<ILogicalExpression>(makeUnnestExpression(eo.first)),
@@ -448,12 +448,12 @@
     private Pair<ILogicalOperator, LogicalVariable> generateUnnestForBinaryCorrelateRightBranch(
             AbstractBinaryCorrelateClause binaryCorrelate, Mutable<ILogicalOperator> inputOpRef, boolean innerUnnest)
             throws CompilationException {
-        LogicalVariable rightVar = context.newVar(binaryCorrelate.getRightVariable());
+        LogicalVariable rightVar = context.newVarFromExpression(binaryCorrelate.getRightVariable());
         Expression rightExpr = binaryCorrelate.getRightExpression();
         Pair<ILogicalExpression, Mutable<ILogicalOperator>> eo = langExprToAlgExpression(rightExpr, inputOpRef);
         ILogicalOperator unnestOp;
         if (binaryCorrelate.hasPositionalVariable()) {
-            LogicalVariable pVar = context.newVar(binaryCorrelate.getPositionalVariable());
+            LogicalVariable pVar = context.newVarFromExpression(binaryCorrelate.getPositionalVariable());
             // We set the positional variable type as INT64 type.
             unnestOp = innerUnnest
                     ? new UnnestOperator(rightVar, new MutableObject<>(makeUnnestExpression(eo.first)), pVar,
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/TranslationContext.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/TranslationContext.java
index 71de5ac..1344e0c 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/TranslationContext.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/TranslationContext.java
@@ -18,10 +18,12 @@
  */
 package org.apache.asterix.translator;
 
+import java.util.ArrayDeque;
+import java.util.Deque;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Stack;
 
+import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.expression.VariableExpr;
 import org.apache.hyracks.algebricks.core.algebra.base.Counter;
 import org.apache.hyracks.algebricks.core.algebra.base.IVariableContext;
@@ -32,8 +34,8 @@
     private Counter varCounter;
 
     /** The stack is the used to manage the scope of variables for group-by rebindings. */
-    private Stack<Map<Integer, LogicalVariable>> stack = new Stack<Map<Integer, LogicalVariable>>();
-    private Map<Integer, LogicalVariable> currentVarMap = new HashMap<Integer, LogicalVariable>();
+    private Deque<Map<Integer, LogicalVariable>> stack = new ArrayDeque<>();
+    private Map<Integer, LogicalVariable> currentVarMap = new HashMap<>();
     private boolean topFlwor = true;
 
     public TranslationContext(Counter varCounter) {
@@ -47,9 +49,15 @@
 
     @Override
     public LogicalVariable newVar() {
+        return newVarFromExpression(null);
+    }
+
+    @Override
+    public LogicalVariable newVar(String displayName) {
         varCounter.inc();
-        LogicalVariable var = new LogicalVariable(varCounter.get());
-        currentVarMap.put(varCounter.get(), var);
+        int varId = varCounter.get();
+        LogicalVariable var = new LogicalVariable(varId, displayName);
+        currentVarMap.put(varId, var);
         return var;
     }
 
@@ -70,20 +78,26 @@
         return currentVarMap.get(varId);
     }
 
-    public LogicalVariable getVar(VariableExpr v) {
-        return currentVarMap.get(v.getVar().getId());
-    }
-
-    public LogicalVariable newVar(VariableExpr v) {
-        Integer i = v.getVar().getId();
-        if (i > varCounter.get()) {
-            varCounter.set(i);
+    public LogicalVariable newVarFromExpression(Expression expr) {
+        int varId;
+        if (expr != null && expr.getKind() == Expression.Kind.VARIABLE_EXPRESSION) {
+            VariableExpr v = (VariableExpr) expr;
+            varId = v.getVar().getId();
+            if (varId > varCounter.get()) {
+                varCounter.set(varId);
+            }
+        } else {
+            varCounter.inc();
+            varId = varCounter.get();
         }
-        LogicalVariable var = new LogicalVariable(i);
-        currentVarMap.put(i, var);
+        LogicalVariable var = expr != null && (expr.getKind() == Expression.Kind.VARIABLE_EXPRESSION
+                || expr.getKind() == Expression.Kind.FIELD_ACCESSOR_EXPRESSION)
+                        ? new LogicalVariable(varId, expr.toString()) : new LogicalVariable(varId);
+        currentVarMap.put(varId, var);
         return var;
     }
 
+
     public void setVar(VariableExpr v, LogicalVariable var) {
         currentVarMap.put(v.getVar().getId(), var);
     }
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/count-tweets.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/count-tweets.plan
index a17020e..4f8d74b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/count-tweets.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/count-tweets.plan
@@ -9,7 +9,7 @@
                       -- NESTED_TUPLE_SOURCE  |LOCAL|
                   }
             -- HASH_PARTITION_EXCHANGE [$$14]  |PARTITIONED|
-              -- SORT_GROUP_BY[$$4]  |PARTITIONED|
+              -- SORT_GROUP_BY[$$token]  |PARTITIONED|
                       {
                         -- AGGREGATE  |LOCAL|
                           -- NESTED_TUPLE_SOURCE  |LOCAL|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/fj-phase1.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/fj-phase1.plan
index 83af511..c00096d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/fj-phase1.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/fj-phase1.plan
@@ -10,12 +10,12 @@
                         -- NESTED_TUPLE_SOURCE  |LOCAL|
                   }
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              -- STABLE_SORT [$$21(ASC), $$4(ASC)]  |PARTITIONED|
+              -- STABLE_SORT [$$21(ASC), $$item(ASC)]  |PARTITIONED|
                 -- HASH_PARTITION_EXCHANGE [$$21]  |PARTITIONED|
                   -- STREAM_PROJECT  |PARTITIONED|
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      -- HYBRID_HASH_JOIN [$$1][$$4]  |PARTITIONED|
-                        -- HASH_PARTITION_EXCHANGE [$$1]  |PARTITIONED|
+                      -- HYBRID_HASH_JOIN [$$lottery_number][$$item]  |PARTITIONED|
+                        -- HASH_PARTITION_EXCHANGE [$$lottery_number]  |PARTITIONED|
                           -- STREAM_PROJECT  |PARTITIONED|
                             -- UNNEST  |PARTITIONED|
                               -- STREAM_PROJECT  |PARTITIONED|
@@ -24,7 +24,7 @@
                                     -- DATASOURCE_SCAN  |PARTITIONED|
                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                         -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                        -- HASH_PARTITION_EXCHANGE [$$4]  |PARTITIONED|
+                        -- HASH_PARTITION_EXCHANGE [$$item]  |PARTITIONED|
                           -- ASSIGN  |PARTITIONED|
                             -- RUNNING_AGGREGATE  |PARTITIONED|
                               -- STREAM_PROJECT  |PARTITIONED|
@@ -37,7 +37,7 @@
                                                   -- NESTED_TUPLE_SOURCE  |LOCAL|
                                               }
                                         -- HASH_PARTITION_EXCHANGE [$$30]  |PARTITIONED|
-                                          -- SORT_GROUP_BY[$$3]  |PARTITIONED|
+                                          -- SORT_GROUP_BY[$$lottery_number]  |PARTITIONED|
                                                   {
                                                     -- AGGREGATE  |LOCAL|
                                                       -- NESTED_TUPLE_SOURCE  |LOCAL|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/gby_inline.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/gby_inline.plan
index b3f4ac2..4043a9c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/gby_inline.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/gby_inline.plan
@@ -4,20 +4,20 @@
       -- ASSIGN  |PARTITIONED|
         -- STREAM_PROJECT  |PARTITIONED|
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            -- PRE_CLUSTERED_GROUP_BY[$$1]  |PARTITIONED|
+            -- PRE_CLUSTERED_GROUP_BY[$$ccustkey]  |PARTITIONED|
                     {
                       -- AGGREGATE  |LOCAL|
                         -- STREAM_SELECT  |LOCAL|
                           -- NESTED_TUPLE_SOURCE  |LOCAL|
                     }
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                -- STABLE_SORT [$$1(ASC)]  |PARTITIONED|
+                -- STABLE_SORT [$$ccustkey(ASC)]  |PARTITIONED|
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                     -- STREAM_PROJECT  |PARTITIONED|
                       -- STREAM_PROJECT  |PARTITIONED|
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                          -- HYBRID_HASH_JOIN [$$1, $$2][$$24, $$26]  |PARTITIONED|
-                            -- HASH_PARTITION_EXCHANGE [$$1]  |PARTITIONED|
+                          -- HYBRID_HASH_JOIN [$$ccustkey, $$cnationkey][$$24, $$26]  |PARTITIONED|
+                            -- HASH_PARTITION_EXCHANGE [$$ccustkey]  |PARTITIONED|
                               -- PRE_CLUSTERED_GROUP_BY[$$20]  |PARTITIONED|
                                       {
                                         -- AGGREGATE  |LOCAL|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/hashjoin-with-unnest.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/hashjoin-with-unnest.plan
index b36dbe8..302d7e4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/hashjoin-with-unnest.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/hashjoin-with-unnest.plan
@@ -4,8 +4,8 @@
       -- ASSIGN  |PARTITIONED|
         -- STREAM_PROJECT  |PARTITIONED|
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            -- HYBRID_HASH_JOIN [$$2][$$3]  |PARTITIONED|
-              -- HASH_PARTITION_EXCHANGE [$$2]  |PARTITIONED|
+            -- HYBRID_HASH_JOIN [$$a][$$b]  |PARTITIONED|
+              -- HASH_PARTITION_EXCHANGE [$$a]  |PARTITIONED|
                 -- STREAM_PROJECT  |PARTITIONED|
                   -- UNNEST  |PARTITIONED|
                     -- ASSIGN  |PARTITIONED|
@@ -14,7 +14,7 @@
                           -- DATASOURCE_SCAN  |PARTITIONED|
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                               -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-              -- HASH_PARTITION_EXCHANGE [$$3]  |PARTITIONED|
+              -- HASH_PARTITION_EXCHANGE [$$b]  |PARTITIONED|
                 -- STREAM_PROJECT  |PARTITIONED|
                   -- UNNEST  |PARTITIONED|
                     -- ASSIGN  |PARTITIONED|
@@ -22,4 +22,4 @@
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                           -- DATASOURCE_SCAN  |PARTITIONED|
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/inlined_q18_large_volume_customer.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/inlined_q18_large_volume_customer.plan
index b2d5267..d9ce6c8 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/inlined_q18_large_volume_customer.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/inlined_q18_large_volume_customer.plan
@@ -3,10 +3,10 @@
     -- STREAM_PROJECT  |UNPARTITIONED|
       -- ASSIGN  |UNPARTITIONED|
         -- STREAM_LIMIT  |UNPARTITIONED|
-          -- SORT_MERGE_EXCHANGE [$$12(DESC), $$11(ASC) ]  |PARTITIONED|
+          -- SORT_MERGE_EXCHANGE [$$o_totalprice(DESC), $$o_orderdate(ASC) ]  |PARTITIONED|
             -- STREAM_LIMIT  |PARTITIONED|
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                -- STABLE_SORT [topK: 100] [$$12(DESC), $$11(ASC)]  |PARTITIONED|
+                -- STABLE_SORT [topK: 100] [$$o_totalprice(DESC), $$o_orderdate(ASC)]  |PARTITIONED|
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                     -- SORT_GROUP_BY[$$72, $$73]  |PARTITIONED|
                             {
@@ -26,7 +26,7 @@
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                     -- STREAM_PROJECT  |PARTITIONED|
                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        -- HYBRID_HASH_JOIN [$$57][$$3]  |PARTITIONED|
+                                        -- HYBRID_HASH_JOIN [$$57][$$l_orderkey]  |PARTITIONED|
                                           -- HASH_PARTITION_EXCHANGE [$$57]  |PARTITIONED|
                                             -- STREAM_PROJECT  |PARTITIONED|
                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -45,7 +45,7 @@
                                                           -- DATASOURCE_SCAN  |PARTITIONED|
                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                               -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                          -- HASH_PARTITION_EXCHANGE [$$3]  |PARTITIONED|
+                                          -- HASH_PARTITION_EXCHANGE [$$l_orderkey]  |PARTITIONED|
                                             -- STREAM_PROJECT  |PARTITIONED|
                                               -- STREAM_SELECT  |PARTITIONED|
                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nonpure/global-datetime-use-index-return-time.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nonpure/global-datetime-use-index-return-time.plan
index c6fd83e..a7a7662 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nonpure/global-datetime-use-index-return-time.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nonpure/global-datetime-use-index-return-time.plan
@@ -6,7 +6,7 @@
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
             -- BTREE_SEARCH  |PARTITIONED|
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                -- STABLE_SORT [$$0(ASC)]  |PARTITIONED|
-                  -- HASH_PARTITION_EXCHANGE [$$0]  |PARTITIONED|
+                -- STABLE_SORT [$$time(ASC)]  |PARTITIONED|
+                  -- HASH_PARTITION_EXCHANGE [$$time]  |PARTITIONED|
                     -- ASSIGN  |UNPARTITIONED|
-                      -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
\ No newline at end of file
+                      -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nonpure/global-datetime-use-index.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nonpure/global-datetime-use-index.plan
index 972e56a..228a6ec 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nonpure/global-datetime-use-index.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nonpure/global-datetime-use-index.plan
@@ -4,7 +4,7 @@
       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
         -- BTREE_SEARCH  |PARTITIONED|
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            -- STABLE_SORT [$$0(ASC)]  |PARTITIONED|
-              -- HASH_PARTITION_EXCHANGE [$$0]  |PARTITIONED|
+            -- STABLE_SORT [$$time(ASC)]  |PARTITIONED|
+              -- HASH_PARTITION_EXCHANGE [$$time]  |PARTITIONED|
                 -- ASSIGN  |UNPARTITIONED|
-                  -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
\ No newline at end of file
+                  -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/orderby-desc-using-gby.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/orderby-desc-using-gby.plan
index 8c86c6b..8e7f8ca 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/orderby-desc-using-gby.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/orderby-desc-using-gby.plan
@@ -2,7 +2,7 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$1(DESC) ]  |PARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$name(DESC) ]  |PARTITIONED|
           -- SORT_GROUP_BY[$$10]  |PARTITIONED|
                   {
                     -- AGGREGATE  |LOCAL|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/q01_pricing_summary_report_nt.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/q01_pricing_summary_report_nt.plan
index d0b7ef3..de74804 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/q01_pricing_summary_report_nt.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/q01_pricing_summary_report_nt.plan
@@ -15,8 +15,8 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$1(ASC), $$2(ASC) ]  |PARTITIONED|
-          -- STABLE_SORT [$$1(ASC), $$2(ASC)]  |PARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$l_returnflag(ASC), $$l_linestatus(ASC) ]  |PARTITIONED|
+          -- STABLE_SORT [$$l_returnflag(ASC), $$l_linestatus(ASC)]  |PARTITIONED|
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
               -- EXTERNAL_GROUP_BY[$$74, $$75]  |PARTITIONED|
                       {
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/q03_shipping_priority.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/q03_shipping_priority.plan
index c4c0c05..e5a6867 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/q03_shipping_priority.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/q03_shipping_priority.plan
@@ -3,10 +3,10 @@
     -- STREAM_PROJECT  |UNPARTITIONED|
       -- ASSIGN  |UNPARTITIONED|
         -- STREAM_LIMIT  |UNPARTITIONED|
-          -- SORT_MERGE_EXCHANGE [$$49(DESC), $$4(ASC) ]  |PARTITIONED|
+          -- SORT_MERGE_EXCHANGE [$$49(DESC), $$o_orderdate(ASC) ]  |PARTITIONED|
             -- STREAM_LIMIT  |PARTITIONED|
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                -- STABLE_SORT [topK: 10] [$$49(DESC), $$4(ASC)]  |PARTITIONED|
+                -- STABLE_SORT [topK: 10] [$$49(DESC), $$o_orderdate(ASC)]  |PARTITIONED|
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                     -- EXTERNAL_GROUP_BY[$$55, $$56, $$57]  |PARTITIONED|
                             {
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1005.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1005.plan
index 5675545..92a1472 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1005.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1005.plan
@@ -20,7 +20,7 @@
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                               -- STREAM_PROJECT  |PARTITIONED|
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  -- HYBRID_HASH_JOIN [$$1][$$13]  |PARTITIONED|
+                                  -- HYBRID_HASH_JOIN [$$c][$$13]  |PARTITIONED|
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                       -- UNNEST  |PARTITIONED|
                                         -- STREAM_PROJECT  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1127.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1127.plan
index d7ca1e9..40e653c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1127.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1127.plan
@@ -3,10 +3,10 @@
     -- STREAM_PROJECT  |UNPARTITIONED|
       -- ASSIGN  |UNPARTITIONED|
         -- STREAM_LIMIT  |UNPARTITIONED|
-          -- SORT_MERGE_EXCHANGE [$$49(DESC), $$4(ASC) ]  |PARTITIONED|
+          -- SORT_MERGE_EXCHANGE [$$49(DESC), $$o_orderdate(ASC) ]  |PARTITIONED|
             -- STREAM_LIMIT  |PARTITIONED|
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                -- STABLE_SORT [topK: 10] [$$49(DESC), $$4(ASC)]  |PARTITIONED|
+                -- STABLE_SORT [topK: 10] [$$49(DESC), $$o_orderdate(ASC)]  |PARTITIONED|
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                     -- EXTERNAL_GROUP_BY[$$55, $$56, $$57]  |PARTITIONED|
                             {
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1168.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1168.plan
index b4d6934..660ad87 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1168.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1168.plan
@@ -15,8 +15,8 @@
                   -- HASH_PARTITION_EXCHANGE [$$12]  |PARTITIONED|
                     -- STREAM_PROJECT  |PARTITIONED|
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        -- HYBRID_HASH_JOIN [$$1][$$11]  |PARTITIONED|
-                          -- HASH_PARTITION_EXCHANGE [$$1]  |PARTITIONED|
+                        -- HYBRID_HASH_JOIN [$$p][$$11]  |PARTITIONED|
+                          -- HASH_PARTITION_EXCHANGE [$$p]  |PARTITIONED|
                             -- ASSIGN  |UNPARTITIONED|
                               -- STREAM_PROJECT  |UNPARTITIONED|
                                 -- UNNEST  |UNPARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1343-2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1343-2.plan
index cb833a5..caa317d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1343-2.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1343-2.plan
@@ -2,7 +2,7 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$3(ASC) ]  |PARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$o_orderpriority(ASC) ]  |PARTITIONED|
           -- SORT_GROUP_BY[$$39]  |PARTITIONED|
                   {
                     -- AGGREGATE  |LOCAL|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1343-3.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1343-3.plan
index 336d7d4..5141e09 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1343-3.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1343-3.plan
@@ -2,7 +2,7 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$3(ASC) ]  |PARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$o_orderpriority(ASC) ]  |PARTITIONED|
           -- SORT_GROUP_BY[$$39]  |PARTITIONED|
                   {
                     -- AGGREGATE  |LOCAL|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1343-4.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1343-4.plan
index 5e3d14a..2de88ae 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1343-4.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1343-4.plan
@@ -2,7 +2,7 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$3(ASC) ]  |PARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$o_orderpriority(ASC) ]  |PARTITIONED|
           -- SORT_GROUP_BY[$$39]  |PARTITIONED|
                   {
                     -- AGGREGATE  |LOCAL|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1343.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1343.plan
index cb833a5..caa317d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1343.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1343.plan
@@ -2,7 +2,7 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$3(ASC) ]  |PARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$o_orderpriority(ASC) ]  |PARTITIONED|
           -- SORT_GROUP_BY[$$39]  |PARTITIONED|
                   {
                     -- AGGREGATE  |LOCAL|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1806.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1806.plan
index 2439f0d..7ea82a1 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1806.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1806.plan
@@ -2,7 +2,7 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$2(ASC), $$3(ASC) ]  |PARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$l_returnflag(ASC), $$l_linestatus(ASC) ]  |PARTITIONED|
           -- SORT_GROUP_BY[$$98, $$99]  |PARTITIONED|
                   {
                     -- AGGREGATE  |LOCAL|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-issue562.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-issue562.plan
index b7e11d3..9974287 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-issue562.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-issue562.plan
@@ -2,14 +2,14 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$7(ASC) ]  |PARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$cntrycode(ASC) ]  |PARTITIONED|
           -- SORT_GROUP_BY[$$82]  |PARTITIONED|
                   {
                     -- AGGREGATE  |LOCAL|
                       -- NESTED_TUPLE_SOURCE  |LOCAL|
                   }
             -- HASH_PARTITION_EXCHANGE [$$82]  |PARTITIONED|
-              -- SORT_GROUP_BY[$$11]  |PARTITIONED|
+              -- SORT_GROUP_BY[$$phone_substr]  |PARTITIONED|
                       {
                         -- AGGREGATE  |LOCAL|
                           -- NESTED_TUPLE_SOURCE  |LOCAL|
@@ -41,7 +41,7 @@
                                               -- ASSIGN  |PARTITIONED|
                                                 -- STREAM_PROJECT  |PARTITIONED|
                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    -- HYBRID_HASH_JOIN [$$11][$$65]  |PARTITIONED|
+                                                    -- HYBRID_HASH_JOIN [$$phone_substr][$$65]  |PARTITIONED|
                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                         -- STREAM_PROJECT  |PARTITIONED|
                                                           -- ASSIGN  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-issue785.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-issue785.plan
index 4027e6a..fe1f67a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-issue785.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-issue785.plan
@@ -3,7 +3,7 @@
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-          -- PRE_CLUSTERED_GROUP_BY[$$7]  |PARTITIONED|
+          -- PRE_CLUSTERED_GROUP_BY[$$nation_key]  |PARTITIONED|
                   {
                     -- AGGREGATE  |LOCAL|
                       -- STREAM_LIMIT  |LOCAL|
@@ -11,8 +11,8 @@
                           -- NESTED_TUPLE_SOURCE  |LOCAL|
                   }
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              -- STABLE_SORT [$$7(ASC)]  |PARTITIONED|
-                -- HASH_PARTITION_EXCHANGE [$$7]  |PARTITIONED|
+              -- STABLE_SORT [$$nation_key(ASC)]  |PARTITIONED|
+                -- HASH_PARTITION_EXCHANGE [$$nation_key]  |PARTITIONED|
                   -- SORT_GROUP_BY[$$69, $$70]  |PARTITIONED|
                           {
                             -- AGGREGATE  |LOCAL|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-issue810-2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-issue810-2.plan
index 7b94c2a..e229e75 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-issue810-2.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-issue810-2.plan
@@ -2,7 +2,7 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$1(ASC), $$2(ASC) ]  |PARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$l_returnflag(ASC), $$l_linestatus(ASC) ]  |PARTITIONED|
           -- PRE_CLUSTERED_GROUP_BY[$$75, $$76]  |PARTITIONED|
                   {
                     -- AGGREGATE  |LOCAL|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-issue810.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-issue810.plan
index 3e7d5d9..ca941bf 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-issue810.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-issue810.plan
@@ -2,7 +2,7 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$1(ASC), $$2(ASC) ]  |PARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$l_returnflag(ASC), $$l_linestatus(ASC) ]  |PARTITIONED|
           -- PRE_CLUSTERED_GROUP_BY[$$34, $$35]  |PARTITIONED|
                   {
                     -- AGGREGATE  |LOCAL|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/split-materialization-above-join.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/split-materialization-above-join.plan
index d698437..a81a142 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/split-materialization-above-join.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/split-materialization-above-join.plan
@@ -8,16 +8,16 @@
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                 -- STREAM_PROJECT  |PARTITIONED|
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    -- HYBRID_HASH_JOIN [$$26][$$94]  |PARTITIONED|
-                      -- HASH_PARTITION_EXCHANGE [$$26]  |PARTITIONED|
+                    -- HYBRID_HASH_JOIN [$$idRight][$$94]  |PARTITIONED|
+                      -- HASH_PARTITION_EXCHANGE [$$idRight]  |PARTITIONED|
                         -- STREAM_PROJECT  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            -- HYBRID_HASH_JOIN [$$93][$$25]  |PARTITIONED|
+                            -- HYBRID_HASH_JOIN [$$93][$$idLeft]  |PARTITIONED|
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                 -- DATASOURCE_SCAN  |PARTITIONED|
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                     -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                              -- HASH_PARTITION_EXCHANGE [$$25]  |PARTITIONED|
+                              -- HASH_PARTITION_EXCHANGE [$$idLeft]  |PARTITIONED|
                                 -- PRE_CLUSTERED_GROUP_BY[$$122, $$124]  |PARTITIONED|
                                         {
                                           -- AGGREGATE  |LOCAL|
@@ -31,13 +31,13 @@
                                             -- STREAM_SELECT  |PARTITIONED|
                                               -- STREAM_PROJECT  |PARTITIONED|
                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                  -- HYBRID_HASH_JOIN [$$12][$$23]  |PARTITIONED|
+                                                  -- HYBRID_HASH_JOIN [$$prefixTokenLeft][$$prefixTokenRight]  |PARTITIONED|
                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                       -- STREAM_PROJECT  |PARTITIONED|
                                                         -- ASSIGN  |PARTITIONED|
                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                             -- REPLICATE  |PARTITIONED|
-                                                              -- HASH_PARTITION_EXCHANGE [$$23]  |PARTITIONED|
+                                                              -- HASH_PARTITION_EXCHANGE [$$prefixTokenRight]  |PARTITIONED|
                                                                 -- UNNEST  |PARTITIONED|
                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                     -- PRE_CLUSTERED_GROUP_BY[$$97]  |PARTITIONED|
@@ -47,12 +47,12 @@
                                                                                   -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                             }
                                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                        -- STABLE_SORT [$$97(ASC), $$21(ASC)]  |PARTITIONED|
+                                                                        -- STABLE_SORT [$$97(ASC), $$i(ASC)]  |PARTITIONED|
                                                                           -- HASH_PARTITION_EXCHANGE [$$97]  |PARTITIONED|
                                                                             -- STREAM_PROJECT  |PARTITIONED|
                                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                -- HYBRID_HASH_JOIN [$$15][$$18]  |PARTITIONED|
-                                                                                  -- HASH_PARTITION_EXCHANGE [$$15]  |PARTITIONED|
+                                                                                -- HYBRID_HASH_JOIN [$$tokenUnranked][$$tokenGroupped]  |PARTITIONED|
+                                                                                  -- HASH_PARTITION_EXCHANGE [$$tokenUnranked]  |PARTITIONED|
                                                                                     -- STREAM_PROJECT  |PARTITIONED|
                                                                                       -- UNNEST  |PARTITIONED|
                                                                                         -- ASSIGN  |PARTITIONED|
@@ -62,12 +62,12 @@
                                                                                                 -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                                     -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                                                  -- HASH_PARTITION_EXCHANGE [$$18]  |PARTITIONED|
+                                                                                  -- HASH_PARTITION_EXCHANGE [$$tokenGroupped]  |PARTITIONED|
                                                                                     -- ASSIGN  |PARTITIONED|
                                                                                       -- RUNNING_AGGREGATE  |PARTITIONED|
                                                                                         -- STREAM_PROJECT  |PARTITIONED|
-                                                                                          -- SORT_MERGE_EXCHANGE [$$102(ASC), $$18(ASC) ]  |PARTITIONED|
-                                                                                            -- STABLE_SORT [$$102(ASC), $$18(ASC)]  |PARTITIONED|
+                                                                                          -- SORT_MERGE_EXCHANGE [$$102(ASC), $$tokenGroupped(ASC) ]  |PARTITIONED|
+                                                                                            -- STABLE_SORT [$$102(ASC), $$tokenGroupped(ASC)]  |PARTITIONED|
                                                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                                 -- SORT_GROUP_BY[$$130]  |PARTITIONED|
                                                                                                         {
@@ -75,7 +75,7 @@
                                                                                                             -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                                                         }
                                                                                                   -- HASH_PARTITION_EXCHANGE [$$130]  |PARTITIONED|
-                                                                                                    -- SORT_GROUP_BY[$$17]  |PARTITIONED|
+                                                                                                    -- SORT_GROUP_BY[$$token]  |PARTITIONED|
                                                                                                             {
                                                                                                               -- AGGREGATE  |LOCAL|
                                                                                                                 -- NESTED_TUPLE_SOURCE  |LOCAL|
@@ -94,7 +94,7 @@
                                                                                                                             -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                       -- REPLICATE  |PARTITIONED|
-                                                        -- HASH_PARTITION_EXCHANGE [$$23]  |PARTITIONED|
+                                                        -- HASH_PARTITION_EXCHANGE [$$prefixTokenRight]  |PARTITIONED|
                                                           -- UNNEST  |PARTITIONED|
                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                               -- PRE_CLUSTERED_GROUP_BY[$$97]  |PARTITIONED|
@@ -104,12 +104,12 @@
                                                                             -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                       }
                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                  -- STABLE_SORT [$$97(ASC), $$21(ASC)]  |PARTITIONED|
+                                                                  -- STABLE_SORT [$$97(ASC), $$i(ASC)]  |PARTITIONED|
                                                                     -- HASH_PARTITION_EXCHANGE [$$97]  |PARTITIONED|
                                                                       -- STREAM_PROJECT  |PARTITIONED|
                                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                          -- HYBRID_HASH_JOIN [$$15][$$18]  |PARTITIONED|
-                                                                            -- HASH_PARTITION_EXCHANGE [$$15]  |PARTITIONED|
+                                                                          -- HYBRID_HASH_JOIN [$$tokenUnranked][$$tokenGroupped]  |PARTITIONED|
+                                                                            -- HASH_PARTITION_EXCHANGE [$$tokenUnranked]  |PARTITIONED|
                                                                               -- STREAM_PROJECT  |PARTITIONED|
                                                                                 -- UNNEST  |PARTITIONED|
                                                                                   -- ASSIGN  |PARTITIONED|
@@ -119,12 +119,12 @@
                                                                                           -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                               -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                                            -- HASH_PARTITION_EXCHANGE [$$18]  |PARTITIONED|
+                                                                            -- HASH_PARTITION_EXCHANGE [$$tokenGroupped]  |PARTITIONED|
                                                                               -- ASSIGN  |PARTITIONED|
                                                                                 -- RUNNING_AGGREGATE  |PARTITIONED|
                                                                                   -- STREAM_PROJECT  |PARTITIONED|
-                                                                                    -- SORT_MERGE_EXCHANGE [$$102(ASC), $$18(ASC) ]  |PARTITIONED|
-                                                                                      -- STABLE_SORT [$$102(ASC), $$18(ASC)]  |PARTITIONED|
+                                                                                    -- SORT_MERGE_EXCHANGE [$$102(ASC), $$tokenGroupped(ASC) ]  |PARTITIONED|
+                                                                                      -- STABLE_SORT [$$102(ASC), $$tokenGroupped(ASC)]  |PARTITIONED|
                                                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                           -- SORT_GROUP_BY[$$130]  |PARTITIONED|
                                                                                                   {
@@ -132,7 +132,7 @@
                                                                                                       -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                                                   }
                                                                                             -- HASH_PARTITION_EXCHANGE [$$130]  |PARTITIONED|
-                                                                                              -- SORT_GROUP_BY[$$17]  |PARTITIONED|
+                                                                                              -- SORT_GROUP_BY[$$token]  |PARTITIONED|
                                                                                                       {
                                                                                                         -- AGGREGATE  |LOCAL|
                                                                                                           -- NESTED_TUPLE_SOURCE  |LOCAL|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/exists.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/exists.plan
index 1c404ab..3b92cdd 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/exists.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/exists.plan
@@ -2,7 +2,7 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$9(ASC) ]  |PARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$cntrycode(ASC) ]  |PARTITIONED|
           -- SORT_GROUP_BY[$$82]  |PARTITIONED|
                   {
                     -- AGGREGATE  |LOCAL|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/not_exists.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/not_exists.plan
index b134499..06257a1 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/not_exists.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/not_exists.plan
@@ -2,7 +2,7 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$9(ASC) ]  |PARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$cntrycode(ASC) ]  |PARTITIONED|
           -- SORT_GROUP_BY[$$83]  |PARTITIONED|
                   {
                     -- AGGREGATE  |LOCAL|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/query-ASTERIXDB-1572.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/query-ASTERIXDB-1572.plan
index a8f916c..6c9c457 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/query-ASTERIXDB-1572.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/query-ASTERIXDB-1572.plan
@@ -16,7 +16,7 @@
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                       -- STREAM_PROJECT  |PARTITIONED|
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                          -- HYBRID_HASH_JOIN [$$44][$$5]  |PARTITIONED|
+                          -- HYBRID_HASH_JOIN [$$44][$#4]  |PARTITIONED|
                             -- HASH_PARTITION_EXCHANGE [$$44]  |PARTITIONED|
                               -- PRE_CLUSTERED_GROUP_BY[$$42]  |PARTITIONED|
                                       {
@@ -29,7 +29,7 @@
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                       -- STREAM_PROJECT  |PARTITIONED|
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          -- HYBRID_HASH_JOIN [$$42][$$4]  |PARTITIONED|
+                                          -- HYBRID_HASH_JOIN [$$42][$#3]  |PARTITIONED|
                                             -- HASH_PARTITION_EXCHANGE [$$42]  |PARTITIONED|
                                               -- PRE_CLUSTERED_GROUP_BY[$$40]  |PARTITIONED|
                                                       {
@@ -42,7 +42,7 @@
                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                       -- STREAM_PROJECT  |PARTITIONED|
                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                          -- HYBRID_HASH_JOIN [$$40][$$3]  |PARTITIONED|
+                                                          -- HYBRID_HASH_JOIN [$$40][$#2]  |PARTITIONED|
                                                             -- HASH_PARTITION_EXCHANGE [$$40]  |PARTITIONED|
                                                               -- PRE_CLUSTERED_GROUP_BY[$$33]  |PARTITIONED|
                                                                       {
@@ -53,26 +53,26 @@
                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                   -- STREAM_PROJECT  |PARTITIONED|
                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                      -- HYBRID_HASH_JOIN [$$33][$$2]  |PARTITIONED|
+                                                                      -- HYBRID_HASH_JOIN [$$33][$#1]  |PARTITIONED|
                                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                           -- STREAM_PROJECT  |PARTITIONED|
                                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                               -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                   -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                                        -- HASH_PARTITION_EXCHANGE [$$2]  |PARTITIONED|
+                                                                        -- HASH_PARTITION_EXCHANGE [$#1]  |PARTITIONED|
                                                                           -- ASSIGN  |UNPARTITIONED|
                                                                             -- UNNEST  |UNPARTITIONED|
                                                                               -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
-                                                            -- HASH_PARTITION_EXCHANGE [$$3]  |PARTITIONED|
+                                                            -- HASH_PARTITION_EXCHANGE [$#2]  |PARTITIONED|
                                                               -- ASSIGN  |UNPARTITIONED|
                                                                 -- UNNEST  |UNPARTITIONED|
                                                                   -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
-                                            -- HASH_PARTITION_EXCHANGE [$$4]  |PARTITIONED|
+                                            -- HASH_PARTITION_EXCHANGE [$#3]  |PARTITIONED|
                                               -- ASSIGN  |UNPARTITIONED|
                                                 -- UNNEST  |UNPARTITIONED|
                                                   -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
-                            -- HASH_PARTITION_EXCHANGE [$$5]  |PARTITIONED|
+                            -- HASH_PARTITION_EXCHANGE [$#4]  |PARTITIONED|
                               -- ASSIGN  |UNPARTITIONED|
                                 -- UNNEST  |UNPARTITIONED|
                                   -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpch/q12_shipping.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpch/q12_shipping.plan
index cbcce5d..57ca6ce 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpch/q12_shipping.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpch/q12_shipping.plan
@@ -2,7 +2,7 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$3(ASC) ]  |PARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$l_shipmode(ASC) ]  |PARTITIONED|
           -- SORT_GROUP_BY[$$95]  |PARTITIONED|
                   {
                     -- AGGREGATE  |LOCAL|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpch/q12_shipping_broadcast.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpch/q12_shipping_broadcast.plan
index cd7e6da..40c1c55 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpch/q12_shipping_broadcast.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpch/q12_shipping_broadcast.plan
@@ -2,7 +2,7 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$3(ASC) ]  |PARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$l_shipmode(ASC) ]  |PARTITIONED|
           -- SORT_GROUP_BY[$$95]  |PARTITIONED|
                   {
                     -- AGGREGATE  |LOCAL|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/udfs/query-ASTERIXDB-1298.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/udfs/query-ASTERIXDB-1298.plan
index c62d34e..ffd8105 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/udfs/query-ASTERIXDB-1298.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/udfs/query-ASTERIXDB-1298.plan
@@ -2,8 +2,8 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-        -- HYBRID_HASH_JOIN [$$5][$$17]  |PARTITIONED|
-          -- HASH_PARTITION_EXCHANGE [$$5]  |PARTITIONED|
+        -- HYBRID_HASH_JOIN [$#1][$$17]  |PARTITIONED|
+          -- HASH_PARTITION_EXCHANGE [$#1]  |PARTITIONED|
             -- STREAM_PROJECT  |PARTITIONED|
               -- ASSIGN  |PARTITIONED|
                 -- STREAM_PROJECT  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/udfs/query-ASTERIXDB-1308-1.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/udfs/query-ASTERIXDB-1308-1.plan
index f6ee3fa..1e60aed 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/udfs/query-ASTERIXDB-1308-1.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/udfs/query-ASTERIXDB-1308-1.plan
@@ -10,7 +10,7 @@
                   -- SUBPLAN  |UNPARTITIONED|
                           {
                             -- AGGREGATE  |UNPARTITIONED|
-                              -- IN_MEMORY_STABLE_SORT [$$28(ASC)]  |UNPARTITIONED|
+                              -- IN_MEMORY_STABLE_SORT [$$j(ASC)]  |UNPARTITIONED|
                                 -- UNNEST  |UNPARTITIONED|
                                   -- NESTED_TUPLE_SOURCE  |UNPARTITIONED|
                           }
@@ -31,7 +31,7 @@
                                                       -- SUBPLAN  |UNPARTITIONED|
                                                               {
                                                                 -- AGGREGATE  |UNPARTITIONED|
-                                                                  -- IN_MEMORY_STABLE_SORT [$$21(ASC)]  |UNPARTITIONED|
+                                                                  -- IN_MEMORY_STABLE_SORT [$$j(ASC)]  |UNPARTITIONED|
                                                                     -- UNNEST  |UNPARTITIONED|
                                                                       -- NESTED_TUPLE_SOURCE  |UNPARTITIONED|
                                                               }
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/udfs/query-ASTERIXDB-1308-2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/udfs/query-ASTERIXDB-1308-2.plan
index aa22db0..a5124c3 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/udfs/query-ASTERIXDB-1308-2.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/udfs/query-ASTERIXDB-1308-2.plan
@@ -12,7 +12,7 @@
                             -- SUBPLAN  |LOCAL|
                                     {
                                       -- AGGREGATE  |LOCAL|
-                                        -- IN_MEMORY_STABLE_SORT [$$38(ASC)]  |LOCAL|
+                                        -- IN_MEMORY_STABLE_SORT [$$j(ASC)]  |LOCAL|
                                           -- UNNEST  |LOCAL|
                                             -- NESTED_TUPLE_SOURCE  |LOCAL|
                                     }
@@ -36,7 +36,7 @@
                                   -- SUBPLAN  |LOCAL|
                                           {
                                             -- AGGREGATE  |LOCAL|
-                                              -- IN_MEMORY_STABLE_SORT [$$31(ASC)]  |LOCAL|
+                                              -- IN_MEMORY_STABLE_SORT [$$j(ASC)]  |LOCAL|
                                                 -- UNNEST  |LOCAL|
                                                   -- NESTED_TUPLE_SOURCE  |LOCAL|
                                           }
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/unnest-to-join_01.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/unnest-to-join_01.plan
index beacfb0..50dce7a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/unnest-to-join_01.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/unnest-to-join_01.plan
@@ -2,7 +2,7 @@
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
     -- STREAM_PROJECT  |UNPARTITIONED|
       -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-        -- HYBRID_HASH_JOIN [$$0][$$1]  |UNPARTITIONED|
+        -- HYBRID_HASH_JOIN [$$x][$$y]  |UNPARTITIONED|
           -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
             -- UNNEST  |UNPARTITIONED|
               -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/unnest-to-join_02.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/unnest-to-join_02.plan
index 8c65c4b..b8b37a2 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/unnest-to-join_02.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/unnest-to-join_02.plan
@@ -2,7 +2,7 @@
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
     -- AGGREGATE  |UNPARTITIONED|
       -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-        -- HYBRID_HASH_JOIN [$$0][$$1]  |UNPARTITIONED|
+        -- HYBRID_HASH_JOIN [$$x][$$y]  |UNPARTITIONED|
           -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
             -- UNNEST  |UNPARTITIONED|
               -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/functions/AbstractFunctionInfo.java b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/explain/explain_field_access/explain_field_access.1.ddl.sqlpp
similarity index 63%
copy from hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/functions/AbstractFunctionInfo.java
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/explain/explain_field_access/explain_field_access.1.ddl.sqlpp
index 79c143d..866804c 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/functions/AbstractFunctionInfo.java
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/explain/explain_field_access/explain_field_access.1.ddl.sqlpp
@@ -17,23 +17,13 @@
  * under the License.
  */
 
-package org.apache.hyracks.algebricks.core.algebra.functions;
+DROP DATAVERSE gby IF EXISTS;
+CREATE DATAVERSE gby;
 
-import java.io.Serializable;
+USE gby;
 
-public abstract class AbstractFunctionInfo implements IFunctionInfo, Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    private final boolean isFunctional;
-
-    protected AbstractFunctionInfo(boolean isFunctional) {
-        this.isFunctional = isFunctional;
-    }
-
-    @Override
-    public boolean isFunctional() {
-        return isFunctional;
-    }
-
+CREATE TYPE EmployeeType AS {
+  id : string
 }
+
+CREATE DATASET Employee(EmployeeType) PRIMARY KEY id;
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/functions/AbstractFunctionInfo.java b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/explain/explain_field_access/explain_field_access.2.query.sqlpp
similarity index 62%
copy from hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/functions/AbstractFunctionInfo.java
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/explain/explain_field_access/explain_field_access.2.query.sqlpp
index 79c143d..a4166e5 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/functions/AbstractFunctionInfo.java
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/explain/explain_field_access/explain_field_access.2.query.sqlpp
@@ -17,23 +17,9 @@
  * under the License.
  */
 
-package org.apache.hyracks.algebricks.core.algebra.functions;
+USE gby;
 
-import java.io.Serializable;
-
-public abstract class AbstractFunctionInfo implements IFunctionInfo, Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    private final boolean isFunctional;
-
-    protected AbstractFunctionInfo(boolean isFunctional) {
-        this.isFunctional = isFunctional;
-    }
-
-    @Override
-    public boolean isFunctional() {
-        return isFunctional;
-    }
-
-}
+EXPLAIN
+FROM Employee e
+GROUP BY substr(e.dept.department_id, 1)
+SELECT substr(e.dept.department_id, 1) as deptId, SUM(e.salary) AS star_cost;
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/functions/AbstractFunctionInfo.java b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/explain/explain_field_access_closed/explain_field_access_closed.1.ddl.sqlpp
similarity index 63%
rename from hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/functions/AbstractFunctionInfo.java
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/explain/explain_field_access_closed/explain_field_access_closed.1.ddl.sqlpp
index 79c143d..aaa62aa 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/functions/AbstractFunctionInfo.java
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/explain/explain_field_access_closed/explain_field_access_closed.1.ddl.sqlpp
@@ -17,23 +17,15 @@
  * under the License.
  */
 
-package org.apache.hyracks.algebricks.core.algebra.functions;
+DROP DATAVERSE gby IF EXISTS;
+CREATE DATAVERSE gby;
 
-import java.io.Serializable;
+USE gby;
 
-public abstract class AbstractFunctionInfo implements IFunctionInfo, Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    private final boolean isFunctional;
-
-    protected AbstractFunctionInfo(boolean isFunctional) {
-        this.isFunctional = isFunctional;
-    }
-
-    @Override
-    public boolean isFunctional() {
-        return isFunctional;
-    }
-
+CREATE TYPE EmployeeType AS {
+  id : string,
+  department_id: string,
+  salary : float
 }
+
+CREATE DATASET Employee(EmployeeType) PRIMARY KEY id;
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/functions/AbstractFunctionInfo.java b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/explain/explain_field_access_closed/explain_field_access_closed.2.query.sqlpp
similarity index 62%
copy from hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/functions/AbstractFunctionInfo.java
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/explain/explain_field_access_closed/explain_field_access_closed.2.query.sqlpp
index 79c143d..e170a6e 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/functions/AbstractFunctionInfo.java
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/explain/explain_field_access_closed/explain_field_access_closed.2.query.sqlpp
@@ -17,23 +17,9 @@
  * under the License.
  */
 
-package org.apache.hyracks.algebricks.core.algebra.functions;
+USE gby;
 
-import java.io.Serializable;
-
-public abstract class AbstractFunctionInfo implements IFunctionInfo, Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    private final boolean isFunctional;
-
-    protected AbstractFunctionInfo(boolean isFunctional) {
-        this.isFunctional = isFunctional;
-    }
-
-    @Override
-    public boolean isFunctional() {
-        return isFunctional;
-    }
-
-}
+EXPLAIN
+FROM Employee e
+GROUP BY substr(e.department_id, 1)
+SELECT substr(e.department_id, 1) as deptId, SUM(e.salary) AS star_cost;
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/functions/AbstractFunctionInfo.java b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/explain/explain_object_constructor-01/explain_object_constructor-01.1.query.sqlpp
similarity index 62%
copy from hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/functions/AbstractFunctionInfo.java
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/explain/explain_object_constructor-01/explain_object_constructor-01.1.query.sqlpp
index 79c143d..f4e46e4 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/functions/AbstractFunctionInfo.java
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/explain/explain_object_constructor-01/explain_object_constructor-01.1.query.sqlpp
@@ -17,23 +17,4 @@
  * under the License.
  */
 
-package org.apache.hyracks.algebricks.core.algebra.functions;
-
-import java.io.Serializable;
-
-public abstract class AbstractFunctionInfo implements IFunctionInfo, Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    private final boolean isFunctional;
-
-    protected AbstractFunctionInfo(boolean isFunctional) {
-        this.isFunctional = isFunctional;
-    }
-
-    @Override
-    public boolean isFunctional() {
-        return isFunctional;
-    }
-
-}
+EXPLAIN SELECT VALUE {"a": "1", "b": 1};
\ No newline at end of file
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/functions/AbstractFunctionInfo.java b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/explain/explain_object_constructor-02/explain_object_constructor-02.1.query.sqlpp
similarity index 62%
copy from hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/functions/AbstractFunctionInfo.java
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/explain/explain_object_constructor-02/explain_object_constructor-02.1.query.sqlpp
index 79c143d..3b7fe02 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/functions/AbstractFunctionInfo.java
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/explain/explain_object_constructor-02/explain_object_constructor-02.1.query.sqlpp
@@ -17,23 +17,4 @@
  * under the License.
  */
 
-package org.apache.hyracks.algebricks.core.algebra.functions;
-
-import java.io.Serializable;
-
-public abstract class AbstractFunctionInfo implements IFunctionInfo, Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    private final boolean isFunctional;
-
-    protected AbstractFunctionInfo(boolean isFunctional) {
-        this.isFunctional = isFunctional;
-    }
-
-    @Override
-    public boolean isFunctional() {
-        return isFunctional;
-    }
-
-}
+EXPLAIN SELECT VALUE {"a": "1"};
\ No newline at end of file
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/functions/AbstractFunctionInfo.java b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/explain/explain_object_constructor-03/explain_object_constructor-03.1.query.sqlpp
similarity index 62%
copy from hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/functions/AbstractFunctionInfo.java
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/explain/explain_object_constructor-03/explain_object_constructor-03.1.query.sqlpp
index 79c143d..991e557 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/functions/AbstractFunctionInfo.java
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/explain/explain_object_constructor-03/explain_object_constructor-03.1.query.sqlpp
@@ -17,23 +17,4 @@
  * under the License.
  */
 
-package org.apache.hyracks.algebricks.core.algebra.functions;
-
-import java.io.Serializable;
-
-public abstract class AbstractFunctionInfo implements IFunctionInfo, Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    private final boolean isFunctional;
-
-    protected AbstractFunctionInfo(boolean isFunctional) {
-        this.isFunctional = isFunctional;
-    }
-
-    @Override
-    public boolean isFunctional() {
-        return isFunctional;
-    }
-
-}
+EXPLAIN SELECT VALUE { };
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_field_access/explain_field_access.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_field_access/explain_field_access.1.adm
new file mode 100644
index 0000000..055512a
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_field_access/explain_field_access.1.adm
@@ -0,0 +1,46 @@
+distribute result [$$19]
+-- DISTRIBUTE_RESULT  |PARTITIONED|
+  exchange
+  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+    project ([$$19])
+    -- STREAM_PROJECT  |PARTITIONED|
+      assign [$$19] <- [{"deptId": $#1, "star_cost": $$22}]
+      -- ASSIGN  |PARTITIONED|
+        exchange
+        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+          group by ([$#1 := $$27]) decor ([]) {
+                    aggregate [$$22] <- [agg-sql-sum($$26)]
+                    -- AGGREGATE  |LOCAL|
+                      nested tuple source
+                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                 }
+          -- SORT_GROUP_BY[$$27]  |PARTITIONED|
+            exchange
+            -- HASH_PARTITION_EXCHANGE [$$27]  |PARTITIONED|
+              group by ([$$27 := $$20]) decor ([]) {
+                        aggregate [$$26] <- [agg-local-sql-sum($$17)]
+                        -- AGGREGATE  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                     }
+              -- SORT_GROUP_BY[$$20]  |PARTITIONED|
+                exchange
+                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                  project ([$$17, $$20])
+                  -- STREAM_PROJECT  |PARTITIONED|
+                    assign [$$20] <- [substring($$24.getField("department_id"), 1)]
+                    -- ASSIGN  |PARTITIONED|
+                      project ([$$17, $$24])
+                      -- STREAM_PROJECT  |PARTITIONED|
+                        assign [$$17, $$24] <- [$$e.getField("salary"), $$e.getField("dept")]
+                        -- ASSIGN  |PARTITIONED|
+                          project ([$$e])
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            exchange
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              data-scan []<-[$$21, $$e] <- gby.Employee
+                              -- DATASOURCE_SCAN  |PARTITIONED|
+                                exchange
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  empty-tuple-source
+                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_field_access_closed/explain_field_access_closed.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_field_access_closed/explain_field_access_closed.1.adm
new file mode 100644
index 0000000..d7f1893
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_field_access_closed/explain_field_access_closed.1.adm
@@ -0,0 +1,42 @@
+distribute result [$$18]
+-- DISTRIBUTE_RESULT  |PARTITIONED|
+  exchange
+  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+    project ([$$18])
+    -- STREAM_PROJECT  |PARTITIONED|
+      assign [$$18] <- [{"deptId": $#1, "star_cost": $$21}]
+      -- ASSIGN  |PARTITIONED|
+        exchange
+        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+          group by ([$#1 := $$25]) decor ([]) {
+                    aggregate [$$21] <- [agg-sql-sum($$24)]
+                    -- AGGREGATE  |LOCAL|
+                      nested tuple source
+                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                 }
+          -- SORT_GROUP_BY[$$25]  |PARTITIONED|
+            exchange
+            -- HASH_PARTITION_EXCHANGE [$$25]  |PARTITIONED|
+              group by ([$$25 := $$19]) decor ([]) {
+                        aggregate [$$24] <- [agg-local-sql-sum($$16)]
+                        -- AGGREGATE  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                     }
+              -- SORT_GROUP_BY[$$19]  |PARTITIONED|
+                exchange
+                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                  project ([$$16, $$19])
+                  -- STREAM_PROJECT  |PARTITIONED|
+                    assign [$$19, $$16] <- [substring($$e.getField(1), 1), $$e.getField(2)]
+                    -- ASSIGN  |PARTITIONED|
+                      project ([$$e])
+                      -- STREAM_PROJECT  |PARTITIONED|
+                        exchange
+                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                          data-scan []<-[$$20, $$e] <- gby.Employee
+                          -- DATASOURCE_SCAN  |PARTITIONED|
+                            exchange
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              empty-tuple-source
+                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_object_constructor-01/explain_object_constructor-01.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_object_constructor-01/explain_object_constructor-01.1.adm
new file mode 100644
index 0000000..9a536a6
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_object_constructor-01/explain_object_constructor-01.1.adm
@@ -0,0 +1,8 @@
+distribute result [$$2]
+-- DISTRIBUTE_RESULT  |UNPARTITIONED|
+  exchange
+  -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+    assign [$$2] <- [{ a: "1", b: 1 }]
+    -- ASSIGN  |UNPARTITIONED|
+      empty-tuple-source
+      -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_object_constructor-02/explain_object_constructor-02.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_object_constructor-02/explain_object_constructor-02.1.adm
new file mode 100644
index 0000000..c637d87
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_object_constructor-02/explain_object_constructor-02.1.adm
@@ -0,0 +1,8 @@
+distribute result [$$2]
+-- DISTRIBUTE_RESULT  |UNPARTITIONED|
+  exchange
+  -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+    assign [$$2] <- [{ a: "1" }]
+    -- ASSIGN  |UNPARTITIONED|
+      empty-tuple-source
+      -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_object_constructor-03/explain_object_constructor-03.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_object_constructor-03/explain_object_constructor-03.1.adm
new file mode 100644
index 0000000..83a9af1
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_object_constructor-03/explain_object_constructor-03.1.adm
@@ -0,0 +1,8 @@
+distribute result [$$2]
+-- DISTRIBUTE_RESULT  |UNPARTITIONED|
+  exchange
+  -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+    assign [$$2] <- [{  }]
+    -- ASSIGN  |UNPARTITIONED|
+      empty-tuple-source
+      -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_simple/explain_simple.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_simple/explain_simple.1.adm
index d3b66a5..ad872a1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_simple/explain_simple.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_simple/explain_simple.1.adm
@@ -1,9 +1,8 @@
-distribute result [%0->$$2]
+distribute result [$$2]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
   exchange
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    assign [$$2] <- [AInt64: {2}]
+    assign [$$2] <- [2]
     -- ASSIGN  |UNPARTITIONED|
       empty-tuple-source
       -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
index cf1ea5b..3931601 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
@@ -137,6 +137,31 @@
         <output-dir compare="Text">explain_simple</output-dir>
       </compilation-unit>
     </test-case>
+    <test-case FilePath="explain">
+      <compilation-unit name="explain_object_constructor-01">
+        <output-dir compare="Text">explain_object_constructor-01</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="explain">
+      <compilation-unit name="explain_object_constructor-02">
+        <output-dir compare="Text">explain_object_constructor-02</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="explain">
+      <compilation-unit name="explain_object_constructor-03">
+        <output-dir compare="Text">explain_object_constructor-03</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="explain">
+      <compilation-unit name="explain_field_access">
+        <output-dir compare="Text">explain_field_access</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="explain">
+      <compilation-unit name="explain_field_access_closed">
+        <output-dir compare="Text">explain_field_access_closed</output-dir>
+      </compilation-unit>
+    </test-case>
   </test-group>
   <test-case FilePath="flwor">
     <compilation-unit name="let33">
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java
index 702cb0a..aeed05d 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java
@@ -130,9 +130,6 @@
     public static final int NODE_RESOLVER_UNABLE_RESOLVE_HOST = 3032;
     public static final int INPUT_RECORD_CONVERTER_DCP_MSG_TO_RECORD_CONVERTER_UNKNOWN_DCP_REQUEST = 3033;
     public static final int FEED_DATAFLOW_FRAME_DISTR_REGISTER_FAILED_DATA_PROVIDER = 3034;
-    public static final int FEED_MANAGEMENT_FEED_EVENTS_LISTENER_ALREADY_HAVE_INTAKE_JOB = 3035;
-    public static final int FEED_MANAGEMENT_FEED_EVENTS_LISTENER_INTAKE_JOB_REGISTERED = 3036;
-    public static final int FEED_MANAGEMENT_FEED_EVENTS_LISTENER_FEED_JOB_REGISTERED = 3037;
     public static final int INPUT_RECORD_READER_CHAR_ARRAY_RECORD_TOO_LARGE = 3038;
     public static final int LIBRARY_JOBJECT_ACCESSOR_CANNOT_PARSE_TYPE = 3039;
     public static final int LIBRARY_JOBJECT_UTIL_ILLEGAL_ARGU_TYPE = 3040;
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/DataSourceId.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/DataSourceId.java
index d4329a3..0c3f942 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/DataSourceId.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/DataSourceId.java
@@ -19,8 +19,6 @@
 
 package org.apache.asterix.metadata.declared;
 
-import java.io.File;
-
 public class DataSourceId {
 
     private String dataverseName;
@@ -33,7 +31,7 @@
 
     @Override
     public String toString() {
-        return dataverseName + File.pathSeparator + datasourceName;
+        return dataverseName + "." + datasourceName;
     }
 
     public String getDataverseName() {
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/functions/ExternalScalarFunctionInfo.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/functions/ExternalScalarFunctionInfo.java
index 97211f6..8625756 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/functions/ExternalScalarFunctionInfo.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/functions/ExternalScalarFunctionInfo.java
@@ -35,8 +35,4 @@
         super(namespace, name, arity , FunctionKind.SCALAR, argumentTypes, returnType, rtc, body, language);
     }
 
-    public ExternalScalarFunctionInfo() {
-        super();
-    }
-
 }
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ABinary.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ABinary.java
index d4b7ac7..4bcd4c9 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ABinary.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ABinary.java
@@ -18,9 +18,10 @@
  */
 package org.apache.asterix.om.base;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 
@@ -95,14 +96,10 @@
     public String toString() {
         StringBuilder sb = new StringBuilder();
         int start = getStart();
-        sb.append("ABinary: [ ");
+        sb.append("0b");
         for (int i = 0; i < getLength(); i++) {
-            if (i > 0) {
-                sb.append(", ");
-            }
             sb.append(bytes[start + i]);
         }
-        sb.append(" ]");
         return sb.toString();
 
     }
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ABitArray.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ABitArray.java
deleted file mode 100644
index d3dbe42..0000000
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ABitArray.java
+++ /dev/null
@@ -1,148 +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.asterix.om.base;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
-import org.apache.asterix.om.types.BuiltinType;
-import org.apache.asterix.om.types.IAType;
-
-public final class ABitArray implements IAObject {
-
-    private int numberOfBits;
-    private int[] intArray;
-
-    public ABitArray(int nBits) {
-        numberOfBits = nBits;
-        intArray = new int[nBits / 32 + 1];
-    }
-
-    public int[] getIntArray() {
-        return intArray;
-    }
-
-    public final boolean get(int index) {
-        int r = index % 32;
-        int q = index / 32;
-        int p = 1 << r;
-        return (intArray[q] & p) != 0;
-    }
-
-    public final int numberOfBits() {
-        return this.numberOfBits;
-    }
-
-    public final void set(int index, boolean value) {
-        int r = index % 32;
-        int q = index / 32;
-        int p = 1 << r;
-        if (value) {
-            intArray[q] |= p;
-        } else {
-            p = ~p;
-            intArray[q] &= p;
-        }
-    }
-
-    public final void setBit(int index) {
-        set(index, true);
-    }
-
-    public IAType getType() {
-        return BuiltinType.ABITARRAY;
-    }
-
-    public void or(ABitArray bitArray) {
-        int n2 = bitArray.numberOfBits();
-        int[] a2 = bitArray.getIntArray();
-        int q = n2 / 32;
-        for (int i = 0; i < q; i++) {
-            this.intArray[i] |= a2[i];
-        }
-        int r = n2 % 32;
-        if (r > 0) {
-            int mask = 0;
-            for (int i = 0; i < r; i++) {
-                mask = (mask << 1) + 1;
-            }
-            this.intArray[q] |= a2[q] & mask;
-        }
-    }
-
-    @Override
-    public int hashCode() {
-        int h = 0;
-        for (int i = 0; i < intArray.length; i++) {
-            h = h * 31 + intArray[i];
-        }
-        return h;
-    }
-
-    @Override
-    public boolean deepEqual(IAObject obj) {
-        if (!(obj instanceof ABitArray)) {
-            return false;
-        }
-        int[] x = ((ABitArray) obj).getIntArray();
-        if (intArray.length != x.length) {
-            return false;
-        }
-        for (int k = 0; k < intArray.length; k++) {
-            if (intArray[k] != x[k]) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    @Override
-    public int hash() {
-        return hashCode();
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder();
-        sb.append("ABitArray: [ ");
-        for (int i = 0; i < intArray.length; i++) {
-            if (i > 0) {
-                sb.append(", ");
-            }
-            sb.append(intArray[i]);
-        }
-        sb.append(" ]");
-        return sb.toString();
-    }
-
-    @Override
-    public ObjectNode toJSON()  {
-        ObjectMapper om = new ObjectMapper();
-        ObjectNode json = om.createObjectNode();
-
-        ArrayNode bitArray = om.createArrayNode();
-        for (int i = 0; i < intArray.length; i++) {
-            bitArray.add(intArray[i]);
-        }
-        json.set("ABitArray", bitArray);
-
-        return json;
-    }
-}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ABoolean.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ABoolean.java
index 8b24205..a0c572c 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ABoolean.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ABoolean.java
@@ -18,9 +18,10 @@
  */
 package org.apache.asterix.om.base;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 
 public final class ABoolean implements IAObject {
@@ -49,7 +50,7 @@
 
     @Override
     public String toString() {
-        return "ABoolean: {" + bVal + "}";
+        return Boolean.toString(bVal).toUpperCase();
     }
 
     @Override
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ACircle.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ACircle.java
index 43f9109..9c2369d 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ACircle.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ACircle.java
@@ -18,12 +18,12 @@
  */
 package org.apache.asterix.om.base;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
 public class ACircle implements IAObject {
 
     protected APoint center;
@@ -71,7 +71,7 @@
 
     @Override
     public String toString() {
-        return "ACircle: { center: " + center + ", radius: " + radius + "}";
+        return "circle: { \"center\": " + center + ", \"radius\":" + radius + "}";
     }
 
     @Override
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ACollectionCursor.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ACollectionCursor.java
index e57d534..c65cb78 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ACollectionCursor.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ACollectionCursor.java
@@ -27,17 +27,6 @@
     private int size;
     private IAObject object = null;
 
-    public ACollectionCursor() {
-    }
-
-    public ACollectionCursor(AUnorderedList bag) {
-        reset(bag);
-    }
-
-    public ACollectionCursor(AOrderedList list) {
-        reset(list);
-    }
-
     @Override
     public boolean next() {
         pos++;
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADate.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADate.java
index 4bd6711..3d7639e 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADate.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADate.java
@@ -20,13 +20,13 @@
 
 import java.io.IOException;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
 import org.apache.asterix.om.base.temporal.GregorianCalendarSystem;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
 /**
  * ADate type represents dates in a gregorian calendar system.
  */
@@ -73,7 +73,7 @@
     @Override
     public String toString() {
         StringBuilder sbder = new StringBuilder();
-        sbder.append("ADate: { ");
+        sbder.append("\"date\": { ");
         try {
             GregorianCalendarSystem.getInstance().getExtendStringRepUntilField(chrononTimeInDay * CHRONON_OF_DAY, 0,
                     sbder, GregorianCalendarSystem.Fields.YEAR, GregorianCalendarSystem.Fields.DAY, false);
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADateTime.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADateTime.java
index ab228a2..cf6fff0 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADateTime.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADateTime.java
@@ -20,10 +20,11 @@
 
 import java.io.IOException;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.asterix.om.base.temporal.GregorianCalendarSystem;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 
 /**
@@ -106,7 +107,7 @@
     @Override
     public String toString() {
         StringBuilder sbder = new StringBuilder();
-        sbder.append("ADateTime: { ");
+        sbder.append("datetime: { ");
         try {
             GregorianCalendarSystem.getInstance().getExtendStringRepUntilField(chrononTime, 0, sbder,
                     GregorianCalendarSystem.Fields.YEAR, GregorianCalendarSystem.Fields.MILLISECOND, true);
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADouble.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADouble.java
index 7cb4151..4c307f4 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADouble.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADouble.java
@@ -18,13 +18,12 @@
  */
 package org.apache.asterix.om.base;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
 public class ADouble implements IAObject {
 
     protected double value;
@@ -45,7 +44,7 @@
 
     @Override
     public String toString() {
-        return "ADouble: {" + value + "}";
+        return Double.toString(value);
     }
 
     @Override
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADuration.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADuration.java
index 3753930..618f130 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADuration.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADuration.java
@@ -18,14 +18,13 @@
  */
 package org.apache.asterix.om.base;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
 import org.apache.asterix.om.base.temporal.GregorianCalendarSystem;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
 /**
  * ADuration type represents time duration (unanchored time length) values.
  * <p/>
@@ -103,7 +102,7 @@
     @Override
     public String toString() {
         StringBuilder sbder = new StringBuilder();
-        sbder.append("ADuration: {");
+        sbder.append("duration: {");
         GregorianCalendarSystem.getInstance().getDurationExtendStringRepWithTimezoneUntilField(chrononInMillisecond,
                 chrononInMonth, sbder);
         sbder.append(" }");
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AFloat.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AFloat.java
index 3794747..4ad1b50 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AFloat.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AFloat.java
@@ -18,13 +18,12 @@
  */
 package org.apache.asterix.om.base;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
 public class AFloat implements IAObject {
 
     protected float value;
@@ -68,7 +67,7 @@
 
     @Override
     public String toString() {
-        return "AFloat: {" + value + "}";
+        return Float.toString(value);
     }
 
     @Override
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInt16.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInt16.java
index 392aae7..65c53ac 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInt16.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInt16.java
@@ -18,13 +18,12 @@
  */
 package org.apache.asterix.om.base;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
 public class AInt16 implements IAObject {
 
     protected short value;
@@ -58,7 +57,7 @@
 
     @Override
     public String toString() {
-        return "AInt16: {" + value + "}";
+        return Short.toString(value);
     }
 
     @Override
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInt32.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInt32.java
index 495a604..e0ecbb0 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInt32.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInt32.java
@@ -18,13 +18,12 @@
  */
 package org.apache.asterix.om.base;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
 public class AInt32 implements IAObject {
 
     protected int value;
@@ -49,7 +48,7 @@
 
     @Override
     public String toString() {
-        return "AInt32: {" + value + "}";
+        return Integer.toString(value);
     }
 
     @Override
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInt64.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInt64.java
index 3cf40d6..e0369a2 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInt64.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInt64.java
@@ -18,13 +18,12 @@
  */
 package org.apache.asterix.om.base;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
 public class AInt64 implements IAObject {
 
     protected long value;
@@ -57,7 +56,7 @@
 
     @Override
     public String toString() {
-        return "AInt64: {" + value + "}";
+        return Long.toString(value);
     }
 
     @Override
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInt8.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInt8.java
index a435833..c18e878 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInt8.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInt8.java
@@ -18,13 +18,12 @@
  */
 package org.apache.asterix.om.base;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
 public class AInt8 implements IAObject {
 
     protected byte value;
@@ -57,7 +56,7 @@
 
     @Override
     public String toString() {
-        return "AInt8: {" + value + "}";
+        return Byte.toString(value);
     }
 
     @Override
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInterval.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInterval.java
index b5d40c0..2d54786 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInterval.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInterval.java
@@ -20,13 +20,13 @@
 
 import java.io.IOException;
 
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
 import org.apache.asterix.om.base.temporal.GregorianCalendarSystem;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
 
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
 public class AInterval implements IAObject {
 
     protected long intervalStart;
@@ -94,33 +94,33 @@
     @Override
     public String toString() {
         StringBuilder sbder = new StringBuilder();
-        sbder.append("AInterval: { ");
+        sbder.append("interval: { ");
         try {
             if (typetag == ATypeTag.DATE.serialize()) {
-                sbder.append("ADate: { ");
+                sbder.append("date: { ");
 
                 GregorianCalendarSystem.getInstance().getExtendStringRepUntilField(
                         intervalStart * ADate.CHRONON_OF_DAY, 0, sbder, GregorianCalendarSystem.Fields.YEAR,
                         GregorianCalendarSystem.Fields.DAY, false);
 
-                sbder.append(" }, ADate: {");
+                sbder.append(" }, date: {");
                 GregorianCalendarSystem.getInstance().getExtendStringRepUntilField(intervalEnd * ADate.CHRONON_OF_DAY,
                         0, sbder, GregorianCalendarSystem.Fields.YEAR, GregorianCalendarSystem.Fields.DAY, false);
                 sbder.append(" }");
             } else if (typetag == ATypeTag.TIME.serialize()) {
-                sbder.append("ATime: { ");
+                sbder.append("time: { ");
                 GregorianCalendarSystem.getInstance().getExtendStringRepUntilField(intervalStart, 0, sbder,
                         GregorianCalendarSystem.Fields.HOUR, GregorianCalendarSystem.Fields.MILLISECOND, true);
-                sbder.append(" }, ATime: { ");
+                sbder.append(" }, time: { ");
 
                 GregorianCalendarSystem.getInstance().getExtendStringRepUntilField(intervalEnd, 0, sbder,
                         GregorianCalendarSystem.Fields.HOUR, GregorianCalendarSystem.Fields.MILLISECOND, true);
                 sbder.append(" }");
             } else if (typetag == ATypeTag.DATETIME.serialize()) {
-                sbder.append("ADateTime: { ");
+                sbder.append("datetime: { ");
                 GregorianCalendarSystem.getInstance().getExtendStringRepUntilField(intervalStart, 0, sbder,
                         GregorianCalendarSystem.Fields.YEAR, GregorianCalendarSystem.Fields.MILLISECOND, true);
-                sbder.append(" }, ADateTime: { ");
+                sbder.append(" }, datetime: { ");
                 GregorianCalendarSystem.getInstance().getExtendStringRepUntilField(intervalEnd, 0, sbder,
                         GregorianCalendarSystem.Fields.YEAR, GregorianCalendarSystem.Fields.MILLISECOND, true);
                 sbder.append(" }");
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ALine.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ALine.java
index e1cf6ff..67ae2d5 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ALine.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ALine.java
@@ -18,12 +18,12 @@
  */
 package org.apache.asterix.om.base;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
 public class ALine implements IAObject {
 
     protected APoint p1;
@@ -64,7 +64,7 @@
 
     @Override
     public String toString() {
-        return "ALine: { p1: " + p1 + ", p2: " + p2 + "}";
+        return "line: { p1: " + p1 + ", p2: " + p2 + "}";
     }
 
     @Override
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AOrderedList.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AOrderedList.java
index 9a5a147..3c1a165 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AOrderedList.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AOrderedList.java
@@ -21,10 +21,11 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.asterix.om.types.AOrderedListType;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 
@@ -104,7 +105,7 @@
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder();
-        sb.append("AOrderedList: [ ");
+        sb.append("array: [ ");
         boolean first = true;
         for (IAObject v : values) {
             if (first) {
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/APoint.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/APoint.java
index 543edfb..66e96f0 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/APoint.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/APoint.java
@@ -18,12 +18,12 @@
  */
 package org.apache.asterix.om.base;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
 public class APoint implements IAObject {
 
     protected double x;
@@ -64,7 +64,7 @@
 
     @Override
     public String toString() {
-        return "APoint: { x: " + x + ", y: " + y + " }";
+        return "point: { x: " + x + ", y: " + y + " }";
     }
 
     @Override
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/APoint3D.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/APoint3D.java
index 94876b5..9a4a06e 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/APoint3D.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/APoint3D.java
@@ -18,12 +18,12 @@
  */
 package org.apache.asterix.om.base;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
 public class APoint3D implements IAObject {
 
     protected double x;
@@ -70,7 +70,7 @@
 
     @Override
     public String toString() {
-        return "APoint3D: { x: " + x + ", y: " + y + ", z: " + z + " }";
+        return "point3d: { x: " + x + ", y: " + y + ", z: " + z + " }";
     }
 
     @Override
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/APolygon.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/APolygon.java
index 8c31c76..eb4f1b4 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/APolygon.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/APolygon.java
@@ -18,13 +18,13 @@
  */
 package org.apache.asterix.om.base;
 
+import org.apache.asterix.om.types.BuiltinType;
+import org.apache.asterix.om.types.IAType;
+
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 
-import org.apache.asterix.om.types.BuiltinType;
-import org.apache.asterix.om.types.IAType;
-
 public class APolygon implements IAObject {
 
     protected APoint[] points;
@@ -76,7 +76,7 @@
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder();
-        sb.append("APolygon: [ ");
+        sb.append("polygon: [ ");
         for (int i = 0; i < points.length; i++) {
             if (i > 0) {
                 sb.append(", ");
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ARecord.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ARecord.java
index 352f2eb..aed969c 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ARecord.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ARecord.java
@@ -18,11 +18,11 @@
  */
 package org.apache.asterix.om.base;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.asterix.om.types.ARecordType;
 import org.apache.asterix.om.utils.RecordUtil;
-import com.fasterxml.jackson.databind.node.ArrayNode;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 
 public class ARecord implements IAObject {
@@ -83,7 +83,7 @@
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder();
-        sb.append("ARecord: { ");
+        sb.append("{ ");
         if (fields != null) {
             for (int i = 0; i < fields.length; i++) {
                 if (i > 0) {
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ARectangle.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ARectangle.java
index c99bc9b..d6da9e5 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ARectangle.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ARectangle.java
@@ -18,12 +18,12 @@
  */
 package org.apache.asterix.om.base;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
 public class ARectangle implements IAObject {
 
     protected APoint p1;
@@ -64,7 +64,7 @@
 
     @Override
     public String toString() {
-        return "ARectangle: { p1: " + p1 + ", p2: " + p2 + "}";
+        return "rectangle: { p1: " + p1 + ", p2: " + p2 + "}";
     }
 
     @Override
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AString.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AString.java
index 4efd63a..aefe5f7 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AString.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AString.java
@@ -20,10 +20,10 @@
 
 import java.io.Serializable;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 
 public class AString implements IAObject, Serializable {
@@ -45,7 +45,7 @@
 
     @Override
     public String toString() {
-        return "AString: {" + value + "}";
+        return "\"" + value + "\"";
     }
 
     @Override
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ATime.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ATime.java
index 38d22bc..a14d386 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ATime.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ATime.java
@@ -20,13 +20,13 @@
 
 import java.io.IOException;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
 import org.apache.asterix.om.base.temporal.GregorianCalendarSystem;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
 public class ATime implements IAObject {
 
     /**
@@ -88,7 +88,7 @@
     @Override
     public String toString() {
         StringBuilder sbder = new StringBuilder();
-        sbder.append("ATime: { ");
+        sbder.append("time: { ");
         try {
             GregorianCalendarSystem.getInstance().getExtendStringRepUntilField(chrononTime, 0, sbder,
                     GregorianCalendarSystem.Fields.HOUR, GregorianCalendarSystem.Fields.MILLISECOND, true);
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AUUID.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AUUID.java
index c0d27ce..0ed9d3f 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AUUID.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AUUID.java
@@ -24,10 +24,11 @@
 import java.io.IOException;
 import java.util.Arrays;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 
 public class AUUID implements IAObject {
@@ -84,13 +85,8 @@
     @Override
     public String toString() {
         StringBuilder buf = new StringBuilder(UUID_CHARS + 9);
-        buf.append("AUUID: {");
-        return appendLiteralOnly(buf).append('}').toString();
-    }
-
-    public String toSimpleString() {
-        StringBuilder buf = new StringBuilder(UUID_CHARS + 9);
-        return appendLiteralOnly(buf).toString();
+        buf.append("uuid: { ");
+        return appendLiteralOnly(buf).append(" }").toString();
     }
 
     public StringBuilder appendLiteralOnly(StringBuilder buf) {
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AUnorderedList.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AUnorderedList.java
index cac0840..894421c 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AUnorderedList.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AUnorderedList.java
@@ -21,9 +21,10 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.asterix.om.types.AUnorderedListType;
 import org.apache.asterix.om.types.IAType;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 
@@ -33,7 +34,7 @@
     protected AUnorderedListType type;
 
     public AUnorderedList(AUnorderedListType type) {
-        values = new ArrayList<IAObject>();
+        values = new ArrayList<>();
         this.type = type;
     }
 
@@ -74,14 +75,6 @@
         return values.size();
     }
 
-    public IAObject getOneObject() {
-        if (values == null || values.isEmpty()) {
-            return null;
-        } else {
-            return values.get(0);
-        }
-    }
-
     @Override
     public boolean deepEqual(IAObject obj) {
         return equals(obj);
@@ -95,7 +88,7 @@
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder();
-        sb.append("AUnorderedList: [ ");
+        sb.append("multiset: {{ ");
         boolean first = true;
         for (IAObject v : values) {
             if (first) {
@@ -105,7 +98,7 @@
             }
             sb.append(v.toString());
         }
-        sb.append(" ]");
+        sb.append(" }}");
         return sb.toString();
     }
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AYearMonthDuration.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AYearMonthDuration.java
index 55982e1..8321848 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AYearMonthDuration.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AYearMonthDuration.java
@@ -18,13 +18,13 @@
  */
 package org.apache.asterix.om.base;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
+import org.apache.asterix.om.base.temporal.GregorianCalendarSystem;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
 /**
  * AYearMonthDuration represents the duration in the unit of months.
  * <p/>
@@ -45,9 +45,15 @@
         return chrononInMonth;
     }
 
-    /* (non-Javadoc)
-     * @see org.apache.hyracks.api.dataflow.value.JSONSerializable#toJSON()
-     */
+    @Override
+    public String toString() {
+        StringBuilder sbder = new StringBuilder();
+        sbder.append("year_month_duration: {");
+        GregorianCalendarSystem.getInstance().getDurationMonth(chrononInMonth);
+        sbder.append(" }");
+        return sbder.toString();
+    }
+
     @Override
     public ObjectNode toJSON()  {
         ObjectMapper om = new ObjectMapper();
@@ -60,25 +66,16 @@
         return json;
     }
 
-    /* (non-Javadoc)
-     * @see org.apache.asterix.om.base.IAObject#getType()
-     */
     @Override
     public IAType getType() {
         return BuiltinType.AYEARMONTHDURATION;
     }
 
-    /* (non-Javadoc)
-     * @see org.apache.asterix.om.base.IAObject#deepEqual(org.apache.asterix.om.base.IAObject)
-     */
     @Override
     public boolean deepEqual(IAObject obj) {
         return equals(obj);
     }
 
-    /* (non-Javadoc)
-     * @see org.apache.asterix.om.base.IAObject#hash()
-     */
     @Override
     public int hash() {
         return hashCode();
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ShortWithoutTypeInfo.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ShortWithoutTypeInfo.java
deleted file mode 100644
index 4ed7966..0000000
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ShortWithoutTypeInfo.java
+++ /dev/null
@@ -1,95 +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.asterix.om.base;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
-import org.apache.asterix.om.types.BuiltinType;
-import org.apache.asterix.om.types.IAType;
-
-public class ShortWithoutTypeInfo implements IAObject {
-
-    protected short value;
-
-    public ShortWithoutTypeInfo(short value) {
-        super();
-        this.value = value;
-    }
-
-    public ShortWithoutTypeInfo(byte[] bytes, int offset, int length) {
-        value = valueFromBytes(bytes, offset, length);
-    }
-
-    public Short getShortValue() {
-        return value;
-    }
-
-    @Override
-    public IAType getType() {
-        return BuiltinType.SHORTWITHOUTTYPEINFO;
-    }
-
-    @Override
-    public String toString() {
-        return "ShortWithoutTypeInfo: {" + value + "}";
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (!(obj instanceof ShortWithoutTypeInfo)) {
-            return false;
-        } else {
-            return value == (((ShortWithoutTypeInfo) obj).getShortValue());
-        }
-    }
-
-    @Override
-    public int hashCode() {
-        return value;
-    }
-
-    private static short valueFromBytes(byte[] bytes, int offset, int length) {
-        return (short) (((bytes[offset] & 0xff) << 8) + ((bytes[offset + 1] & 0xff)));
-    }
-
-    public byte[] toBytes() {
-        return new byte[] { (byte) ((value >>> 8) & 0xff), (byte) ((value >>> 0) & 0xff)};
-    }
-
-    @Override
-    public boolean deepEqual(IAObject obj) {
-        return equals(obj);
-    }
-
-    @Override
-    public int hash() {
-        return hashCode();
-    }
-
-    @Override
-    public ObjectNode toJSON()  {
-        ObjectMapper om = new ObjectMapper();
-        ObjectNode json = om.createObjectNode();
-
-        json.put("ShortWithoutTypeInfo", value);
-
-        return json;
-    }
-}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/ExternalFunctionInfo.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/ExternalFunctionInfo.java
index 9f3b529..0042b26 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/ExternalFunctionInfo.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/ExternalFunctionInfo.java
@@ -35,17 +35,6 @@
     private final FunctionKind kind;
     private final IAType returnType;
 
-    public ExternalFunctionInfo() {
-        super();
-        rtc = null;
-        argumentTypes = null;
-        body = null;
-        language = null;
-        kind = null;
-        returnType = null;
-
-    }
-
     public ExternalFunctionInfo(String namespace, String name, int arity, FunctionKind kind,
             List<IAType> argumentTypes, IAType returnType, IResultTypeComputer rtc, String body, String language) {
         super(namespace, name, arity, true);
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/FunctionDisplayUtil.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/FunctionDisplayUtil.java
new file mode 100644
index 0000000..a1b81f0
--- /dev/null
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/FunctionDisplayUtil.java
@@ -0,0 +1,110 @@
+/*
+ * 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.asterix.om.functions;
+
+import java.util.List;
+
+import org.apache.commons.lang3.mutable.Mutable;
+import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.core.algebra.functions.IFunctionInfo;
+
+class FunctionDisplayUtil {
+
+    @FunctionalInterface
+    interface DefaultDisplayFunction {
+        String display(List<Mutable<ILogicalExpression>> args);
+    }
+
+    private FunctionDisplayUtil() {
+        // Does nothing.
+    }
+
+    /**
+     * Displays a function with its parameters in a user-friendly way.
+     *
+     * @param functionInfo,
+     *            the function info.
+     * @param args
+     *            , the arguments in the function call expression.
+     * @param defaultDisplayFunction,
+     *            the default display function for regular functions.
+     * @return the display string of the function call expression.
+     */
+    public static String display(IFunctionInfo functionInfo, List<Mutable<ILogicalExpression>> args,
+            DefaultDisplayFunction defaultDisplayFunction) {
+        FunctionIdentifier funcId = functionInfo.getFunctionIdentifier();
+        if (funcId.equals(BuiltinFunctions.FIELD_ACCESS_BY_INDEX)) {
+            return displayFieldAccess(args, true);
+        } else if (funcId.equals(BuiltinFunctions.FIELD_ACCESS_BY_NAME)
+                || funcId.equals(BuiltinFunctions.FIELD_ACCESS_NESTED)) {
+            return displayFieldAccess(args, false);
+        } else if (funcId.equals(BuiltinFunctions.OPEN_RECORD_CONSTRUCTOR)
+                || funcId.equals(BuiltinFunctions.CLOSED_RECORD_CONSTRUCTOR)) {
+            return displayRecordConstructor(args);
+        }
+        return defaultDisplayFunction.display(args);
+    }
+
+    // Displays field-access-by-index in an easy-to-understand way.
+    private static String displayFieldAccess(List<Mutable<ILogicalExpression>> args, boolean intArg) {
+        StringBuilder sb = new StringBuilder();
+        boolean first = true;
+        boolean second = true;
+        for (Mutable<ILogicalExpression> ref : args) {
+            if (first) {
+                first = false;
+            } else if (second) {
+                sb.append(".getField(" + (intArg ? "" : "\""));
+                second = false;
+            } else {
+                sb.append(".");
+            }
+            sb.append(ref.getValue().toString().replaceAll("^\"|\"$", ""));
+        }
+        sb.append((intArg ? "" : "\"") + ")");
+        return sb.toString();
+    }
+
+    // Displays record-constructor in an easy-to-understand way.
+    private static String displayRecordConstructor(List<Mutable<ILogicalExpression>> args) {
+        StringBuilder sb = new StringBuilder();
+        boolean first = true;
+        boolean fieldName = true;
+        sb.append("{");
+        for (Mutable<ILogicalExpression> ref : args) {
+            if (first) {
+                first = false;
+            } else if (fieldName) {
+                sb.append(", ");
+            }
+            sb.append(ref.getValue());
+            if (fieldName) {
+                sb.append(": ");
+                fieldName = false;
+            } else {
+                fieldName = true;
+            }
+        }
+        sb.append("}");
+        return sb.toString();
+    }
+
+}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/FunctionInfo.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/FunctionInfo.java
index 7a590a7..994b2a9 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/FunctionInfo.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/FunctionInfo.java
@@ -18,43 +18,48 @@
  */
 package org.apache.asterix.om.functions;
 
-import org.apache.asterix.common.functions.FunctionSignature;
-import org.apache.hyracks.algebricks.core.algebra.functions.AbstractFunctionInfo;
+import java.util.List;
+
+import org.apache.commons.lang3.mutable.Mutable;
+import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.core.algebra.functions.IFunctionInfo;
 
-public class FunctionInfo extends AbstractFunctionInfo {
-
-    private static final long serialVersionUID = 1L;
+public class FunctionInfo implements IFunctionInfo {
 
     private final FunctionIdentifier functionIdentifier;
+    private final boolean isFunctional;
 
     public FunctionInfo(String namespace, String name, int arity, boolean isFunctional) {
-        super(isFunctional);
-        this.functionIdentifier = new FunctionIdentifier(namespace, name, arity);
-    }
-
-    public FunctionInfo() {
-        super(true);
-        functionIdentifier = null;
+        this(new FunctionIdentifier(namespace, name, arity), isFunctional);
     }
 
     public FunctionInfo(FunctionIdentifier functionIdentifier, boolean isFunctional) {
-        super(isFunctional);
+        this.isFunctional = isFunctional;
         this.functionIdentifier = functionIdentifier;
     }
 
-    public FunctionInfo(FunctionSignature functionSignature, boolean isFunctional) {
-        super(isFunctional);
-        this.functionIdentifier = new FunctionIdentifier(functionSignature.getNamespace(), functionSignature.getName(),
-                functionSignature.getArity());
-    }
-
     @Override
     public FunctionIdentifier getFunctionIdentifier() {
         return functionIdentifier;
     }
 
     @Override
+    public boolean isFunctional() {
+        return isFunctional;
+    }
+
+    /**
+     * @param args,
+     *            the arguments.
+     * @return a display string of the FunctionInfo.
+     */
+    @Override
+    public String display(List<Mutable<ILogicalExpression>> args) {
+        return FunctionDisplayUtil.display(this, args, input -> IFunctionInfo.super.display(input));
+    }
+
+    @Override
     public int hashCode() {
         return toString().hashCode();
     }
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IExternalFunctionInfo.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IExternalFunctionInfo.java
index 070fa97..d2d6339 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IExternalFunctionInfo.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IExternalFunctionInfo.java
@@ -18,7 +18,6 @@
  */
 package org.apache.asterix.om.functions;
 
-import java.io.Serializable;
 import java.util.List;
 
 import org.apache.asterix.om.typecomputer.base.IResultTypeComputer;
@@ -26,7 +25,7 @@
 import org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression.FunctionKind;
 import org.apache.hyracks.algebricks.core.algebra.functions.IFunctionInfo;
 
-public interface IExternalFunctionInfo extends IFunctionInfo, Serializable {
+public interface IExternalFunctionInfo extends IFunctionInfo {
 
     public IResultTypeComputer getResultTypeComputer();
 
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/IOptimizationContext.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/IOptimizationContext.java
index 328697d..a5b2284 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/IOptimizationContext.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/IOptimizationContext.java
@@ -67,8 +67,6 @@
 
     public List<FunctionalDependency> getFDList(ILogicalOperator op);
 
-    public void clearAllFDAndEquivalenceClasses();
-
     public void putLogicalPropertiesVector(ILogicalOperator op, ILogicalPropertiesVector v);
 
     public ILogicalPropertiesVector getLogicalPropertiesVector(ILogicalOperator op);
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/IVariableContext.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/IVariableContext.java
index e308a8d..71d4533 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/IVariableContext.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/IVariableContext.java
@@ -20,10 +20,11 @@
 
 public interface IVariableContext {
 
-    public int getVarCounter();
+    int getVarCounter();
 
-    public void setVarCounter(int varCounter);
+    void setVarCounter(int varCounter);
 
-    public LogicalVariable newVar();
+    LogicalVariable newVar();
 
+    LogicalVariable newVar(String displayName);
 }
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/LogicalVariable.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/LogicalVariable.java
index fc30ce2..2023304 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/LogicalVariable.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/LogicalVariable.java
@@ -25,9 +25,16 @@
  */
 public final class LogicalVariable {
     private final int id;
+    private final String displayName;
 
     public LogicalVariable(int id) {
         this.id = id;
+        this.displayName = "$$" + id;
+    }
+
+    public LogicalVariable(int id, String displayName) {
+        this.id = id;
+        this.displayName = "$" + displayName;
     }
 
     public int getId() {
@@ -36,7 +43,7 @@
 
     @Override
     public String toString() {
-        return "$$" + id;
+        return displayName;
     }
 
     @Override
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/expressions/AbstractFunctionCallExpression.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/expressions/AbstractFunctionCallExpression.java
index b35f692..8bc39b8 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/expressions/AbstractFunctionCallExpression.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/expressions/AbstractFunctionCallExpression.java
@@ -87,7 +87,7 @@
     protected List<Mutable<ILogicalExpression>> cloneArguments() {
         List<Mutable<ILogicalExpression>> clonedArgs = new ArrayList<Mutable<ILogicalExpression>>(arguments.size());
         for (Mutable<ILogicalExpression> e : arguments) {
-            ILogicalExpression e2 = ((AbstractLogicalExpression) e.getValue()).cloneExpression();
+            ILogicalExpression e2 = e.getValue().cloneExpression();
             clonedArgs.add(new MutableObject<ILogicalExpression>(e2));
         }
         return clonedArgs;
@@ -111,20 +111,7 @@
 
     @Override
     public String toString() {
-        StringBuilder sb = new StringBuilder();
-        sb.append("function-call: " + finfo.getFunctionIdentifier() + ", Args:[");
-        // + arguments;
-        boolean first = true;
-        for (Mutable<ILogicalExpression> ref : arguments) {
-            if (first) {
-                first = false;
-            } else {
-                sb.append(", ");
-            }
-            sb.append(ref.getValue());
-        }
-        sb.append("]");
-        return sb.toString();
+        return finfo.display(arguments);
     }
 
     @Override
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/expressions/AggregateFunctionCallExpression.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/expressions/AggregateFunctionCallExpression.java
index f09b4c2..8fca47c 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/expressions/AggregateFunctionCallExpression.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/expressions/AggregateFunctionCallExpression.java
@@ -52,10 +52,6 @@
         return twoStep;
     }
 
-    public void setTwoStep(boolean twoStep) {
-        this.twoStep = twoStep;
-    }
-
     @Override
     public AggregateFunctionCallExpression cloneExpression() {
         cloneAnnotations();
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/expressions/StatefulFunctionCallExpression.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/expressions/StatefulFunctionCallExpression.java
index fe91ed3..661c389 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/expressions/StatefulFunctionCallExpression.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/expressions/StatefulFunctionCallExpression.java
@@ -24,7 +24,6 @@
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
 import org.apache.hyracks.algebricks.core.algebra.functions.IFunctionInfo;
-import org.apache.hyracks.algebricks.core.algebra.properties.IPartitioningProperty;
 import org.apache.hyracks.algebricks.core.algebra.properties.IPropertiesComputer;
 import org.apache.hyracks.algebricks.core.algebra.visitors.ILogicalExpressionVisitor;
 
@@ -56,11 +55,6 @@
         return new StatefulFunctionCallExpression(finfo, propertiesComputer, clonedArgs);
     }
 
-    // can be null
-    public IPartitioningProperty getRequiredPartitioningProperty() {
-        return propertiesComputer.computePartitioningProperty(this);
-    }
-
     @Override
     public <R, T> R accept(ILogicalExpressionVisitor<R, T> visitor, T arg) throws AlgebricksException {
         return visitor.visitStatefulFunctionCallExpression(this, arg);
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/expressions/VariableReferenceExpression.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/expressions/VariableReferenceExpression.java
index c02eec3..2ccf0c4 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/expressions/VariableReferenceExpression.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/expressions/VariableReferenceExpression.java
@@ -41,14 +41,6 @@
         this(0, variable);
     }
 
-    public int getTupleRef() {
-        return tupleRef;
-    }
-
-    public void setTupleRef(int tupleRef) {
-        this.tupleRef = tupleRef;
-    }
-
     public LogicalVariable getVariableReference() {
         return variable;
     }
@@ -64,7 +56,7 @@
 
     @Override
     public String toString() {
-        return "%" + tupleRef + "->" + variable.toString();
+        return variable.toString();
     }
 
     @Override
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/functions/IFunctionInfo.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/functions/IFunctionInfo.java
index a4d56c1..6e1ccef 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/functions/IFunctionInfo.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/functions/IFunctionInfo.java
@@ -18,8 +18,44 @@
  */
 package org.apache.hyracks.algebricks.core.algebra.functions;
 
-public interface IFunctionInfo {
+import java.io.Serializable;
+import java.util.List;
+
+import org.apache.commons.lang3.mutable.Mutable;
+import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
+
+public interface IFunctionInfo extends Serializable {
+    /**
+     * @return the FunctionIdentifier.
+     */
     FunctionIdentifier getFunctionIdentifier();
 
-    public boolean isFunctional();
+    /**
+     * @return true if the function is a stateful function; false otherwise.
+     */
+    default boolean isFunctional() {
+        // A function is functional by default.
+        return true;
+    }
+
+    /**
+     * @param args,
+     *            the arguments.
+     * @return a display string of the FunctionInfo.
+     */
+    default String display(List<Mutable<ILogicalExpression>> args) {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getFunctionIdentifier().getName() + "(");
+        boolean first = true;
+        for (Mutable<ILogicalExpression> ref : args) {
+            if (first) {
+                first = false;
+            } else {
+                sb.append(", ");
+            }
+            sb.append(ref.getValue());
+        }
+        sb.append(")");
+        return sb.toString();
+    }
 }
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/rewriter/base/AlgebricksOptimizationContext.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/rewriter/base/AlgebricksOptimizationContext.java
index a1b3556..58e95bb 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/rewriter/base/AlgebricksOptimizationContext.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/rewriter/base/AlgebricksOptimizationContext.java
@@ -131,6 +131,12 @@
     }
 
     @Override
+    public LogicalVariable newVar(String displayName) {
+        varCounter++;
+        return new LogicalVariable(varCounter, displayName);
+    }
+
+    @Override
     public IMetadataProvider getMetadataProvider() {
         return metadataProvider;
     }
@@ -233,12 +239,6 @@
     }
 
     @Override
-    public void clearAllFDAndEquivalenceClasses() {
-        eqClassGlobalMap.clear();
-        fdGlobalMap.clear();
-    }
-
-    @Override
     public ILogicalPropertiesVector getLogicalPropertiesVector(ILogicalOperator op) {
         return logicalProps.get(op);
     }
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/metadata/PigletFunction.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/metadata/PigletFunction.java
index 55e99e8..06d9b25 100644
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/metadata/PigletFunction.java
+++ b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/metadata/PigletFunction.java
@@ -18,16 +18,13 @@
  */
 package org.apache.hyracks.algebricks.examples.piglet.metadata;
 
-import org.apache.hyracks.algebricks.core.algebra.functions.AbstractFunctionInfo;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.core.algebra.functions.IFunctionInfo;
 
-public class PigletFunction extends AbstractFunctionInfo {
-    private static final long serialVersionUID = 1L;
-
+public class PigletFunction implements IFunctionInfo {
     private final FunctionIdentifier fid;
 
     public PigletFunction(FunctionIdentifier fid) {
-        super(true);
         this.fid = fid;
     }