You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asterixdb.apache.org by im...@apache.org on 2015/08/20 04:27:47 UTC

[2/9] incubator-asterixdb git commit: Changed metadata storage format for nullable field types. Moved field name generation to the client out of metadata node code. Changed naming scheme for autogenerated types. Moved GroupName, CompactionPolicy & Compac

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/InjectFailureTypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/InjectFailureTypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/InjectFailureTypeComputer.java
index 4787699..73e5895 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/InjectFailureTypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/InjectFailureTypeComputer.java
@@ -42,14 +42,12 @@ public class InjectFailureTypeComputer implements IResultTypeComputer {
         IAType t0 = (IAType) env.getType(fce.getArguments().get(0).getValue());
         IAType t1 = (IAType) env.getType(fce.getArguments().get(0).getValue());
         ATypeTag tag1 = t1.getTypeTag();
-        if (t1.getTypeTag() == ATypeTag.UNION && NonTaggedFormatUtil.isOptionalField((AUnionType) t1))
-            tag1 = ((AUnionType) t1).getUnionList().get(AUnionType.OPTIONAL_TYPE_INDEX_IN_UNION_LIST)
-                    .getTypeTag();
+        if (NonTaggedFormatUtil.isOptional(t1))
+            tag1 = ((AUnionType) t1).getNullableType().getTypeTag();
 
         if (tag1 != ATypeTag.BOOLEAN)
             throw new AlgebricksException(errMsg2);
 
         return t0;
     }
-
 }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedCollectionMemberResultType.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedCollectionMemberResultType.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedCollectionMemberResultType.java
