Tracks the variables coming from the outer branch of loj to later decide whether they are still nullable

Change-Id: I65ef3ec64e231d4ee4b9cb18ac3292f126ee16f8
Reviewed-on: http://fulliautomatix.ics.uci.edu:8443/209
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Yingyi Bu <buyingyi@gmail.com>
diff --git a/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/ConstantFoldingRule.java b/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/ConstantFoldingRule.java
index a42507c..51a9dc4 100644
--- a/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/ConstantFoldingRule.java
+++ b/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/ConstantFoldingRule.java
@@ -75,8 +75,9 @@
 
 public class ConstantFoldingRule implements IAlgebraicRewriteRule {
 
-    private ConstantFoldingVisitor cfv = new ConstantFoldingVisitor();
+    private final ConstantFoldingVisitor cfv = new ConstantFoldingVisitor();
 
+    /** Throws exceptions in substituiteProducedVariable, setVarType, and one getVarType method. */
     private static final IVariableTypeEnvironment _emptyTypeEnv = new IVariableTypeEnvironment() {
 
         @Override
@@ -90,8 +91,8 @@
         }
 
         @Override
-        public Object getVarType(LogicalVariable var, List<LogicalVariable> nonNullVariables)
-                throws AlgebricksException {
+        public Object getVarType(LogicalVariable var, List<LogicalVariable> nonNullVariables,
+                List<List<LogicalVariable>> correlatedNullableVariableLists) throws AlgebricksException {
             throw new IllegalStateException();
         }
 
@@ -135,9 +136,9 @@
     private class ConstantFoldingVisitor implements ILogicalExpressionVisitor<Pair<Boolean, ILogicalExpression>, Void>,
             ILogicalExpressionReferenceTransform {
 
-        private IPointable p = VoidPointable.FACTORY.createPointable();
-        private ByteBufferInputStream bbis = new ByteBufferInputStream();
-        private DataInputStream dis = new DataInputStream(bbis);
+        private final IPointable p = VoidPointable.FACTORY.createPointable();
+        private final ByteBufferInputStream bbis = new ByteBufferInputStream();
+        private final DataInputStream dis = new DataInputStream(bbis);
 
         @Override
         public boolean transform(Mutable<ILogicalExpression> exprRef) throws AlgebricksException {
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/common/AqlNullableTypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/common/AqlNullableTypeComputer.java
index f71fcf4..40c515f 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/common/AqlNullableTypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/common/AqlNullableTypeComputer.java
@@ -37,4 +37,15 @@
         }
     }
 
+    @Override
+    public boolean canBeNull(Object type) {
+        IAType t = (IAType) type;
+        return TypeHelper.canBeNull(t);
+    }
+
+    @Override
+    public Object getNonOptionalType(Object type) {
+        IAType t = (IAType) type;
+        return TypeHelper.getNonOptionalType(t);
+    }
 }