address Pouria's review comments

git-svn-id: https://asterixdb.googlecode.com/svn/branches/asterix_stabilization_printerfix_staging@1021 eaa15691-b419-025a-1212-ee371bd00084
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 769ede3..47e957b 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
@@ -166,17 +166,20 @@
             if (!checkArgs(expr)) {
                 return new Pair<Boolean, ILogicalExpression>(changed, expr);
             }
-            // TODO: currently ARecord is always a closed record
+            //Current ARecord SerDe assumes a closed record, so we do not constant fold open record constructors
             if (expr.getFunctionIdentifier().equals(AsterixBuiltinFunctions.OPEN_RECORD_CONSTRUCTOR)
                     || expr.getFunctionIdentifier().equals(AsterixBuiltinFunctions.CAST_RECORD)) {
                 return new Pair<Boolean, ILogicalExpression>(false, null);
             }
+            //Current List SerDe assumes a strongly typed list, so we do not constant fold the list constructors if they are not strongly typed
             if (expr.getFunctionIdentifier().equals(AsterixBuiltinFunctions.UNORDERED_LIST_CONSTRUCTOR)
                     || expr.getFunctionIdentifier().equals(AsterixBuiltinFunctions.ORDERED_LIST_CONSTRUCTOR)) {
                 AbstractCollectionType listType = (AbstractCollectionType) TypeComputerUtilities.getRequiredType(expr);
-                // do not fold open lists nor nested lists
                 if (listType != null
                         && (listType.getItemType().getTypeTag() == ATypeTag.ANY || listType.getItemType() instanceof AbstractCollectionType)) {
+                    //case1: listType == null,  could be a nested list inside a list<ANY>
+                    //case2: itemType = ANY
+                    //case3: itemType = a nested list
                     return new Pair<Boolean, ILogicalExpression>(false, null);
                 }
             }
diff --git a/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/typecast/StaticTypeCastUtil.java b/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/typecast/StaticTypeCastUtil.java
index 1d61731..0c6f2ea 100644
--- a/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/typecast/StaticTypeCastUtil.java
+++ b/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/typecast/StaticTypeCastUtil.java
@@ -220,10 +220,14 @@
     /**
      * This method statically cast the type of records from their current type to the required type.
      * 
-     * @param func The record constructor expression.
-     * @param reqType  The required type.
-     * @param inputType The current type.
-     * @param env The type environment.
+     * @param func
+     *            The record constructor expression.
+     * @param reqType
+     *            The required type.
+     * @param inputType
+     *            The current type.
+     * @param env
+     *            The type environment.
      * @throws AlgebricksException
      */
     private static void staticRecordTypeCast(AbstractFunctionCallExpression func, ARecordType reqType,
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/pointables/printer/AListPrinter.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/pointables/printer/AListPrinter.java
index 5f47f4f..283c916 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/pointables/printer/AListPrinter.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/pointables/printer/AListPrinter.java
@@ -54,32 +54,32 @@
         List<IVisitablePointable> items = listAccessor.getItems();
         itemVisitorArg.first = ps;
 
-        //print the beginning part
+        // print the beginning part
         ps.print(leftParen);
 
         // print item 0 to n-2
         for (int i = 0; i < items.size() - 1; i++) {
-            IVisitablePointable itemTypeTag = itemTags.get(i);
-            IVisitablePointable item = items.get(i);
-            ATypeTag typeTag = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(itemTypeTag.getByteArray()[itemTypeTag
-                    .getStartOffset()]);
-            itemVisitorArg.second = item.getLength() <= 1 ? ATypeTag.NULL : typeTag;
-            item.accept(visitor, itemVisitorArg);
-            //print the comma
+            printItem(visitor, itemTags, items, i);
+            // print the comma
             ps.print(COMMA);
         }
 
         // print item n-1
         if (items.size() > 0) {
-            IVisitablePointable itemTypeTag = itemTags.get(itemTags.size() - 1);
-            IVisitablePointable item = items.get(items.size() - 1);
-            ATypeTag typeTag = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(itemTypeTag.getByteArray()[itemTypeTag
-                    .getStartOffset()]);
-            itemVisitorArg.second = item.getLength() <= 1 ? ATypeTag.NULL : typeTag;
-            item.accept(visitor, itemVisitorArg);
+            printItem(visitor, itemTags, items, items.size() - 1);
         }
 
-        //print the end part
+        // print the end part
         ps.print(rightParen);
     }
