HCATALOG-270 HCatRecord SerDe does not handle List<Map> or List<List> or List<lazy primitive> correctly


git-svn-id: https://svn.apache.org/repos/asf/incubator/hcatalog/branches/branch-0.3@1293488 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/CHANGES.txt b/CHANGES.txt
index 9f11058..8762362 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -119,6 +119,8 @@
   OPTIMIZATIONS
 
   BUG FIXES
+  HCAT-270  HCatRecord SerDe does not handle List<Map> or List<List> or List<lazy primitive> correctly (khorgath via gates)
+
   HCAT-232. Dynamic Partitioning broken: keys set to HIVE_DEFAULT_PARTITION (mithun via gates)
 
   HCAT-229. bin/hcat should put hcatalog.jar into classpath (daiky via gates)
diff --git a/src/java/org/apache/hcatalog/data/HCatRecordSerDe.java b/src/java/org/apache/hcatalog/data/HCatRecordSerDe.java
index e2717de..f88afc1 100644
--- a/src/java/org/apache/hcatalog/data/HCatRecordSerDe.java
+++ b/src/java/org/apache/hcatalog/data/HCatRecordSerDe.java
@@ -225,7 +225,11 @@
     List l = loi.getList(f);
     ObjectInspector eloi = loi.getListElementObjectInspector();
     if (eloi.getCategory() == Category.PRIMITIVE){
-      return l;
+      List<Object> list = new ArrayList<Object>(l.size());
+      for(int i = 0; i < l.size(); i++){
+        list.add(((PrimitiveObjectInspector)eloi).getPrimitiveJavaObject(l.get(i)));
+      }
+      return list;
     } else if (eloi.getCategory() == Category.STRUCT){
       List<List<?>> list = new ArrayList<List<?>>(l.size());
       for (int i = 0 ; i < l.size() ; i++ ){
@@ -237,18 +241,18 @@
       for (int i = 0 ; i < l.size() ; i++ ){
         list.add(serializeList(l.get(i), (ListObjectInspector) eloi));
       }
+      return list;
     } else if (eloi.getCategory() == Category.MAP){
       List<Map<?,?>> list = new ArrayList<Map<?,?>>(l.size());
       for (int i = 0 ; i < l.size() ; i++ ){
         list.add(serializeMap(l.get(i), (MapObjectInspector) eloi));
       }
-      throw new SerDeException("HCatSerDe map type unimplemented");
+      return list;
     } else {
       throw new SerDeException(getClass().toString() 
           + " does not know what to do with fields of unknown category: "
           + eloi.getCategory() + " , type: " + eloi.getTypeName());
     }
-    return l;
   }
 
   /**
diff --git a/src/test/org/apache/hcatalog/data/TestHCatRecordSerDe.java b/src/test/org/apache/hcatalog/data/TestHCatRecordSerDe.java
index 9ad5864..9f88202 100644
--- a/src/test/org/apache/hcatalog/data/TestHCatRecordSerDe.java
+++ b/src/test/org/apache/hcatalog/data/TestHCatRecordSerDe.java
@@ -81,14 +81,26 @@
       c1_1.add(i2);
       c1.add(c1_1);
     rlist.add(c1);
+    List<Object> am = new ArrayList<Object>();
+      Map<String,String> am_1 = new HashMap<String,String>();
+        am_1.put("noo","haha");
+      am.add(am_1);
+    rlist.add(am);
+    List<Object> aa = new ArrayList<Object>();
+      List<String> aa_1 = new ArrayList<String>();
+        aa_1.add("bloo");
+        aa_1.add("bwahaha");
+      aa.add(aa_1);
+    rlist.add(aa);
 
     String typeString = 
         "tinyint,smallint,int,bigint,double,float,string,string,"
         + "struct<a:string,b:string>,array<int>,map<smallint,string>,boolean,"
-        + "array<struct<i1:int,i2:struct<ii1:array<int>,ii2:map<string,struct<iii1:int>>>>>";
+        + "array<struct<i1:int,i2:struct<ii1:array<int>,ii2:map<string,struct<iii1:int>>>>>,"
+        + "array<map<string,string>>,array<array<string>>";
     Properties props = new Properties();
     
-    props.put(Constants.LIST_COLUMNS, "ti,si,i,bi,d,f,s,n,r,l,m,b,c1");
+    props.put(Constants.LIST_COLUMNS, "ti,si,i,bi,d,f,s,n,r,l,m,b,c1,am,aa");
     props.put(Constants.LIST_COLUMN_TYPES, typeString);
 
     data.put(props, new DefaultHCatRecord(rlist));