index 3dae5f8..48e2b9b 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedCollectionMemberResultType.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedCollectionMemberResultType.java
@@ -39,8 +39,8 @@ public class NonTaggedCollectionMemberResultType implements IResultTypeComputer
             IMetadataProvider<?, ?> metadataProvider) throws AlgebricksException {
         AbstractFunctionCallExpression f = (AbstractFunctionCallExpression) expression;
         IAType type = (IAType) env.getType(f.getArguments().get(0).getValue());
-        if (type.getTypeTag() == ATypeTag.UNION && NonTaggedFormatUtil.isOptionalField((AUnionType) type)) {
-            type = ((AUnionType) type).getUnionList().get(AUnionType.OPTIONAL_TYPE_INDEX_IN_UNION_LIST);
+        if (NonTaggedFormatUtil.isOptional(type)) {
+            type = ((AUnionType) type).getNullableType();
         }
         if (type.getTypeTag() == ATypeTag.ANY) {
             return BuiltinType.ANY;

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedFieldAccessByNameResultType.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedFieldAccessByNameResultType.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedFieldAccessByNameResultType.java
index bddff9c..7b7d105 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedFieldAccessByNameResultType.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedFieldAccessByNameResultType.java
@@ -80,7 +80,7 @@ public class NonTaggedFieldAccessByNameResultType implements IResultTypeComputer
             case UNION: {
                 AUnionType u = (AUnionType) type0;
                 if (u.isNullableType()) {
-                    IAType t1 = u.getUnionList().get(1);
+                    IAType t1 = u.getNullableType();
                     if (t1.getTypeTag() == ATypeTag.RECORD) {
                         return (ARecordType) t1;
                     }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedGetItemResultType.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedGetItemResultType.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedGetItemResultType.java
index 633af06..972cc09 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedGetItemResultType.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedGetItemResultType.java
@@ -14,9 +14,6 @@
  */
 package edu.uci.ics.asterix.om.typecomputer.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import edu.uci.ics.asterix.om.typecomputer.base.IResultTypeComputer;
 import edu.uci.ics.asterix.om.types.AOrderedListType;
 import edu.uci.ics.asterix.om.types.ATypeTag;
@@ -42,17 +39,14 @@ public class NonTaggedGetItemResultType implements IResultTypeComputer {
             IMetadataProvider<?, ?> metadataProvider) throws AlgebricksException {
         AbstractFunctionCallExpression f = (AbstractFunctionCallExpression) expression;
         IAType type = (IAType) env.getType(f.getArguments().get(0).getValue());
-        if (type.getTypeTag() == ATypeTag.UNION && NonTaggedFormatUtil.isOptionalField((AUnionType) type))
-            type = ((AUnionType) type).getUnionList().get(AUnionType.OPTIONAL_TYPE_INDEX_IN_UNION_LIST);
+        if (NonTaggedFormatUtil.isOptional(type))
+            type = ((AUnionType) type).getNullableType();
         if (type.getTypeTag() == ATypeTag.ANY)
             return BuiltinType.ANY;
         else {
             if (((AOrderedListType) type).getItemType().getTypeTag() == ATypeTag.NULL)
                 return BuiltinType.ANULL;
-            List<IAType> unionList = new ArrayList<IAType>();
-            unionList.add(BuiltinType.ANULL);
-            unionList.add(((AOrderedListType) type).getItemType());
-            return new AUnionType(unionList, "GetItemResult");
+            return AUnionType.createNullableType(((AOrderedListType) type).getItemType(), "GetItemResult");
         }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedLocalAvgTypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedLocalAvgTypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedLocalAvgTypeComputer.java
index 22c7f6f..6e0316f 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedLocalAvgTypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedLocalAvgTypeComputer.java
@@ -15,9 +15,6 @@
 
 package edu.uci.ics.asterix.om.typecomputer.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import edu.uci.ics.asterix.common.exceptions.AsterixException;
 import edu.uci.ics.asterix.om.typecomputer.base.IResultTypeComputer;
 import edu.uci.ics.asterix.om.types.ARecordType;
@@ -37,12 +34,9 @@ public class NonTaggedLocalAvgTypeComputer implements IResultTypeComputer {
     @Override
     public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
             IMetadataProvider<?, ?> metadataProvider) throws AlgebricksException {
-        List<IAType> unionList = new ArrayList<IAType>();
-        unionList.add(BuiltinType.ANULL);
-        unionList.add(BuiltinType.ADOUBLE);
         try {
             return new ARecordType(null, new String[] { "sum", "count" }, new IAType[] {
-                    new AUnionType(unionList, "OptionalDouble"), BuiltinType.AINT32 }, false);
+                    AUnionType.createNullableType(BuiltinType.ADOUBLE, "OptionalDouble"), BuiltinType.AINT32 }, false);
         } catch (AsterixException | HyracksDataException e) {
             throw new AlgebricksException(e);
         }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedMinMaxAggTypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedMinMaxAggTypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedMinMaxAggTypeComputer.java
index c4d3248..ec6bd0b 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedMinMaxAggTypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedMinMaxAggTypeComputer.java
@@ -14,9 +14,6 @@
  */
 package edu.uci.ics.asterix.om.typecomputer.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import edu.uci.ics.asterix.om.typecomputer.base.IResultTypeComputer;
 import edu.uci.ics.asterix.om.types.ATypeTag;
 import edu.uci.ics.asterix.om.types.AUnionType;
@@ -49,52 +46,50 @@ public class NonTaggedMinMaxAggTypeComputer implements IResultTypeComputer {
         }
 
         ATypeTag tag1;
-        if (t1.getTypeTag() == ATypeTag.UNION && NonTaggedFormatUtil.isOptionalField((AUnionType) t1)) {
-            tag1 = ((AUnionType) t1).getUnionList().get(AUnionType.OPTIONAL_TYPE_INDEX_IN_UNION_LIST)
-                    .getTypeTag();
+        if (NonTaggedFormatUtil.isOptional(t1)) {
+            tag1 = ((AUnionType) t1).getNullableType().getTypeTag();
         } else {
             tag1 = t1.getTypeTag();
         }
 
-        List<IAType> unionList = new ArrayList<IAType>();
-        unionList.add(BuiltinType.ANULL);
+        IAType type;
 
         switch (tag1) {
             case DOUBLE:
-                unionList.add(BuiltinType.ADOUBLE);
+                type = BuiltinType.ADOUBLE;
                 break;
             case FLOAT:
-                unionList.add(BuiltinType.AFLOAT);
+                type = BuiltinType.AFLOAT;
                 break;
             case INT64:
-                unionList.add(BuiltinType.AINT64);
+                type = BuiltinType.AINT64;
                 break;
             case INT32:
-                unionList.add(BuiltinType.AINT32);
+                type = BuiltinType.AINT32;
                 break;
             case INT16:
-                unionList.add(BuiltinType.AINT16);
+                type = BuiltinType.AINT16;
                 break;
             case INT8:
-                unionList.add(BuiltinType.AINT8);
+                type = BuiltinType.AINT8;
                 break;
             case STRING:
-                unionList.add(BuiltinType.ASTRING);
+                type = BuiltinType.ASTRING;
                 break;
             case DATE:
-                unionList.add(BuiltinType.ADATE);
+                type = BuiltinType.ADATE;
                 break;
             case TIME:
-                unionList.add(BuiltinType.ATIME);
+                type = BuiltinType.ATIME;
                 break;
             case DATETIME:
-                unionList.add(BuiltinType.ADATETIME);
+                type = BuiltinType.ADATETIME;
                 break;
             case YEARMONTHDURATION:
-                unionList.add(BuiltinType.AYEARMONTHDURATION);
+                type = BuiltinType.AYEARMONTHDURATION;
                 break;
             case DAYTIMEDURATION:
-                unionList.add(BuiltinType.ADAYTIMEDURATION);
+                type = BuiltinType.ADAYTIMEDURATION;
                 break;
             case ANY:
                 return BuiltinType.ANY;
@@ -102,6 +97,6 @@ public class NonTaggedMinMaxAggTypeComputer implements IResultTypeComputer {
                 throw new NotImplementedException(errMsg + tag1);
             }
         }
-        return new AUnionType(unionList, "SumResult");
+        return AUnionType.createNullableType(type, "SumResult");
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedNumericAddSubMulDivTypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedNumericAddSubMulDivTypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedNumericAddSubMulDivTypeComputer.java
index e39fb84..138913f 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedNumericAddSubMulDivTypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedNumericAddSubMulDivTypeComputer.java
@@ -14,9 +14,6 @@
  */
 package edu.uci.ics.asterix.om.typecomputer.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import edu.uci.ics.asterix.om.typecomputer.base.IResultTypeComputer;
 import edu.uci.ics.asterix.om.types.ATypeTag;
 import edu.uci.ics.asterix.om.types.AUnionType;
@@ -58,15 +55,13 @@ public class NonTaggedNumericAddSubMulDivTypeComputer implements IResultTypeComp
         }
 
         ATypeTag tag1, tag2;
-        if (t1.getTypeTag() == ATypeTag.UNION && NonTaggedFormatUtil.isOptionalField((AUnionType) t1))
-            tag1 = ((AUnionType) t1).getUnionList().get(AUnionType.OPTIONAL_TYPE_INDEX_IN_UNION_LIST)
-                    .getTypeTag();
+        if (NonTaggedFormatUtil.isOptional(t1))
+            tag1 = ((AUnionType) t1).getNullableType().getTypeTag();
         else
             tag1 = t1.getTypeTag();
 
-        if (t2.getTypeTag() == ATypeTag.UNION && NonTaggedFormatUtil.isOptionalField((AUnionType) t2))
-            tag2 = ((AUnionType) t2).getUnionList().get(AUnionType.OPTIONAL_TYPE_INDEX_IN_UNION_LIST)
-                    .getTypeTag();
+        if (NonTaggedFormatUtil.isOptional(t2))
+            tag2 = ((AUnionType) t2).getNullableType().getTypeTag();
         else
             tag2 = t2.getTypeTag();
 
@@ -74,8 +69,7 @@ public class NonTaggedNumericAddSubMulDivTypeComputer implements IResultTypeComp
             return BuiltinType.ANULL;
         }
 
-        List<IAType> unionList = new ArrayList<IAType>();
-        unionList.add(BuiltinType.ANULL);
+        IAType type;
 
         switch (tag1) {
             case DOUBLE: {
@@ -86,7 +80,7 @@ public class NonTaggedNumericAddSubMulDivTypeComputer implements IResultTypeComp
                     case INT64:
                     case FLOAT:
                     case DOUBLE:
-                        unionList.add(BuiltinType.ADOUBLE);
+                        type = BuiltinType.ADOUBLE;
                         break;
                     case ANY:
                         return BuiltinType.ANY;
@@ -103,10 +97,10 @@ public class NonTaggedNumericAddSubMulDivTypeComputer implements IResultTypeComp
                     case INT32:
                     case INT64:
                     case FLOAT:
-                        unionList.add(BuiltinType.AFLOAT);
+                        type = BuiltinType.AFLOAT;
                         break;
                     case DOUBLE:
-                        unionList.add(BuiltinType.ADOUBLE);
+                        type = BuiltinType.ADOUBLE;
                         break;
                     case ANY:
                         return BuiltinType.ANY;
@@ -122,13 +116,13 @@ public class NonTaggedNumericAddSubMulDivTypeComputer implements IResultTypeComp
                     case INT16:
                     case INT32:
                     case INT64:
-                        unionList.add(BuiltinType.AINT64);
+                        type = BuiltinType.AINT64;
                         break;
                     case FLOAT:
-                        unionList.add(BuiltinType.AFLOAT);
+                        type = BuiltinType.AFLOAT;
                         break;
                     case DOUBLE:
-                        unionList.add(BuiltinType.ADOUBLE);
+                        type = BuiltinType.ADOUBLE;
                         break;
                     case ANY:
                         return BuiltinType.ANY;
@@ -143,16 +137,16 @@ public class NonTaggedNumericAddSubMulDivTypeComputer implements IResultTypeComp
                     case INT8:
                     case INT16:
                     case INT32:
-                        unionList.add(BuiltinType.AINT32);
+                        type = BuiltinType.AINT32;
                         break;
                     case INT64:
-                        unionList.add(BuiltinType.AINT64);
+                        type = BuiltinType.AINT64;
                         break;
                     case FLOAT:
-                        unionList.add(BuiltinType.AFLOAT);
+                        type = BuiltinType.AFLOAT;
                         break;
                     case DOUBLE:
-                        unionList.add(BuiltinType.ADOUBLE);
+                        type = BuiltinType.ADOUBLE;
                         break;
                     case ANY:
                         return BuiltinType.ANY;
@@ -166,19 +160,19 @@ public class NonTaggedNumericAddSubMulDivTypeComputer implements IResultTypeComp
                 switch (tag2) {
                     case INT8:
                     case INT16:
-                        unionList.add(BuiltinType.AINT16);
+                        type = BuiltinType.AINT16;
                         break;
                     case INT32:
-                        unionList.add(BuiltinType.AINT32);
+                        type = BuiltinType.AINT32;
                         break;
                     case INT64:
-                        unionList.add(BuiltinType.AINT64);
+                        type = BuiltinType.AINT64;
                         break;
                     case FLOAT:
-                        unionList.add(BuiltinType.AFLOAT);
+                        type = BuiltinType.AFLOAT;
                         break;
                     case DOUBLE:
-                        unionList.add(BuiltinType.ADOUBLE);
+                        type = BuiltinType.ADOUBLE;
                         break;
                     case ANY:
                         return BuiltinType.ANY;
@@ -191,22 +185,22 @@ public class NonTaggedNumericAddSubMulDivTypeComputer implements IResultTypeComp
             case INT8: {
                 switch (tag2) {
                     case INT8:
-                        unionList.add(BuiltinType.AINT8);
+                        type = BuiltinType.AINT8;
                         break;
                     case INT16:
-                        unionList.add(BuiltinType.AINT16);
+                        type = BuiltinType.AINT16;
                         break;
                     case INT32:
-                        unionList.add(BuiltinType.AINT32);
+                        type = BuiltinType.AINT32;
                         break;
                     case INT64:
-                        unionList.add(BuiltinType.AINT64);
+                        type = BuiltinType.AINT64;
                         break;
                     case FLOAT:
-                        unionList.add(BuiltinType.AFLOAT);
+                        type = BuiltinType.AFLOAT;
                         break;
                     case DOUBLE:
-                        unionList.add(BuiltinType.ADOUBLE);
+                        type = BuiltinType.ADOUBLE;
                         break;
                     case ANY:
                         return BuiltinType.ANY;
@@ -234,12 +228,12 @@ public class NonTaggedNumericAddSubMulDivTypeComputer implements IResultTypeComp
             case DATE: {
                 switch (tag2) {
                     case DATE:
-                        unionList.add(BuiltinType.ADURATION);
+                        type = BuiltinType.ADURATION;
                         break;
                     case YEARMONTHDURATION:
                     case DAYTIMEDURATION:
                     case DURATION:
-                        unionList.add(BuiltinType.ADATE);
+                        type = BuiltinType.ADATE;
                         break;
                     default: {
                         throw new NotImplementedException(errMsg + tag2);
@@ -250,12 +244,12 @@ public class NonTaggedNumericAddSubMulDivTypeComputer implements IResultTypeComp
             case TIME: {
                 switch (tag2) {
                     case TIME:
-                        unionList.add(BuiltinType.ADURATION);
+                        type = BuiltinType.ADURATION;
                         break;
                     case YEARMONTHDURATION:
                     case DAYTIMEDURATION:
                     case DURATION:
-                        unionList.add(BuiltinType.ATIME);
+                        type = BuiltinType.ATIME;
                         break;
                     default: {
                         throw new NotImplementedException(errMsg + tag2);
@@ -266,12 +260,12 @@ public class NonTaggedNumericAddSubMulDivTypeComputer implements IResultTypeComp
             case DATETIME: {
                 switch (tag2) {
                     case DATETIME:
-                        unionList.add(BuiltinType.ADURATION);
+                        type = BuiltinType.ADURATION;
                         break;
                     case YEARMONTHDURATION:
                     case DAYTIMEDURATION:
                     case DURATION:
-                        unionList.add(BuiltinType.ADATETIME);
+                        type = BuiltinType.ADATETIME;
                         break;
                     default: {
                         throw new NotImplementedException(errMsg + tag2);
@@ -282,13 +276,13 @@ public class NonTaggedNumericAddSubMulDivTypeComputer implements IResultTypeComp
             case DURATION: {
                 switch (tag2) {
                     case DATE:
-                        unionList.add(BuiltinType.ADATE);
+                        type = BuiltinType.ADATE;
                         break;
                     case TIME:
-                        unionList.add(BuiltinType.ATIME);
+                        type = BuiltinType.ATIME;
                         break;
                     case DATETIME:
-                        unionList.add(BuiltinType.ADATETIME);
+                        type = BuiltinType.ADATETIME;
                         break;
                     default: {
                         throw new NotImplementedException(errMsg + tag2);
@@ -299,16 +293,16 @@ public class NonTaggedNumericAddSubMulDivTypeComputer implements IResultTypeComp
             case YEARMONTHDURATION: {
                 switch (tag2) {
                     case DATE:
-                        unionList.add(BuiltinType.ADATE);
+                        type = BuiltinType.ADATE;
                         break;
                     case TIME:
-                        unionList.add(BuiltinType.ATIME);
+                        type = BuiltinType.ATIME;
                         break;
                     case DATETIME:
-                        unionList.add(BuiltinType.ADATETIME);
+                        type = BuiltinType.ADATETIME;
                         break;
                     case YEARMONTHDURATION:
-                        unionList.add(BuiltinType.AYEARMONTHDURATION);
+                        type = BuiltinType.AYEARMONTHDURATION;
                         break;
                     default: {
                         throw new NotImplementedException(errMsg + tag2);
@@ -319,16 +313,16 @@ public class NonTaggedNumericAddSubMulDivTypeComputer implements IResultTypeComp
             case DAYTIMEDURATION: {
                 switch (tag2) {
                     case DATE:
-                        unionList.add(BuiltinType.ADATE);
+                        type = BuiltinType.ADATE;
                         break;
                     case TIME:
-                        unionList.add(BuiltinType.ATIME);
+                        type = BuiltinType.ATIME;
                         break;
                     case DATETIME:
-                        unionList.add(BuiltinType.ADATETIME);
+                        type = BuiltinType.ADATETIME;
                         break;
                     case DAYTIMEDURATION:
-                        unionList.add(BuiltinType.ADAYTIMEDURATION);
+                        type = BuiltinType.ADAYTIMEDURATION;
                         break;
                     default: {
                         throw new NotImplementedException(errMsg + tag2);
@@ -340,6 +334,6 @@ public class NonTaggedNumericAddSubMulDivTypeComputer implements IResultTypeComp
                 throw new NotImplementedException(errMsg + tag1);
             }
         }
-        return new AUnionType(unionList, "ArithemitcResult");
+        return AUnionType.createNullableType(type, "ArithemitcResult");
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedNumericAggTypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedNumericAggTypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedNumericAggTypeComputer.java
index f6eaf86..d565c59 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedNumericAggTypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedNumericAggTypeComputer.java
@@ -14,9 +14,6 @@
  */
 package edu.uci.ics.asterix.om.typecomputer.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import edu.uci.ics.asterix.om.typecomputer.base.IResultTypeComputer;
 import edu.uci.ics.asterix.om.types.ATypeTag;
 import edu.uci.ics.asterix.om.types.AUnionType;
@@ -50,34 +47,31 @@ public class NonTaggedNumericAggTypeComputer implements IResultTypeComputer {
         }
 
         ATypeTag tag1;
-        if (t1.getTypeTag() == ATypeTag.UNION && NonTaggedFormatUtil.isOptionalField((AUnionType) t1)) {
-            tag1 = ((AUnionType) t1).getUnionList().get(AUnionType.OPTIONAL_TYPE_INDEX_IN_UNION_LIST)
-                    .getTypeTag();
+        if (NonTaggedFormatUtil.isOptional(t1)) {
+            tag1 = ((AUnionType) t1).getNullableType().getTypeTag();
         } else {
             tag1 = t1.getTypeTag();
         }
 
-        List<IAType> unionList = new ArrayList<IAType>();
-        unionList.add(BuiltinType.ANULL);
-
+        IAType type;
         switch (tag1) {
             case DOUBLE:
-                unionList.add(BuiltinType.ADOUBLE);
+                type = BuiltinType.ADOUBLE;
                 break;
             case FLOAT:
-                unionList.add(BuiltinType.AFLOAT);
+                type = BuiltinType.AFLOAT;
                 break;
             case INT64:
-                unionList.add(BuiltinType.AINT64);
+                type = BuiltinType.AINT64;
                 break;
             case INT32:
-                unionList.add(BuiltinType.AINT32);
+                type = BuiltinType.AINT32;
                 break;
             case INT16:
-                unionList.add(BuiltinType.AINT16);
+                type = BuiltinType.AINT16;
                 break;
             case INT8:
-                unionList.add(BuiltinType.AINT8);
+                type = BuiltinType.AINT8;
                 break;
             case ANY:
                 return BuiltinType.ANY;
@@ -85,6 +79,6 @@ public class NonTaggedNumericAggTypeComputer implements IResultTypeComputer {
                 throw new NotImplementedException(errMsg + tag1);
             }
         }
-        return new AUnionType(unionList, "SumResult");
+        return AUnionType.createNullableType(type, "SumResult");
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedNumericRoundHalfToEven2TypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedNumericRoundHalfToEven2TypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedNumericRoundHalfToEven2TypeComputer.java
index 7b611c3..300262d 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedNumericRoundHalfToEven2TypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedNumericRoundHalfToEven2TypeComputer.java
@@ -59,15 +59,13 @@ public class NonTaggedNumericRoundHalfToEven2TypeComputer implements IResultType
         unionList.add(BuiltinType.ANULL);
 
         ATypeTag tag1, tag2;
-        if (t1.getTypeTag() == ATypeTag.UNION && NonTaggedFormatUtil.isOptionalField((AUnionType) t1))
-            tag1 = ((AUnionType) t1).getUnionList().get(AUnionType.OPTIONAL_TYPE_INDEX_IN_UNION_LIST)
-                    .getTypeTag();
+        if (NonTaggedFormatUtil.isOptional(t1))
+            tag1 = ((AUnionType) t1).getNullableType().getTypeTag();
         else
             tag1 = t1.getTypeTag();
 
-        if (t2.getTypeTag() == ATypeTag.UNION && NonTaggedFormatUtil.isOptionalField((AUnionType) t2))
-            tag2 = ((AUnionType) t2).getUnionList().get(AUnionType.OPTIONAL_TYPE_INDEX_IN_UNION_LIST)
-                    .getTypeTag();
+        if (NonTaggedFormatUtil.isOptional(t2))
+            tag2 = ((AUnionType) t2).getNullableType().getTypeTag();
         else
             tag2 = t2.getTypeTag();
 
@@ -81,24 +79,25 @@ public class NonTaggedNumericRoundHalfToEven2TypeComputer implements IResultType
                 throw new AlgebricksException("Argument $precision cannot be type " + t2.getTypeName());
         }
 
+        IAType type;
         switch (tag1) {
             case INT8:
-                unionList.add(BuiltinType.AINT8);
+                type = BuiltinType.AINT8;
                 break;
             case INT16:
-                unionList.add(BuiltinType.AINT16);
+                type = BuiltinType.AINT16;
                 break;
             case INT32:
-                unionList.add(BuiltinType.AINT32);
+                type = BuiltinType.AINT32;
                 break;
             case INT64:
-                unionList.add(BuiltinType.AINT64);
+                type = BuiltinType.AINT64;
                 break;
             case FLOAT:
-                unionList.add(BuiltinType.AFLOAT);
+                type = BuiltinType.AFLOAT;
                 break;
             case DOUBLE:
-                unionList.add(BuiltinType.ADOUBLE);
+                type = BuiltinType.ADOUBLE;
                 break;
             case NULL:
                 return BuiltinType.ANULL;
@@ -107,6 +106,6 @@ public class NonTaggedNumericRoundHalfToEven2TypeComputer implements IResultType
             }
         }
 
-        return new AUnionType(unionList, "NumericFuncionsResult");
+        return AUnionType.createNullableType(type, "NumericFuncionsResult");
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedNumericUnaryFunctionTypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedNumericUnaryFunctionTypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedNumericUnaryFunctionTypeComputer.java
index 947dd75..7322b7e 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedNumericUnaryFunctionTypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedNumericUnaryFunctionTypeComputer.java
@@ -19,11 +19,7 @@
  */
 package edu.uci.ics.asterix.om.typecomputer.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import edu.uci.ics.asterix.om.typecomputer.base.IResultTypeComputer;
-import edu.uci.ics.asterix.om.types.ATypeTag;
 import edu.uci.ics.asterix.om.types.AUnionType;
 import edu.uci.ics.asterix.om.types.BuiltinType;
 import edu.uci.ics.asterix.om.types.IAType;
@@ -53,32 +49,30 @@ public class NonTaggedNumericUnaryFunctionTypeComputer implements IResultTypeCom
         ILogicalExpression arg1 = fce.getArguments().get(0).getValue();
 
         IAType t = (IAType) env.getType(arg1);
-        ATypeTag tag = t.getTypeTag();
 
-        if (tag == ATypeTag.UNION && NonTaggedFormatUtil.isOptionalField((AUnionType) env.getType(arg1))) {
+        if (NonTaggedFormatUtil.isOptional(t)) {
             return (IAType) env.getType(arg1);
         }
 
-        List<IAType> unionList = new ArrayList<IAType>();
-        unionList.add(BuiltinType.ANULL);
-        switch (tag) {
+        IAType type;
+        switch (t.getTypeTag()) {
             case INT8:
-                unionList.add(BuiltinType.AINT8);
+                type = BuiltinType.AINT8;
                 break;
             case INT16:
-                unionList.add(BuiltinType.AINT16);
+                type = BuiltinType.AINT16;
                 break;
             case INT32:
-                unionList.add(BuiltinType.AINT32);
+                type = BuiltinType.AINT32;
                 break;
             case INT64:
-                unionList.add(BuiltinType.AINT64);
+                type = BuiltinType.AINT64;
                 break;
             case FLOAT:
-                unionList.add(BuiltinType.AFLOAT);
+                type = BuiltinType.AFLOAT;
                 break;
             case DOUBLE:
-                unionList.add(BuiltinType.ADOUBLE);
+                type = BuiltinType.ADOUBLE;
                 break;
             case NULL:
                 return BuiltinType.ANULL;
@@ -89,6 +83,6 @@ public class NonTaggedNumericUnaryFunctionTypeComputer implements IResultTypeCom
             }
         }
 
-        return new AUnionType(unionList, "NumericUnaryFuncionsResult");
+        return AUnionType.createNullableType(type, "NumericUnaryFuncionsResult");
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedUnaryMinusTypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedUnaryMinusTypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedUnaryMinusTypeComputer.java
index 4262325..20980ba 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedUnaryMinusTypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/NonTaggedUnaryMinusTypeComputer.java
@@ -14,13 +14,8 @@
  */
 package edu.uci.ics.asterix.om.typecomputer.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import edu.uci.ics.asterix.om.typecomputer.base.IResultTypeComputer;
-import edu.uci.ics.asterix.om.types.ATypeTag;
 import edu.uci.ics.asterix.om.types.AUnionType;
-import edu.uci.ics.asterix.om.types.BuiltinType;
 import edu.uci.ics.asterix.om.types.IAType;
 import edu.uci.ics.asterix.om.util.NonTaggedFormatUtil;
 import edu.uci.ics.hyracks.algebricks.common.exceptions.AlgebricksException;
@@ -41,13 +36,9 @@ public class NonTaggedUnaryMinusTypeComputer implements IResultTypeComputer {
             IMetadataProvider<?, ?> metadataProvider) throws AlgebricksException {
         AbstractFunctionCallExpression fce = (AbstractFunctionCallExpression) expression;
         ILogicalExpression arg1 = fce.getArguments().get(0).getValue();
-        if (((IAType) env.getType(arg1)).getTypeTag() == ATypeTag.UNION
-                && NonTaggedFormatUtil.isOptionalField((AUnionType) env.getType(arg1)))
-            return (IAType) env.getType(arg1);
-        List<IAType> unionList = new ArrayList<IAType>();
-        unionList.add(BuiltinType.ANULL);
-        unionList.add((IAType) env.getType(arg1));
-        return new AUnionType(unionList, "UnaryMinusResult");
+        IAType envType = (IAType) env.getType(arg1);
+        if (NonTaggedFormatUtil.isOptional(envType))
+            return envType;
+        return AUnionType.createNullableType(envType, "UnaryMinusResult");
     }
-
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalABinaryTypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalABinaryTypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalABinaryTypeComputer.java
index 68e9b63..6595950 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalABinaryTypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalABinaryTypeComputer.java
@@ -25,23 +25,18 @@ import edu.uci.ics.hyracks.algebricks.core.algebra.base.ILogicalExpression;
 import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment;
 import edu.uci.ics.hyracks.algebricks.core.algebra.metadata.IMetadataProvider;
 
-import java.util.ArrayList;
-import java.util.List;
-
 public class OptionalABinaryTypeComputer implements IResultTypeComputer {
     public static final OptionalABinaryTypeComputer INSTANCE = new OptionalABinaryTypeComputer();
 
-    private OptionalABinaryTypeComputer(){
+    private OptionalABinaryTypeComputer() {
 
     }
 
-    @Override public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
+    @Override
+    public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
             IMetadataProvider<?, ?> metadataProvider) throws AlgebricksException {
         if (TypeComputerUtilities.inputInferednullableType(expression, env)) {
-            List<IAType> unionList = new ArrayList<IAType>();
-            unionList.add(BuiltinType.ANULL);
-            unionList.add(BuiltinType.ABINARY);
-            return new AUnionType(unionList, "OptionalBinary");
+            return AUnionType.createNullableType(BuiltinType.ABINARY, "OptionalBinary");
         } else {
             return BuiltinType.ABINARY;
         }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalABooleanTypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalABooleanTypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalABooleanTypeComputer.java
index 043ed08..9d47af3 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalABooleanTypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalABooleanTypeComputer.java
@@ -14,9 +14,6 @@
  */
 package edu.uci.ics.asterix.om.typecomputer.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import edu.uci.ics.asterix.om.typecomputer.base.IResultTypeComputer;
 import edu.uci.ics.asterix.om.typecomputer.base.TypeComputerUtilities;
 import edu.uci.ics.asterix.om.types.AUnionType;
@@ -38,10 +35,7 @@ public class OptionalABooleanTypeComputer implements IResultTypeComputer {
     public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
             IMetadataProvider<?, ?> metadataProvider) throws AlgebricksException {
         if (TypeComputerUtilities.inputInferednullableType(expression, env)) {
-            List<IAType> unionList = new ArrayList<IAType>();
-            unionList.add(BuiltinType.ANULL);
-            unionList.add(BuiltinType.ABOOLEAN);
-            return new AUnionType(unionList, "OptionalBoolean");
+            return AUnionType.createNullableType(BuiltinType.ABOOLEAN, "OptionalBoolean");
         } else {
             return BuiltinType.ABOOLEAN;
         }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalACircleTypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalACircleTypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalACircleTypeComputer.java
index c50c6ca..0cee42b 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalACircleTypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalACircleTypeComputer.java
@@ -14,9 +14,6 @@
  */
 package edu.uci.ics.asterix.om.typecomputer.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import edu.uci.ics.asterix.om.typecomputer.base.IResultTypeComputer;
 import edu.uci.ics.asterix.om.typecomputer.base.TypeComputerUtilities;
 import edu.uci.ics.asterix.om.types.AUnionType;
@@ -38,10 +35,7 @@ public class OptionalACircleTypeComputer implements IResultTypeComputer {
     public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
             IMetadataProvider<?, ?> metadataProvider) throws AlgebricksException {
         if (TypeComputerUtilities.inputInferednullableType(expression, env)) {
-            List<IAType> unionList = new ArrayList<IAType>();
-            unionList.add(BuiltinType.ANULL);
-            unionList.add(BuiltinType.ACIRCLE);
-            return new AUnionType(unionList, "OptionalCircle");
+            return AUnionType.createNullableType(BuiltinType.ACIRCLE, "OptionalCircle");
         } else {
             return BuiltinType.ACIRCLE;
         }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalADateTimeTypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalADateTimeTypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalADateTimeTypeComputer.java
index e38ba14..ff382d2 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalADateTimeTypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalADateTimeTypeComputer.java
@@ -14,9 +14,6 @@
  */
 package edu.uci.ics.asterix.om.typecomputer.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import edu.uci.ics.asterix.om.typecomputer.base.IResultTypeComputer;
 import edu.uci.ics.asterix.om.typecomputer.base.TypeComputerUtilities;
 import edu.uci.ics.asterix.om.types.AUnionType;
@@ -38,10 +35,7 @@ public class OptionalADateTimeTypeComputer implements IResultTypeComputer {
     public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
             IMetadataProvider<?, ?> metadataProvider) throws AlgebricksException {
         if (TypeComputerUtilities.inputInferednullableType(expression, env)) {
-            List<IAType> unionList = new ArrayList<IAType>();
-            unionList.add(BuiltinType.ANULL);
-            unionList.add(BuiltinType.ADATETIME);
-            return new AUnionType(unionList, "OptionalDatetime");
+            return AUnionType.createNullableType(BuiltinType.ADATETIME, "OptionalDatetime");
         } else {
             return BuiltinType.ADATETIME;
         }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalADateTypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalADateTypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalADateTypeComputer.java
index f1b797d..5f3cdff 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalADateTypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalADateTypeComputer.java
@@ -14,9 +14,6 @@
  */
 package edu.uci.ics.asterix.om.typecomputer.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import edu.uci.ics.asterix.om.typecomputer.base.IResultTypeComputer;
 import edu.uci.ics.asterix.om.typecomputer.base.TypeComputerUtilities;
 import edu.uci.ics.asterix.om.types.AUnionType;
@@ -38,10 +35,7 @@ public class OptionalADateTypeComputer implements IResultTypeComputer {
     public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
             IMetadataProvider<?, ?> metadataProvider) throws AlgebricksException {
         if (TypeComputerUtilities.inputInferednullableType(expression, env)) {
-            List<IAType> unionList = new ArrayList<IAType>();
-            unionList.add(BuiltinType.ANULL);
-            unionList.add(BuiltinType.ADATE);
-            return new AUnionType(unionList, "OptionalDate");
+            return AUnionType.createNullableType(BuiltinType.ADATE, "OptionalDate");
         } else {
             return BuiltinType.ADATE;
         }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalADayTimeDurationTypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalADayTimeDurationTypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalADayTimeDurationTypeComputer.java
index 49e737d..b3fc158 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalADayTimeDurationTypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalADayTimeDurationTypeComputer.java
@@ -14,9 +14,6 @@
  */
 package edu.uci.ics.asterix.om.typecomputer.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import edu.uci.ics.asterix.om.typecomputer.base.IResultTypeComputer;
 import edu.uci.ics.asterix.om.typecomputer.base.TypeComputerUtilities;
 import edu.uci.ics.asterix.om.types.AUnionType;
@@ -42,10 +39,7 @@ public class OptionalADayTimeDurationTypeComputer implements IResultTypeComputer
     public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
             IMetadataProvider<?, ?> metadataProvider) throws AlgebricksException {
         if (TypeComputerUtilities.inputInferednullableType(expression, env)) {
-            List<IAType> unionList = new ArrayList<IAType>();
-            unionList.add(BuiltinType.ANULL);
-            unionList.add(BuiltinType.ADAYTIMEDURATION);
-            return new AUnionType(unionList, "OptionalDayTimeDuration");
+            return AUnionType.createNullableType(BuiltinType.ADAYTIMEDURATION, "OptionalDayTimeDuration");
         } else {
             return BuiltinType.ADAYTIMEDURATION;
         }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalADoubleTypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalADoubleTypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalADoubleTypeComputer.java
index 1a20a5c..544a0d8 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalADoubleTypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalADoubleTypeComputer.java
@@ -14,9 +14,6 @@
  */
 package edu.uci.ics.asterix.om.typecomputer.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import edu.uci.ics.asterix.om.typecomputer.base.IResultTypeComputer;
 import edu.uci.ics.asterix.om.typecomputer.base.TypeComputerUtilities;
 import edu.uci.ics.asterix.om.types.AUnionType;
@@ -38,10 +35,7 @@ public class OptionalADoubleTypeComputer implements IResultTypeComputer {
     public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
             IMetadataProvider<?, ?> metadataProvider) throws AlgebricksException {
         if (TypeComputerUtilities.inputInferednullableType(expression, env)) {
-            List<IAType> unionList = new ArrayList<IAType>();
-            unionList.add(BuiltinType.ANULL);
-            unionList.add(BuiltinType.ADOUBLE);
-            return new AUnionType(unionList, "OptionalDouble");
+            return AUnionType.createNullableType(BuiltinType.ADOUBLE, "OptionalDouble");
         } else {
             return BuiltinType.ADOUBLE;
         }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalADurationTypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalADurationTypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalADurationTypeComputer.java
index b8b6171..0427786 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalADurationTypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalADurationTypeComputer.java
@@ -14,9 +14,6 @@
  */
 package edu.uci.ics.asterix.om.typecomputer.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import edu.uci.ics.asterix.om.typecomputer.base.IResultTypeComputer;
 import edu.uci.ics.asterix.om.typecomputer.base.TypeComputerUtilities;
 import edu.uci.ics.asterix.om.types.AUnionType;
@@ -38,10 +35,7 @@ public class OptionalADurationTypeComputer implements IResultTypeComputer {
     public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
             IMetadataProvider<?, ?> metadataProvider) throws AlgebricksException {
         if (TypeComputerUtilities.inputInferednullableType(expression, env)) {
-            List<IAType> unionList = new ArrayList<IAType>();
-            unionList.add(BuiltinType.ANULL);
-            unionList.add(BuiltinType.ADURATION);
-            return new AUnionType(unionList, "OptionalDuration");
+            return AUnionType.createNullableType(BuiltinType.ADURATION, "OptionalDuration");
         } else {
             return BuiltinType.ADURATION;
         }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAFloatTypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAFloatTypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAFloatTypeComputer.java
index 517bee6..1f8b801 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAFloatTypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAFloatTypeComputer.java
@@ -14,9 +14,6 @@
  */
 package edu.uci.ics.asterix.om.typecomputer.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import edu.uci.ics.asterix.om.typecomputer.base.IResultTypeComputer;
 import edu.uci.ics.asterix.om.typecomputer.base.TypeComputerUtilities;
 import edu.uci.ics.asterix.om.types.AUnionType;
@@ -38,10 +35,7 @@ public class OptionalAFloatTypeComputer implements IResultTypeComputer {
     public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
             IMetadataProvider<?, ?> metadataProvider) throws AlgebricksException {
         if (TypeComputerUtilities.inputInferednullableType(expression, env)) {
-            List<IAType> unionList = new ArrayList<IAType>();
-            unionList.add(BuiltinType.ANULL);
-            unionList.add(BuiltinType.AFLOAT);
-            return new AUnionType(unionList, "OptionalFloat");
+            return AUnionType.createNullableType(BuiltinType.AFLOAT, "OptionalFloat");
         } else {
             return BuiltinType.AFLOAT;
         }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAInt16TypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAInt16TypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAInt16TypeComputer.java
index ee9c6da..9a6249c 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAInt16TypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAInt16TypeComputer.java
@@ -14,9 +14,6 @@
  */
 package edu.uci.ics.asterix.om.typecomputer.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import edu.uci.ics.asterix.om.typecomputer.base.IResultTypeComputer;
 import edu.uci.ics.asterix.om.typecomputer.base.TypeComputerUtilities;
 import edu.uci.ics.asterix.om.types.AUnionType;
@@ -38,10 +35,7 @@ public class OptionalAInt16TypeComputer implements IResultTypeComputer {
     public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
             IMetadataProvider<?, ?> metadataProvider) throws AlgebricksException {
         if (TypeComputerUtilities.inputInferednullableType(expression, env)) {
-            List<IAType> unionList = new ArrayList<IAType>();
-            unionList.add(BuiltinType.ANULL);
-            unionList.add(BuiltinType.AINT16);
-            return new AUnionType(unionList, "OptionalInt16");
+            return AUnionType.createNullableType(BuiltinType.AINT16, "OptionalInt16");
         } else {
             return BuiltinType.AINT16;
         }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAInt32TypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAInt32TypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAInt32TypeComputer.java
index e93e436..71af56c 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAInt32TypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAInt32TypeComputer.java
@@ -14,9 +14,6 @@
  */
 package edu.uci.ics.asterix.om.typecomputer.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import edu.uci.ics.asterix.om.typecomputer.base.IResultTypeComputer;
 import edu.uci.ics.asterix.om.typecomputer.base.TypeComputerUtilities;
 import edu.uci.ics.asterix.om.types.AUnionType;
@@ -38,10 +35,7 @@ public class OptionalAInt32TypeComputer implements IResultTypeComputer {
     public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
             IMetadataProvider<?, ?> metadataProvider) throws AlgebricksException {
         if (TypeComputerUtilities.inputInferednullableType(expression, env)) {
-            List<IAType> unionList = new ArrayList<IAType>();
-            unionList.add(BuiltinType.ANULL);
-            unionList.add(BuiltinType.AINT32);
-            return new AUnionType(unionList, "OptionalInt32");
+            return AUnionType.createNullableType(BuiltinType.AINT32, "OptionalInt32");
         } else {
             return BuiltinType.AINT32;
         }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAInt64TypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAInt64TypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAInt64TypeComputer.java
index 180e746..bb7f2e6 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAInt64TypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAInt64TypeComputer.java
@@ -14,9 +14,6 @@
  */
 package edu.uci.ics.asterix.om.typecomputer.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import edu.uci.ics.asterix.om.typecomputer.base.IResultTypeComputer;
 import edu.uci.ics.asterix.om.typecomputer.base.TypeComputerUtilities;
 import edu.uci.ics.asterix.om.types.AUnionType;
@@ -38,10 +35,7 @@ public class OptionalAInt64TypeComputer implements IResultTypeComputer {
     public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
             IMetadataProvider<?, ?> metadataProvider) throws AlgebricksException {
         if (TypeComputerUtilities.inputInferednullableType(expression, env)) {
-            List<IAType> unionList = new ArrayList<IAType>();
-            unionList.add(BuiltinType.ANULL);
-            unionList.add(BuiltinType.AINT64);
-            return new AUnionType(unionList, "OptionalInt64");
+            return AUnionType.createNullableType(BuiltinType.AINT64, "OptionalInt64");
         } else {
             return BuiltinType.AINT64;
         }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAInt8TypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAInt8TypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAInt8TypeComputer.java
index a28311d..19c21a1 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAInt8TypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAInt8TypeComputer.java
@@ -14,9 +14,6 @@
  */
 package edu.uci.ics.asterix.om.typecomputer.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import edu.uci.ics.asterix.om.typecomputer.base.IResultTypeComputer;
 import edu.uci.ics.asterix.om.typecomputer.base.TypeComputerUtilities;
 import edu.uci.ics.asterix.om.types.AUnionType;
@@ -38,10 +35,7 @@ public class OptionalAInt8TypeComputer implements IResultTypeComputer {
     public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
             IMetadataProvider<?, ?> metadataProvider) throws AlgebricksException {
         if (TypeComputerUtilities.inputInferednullableType(expression, env)) {
-            List<IAType> unionList = new ArrayList<IAType>();
-            unionList.add(BuiltinType.ANULL);
-            unionList.add(BuiltinType.AINT8);
-            return new AUnionType(unionList, "OptionalInt8");
+            return AUnionType.createNullableType(BuiltinType.AINT8, "OptionalInt8");
         } else {
             return BuiltinType.AINT8;
         }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAIntervalTypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAIntervalTypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAIntervalTypeComputer.java
index f523b5d..0ef1503 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAIntervalTypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAIntervalTypeComputer.java
@@ -14,9 +14,6 @@
  */
 package edu.uci.ics.asterix.om.typecomputer.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import edu.uci.ics.asterix.om.typecomputer.base.IResultTypeComputer;
 import edu.uci.ics.asterix.om.typecomputer.base.TypeComputerUtilities;
 import edu.uci.ics.asterix.om.types.AUnionType;
@@ -38,10 +35,7 @@ public class OptionalAIntervalTypeComputer implements IResultTypeComputer {
     public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
             IMetadataProvider<?, ?> metadataProvider) throws AlgebricksException {
         if (TypeComputerUtilities.inputInferednullableType(expression, env)) {
-            List<IAType> unionList = new ArrayList<IAType>();
-            unionList.add(BuiltinType.ANULL);
-            unionList.add(BuiltinType.AINTERVAL);
-            return new AUnionType(unionList, "OptionalInterval");
+            return AUnionType.createNullableType(BuiltinType.AINTERVAL, "OptionalInterval");
         } else {
             return BuiltinType.AINTERVAL;
         }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalALineTypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalALineTypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalALineTypeComputer.java
index 004eb6d..28bd634 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalALineTypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalALineTypeComputer.java
@@ -14,9 +14,6 @@
  */
 package edu.uci.ics.asterix.om.typecomputer.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import edu.uci.ics.asterix.om.typecomputer.base.IResultTypeComputer;
 import edu.uci.ics.asterix.om.typecomputer.base.TypeComputerUtilities;
 import edu.uci.ics.asterix.om.types.AUnionType;
@@ -38,10 +35,7 @@ public class OptionalALineTypeComputer implements IResultTypeComputer {
     public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
             IMetadataProvider<?, ?> metadataProvider) throws AlgebricksException {
         if (TypeComputerUtilities.inputInferednullableType(expression, env)) {
-            List<IAType> unionList = new ArrayList<IAType>();
-            unionList.add(BuiltinType.ANULL);
-            unionList.add(BuiltinType.ALINE);
-            return new AUnionType(unionList, "OptionalLine");
+            return AUnionType.createNullableType(BuiltinType.ALINE, "OptionalLine");
         } else {
             return BuiltinType.ALINE;
         }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAPoint3DTypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAPoint3DTypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAPoint3DTypeComputer.java
index d5e65ad..d1f5d4a 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAPoint3DTypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAPoint3DTypeComputer.java
@@ -14,9 +14,6 @@
  */
 package edu.uci.ics.asterix.om.typecomputer.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import edu.uci.ics.asterix.om.typecomputer.base.IResultTypeComputer;
 import edu.uci.ics.asterix.om.typecomputer.base.TypeComputerUtilities;
 import edu.uci.ics.asterix.om.types.AUnionType;
@@ -38,10 +35,7 @@ public class OptionalAPoint3DTypeComputer implements IResultTypeComputer {
     public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
             IMetadataProvider<?, ?> metadataProvider) throws AlgebricksException {
         if (TypeComputerUtilities.inputInferednullableType(expression, env)) {
-            List<IAType> unionList = new ArrayList<IAType>();
-            unionList.add(BuiltinType.ANULL);
-            unionList.add(BuiltinType.APOINT3D);
-            return new AUnionType(unionList, "OptionalPoint3d");
+            return AUnionType.createNullableType(BuiltinType.APOINT3D, "OptionalPoint3d");
         } else {
             return BuiltinType.APOINT3D;
         }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAPointTypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAPointTypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAPointTypeComputer.java
index d545c43..21a5c0e 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAPointTypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAPointTypeComputer.java
@@ -14,9 +14,6 @@
  */
 package edu.uci.ics.asterix.om.typecomputer.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import edu.uci.ics.asterix.om.typecomputer.base.IResultTypeComputer;
 import edu.uci.ics.asterix.om.typecomputer.base.TypeComputerUtilities;
 import edu.uci.ics.asterix.om.types.AUnionType;
@@ -38,10 +35,7 @@ public class OptionalAPointTypeComputer implements IResultTypeComputer {
     public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
             IMetadataProvider<?, ?> metadataProvider) throws AlgebricksException {
         if (TypeComputerUtilities.inputInferednullableType(expression, env)) {
-            List<IAType> unionList = new ArrayList<IAType>();
-            unionList.add(BuiltinType.ANULL);
-            unionList.add(BuiltinType.APOINT);
-            return new AUnionType(unionList, "OptionalPoint");
+            return AUnionType.createNullableType(BuiltinType.APOINT, "OptionalPoint");
         } else {
             return BuiltinType.APOINT;
         }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAPolygonTypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAPolygonTypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAPolygonTypeComputer.java
index 2744be0..4628c72 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAPolygonTypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAPolygonTypeComputer.java
@@ -14,9 +14,6 @@
  */
 package edu.uci.ics.asterix.om.typecomputer.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import edu.uci.ics.asterix.om.typecomputer.base.IResultTypeComputer;
 import edu.uci.ics.asterix.om.typecomputer.base.TypeComputerUtilities;
 import edu.uci.ics.asterix.om.types.AUnionType;
@@ -38,10 +35,7 @@ public class OptionalAPolygonTypeComputer implements IResultTypeComputer {
     public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
             IMetadataProvider<?, ?> metadataProvider) throws AlgebricksException {
         if (TypeComputerUtilities.inputInferednullableType(expression, env)) {
-            List<IAType> unionList = new ArrayList<IAType>();
-            unionList.add(BuiltinType.ANULL);
-            unionList.add(BuiltinType.APOLYGON);
-            return new AUnionType(unionList, "OptionalPolygon");
+            return AUnionType.createNullableType(BuiltinType.APOLYGON, "OptionalPolygon");
         } else {
             return BuiltinType.APOLYGON;
         }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalARectangleTypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalARectangleTypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalARectangleTypeComputer.java
index 87006f1..1d8a08f 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalARectangleTypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalARectangleTypeComputer.java
@@ -14,9 +14,6 @@
  */
 package edu.uci.ics.asterix.om.typecomputer.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import edu.uci.ics.asterix.om.typecomputer.base.IResultTypeComputer;
 import edu.uci.ics.asterix.om.typecomputer.base.TypeComputerUtilities;
 import edu.uci.ics.asterix.om.types.AUnionType;
@@ -38,10 +35,7 @@ public class OptionalARectangleTypeComputer implements IResultTypeComputer {
     public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
             IMetadataProvider<?, ?> metadataProvider) throws AlgebricksException {
         if (TypeComputerUtilities.inputInferednullableType(expression, env)) {
-            List<IAType> unionList = new ArrayList<IAType>();
-            unionList.add(BuiltinType.ANULL);
-            unionList.add(BuiltinType.ARECTANGLE);
-            return new AUnionType(unionList, "OptionalRectangle");
+            return AUnionType.createNullableType(BuiltinType.ARECTANGLE, "OptionalRectangle");
         } else {
             return BuiltinType.ARECTANGLE;
         }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAStringTypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAStringTypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAStringTypeComputer.java
index 2085df4..0356234 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAStringTypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAStringTypeComputer.java
@@ -14,9 +14,6 @@
  */
 package edu.uci.ics.asterix.om.typecomputer.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import edu.uci.ics.asterix.om.typecomputer.base.IResultTypeComputer;
 import edu.uci.ics.asterix.om.typecomputer.base.TypeComputerUtilities;
 import edu.uci.ics.asterix.om.types.AUnionType;
@@ -38,10 +35,7 @@ public class OptionalAStringTypeComputer implements IResultTypeComputer {
     public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
             IMetadataProvider<?, ?> metadataProvider) throws AlgebricksException {
         if (TypeComputerUtilities.inputInferednullableType(expression, env)) {
-            List<IAType> unionList = new ArrayList<IAType>();
-            unionList.add(BuiltinType.ANULL);
-            unionList.add(BuiltinType.ASTRING);
-            return new AUnionType(unionList, "OptionalString");
+            return AUnionType.createNullableType(BuiltinType.ASTRING, "OptionalString");
         } else {
             return BuiltinType.ASTRING;
         }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalATimeTypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalATimeTypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalATimeTypeComputer.java
index 87aba10..e5bfd2a 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalATimeTypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalATimeTypeComputer.java
@@ -14,9 +14,6 @@
  */
 package edu.uci.ics.asterix.om.typecomputer.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import edu.uci.ics.asterix.om.typecomputer.base.IResultTypeComputer;
 import edu.uci.ics.asterix.om.typecomputer.base.TypeComputerUtilities;
 import edu.uci.ics.asterix.om.types.AUnionType;
@@ -38,10 +35,7 @@ public class OptionalATimeTypeComputer implements IResultTypeComputer {
     public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
             IMetadataProvider<?, ?> metadataProvider) throws AlgebricksException {
         if (TypeComputerUtilities.inputInferednullableType(expression, env)) {
-            List<IAType> unionList = new ArrayList<IAType>();
-            unionList.add(BuiltinType.ANULL);
-            unionList.add(BuiltinType.ATIME);
-            return new AUnionType(unionList, "OptionalTime");
+            return AUnionType.createNullableType(BuiltinType.ATIME, "OptionalTime");
         } else {
             return BuiltinType.ATIME;
         }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAYearMonthDurationTypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAYearMonthDurationTypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAYearMonthDurationTypeComputer.java
index e25c4f4..532b9eb 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAYearMonthDurationTypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OptionalAYearMonthDurationTypeComputer.java
@@ -14,9 +14,6 @@
  */
 package edu.uci.ics.asterix.om.typecomputer.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import edu.uci.ics.asterix.om.typecomputer.base.IResultTypeComputer;
 import edu.uci.ics.asterix.om.typecomputer.base.TypeComputerUtilities;
 import edu.uci.ics.asterix.om.types.AUnionType;
@@ -42,10 +39,7 @@ public class OptionalAYearMonthDurationTypeComputer implements IResultTypeComput
     public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
             IMetadataProvider<?, ?> metadataProvider) throws AlgebricksException {
         if (TypeComputerUtilities.inputInferednullableType(expression, env)) {
-            List<IAType> unionList = new ArrayList<IAType>();
-            unionList.add(BuiltinType.ANULL);
-            unionList.add(BuiltinType.AYEARMONTHDURATION);
-            return new AUnionType(unionList, "OptionalYearMonthDuration");
+            return AUnionType.createNullableType(BuiltinType.AYEARMONTHDURATION, "OptionalYearMonthDuration");
         } else {
             return BuiltinType.AYEARMONTHDURATION;
         }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OrderedListConstructorResultType.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OrderedListConstructorResultType.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OrderedListConstructorResultType.java
index fc1b564..63d9c98 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OrderedListConstructorResultType.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/OrderedListConstructorResultType.java
@@ -20,7 +20,6 @@ import java.util.ArrayList;
 import edu.uci.ics.asterix.om.typecomputer.base.IResultTypeComputer;
 import edu.uci.ics.asterix.om.typecomputer.base.TypeComputerUtilities;
 import edu.uci.ics.asterix.om.types.AOrderedListType;
-import edu.uci.ics.asterix.om.types.ATypeTag;
 import edu.uci.ics.asterix.om.types.AUnionType;
 import edu.uci.ics.asterix.om.types.BuiltinType;
 import edu.uci.ics.asterix.om.types.IAType;
@@ -50,8 +49,8 @@ public class OrderedListConstructorResultType implements IResultTypeComputer {
         ArrayList<IAType> types = new ArrayList<IAType>();
         for (int k = 0; k < f.getArguments().size(); k++) {
             IAType type = (IAType) env.getType(f.getArguments().get(k).getValue());
-            if (type.getTypeTag() == ATypeTag.UNION && NonTaggedFormatUtil.isOptionalField((AUnionType) type))
-                type = ((AUnionType) type).getUnionList().get(AUnionType.OPTIONAL_TYPE_INDEX_IN_UNION_LIST);
+            if (NonTaggedFormatUtil.isOptional(type))
+                type = ((AUnionType) type).getNullableType();
             if (types.indexOf(type) < 0) {
                 types.add(type);
             }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/RecordMergeTypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/RecordMergeTypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/RecordMergeTypeComputer.java
index 2a83e9c..d0316ed 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/RecordMergeTypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/RecordMergeTypeComputer.java
@@ -50,7 +50,7 @@ public class RecordMergeTypeComputer implements IResultTypeComputer {
         }
 
         if (t.getTypeTag() == ATypeTag.UNION) {
-            IAType innerType = ((AUnionType) t).getUnionList().get(1);
+            IAType innerType = ((AUnionType) t).getNullableType();
             if (innerType.getTypeTag() == ATypeTag.RECORD) {
                 return (ARecordType) innerType;
             }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/Substring2TypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/Substring2TypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/Substring2TypeComputer.java
index 29454ed..82be700 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/Substring2TypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/Substring2TypeComputer.java
@@ -46,15 +46,13 @@ public class Substring2TypeComputer implements IResultTypeComputer {
         }
 
         ATypeTag tag0, tag1;
-        if (t0.getTypeTag() == ATypeTag.UNION && NonTaggedFormatUtil.isOptionalField((AUnionType) t0))
-            tag0 = ((AUnionType) t0).getUnionList().get(AUnionType.OPTIONAL_TYPE_INDEX_IN_UNION_LIST)
-                    .getTypeTag();
+        if (NonTaggedFormatUtil.isOptional(t0))
+            tag0 = ((AUnionType) t0).getNullableType().getTypeTag();
         else
             tag0 = t0.getTypeTag();
 
-        if (t1.getTypeTag() == ATypeTag.UNION && NonTaggedFormatUtil.isOptionalField((AUnionType) t1))
-            tag1 = ((AUnionType) t1).getUnionList().get(AUnionType.OPTIONAL_TYPE_INDEX_IN_UNION_LIST)
-                    .getTypeTag();
+        if (NonTaggedFormatUtil.isOptional(t1))
+            tag1 = ((AUnionType) t1).getNullableType().getTypeTag();
         else
             tag1 = t1.getTypeTag();
 

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/SubstringTypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/SubstringTypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/SubstringTypeComputer.java
index ef080ec..80dea97 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/SubstringTypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/SubstringTypeComputer.java
@@ -48,21 +48,18 @@ public class SubstringTypeComputer implements IResultTypeComputer {
         }
 
         ATypeTag tag0, tag1, tag2;
-        if (t0.getTypeTag() == ATypeTag.UNION && NonTaggedFormatUtil.isOptionalField((AUnionType) t0))
-            tag0 = ((AUnionType) t0).getUnionList().get(AUnionType.OPTIONAL_TYPE_INDEX_IN_UNION_LIST)
-                    .getTypeTag();
+        if (NonTaggedFormatUtil.isOptional(t0))
+            tag0 = ((AUnionType) t0).getNullableType().getTypeTag();
         else
             tag0 = t0.getTypeTag();
 
-        if (t1.getTypeTag() == ATypeTag.UNION && NonTaggedFormatUtil.isOptionalField((AUnionType) t1))
-            tag1 = ((AUnionType) t1).getUnionList().get(AUnionType.OPTIONAL_TYPE_INDEX_IN_UNION_LIST)
-                    .getTypeTag();
+        if (NonTaggedFormatUtil.isOptional(t1))
+            tag1 = ((AUnionType) t1).getNullableType().getTypeTag();
         else
             tag1 = t1.getTypeTag();
 
-        if (t2.getTypeTag() == ATypeTag.UNION && NonTaggedFormatUtil.isOptionalField((AUnionType) t2))
-            tag2 = ((AUnionType) t2).getUnionList().get(AUnionType.OPTIONAL_TYPE_INDEX_IN_UNION_LIST)
-                    .getTypeTag();
+        if (NonTaggedFormatUtil.isOptional(t2))
+            tag2 = ((AUnionType) t2).getNullableType().getTypeTag();
         else
             tag2 = t2.getTypeTag();
 

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/UnaryBinaryInt64OrNullTypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/UnaryBinaryInt64OrNullTypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/UnaryBinaryInt64OrNullTypeComputer.java
index 0855ddb..5d2fd42 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/UnaryBinaryInt64OrNullTypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/UnaryBinaryInt64OrNullTypeComputer.java
@@ -27,9 +27,6 @@ import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.AbstractFunctionC
 import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment;
 import edu.uci.ics.hyracks.algebricks.core.algebra.metadata.IMetadataProvider;
 
-import java.util.ArrayList;
-import java.util.List;
-
 public class UnaryBinaryInt64OrNullTypeComputer implements IResultTypeComputer {
     public static final UnaryBinaryInt64OrNullTypeComputer INSTANCE = new UnaryBinaryInt64OrNullTypeComputer();
 
@@ -37,7 +34,8 @@ public class UnaryBinaryInt64OrNullTypeComputer implements IResultTypeComputer {
 
     }
 
-    @Override public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
+    @Override
+    public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
             IMetadataProvider<?, ?> metadataProvider) throws AlgebricksException {
         AbstractFunctionCallExpression fce = (AbstractFunctionCallExpression) expression;
         if (fce.getArguments().size() != 1) {
@@ -49,21 +47,17 @@ public class UnaryBinaryInt64OrNullTypeComputer implements IResultTypeComputer {
         if (t0.getTypeTag() != ATypeTag.NULL
                 && t0.getTypeTag() != ATypeTag.BINARY
                 && (t0.getTypeTag() == ATypeTag.UNION && !((AUnionType) t0).getUnionList()
-                .contains(BuiltinType.ABINARY))) {
+                        .contains(BuiltinType.ABINARY))) {
             throw new NotImplementedException("Expects Binary Type.");
         }
 
-        List<IAType> unionList = new ArrayList<IAType>();
-        unionList.add(BuiltinType.ANULL);
         if (t0.getTypeTag() == ATypeTag.NULL) {
             return BuiltinType.ANULL;
         }
 
         if (t0.getTypeTag() == ATypeTag.BINARY || t0.getTypeTag().equals(ATypeTag.UNION)) {
-            unionList.add(BuiltinType.AINT64);
+            return AUnionType.createNullableType(BuiltinType.AINT64, "binary-length-Result");
         }
-
-        return new AUnionType(unionList, "binary-length-Result");
-
+        throw new AlgebricksException("Cannot compute type");
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/UnaryBooleanOrNullFunctionTypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/UnaryBooleanOrNullFunctionTypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/UnaryBooleanOrNullFunctionTypeComputer.java
index 8050bb4..a0804d8 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/UnaryBooleanOrNullFunctionTypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/UnaryBooleanOrNullFunctionTypeComputer.java
@@ -14,9 +14,6 @@
  */
 package edu.uci.ics.asterix.om.typecomputer.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import edu.uci.ics.asterix.om.typecomputer.base.IResultTypeComputer;
 import edu.uci.ics.asterix.om.types.ATypeTag;
 import edu.uci.ics.asterix.om.types.AUnionType;
@@ -51,10 +48,7 @@ public class UnaryBooleanOrNullFunctionTypeComputer implements IResultTypeComput
             return BuiltinType.ANULL;
         }
         if (TypeHelper.canBeNull(t0)) {
-            List<IAType> unionList = new ArrayList<IAType>();
-            unionList.add(BuiltinType.ANULL);
-            unionList.add(BuiltinType.ABOOLEAN);
-            return new AUnionType(unionList, "OptionalBoolean");
+            return AUnionType.createNullableType(BuiltinType.ABOOLEAN, "OptionalBoolean");
         }
         return BuiltinType.ABOOLEAN;
     }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/a5895308/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/UnaryStringInt64OrNullTypeComputer.java
----------------------------------------------------------------------
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/UnaryStringInt64OrNullTypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/UnaryStringInt64OrNullTypeComputer.java
index ef24315..f148242 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/UnaryStringInt64OrNullTypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/UnaryStringInt64OrNullTypeComputer.java
@@ -66,9 +66,9 @@ public class UnaryStringInt64OrNullTypeComputer implements IResultTypeComputer {
         }
 
         if (t0.getTypeTag() == ATypeTag.STRING || t0.getTypeTag().equals(ATypeTag.UNION)) {
-            unionList.add(BuiltinType.AINT64);
+            return AUnionType.createNullableType(BuiltinType.AINT64, "String-length-Result");
         }
 
-        return new AUnionType(unionList, "String-length-Result");
+        throw new AlgebricksException("Cannot compute type");
     }
 }