+
+    private void printItem(APrintVisitor visitor, List<IVisitablePointable> itemTags, List<IVisitablePointable> items,
+            int i) throws AsterixException {
+        IVisitablePointable itemTypeTag = itemTags.get(i);
+        IVisitablePointable item = items.get(i);
+        ATypeTag typeTag = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(itemTypeTag.getByteArray()[itemTypeTag
+                .getStartOffset()]);
+        itemVisitorArg.second = item.getLength() <= 1 ? ATypeTag.NULL : typeTag;
+        item.accept(visitor, itemVisitorArg);
+    }
 }
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/pointables/printer/ARecordPrinter.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/pointables/printer/ARecordPrinter.java
index 391d2c9..55f9447 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/pointables/printer/ARecordPrinter.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/pointables/printer/ARecordPrinter.java
@@ -57,38 +57,32 @@
 
         // print field 0 to n-2
         for (int i = 0; i < fieldNames.size() - 1; i++) {
-            IVisitablePointable itemTypeTag = fieldTags.get(i);
-            IVisitablePointable item = fieldValues.get(i);
-            ATypeTag typeTag = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(itemTypeTag.getByteArray()[itemTypeTag
-                    .getStartOffset()]);
-            itemVisitorArg.second = item.getLength() <= 1 ? ATypeTag.NULL : typeTag;
-
-            // print field name
-            fieldNames.get(i).accept(visitor, nameVisitorArg);
-            ps.print(COLON);
-            // print field value
-            item.accept(visitor, itemVisitorArg);
-
+            printField(ps, visitor, fieldNames, fieldTags, fieldValues, i);
             // print the comma
             ps.print(COMMA);
         }
 
         // print field n-1
         if (fieldValues.size() > 0) {
-            IVisitablePointable itemTypeTag = fieldTags.get(fieldTags.size() - 1);
-            IVisitablePointable item = fieldValues.get(fieldValues.size() - 1);
-            ATypeTag typeTag = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(itemTypeTag.getByteArray()[itemTypeTag
-                    .getStartOffset()]);
-            itemVisitorArg.second = item.getLength() <= 1 ? ATypeTag.NULL : typeTag;
-
-            // print field name
-            fieldNames.get(fieldNames.size() - 1).accept(visitor, nameVisitorArg);
-            ps.print(COLON);
-            // print field value
-            item.accept(visitor, itemVisitorArg);
+            printField(ps, visitor, fieldNames, fieldTags, fieldValues, fieldValues.size() - 1);
         }
 
         // print the end part
         ps.print(RIGHT_PAREN);
     }
+
+    private void printField(PrintStream ps, APrintVisitor visitor, List<IVisitablePointable> fieldNames,
+            List<IVisitablePointable> fieldTags, List<IVisitablePointable> fieldValues, int i) throws AsterixException {
+        IVisitablePointable itemTypeTag = fieldTags.get(i);
+        IVisitablePointable item = fieldValues.get(i);
+        ATypeTag typeTag = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(itemTypeTag.getByteArray()[itemTypeTag
+                .getStartOffset()]);
+        itemVisitorArg.second = item.getLength() <= 1 ? ATypeTag.NULL : typeTag;
+
+        // print field name
+        fieldNames.get(i).accept(visitor, nameVisitorArg);
+        ps.print(COLON);
+        // print field value
+        item.accept(visitor, itemVisitorArg);
+    }
 }