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));