You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asterixdb.apache.org by bu...@apache.org on 2016/07/14 02:30:15 UTC

[3/4] asterixdb git commit: Support SQL-compliant group-by syntax.

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/clause/WhereClause.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/clause/WhereClause.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/clause/WhereClause.java
index d0af3e9..eaa17e2 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/clause/WhereClause.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/clause/WhereClause.java
@@ -26,12 +26,8 @@ import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
 public class WhereClause implements Clause {
     private Expression whereExpr;
 
-    public Expression getWhereExpr() {
-        return whereExpr;
-    }
-
-    public void setWhereExpr(Expression whereExpr) {
-        this.whereExpr = whereExpr;
+    public WhereClause() {
+        // Default constructor.
     }
 
     public WhereClause(Expression whereExpr) {
@@ -39,7 +35,12 @@ public class WhereClause implements Clause {
         this.whereExpr = whereExpr;
     }
 
-    public WhereClause() {
+    public Expression getWhereExpr() {
+        return whereExpr;
+    }
+
+    public void setWhereExpr(Expression whereExpr) {
+        this.whereExpr = whereExpr;
     }
 
     @Override
@@ -52,4 +53,20 @@ public class WhereClause implements Clause {
         return visitor.visit(this, arg);
     }
 
+    @Override
+    public int hashCode() {
+        return whereExpr.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof WhereClause)) {
+            return false;
+        }
+        WhereClause whereClause = (WhereClause) object;
+        return whereExpr.equals(whereClause.getWhereExpr());
+    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/AbstractAccessor.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/AbstractAccessor.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/AbstractAccessor.java
index c7ac0a1..2b7b748 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/AbstractAccessor.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/AbstractAccessor.java
@@ -19,6 +19,7 @@
 package org.apache.asterix.lang.common.expression;
 
 import org.apache.asterix.lang.common.base.Expression;
+import org.apache.commons.lang.ObjectUtils;
 
 public abstract class AbstractAccessor implements Expression {
     protected Expression expr;
@@ -36,4 +37,21 @@ public abstract class AbstractAccessor implements Expression {
         this.expr = expr;
     }
 
+    @Override
+    public int hashCode() {
+        return ObjectUtils.hashCode(expr);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof AbstractAccessor)) {
+            return false;
+        }
+        AbstractAccessor target = (AbstractAccessor) object;
+        return expr.equals(target.expr);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/CallExpr.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/CallExpr.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/CallExpr.java
index 44a40c4..1b7b918 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/CallExpr.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/CallExpr.java
@@ -25,6 +25,7 @@ import org.apache.asterix.common.functions.FunctionSignature;
 import org.apache.asterix.lang.common.base.AbstractExpression;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
+import org.apache.commons.lang3.ObjectUtils;
 
 public class CallExpr extends AbstractExpression {
     private FunctionSignature functionSignature;
@@ -68,6 +69,24 @@ public class CallExpr extends AbstractExpression {
 
     @Override
     public String toString() {
-        return "call " + String.valueOf(functionSignature);
+        return "call " + functionSignature;
+    }
+
+    @Override
+    public int hashCode() {
+        return ObjectUtils.hashCodeMulti(exprList, functionSignature, isBuiltin);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof CallExpr)) {
+            return false;
+        }
+        CallExpr target = (CallExpr) object;
+        return ObjectUtils.equals(exprList, target.exprList)
+                && ObjectUtils.equals(functionSignature, target.functionSignature) && isBuiltin == target.isBuiltin;
     }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/FieldAccessor.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/FieldAccessor.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/FieldAccessor.java
index e23c799..0a76730 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/FieldAccessor.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/FieldAccessor.java
@@ -22,6 +22,7 @@ import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.struct.Identifier;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
+import org.apache.commons.lang3.ObjectUtils;
 
 public class FieldAccessor extends AbstractAccessor {
     private Identifier ident;
@@ -53,4 +54,21 @@ public class FieldAccessor extends AbstractAccessor {
     public String toString() {
         return String.valueOf(expr) + "." + ident.toString();
     }
+
+    @Override
+    public int hashCode() {
+        return 31 * super.hashCode() + ObjectUtils.hashCode(ident);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof FieldAccessor)) {
+            return false;
+        }
+        FieldAccessor target = (FieldAccessor) object;
+        return super.equals(target) && ObjectUtils.equals(ident, target.ident);
+    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/FieldBinding.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/FieldBinding.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/FieldBinding.java
index abfbbe3..afadddd 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/FieldBinding.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/FieldBinding.java
@@ -19,12 +19,14 @@
 package org.apache.asterix.lang.common.expression;
 
 import org.apache.asterix.lang.common.base.Expression;
+import org.apache.commons.lang3.ObjectUtils;
 
 public class FieldBinding {
     private Expression leftExpr;
     private Expression rightExpr;
 
     public FieldBinding() {
+        // default constructor.
     }
 
     public FieldBinding(Expression leftExpr, Expression rightExpr) {
@@ -49,4 +51,26 @@ public class FieldBinding {
         this.rightExpr = rightExpr;
     }
 
+    @Override
+    public int hashCode() {
+        return ObjectUtils.hashCodeMulti(leftExpr, rightExpr);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof FieldBinding)) {
+            return false;
+        }
+        FieldBinding target = (FieldBinding) object;
+        return ObjectUtils.equals(leftExpr, target.leftExpr) && ObjectUtils.equals(rightExpr, target.rightExpr);
+    }
+
+    @Override
+    public String toString() {
+        return leftExpr + ": " + rightExpr;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/GbyVariableExpressionPair.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/GbyVariableExpressionPair.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/GbyVariableExpressionPair.java
index bb33918..aaa6526 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/GbyVariableExpressionPair.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/GbyVariableExpressionPair.java
@@ -19,6 +19,7 @@
 package org.apache.asterix.lang.common.expression;
 
 import org.apache.asterix.lang.common.base.Expression;
+import org.apache.commons.lang3.ObjectUtils;
 
 public class GbyVariableExpressionPair {
     private VariableExpr var; // can be null
@@ -50,4 +51,25 @@ public class GbyVariableExpressionPair {
         this.expr = expr;
     }
 
+    @Override
+    public int hashCode() {
+        return ObjectUtils.hashCodeMulti(expr, var);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof GbyVariableExpressionPair)) {
+            return false;
+        }
+        GbyVariableExpressionPair target = (GbyVariableExpressionPair) object;
+        return ObjectUtils.equals(expr, target.expr) && ObjectUtils.equals(var, target.var);
+    }
+
+    @Override
+    public String toString() {
+        return expr + " AS " + var;
+    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/IfExpr.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/IfExpr.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/IfExpr.java
index f32a9cc..2709f80 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/IfExpr.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/IfExpr.java
@@ -21,6 +21,7 @@ package org.apache.asterix.lang.common.expression;
 import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
+import org.apache.commons.lang3.ObjectUtils;
 
 public class IfExpr implements Expression {
     private Expression condExpr;
@@ -28,6 +29,7 @@ public class IfExpr implements Expression {
     private Expression elseExpr;
 
     public IfExpr() {
+        // default constructor
     }
 
     public IfExpr(Expression condExpr, Expression thenExpr, Expression elseExpr) {
@@ -69,4 +71,27 @@ public class IfExpr implements Expression {
     public <R, T> R accept(ILangVisitor<R, T> visitor, T arg) throws AsterixException {
         return visitor.visit(this, arg);
     }
+
+    @Override
+    public int hashCode() {
+        return ObjectUtils.hashCodeMulti(condExpr, elseExpr, thenExpr);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof IfExpr)) {
+            return false;
+        }
+        IfExpr target = (IfExpr) object;
+        return ObjectUtils.equals(condExpr, target.condExpr) && ObjectUtils.equals(elseExpr, target.elseExpr)
+                && ObjectUtils.equals(thenExpr, target.thenExpr);
+    }
+
+    @Override
+    public String toString() {
+        return "if(" + condExpr + ") then " + thenExpr + " else " + elseExpr;
+    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/IndexAccessor.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/IndexAccessor.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/IndexAccessor.java
index 898870e..07a8254 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/IndexAccessor.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/IndexAccessor.java
@@ -21,26 +21,26 @@ package org.apache.asterix.lang.common.expression;
 import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
+import org.apache.commons.lang3.ObjectUtils;
 
 public class IndexAccessor extends AbstractAccessor {
-    private boolean any;
+    private boolean isAny;
     private Expression indexExpr;
 
-    public final static int ANY = -1;
-
     public IndexAccessor(Expression expr, Expression indexExpr) {
         super(expr);
-        if (indexExpr == null)
-            this.any = true;
+        if (indexExpr == null) {
+            this.isAny = true;
+        }
         this.indexExpr = indexExpr;
     }
 
     public boolean isAny() {
-        return any;
+        return isAny;
     }
 
     public void setAny(boolean any) {
-        this.any = any;
+        this.isAny = any;
     }
 
     public Expression getIndexExpr() {
@@ -60,4 +60,26 @@ public class IndexAccessor extends AbstractAccessor {
     public <R, T> R accept(ILangVisitor<R, T> visitor, T arg) throws AsterixException {
         return visitor.visit(this, arg);
     }
+
+    @Override
+    public int hashCode() {
+        return 31 * super.hashCode() + ObjectUtils.hashCodeMulti(indexExpr, isAny);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof IndexAccessor)) {
+            return false;
+        }
+        IndexAccessor target = (IndexAccessor) object;
+        return super.equals(target) && isAny == target.isAny && ObjectUtils.equals(indexExpr, target.indexExpr);
+    }
+
+    @Override
+    public String toString() {
+        return expr + "[" + (isAny ? "?" : indexExpr) + "]";
+    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/ListConstructor.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/ListConstructor.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/ListConstructor.java
index 10e1baa..7fdca69 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/ListConstructor.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/ListConstructor.java
@@ -23,12 +23,14 @@ import java.util.List;
 import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
+import org.apache.commons.lang3.ObjectUtils;
 
 public class ListConstructor implements Expression {
     private List<Expression> exprList;
     private Type type;
 
     public ListConstructor() {
+        // default constructor.
     }
 
     public ListConstructor(Type type, List<Expression> exprList) {
@@ -66,4 +68,21 @@ public class ListConstructor implements Expression {
     public <R, T> R accept(ILangVisitor<R, T> visitor, T arg) throws AsterixException {
         return visitor.visit(this, arg);
     }
+
+    @Override
+    public int hashCode() {
+        return ObjectUtils.hashCodeMulti(exprList, type);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof ListConstructor)) {
+            return false;
+        }
+        ListConstructor target = (ListConstructor) object;
+        return ObjectUtils.equals(exprList, target.exprList) && ObjectUtils.equals(type, target.type);
+    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/LiteralExpr.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/LiteralExpr.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/LiteralExpr.java
index a9fa748..46c3c32 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/LiteralExpr.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/LiteralExpr.java
@@ -22,11 +22,13 @@ import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.base.Literal;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
+import org.apache.commons.lang3.ObjectUtils;
 
 public class LiteralExpr implements Expression {
     private Literal value;
 
     public LiteralExpr() {
+        // default constructor.
     }
 
     public LiteralExpr(Literal value) {
@@ -51,4 +53,21 @@ public class LiteralExpr implements Expression {
         return visitor.visit(this, arg);
     }
 
+    @Override
+    public int hashCode() {
+        return ObjectUtils.hashCode(value);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof LiteralExpr)) {
+            return false;
+        }
+        LiteralExpr target = (LiteralExpr) object;
+        return ObjectUtils.equals(value, target.value);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/OperatorExpr.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/OperatorExpr.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/OperatorExpr.java
index bf70df4..fb64ad8 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/OperatorExpr.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/OperatorExpr.java
@@ -27,6 +27,7 @@ import org.apache.asterix.lang.common.base.AbstractExpression;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.struct.OperatorType;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
+import org.apache.commons.lang3.ObjectUtils;
 
 public class OperatorExpr extends AbstractExpression {
     private List<Expression> exprList;
@@ -117,4 +118,22 @@ public class OperatorExpr extends AbstractExpression {
         }
         return false;
     }
+
+    @Override
+    public int hashCode() {
+        return ObjectUtils.hashCodeMulti(currentop, exprBroadcastIdx, exprList, opList);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof OperatorExpr)) {
+            return false;
+        }
+        OperatorExpr target = (OperatorExpr) object;
+        return currentop == target.isCurrentop() && ObjectUtils.equals(exprBroadcastIdx, target.exprBroadcastIdx)
+                && ObjectUtils.equals(exprList, target.exprList) && ObjectUtils.equals(opList, target.opList);
+    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/OrderedListTypeDefinition.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/OrderedListTypeDefinition.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/OrderedListTypeDefinition.java
index 99d0674..08b9c53 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/OrderedListTypeDefinition.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/OrderedListTypeDefinition.java
@@ -20,8 +20,9 @@ package org.apache.asterix.lang.common.expression;
 
 import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
+import org.apache.commons.lang.ObjectUtils;
 
-public class OrderedListTypeDefinition extends TypeExpression {
+public class OrderedListTypeDefinition implements TypeExpression {
 
     private TypeExpression itemTypeExpression;
 
@@ -43,4 +44,20 @@ public class OrderedListTypeDefinition extends TypeExpression {
         return itemTypeExpression;
     }
 
+    @Override
+    public int hashCode() {
+        return ObjectUtils.hashCode(itemTypeExpression);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof OrderedListTypeDefinition)) {
+            return false;
+        }
+        OrderedListTypeDefinition target = (OrderedListTypeDefinition) object;
+        return ObjectUtils.equals(itemTypeExpression, target.itemTypeExpression);
+    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/QuantifiedExpression.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/QuantifiedExpression.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/QuantifiedExpression.java
index 78c8ab1..e1372cd 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/QuantifiedExpression.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/QuantifiedExpression.java
@@ -24,6 +24,7 @@ import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.struct.QuantifiedPair;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
+import org.apache.commons.lang3.ObjectUtils;
 
 public class QuantifiedExpression implements Expression {
     private List<QuantifiedPair> quantifiedList;
@@ -79,4 +80,23 @@ public class QuantifiedExpression implements Expression {
         EVERY,
         SOME
     }
+
+    @Override
+    public int hashCode() {
+        return ObjectUtils.hashCodeMulti(quantifiedList, quantifier, satisfiesExpr);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof QuantifiedExpression)) {
+            return false;
+        }
+        QuantifiedExpression target = (QuantifiedExpression) object;
+        return ObjectUtils.equals(quantifiedList, target.quantifiedList)
+                && ObjectUtils.equals(quantifier, target.quantifier)
+                && ObjectUtils.equals(satisfiesExpr, target.satisfiesExpr);
+    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/RecordConstructor.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/RecordConstructor.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/RecordConstructor.java
index 6c6b415..144b27c 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/RecordConstructor.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/RecordConstructor.java
@@ -23,6 +23,7 @@ import java.util.List;
 import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
+import org.apache.commons.lang3.ObjectUtils;
 
 public class RecordConstructor implements Expression {
     private List<FieldBinding> fbList;
@@ -53,4 +54,21 @@ public class RecordConstructor implements Expression {
     public <R, T> R accept(ILangVisitor<R, T> visitor, T arg) throws AsterixException {
         return visitor.visit(this, arg);
     }
+
+    @Override
+    public int hashCode() {
+        return ObjectUtils.hashCode(fbList);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof RecordConstructor)) {
+            return false;
+        }
+        RecordConstructor target = (RecordConstructor) object;
+        return ObjectUtils.equals(fbList, target.fbList);
+    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/RecordTypeDefinition.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/RecordTypeDefinition.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/RecordTypeDefinition.java
index 5e5208e..800af9f 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/RecordTypeDefinition.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/RecordTypeDefinition.java
@@ -25,26 +25,24 @@ import org.apache.asterix.common.annotations.IRecordFieldDataGen;
 import org.apache.asterix.common.annotations.UndeclaredFieldsDataGen;
 import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
+import org.apache.commons.lang3.ObjectUtils;
 
-public class RecordTypeDefinition extends TypeExpression {
+public class RecordTypeDefinition implements TypeExpression {
 
     public enum RecordKind {
         OPEN,
         CLOSED
     }
 
-    private ArrayList<String> fieldNames;
-    private ArrayList<TypeExpression> fieldTypes;
-    private ArrayList<IRecordFieldDataGen> fieldDataGen;
-    private ArrayList<Boolean> optionalFields;
+    private final List<String> fieldNames = new ArrayList<>();
+    private final List<TypeExpression> fieldTypes = new ArrayList<>();
+    private final List<IRecordFieldDataGen> fieldDataGen = new ArrayList<>();
+    private final List<Boolean> optionalFields = new ArrayList<>();
     private RecordKind recordKind;
     private UndeclaredFieldsDataGen undeclaredFieldsDataGen;
 
     public RecordTypeDefinition() {
-        fieldNames = new ArrayList<>();
-        fieldTypes = new ArrayList<>();
-        optionalFields = new ArrayList<>();
-        fieldDataGen = new ArrayList<>();
+        // Default constructor.
     }
 
     @Override
@@ -102,4 +100,26 @@ public class RecordTypeDefinition extends TypeExpression {
         return undeclaredFieldsDataGen;
     }
 
+    @Override
+    public int hashCode() {
+        return ObjectUtils.hashCodeMulti(fieldDataGen, fieldNames, fieldTypes, optionalFields, recordKind,
+                undeclaredFieldsDataGen);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof RecordTypeDefinition)) {
+            return false;
+        }
+        RecordTypeDefinition target = (RecordTypeDefinition) object;
+        boolean equals = fieldDataGen.equals(target.getFieldDataGen()) && fieldNames.equals(target.getFieldNames())
+                && fieldTypes.equals(target.getFieldNames()) && optionalFields.equals(target.getOptionableFields());
+        equals = equals && ObjectUtils.equals(recordKind, target.getRecordKind())
+                && ObjectUtils.equals(undeclaredFieldsDataGen, target.getUndeclaredFieldsDataGen());
+        return equals;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/TypeExpression.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/TypeExpression.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/TypeExpression.java
index 409e683..3359be6 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/TypeExpression.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/TypeExpression.java
@@ -20,7 +20,7 @@ package org.apache.asterix.lang.common.expression;
 
 import org.apache.asterix.lang.common.base.ILangExpression;
 
-public abstract class TypeExpression implements ILangExpression {
+public interface TypeExpression extends ILangExpression {
 
     public enum TypeExprKind {
         RECORD,
@@ -29,6 +29,6 @@ public abstract class TypeExpression implements ILangExpression {
         UNORDEREDLIST
     }
 
-    public abstract TypeExprKind getTypeKind();
+    public TypeExprKind getTypeKind();
 
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/TypeReferenceExpression.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/TypeReferenceExpression.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/TypeReferenceExpression.java
index 2c35cc3..49f0667 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/TypeReferenceExpression.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/TypeReferenceExpression.java
@@ -21,8 +21,9 @@ package org.apache.asterix.lang.common.expression;
 import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.lang.common.struct.Identifier;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
+import org.apache.commons.lang.ObjectUtils;
 
-public class TypeReferenceExpression extends TypeExpression {
+public class TypeReferenceExpression implements TypeExpression {
 
     private final Identifier ident;
 
@@ -43,4 +44,21 @@ public class TypeReferenceExpression extends TypeExpression {
     public <R, T> R accept(ILangVisitor<R, T> visitor, T arg) throws AsterixException {
         return visitor.visit(this, arg);
     }
+
+    @Override
+    public int hashCode() {
+        return ObjectUtils.hashCode(ident);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof TypeReferenceExpression)) {
+            return false;
+        }
+        TypeReferenceExpression target = (TypeReferenceExpression) object;
+        return ObjectUtils.equals(ident, target.ident);
+    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/UnaryExpr.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/UnaryExpr.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/UnaryExpr.java
index cf5eefe..eef8f1c 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/UnaryExpr.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/UnaryExpr.java
@@ -21,12 +21,14 @@ package org.apache.asterix.lang.common.expression;
 import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
+import org.apache.commons.lang3.ObjectUtils;
 
 public class UnaryExpr implements Expression {
     private Sign sign;
     private Expression expr;
 
     public UnaryExpr() {
+        // default constructor
     }
 
     public UnaryExpr(Sign sign, Expression expr) {
@@ -64,4 +66,21 @@ public class UnaryExpr implements Expression {
     public <R, T> R accept(ILangVisitor<R, T> visitor, T arg) throws AsterixException {
         return visitor.visit(this, arg);
     }
+
+    @Override
+    public int hashCode() {
+        return ObjectUtils.hashCodeMulti(expr, sign);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof UnaryExpr)) {
+            return false;
+        }
+        UnaryExpr target = (UnaryExpr) object;
+        return ObjectUtils.equals(expr, target.expr) && ObjectUtils.equals(sign, target.sign);
+    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/UnorderedListTypeDefinition.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/UnorderedListTypeDefinition.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/UnorderedListTypeDefinition.java
index b47ade4..a0726e2 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/UnorderedListTypeDefinition.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/UnorderedListTypeDefinition.java
@@ -20,8 +20,9 @@ package org.apache.asterix.lang.common.expression;
 
 import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
+import org.apache.commons.lang3.ObjectUtils;
 
-public class UnorderedListTypeDefinition extends TypeExpression {
+public class UnorderedListTypeDefinition implements TypeExpression {
 
     private TypeExpression itemTypeExpression;
 
@@ -43,4 +44,20 @@ public class UnorderedListTypeDefinition extends TypeExpression {
         return itemTypeExpression;
     }
 
+    @Override
+    public int hashCode() {
+        return ObjectUtils.hashCode(itemTypeExpression);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof OrderedListTypeDefinition)) {
+            return false;
+        }
+        UnorderedListTypeDefinition target = (UnorderedListTypeDefinition) object;
+        return ObjectUtils.equals(itemTypeExpression, target.itemTypeExpression);
+    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/VariableExpr.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/VariableExpr.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/VariableExpr.java
index 9eeb6f8..534c74f 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/VariableExpr.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/VariableExpr.java
@@ -22,6 +22,7 @@ import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.struct.VarIdentifier;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
+import org.apache.commons.lang3.ObjectUtils;
 
 public class VariableExpr implements Expression {
     private VarIdentifier var;
@@ -75,16 +76,19 @@ public class VariableExpr implements Expression {
 
     @Override
     public int hashCode() {
-        return var.hashCode();
+        return ObjectUtils.hashCode(var);
     }
 
     @Override
     public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
         if (!(obj instanceof VariableExpr)) {
             return false;
         }
         VariableExpr expr = (VariableExpr) obj;
-        return var.equals(expr.getVar());
+        return ObjectUtils.equals(var, expr.var);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/DoubleLiteral.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/DoubleLiteral.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/DoubleLiteral.java
index 1a5066d..f362c15 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/DoubleLiteral.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/DoubleLiteral.java
@@ -19,11 +19,9 @@
 package org.apache.asterix.lang.common.literal;
 
 import org.apache.asterix.lang.common.base.Literal;
+import org.apache.commons.lang.ObjectUtils;
 
 public class DoubleLiteral extends Literal {
-    /**
-     *
-     */
     private static final long serialVersionUID = -5685491458356989250L;
     private Double value;
 
@@ -45,4 +43,26 @@ public class DoubleLiteral extends Literal {
     public Type getLiteralType() {
         return Type.DOUBLE;
     }
+
+    @Override
+    public int hashCode() {
+        return ObjectUtils.hashCode(value);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof DoubleLiteral)) {
+            return false;
+        }
+        DoubleLiteral target = (DoubleLiteral) object;
+        return ObjectUtils.equals(value, target.value);
+    }
+
+    @Override
+    public String toString() {
+        return String.valueOf(value);
+    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/FalseLiteral.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/FalseLiteral.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/FalseLiteral.java
index 61db616..bde5260 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/FalseLiteral.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/FalseLiteral.java
@@ -23,12 +23,11 @@ import org.apache.asterix.lang.common.base.Literal;
 public class FalseLiteral extends Literal {
 
     private static final long serialVersionUID = -750814844423165149L;
+    public static final FalseLiteral INSTANCE = new FalseLiteral();
 
     private FalseLiteral() {
     }
 
-    public final static FalseLiteral INSTANCE = new FalseLiteral();
-
     @Override
     public Type getLiteralType() {
         return Type.FALSE;
@@ -45,8 +44,8 @@ public class FalseLiteral extends Literal {
     }
 
     @Override
-    public boolean equals(Object obj) {
-        return obj == INSTANCE;
+    public Boolean getValue() {
+        return Boolean.FALSE;
     }
 
     @Override
@@ -55,7 +54,8 @@ public class FalseLiteral extends Literal {
     }
 
     @Override
-    public Boolean getValue() {
-        return Boolean.FALSE;
+    public boolean equals(Object obj) {
+        return obj == INSTANCE;
     }
+
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/FloatLiteral.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/FloatLiteral.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/FloatLiteral.java
index d7c54fa..a3dfd6a 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/FloatLiteral.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/FloatLiteral.java
@@ -19,11 +19,9 @@
 package org.apache.asterix.lang.common.literal;
 
 import org.apache.asterix.lang.common.base.Literal;
+import org.apache.commons.lang.ObjectUtils;
 
 public class FloatLiteral extends Literal {
-    /**
-     *
-     */
     private static final long serialVersionUID = 3273563021227964396L;
     private Float value;
 
@@ -45,4 +43,26 @@ public class FloatLiteral extends Literal {
     public Type getLiteralType() {
         return Type.FLOAT;
     }
+
+    @Override
+    public int hashCode() {
+        return ObjectUtils.hashCode(value);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof FloatLiteral)) {
+            return false;
+        }
+        FloatLiteral target = (FloatLiteral) object;
+        return ObjectUtils.equals(value, target.value);
+    }
+
+    @Override
+    public String toString() {
+        return String.valueOf(value);
+    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/IntegerLiteral.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/IntegerLiteral.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/IntegerLiteral.java
index e0c1de3..a46a736 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/IntegerLiteral.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/IntegerLiteral.java
@@ -19,11 +19,9 @@
 package org.apache.asterix.lang.common.literal;
 
 import org.apache.asterix.lang.common.base.Literal;
+import org.apache.commons.lang.ObjectUtils;
 
 public class IntegerLiteral extends Literal {
-    /**
-     *
-     */
     private static final long serialVersionUID = -8633520244871361967L;
     private Integer value;
 
@@ -32,6 +30,7 @@ public class IntegerLiteral extends Literal {
         this.value = value;
     }
 
+    @Override
     public Integer getValue() {
         return value;
     }
@@ -44,4 +43,26 @@ public class IntegerLiteral extends Literal {
     public Type getLiteralType() {
         return Type.INTEGER;
     }
+
+    @Override
+    public int hashCode() {
+        return ObjectUtils.hashCode(value);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof IntegerLiteral)) {
+            return false;
+        }
+        IntegerLiteral target = (IntegerLiteral) object;
+        return value.equals(target.getValue());
+    }
+
+    @Override
+    public String toString() {
+        return String.valueOf(value);
+    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/LongIntegerLiteral.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/LongIntegerLiteral.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/LongIntegerLiteral.java
index 3320dac..66164d1 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/LongIntegerLiteral.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/LongIntegerLiteral.java
@@ -19,11 +19,9 @@
 package org.apache.asterix.lang.common.literal;
 
 import org.apache.asterix.lang.common.base.Literal;
+import org.apache.commons.lang.ObjectUtils;
 
 public class LongIntegerLiteral extends Literal {
-    /**
-     *
-     */
     private static final long serialVersionUID = -8633520244871361967L;
     private Long value;
 
@@ -45,4 +43,26 @@ public class LongIntegerLiteral extends Literal {
     public Type getLiteralType() {
         return Type.LONG;
     }
+
+    @Override
+    public int hashCode() {
+        return ObjectUtils.hashCode(value);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof LongIntegerLiteral)) {
+            return false;
+        }
+        LongIntegerLiteral target = (LongIntegerLiteral) object;
+        return value.equals(target.getValue());
+    }
+
+    @Override
+    public String toString() {
+        return String.valueOf(value);
+    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/MissingLiteral.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/MissingLiteral.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/MissingLiteral.java
index 2c2fa8e..c12ed6f 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/MissingLiteral.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/MissingLiteral.java
@@ -22,12 +22,11 @@ import org.apache.asterix.lang.common.base.Literal;
 
 public class MissingLiteral extends Literal {
     private static final long serialVersionUID = 1L;
+    public static final MissingLiteral INSTANCE = new MissingLiteral();
 
     private MissingLiteral() {
     }
 
-    public final static MissingLiteral INSTANCE = new MissingLiteral();
-
     @Override
     public Type getLiteralType() {
         return Type.MISSING;
@@ -52,4 +51,9 @@ public class MissingLiteral extends Literal {
     public Object getValue() {
         return null;
     }
+
+    @Override
+    public String toString() {
+        return getStringValue();
+    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/NullLiteral.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/NullLiteral.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/NullLiteral.java
index e5fdb1d..197aa6e 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/NullLiteral.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/NullLiteral.java
@@ -21,17 +21,12 @@ package org.apache.asterix.lang.common.literal;
 import org.apache.asterix.lang.common.base.Literal;
 
 public class NullLiteral extends Literal {
-
-    /**
-     *
-     */
     private static final long serialVersionUID = -7782153599294838739L;
+    public static final NullLiteral INSTANCE = new NullLiteral();
 
     private NullLiteral() {
     }
 
-    public final static NullLiteral INSTANCE = new NullLiteral();
-
     @Override
     public Type getLiteralType() {
         return Type.NULL;
@@ -56,4 +51,9 @@ public class NullLiteral extends Literal {
     public Object getValue() {
         return null;
     }
+
+    @Override
+    public String toString() {
+        return getStringValue();
+    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/StringLiteral.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/StringLiteral.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/StringLiteral.java
index 623c9ee..9caad3e 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/StringLiteral.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/StringLiteral.java
@@ -19,6 +19,7 @@
 package org.apache.asterix.lang.common.literal;
 
 import org.apache.asterix.lang.common.base.Literal;
+import org.apache.commons.lang.ObjectUtils;
 
 public class StringLiteral extends Literal {
 
@@ -30,6 +31,7 @@ public class StringLiteral extends Literal {
         this.value = value;
     }
 
+    @Override
     public String getValue() {
         return value;
     }
@@ -47,4 +49,26 @@ public class StringLiteral extends Literal {
     public String getStringValue() {
         return value;
     }
+
+    @Override
+    public int hashCode() {
+        return ObjectUtils.hashCode(value);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof StringLiteral)) {
+            return false;
+        }
+        StringLiteral target = (StringLiteral) object;
+        return ObjectUtils.equals(value, target.value);
+    }
+
+    @Override
+    public String toString() {
+        return value;
+    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/TrueLiteral.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/TrueLiteral.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/TrueLiteral.java
index a919216..e0ae87d 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/TrueLiteral.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/TrueLiteral.java
@@ -22,12 +22,11 @@ import org.apache.asterix.lang.common.base.Literal;
 
 public class TrueLiteral extends Literal {
     private static final long serialVersionUID = -8513245514578847512L;
+    public static final TrueLiteral INSTANCE = new TrueLiteral();
 
     private TrueLiteral() {
     }
 
-    public final static TrueLiteral INSTANCE = new TrueLiteral();
-
     @Override
     public Type getLiteralType() {
         return Type.TRUE;

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/rewrites/ExpressionSubstitutionEnvironment.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/rewrites/ExpressionSubstitutionEnvironment.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/rewrites/ExpressionSubstitutionEnvironment.java
new file mode 100644
index 0000000..8f5597f
--- /dev/null
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/rewrites/ExpressionSubstitutionEnvironment.java
@@ -0,0 +1,165 @@
+/*
+ * 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.lang.common.rewrites;
+
+import java.util.ArrayDeque;
+import java.util.Collection;
+import java.util.Deque;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.asterix.common.exceptions.AsterixException;
+import org.apache.asterix.lang.common.base.Expression;
+import org.apache.asterix.lang.common.base.ILangExpression;
+import org.apache.asterix.lang.common.expression.VariableExpr;
+
+import com.google.common.collect.HashMultiset;
+import com.google.common.collect.Multiset;
+
+/**
+ * This class is in charge of substitute expressions by a given mapping while
+ * traversing a given AST. The traversal and expression substitution should
+ * be based on the correct variable scoping. In order to support scoping at the
+ * caller, this class provides methods like mark, reset and pop.
+ */
+public class ExpressionSubstitutionEnvironment {
+
+    @FunctionalInterface
+    public static interface FreeVariableCollector {
+        public Collection<VariableExpr> getFreeVariable(ILangExpression expr) throws AsterixException;
+    }
+
+    @FunctionalInterface
+    public static interface DeepCopier {
+        public ILangExpression deepCopy(ILangExpression expr) throws AsterixException;
+    }
+
+    private Map<Expression, Expression> exprMap = new HashMap<>();
+    private Map<VariableExpr, Expression> freeVarToExprMap = new HashMap<>();
+
+    // We use multiset here because variables can be defined multiple times
+    // in the scope stack.
+    private Multiset<Expression> disabledExpr = HashMultiset.create();
+
+    // Snapshots of variables that should be disabled for replacement,
+    // e.g., if a variable is redefined in a closer scope.
+    private Deque<Multiset<Expression>> disabledExprBackup = new ArrayDeque<>();
+
+    public ExpressionSubstitutionEnvironment() {
+        // Default constructor.
+    }
+
+    public ExpressionSubstitutionEnvironment(Map<Expression, Expression> map, FreeVariableCollector freeVarCollector)
+            throws AsterixException {
+        addMapping(map, freeVarCollector);
+    }
+
+    /**
+     * Finds a substitution expression.
+     *
+     * @param expr
+     *            the original expression.
+     * @return the new, replaced expression.
+     */
+    public Expression findSubstitution(Expression expr, DeepCopier deepCopier) throws AsterixException {
+        Expression replacementExpr = exprMap.get(expr);
+        if (replacementExpr != null && !disabledExpr.contains(replacementExpr)) {
+            return (Expression) deepCopier.deepCopy(replacementExpr);
+        }
+        return expr;
+    }
+
+    /**
+     * Disable a substitution when a free variable in the expression is re-defined.
+     *
+     * @param var
+     *            a re-defined variable.
+     */
+    public void disableVariable(VariableExpr var) {
+        Expression expr = freeVarToExprMap.get(var);
+        if (expr != null) {
+            disabledExpr.add(expr);
+        }
+    }
+
+    /**
+     * Re-enable a substitution when a re-defined variable exits its scope.
+     *
+     * @param var
+     *            a re-defined variable.
+     */
+    public void enableVariable(VariableExpr var) {
+        Expression expr = freeVarToExprMap.get(var);
+        if (expr != null) {
+            disabledExpr.remove(expr);
+        }
+    }
+
+    /**
+     * Tasks a snapshot of the current states.
+     *
+     * @return the snapshot id that can be reset to in the future.
+     */
+    public int mark() {
+        Multiset<Expression> copyOfDisabledExprs = HashMultiset.create();
+        copyOfDisabledExprs.addAll(disabledExpr);
+        disabledExprBackup.push(copyOfDisabledExprs);
+        return disabledExprBackup.size() - 1;
+    }
+
+    /**
+     * Resets the internal states to a snapshot.
+     *
+     * @param depth,
+     *            the snapshot id that the caller wants to recover to.
+     */
+    public void reset(int depth) {
+        while (disabledExprBackup.size() > depth) {
+            disabledExpr = disabledExprBackup.pop();
+        }
+    }
+
+    /**
+     * Restores to the most-recent snapshot.
+     */
+    public void pop() {
+        if (!disabledExprBackup.isEmpty()) {
+            disabledExpr = disabledExprBackup.pop();
+        }
+    }
+
+    @Override
+    public String toString() {
+        return exprMap.toString();
+    }
+
+    private void addMapping(Map<Expression, Expression> map, FreeVariableCollector freeVarCollector)
+            throws AsterixException {
+        exprMap.putAll(map);
+        // Put free variable to target expression map.
+        for (Entry<Expression, Expression> entry : map.entrySet()) {
+            Expression targetExpr = entry.getKey();
+            for (VariableExpr freeVar : freeVarCollector.getFreeVariable(targetExpr)) {
+                freeVarToExprMap.put(freeVar, targetExpr);
+            }
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/rewrites/LangRewritingContext.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/rewrites/LangRewritingContext.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/rewrites/LangRewritingContext.java
index 9036413..10cd7d8 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/rewrites/LangRewritingContext.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/rewrites/LangRewritingContext.java
@@ -25,6 +25,7 @@ import org.apache.asterix.lang.common.struct.VarIdentifier;
 public final class LangRewritingContext {
     private int mark = 0;
     private int varCounter;
+    private int systemVarCounter = 1;
     private HashMap<Integer, VarIdentifier> oldVarIdToNewVarId = new HashMap<>();
 
     public LangRewritingContext(int varCounter) {
@@ -63,7 +64,7 @@ public final class LangRewritingContext {
     public VarIdentifier newVariable() {
         int id = newId();
         // Prefixes system-generated variables with "#".
-        return new VarIdentifier("#" + id, id);
+        return new VarIdentifier("#" + (systemVarCounter++), id);
     }
 
     public void markCounter() {
@@ -78,4 +79,5 @@ public final class LangRewritingContext {
         varCounter++;
         return varCounter;
     }
+
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/rewrites/VariableSubstitutionEnvironment.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/rewrites/VariableSubstitutionEnvironment.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/rewrites/VariableSubstitutionEnvironment.java
index 4c4767e..26f528c 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/rewrites/VariableSubstitutionEnvironment.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/rewrites/VariableSubstitutionEnvironment.java
@@ -29,7 +29,7 @@ public class VariableSubstitutionEnvironment {
     private Map<String, Expression> oldVarToNewExpressionMap = new HashMap<String, Expression>();
 
     public VariableSubstitutionEnvironment() {
-
+        // Default constructor.
     }
 
     public VariableSubstitutionEnvironment(Map<VariableExpr, Expression> varExprMap) {

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DeleteStatement.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DeleteStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DeleteStatement.java
index 3a2a933..ba3440f 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DeleteStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DeleteStatement.java
@@ -26,6 +26,7 @@ import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.expression.VariableExpr;
 import org.apache.asterix.lang.common.struct.Identifier;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
+import org.apache.commons.lang3.ObjectUtils;
 
 public class DeleteStatement implements Statement {
 
@@ -95,4 +96,25 @@ public class DeleteStatement implements Statement {
         return datasets;
     }
 
+    @Override
+    public int hashCode() {
+        return ObjectUtils.hashCodeMulti(condition, datasetName, datasets, dataverseName, dataverses, rewrittenQuery,
+                vars);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof DeleteStatement)) {
+            return false;
+        }
+        DeleteStatement target = (DeleteStatement) object;
+        boolean equals = ObjectUtils.equals(condition, target.condition)
+                && ObjectUtils.equals(datasetName, target.datasetName) && ObjectUtils.equals(datasets, target.datasets)
+                && ObjectUtils.equals(dataverseName, target.dataverseName);
+        return equals && ObjectUtils.equals(dataverses, target.dataverses)
+                && ObjectUtils.equals(rewrittenQuery, target.rewrittenQuery) && ObjectUtils.equals(vars, target.vars);
+    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/InsertStatement.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/InsertStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/InsertStatement.java
index de81de0..aab0979 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/InsertStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/InsertStatement.java
@@ -22,6 +22,7 @@ import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.struct.Identifier;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
+import org.apache.commons.lang3.ObjectUtils;
 
 public class InsertStatement implements Statement {
 
@@ -63,4 +64,22 @@ public class InsertStatement implements Statement {
         return visitor.visit(this, arg);
     }
 
+    @Override
+    public int hashCode() {
+        return ObjectUtils.hashCodeMulti(datasetName, dataverseName, query);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof InsertStatement)) {
+            return false;
+        }
+        InsertStatement target = (InsertStatement) object;
+        return ObjectUtils.equals(datasetName, target.datasetName)
+                && ObjectUtils.equals(dataverseName, target.dataverseName) && ObjectUtils.equals(query, target.query);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/Query.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/Query.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/Query.java
index 64ca0c1..a9cba21 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/Query.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/Query.java
@@ -25,16 +25,17 @@ import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
+import org.apache.commons.lang3.ObjectUtils;
 
 public class Query implements Statement {
     private boolean topLevel = true;
     private Expression body;
     private int varCounter;
-    private List<String> dataverses = new ArrayList<String>();
-    private List<String> datasets = new ArrayList<String>();
+    private List<String> dataverses = new ArrayList<>();
+    private List<String> datasets = new ArrayList<>();
 
     public Query() {
-
+        // Default constructor.
     }
 
     public Query(boolean topLevel, Expression body, int varCounter, List<String> dataverses, List<String> datasets) {
@@ -94,4 +95,22 @@ public class Query implements Statement {
     public List<String> getDatasets() {
         return datasets;
     }
+
+    @Override
+    public int hashCode() {
+        return ObjectUtils.hashCodeMulti(body, datasets, dataverses, topLevel);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof Query)) {
+            return false;
+        }
+        Query target = (Query) object;
+        return ObjectUtils.equals(body, target.body) && ObjectUtils.equals(datasets, target.datasets)
+                && ObjectUtils.equals(dataverses, target.dataverses) && topLevel == target.topLevel;
+    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/UpdateStatement.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/UpdateStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/UpdateStatement.java
index c82bbad..c61ec0b 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/UpdateStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/UpdateStatement.java
@@ -26,6 +26,7 @@ import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.clause.UpdateClause;
 import org.apache.asterix.lang.common.expression.VariableExpr;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
+import org.apache.commons.lang3.ObjectUtils;
 
 public class UpdateStatement implements Statement {
 
@@ -67,4 +68,22 @@ public class UpdateStatement implements Statement {
         return visitor.visit(this, arg);
     }
 
+    @Override
+    public int hashCode() {
+        return ObjectUtils.hashCodeMulti(condition, target, ucs, vars);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof UpdateStatement)) {
+            return false;
+        }
+        UpdateStatement update = (UpdateStatement) object;
+        return ObjectUtils.equals(condition, update.condition) && ObjectUtils.equals(target, update.target)
+                && ObjectUtils.equals(ucs, update.ucs) && ObjectUtils.equals(vars, update.vars);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/UpsertStatement.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/UpsertStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/UpsertStatement.java
index f415951..fa11930 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/UpsertStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/UpsertStatement.java
@@ -31,4 +31,20 @@ public class UpsertStatement extends InsertStatement {
         return Kind.UPSERT;
     }
 
+    @Override
+    public int hashCode() {
+        return super.hashCode() + Kind.UPSERT.ordinal();
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof UpsertStatement)) {
+            return false;
+        }
+        return super.equals(object);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/AdmSplitInfo.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/AdmSplitInfo.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/AdmSplitInfo.java
deleted file mode 100644
index 64ec0af..0000000
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/AdmSplitInfo.java
+++ /dev/null
@@ -1,37 +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.lang.common.struct;
-
-public class AdmSplitInfo {
-    public Identifier nodeName;
-    public String fileName;
-
-    public AdmSplitInfo(Identifier nodeName, String fileName) {
-        this.nodeName = nodeName;
-        this.fileName = fileName;
-    }
-
-    @Override
-    public String toString() {
-        return nodeName.value + ":" + fileName;
-    }
-}

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/Identifier.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/Identifier.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/Identifier.java
index d029e3e..b77fd94 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/Identifier.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/Identifier.java
@@ -18,10 +18,13 @@
  */
 package org.apache.asterix.lang.common.struct;
 
+import org.apache.commons.lang.ObjectUtils;
+
 public class Identifier {
     protected String value;
 
     public Identifier() {
+        // default constructor.
     }
 
     public Identifier(String value) {
@@ -36,22 +39,25 @@ public class Identifier {
         this.value = value;
     }
 
+    @Override
     public String toString() {
         return value;
     }
 
     @Override
     public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
         if (!(o instanceof Identifier)) {
             return false;
-        } else {
-            Identifier i = (Identifier) o;
-            return this.value.equals(i.value);
         }
+        Identifier target = (Identifier) o;
+        return ObjectUtils.equals(value, target.value);
     }
 
     @Override
     public int hashCode() {
-        return value.hashCode();
+        return ObjectUtils.hashCode(value);
     }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/QuantifiedPair.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/QuantifiedPair.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/QuantifiedPair.java
index 6be8918..ab8a3f3 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/QuantifiedPair.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/QuantifiedPair.java
@@ -20,12 +20,14 @@ package org.apache.asterix.lang.common.struct;
 
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.expression.VariableExpr;
+import org.apache.commons.lang3.ObjectUtils;
 
 public class QuantifiedPair {
     private VariableExpr varExpr;
     private Expression expr;
 
     public QuantifiedPair() {
+        // default constructor
     }
 
     public QuantifiedPair(VariableExpr varExpr, Expression expr) {
@@ -49,4 +51,17 @@ public class QuantifiedPair {
         this.expr = expr;
     }
 
+    @Override
+    public int hashCode() {
+        return ObjectUtils.hashCodeMulti(expr, varExpr);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (!(object instanceof QuantifiedPair)) {
+            return false;
+        }
+        QuantifiedPair target = (QuantifiedPair) object;
+        return ObjectUtils.equals(expr, target.expr) && ObjectUtils.equals(varExpr, target.varExpr);
+    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/VarIdentifier.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/VarIdentifier.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/VarIdentifier.java
index 6549151..a217bea 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/VarIdentifier.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/VarIdentifier.java
@@ -18,6 +18,8 @@
  */
 package org.apache.asterix.lang.common.struct;
 
+import org.apache.commons.lang3.ObjectUtils;
+
 public final class VarIdentifier extends Identifier {
     private int id = 0;
 
@@ -53,7 +55,7 @@ public final class VarIdentifier extends Identifier {
 
     @Override
     public int hashCode() {
-        return value.hashCode();
+        return ObjectUtils.hashCodeMulti(value);
     }
 
     @Override
@@ -62,6 +64,6 @@ public final class VarIdentifier extends Identifier {
             return false;
         }
         VarIdentifier vid = (VarIdentifier) obj;
-        return value.equals(vid.value);
+        return ObjectUtils.equals(value, vid.value);
     }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5b2d4c89/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/VariableCloneAndSubstitutionUtil.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/VariableCloneAndSubstitutionUtil.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/VariableCloneAndSubstitutionUtil.java
index 29298db..1948b84 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/VariableCloneAndSubstitutionUtil.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/VariableCloneAndSubstitutionUtil.java
@@ -34,19 +34,22 @@ import org.apache.hyracks.algebricks.common.utils.Pair;
 
 public class VariableCloneAndSubstitutionUtil {
 
+    private VariableCloneAndSubstitutionUtil() {
+    }
+
     public static List<GbyVariableExpressionPair> substInVarExprPair(LangRewritingContext context,
-            List<GbyVariableExpressionPair> gbyVeList, VariableSubstitutionEnvironment arg,
-            VariableSubstitutionEnvironment newSubs, CloneAndSubstituteVariablesVisitor visitor)
-                    throws AsterixException {
-        List<GbyVariableExpressionPair> veList = new LinkedList<GbyVariableExpressionPair>();
+            List<GbyVariableExpressionPair> gbyVeList, VariableSubstitutionEnvironment newSubs,
+            CloneAndSubstituteVariablesVisitor visitor) throws AsterixException {
+        VariableSubstitutionEnvironment subs = newSubs;
+        List<GbyVariableExpressionPair> veList = new LinkedList<>();
         for (GbyVariableExpressionPair vep : gbyVeList) {
             VariableExpr oldGbyVar = vep.getVar();
             VariableExpr newGbyVar = null;
             if (oldGbyVar != null) {
                 newGbyVar = visitor.generateNewVariable(context, oldGbyVar);
-                newSubs = eliminateSubstFromList(newGbyVar, newSubs);
+                subs = eliminateSubstFromList(newGbyVar, subs);
             }
-            Pair<ILangExpression, VariableSubstitutionEnvironment> p1 = vep.getExpr().accept(visitor, newSubs);
+            Pair<ILangExpression, VariableSubstitutionEnvironment> p1 = vep.getExpr().accept(visitor, subs);
             GbyVariableExpressionPair ve2 = new GbyVariableExpressionPair(newGbyVar, (Expression) p1.first);
             veList.add(ve2);
         }
@@ -62,7 +65,7 @@ public class VariableCloneAndSubstitutionUtil {
 
     public static List<Expression> visitAndCloneExprList(List<Expression> oldExprList,
             VariableSubstitutionEnvironment arg, CloneAndSubstituteVariablesVisitor visitor) throws AsterixException {
-        List<Expression> exprs = new ArrayList<Expression>(oldExprList.size());
+        List<Expression> exprs = new ArrayList<>(oldExprList.size());
         for (Expression e : oldExprList) {
             Pair<ILangExpression, VariableSubstitutionEnvironment> p1 = e.accept(visitor, arg);
             exprs.add((Expression) p1.first);