package com.livingsocial.hive.utils;
import java.util.ArrayList;
import java.util.List;
import com.livingsocial.hive.Utils;
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.ListObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector.PrimitiveCategory;
import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector.PrimitiveCategory.*;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.AbstractPrimitiveJavaObjectInspector;
public class KISSInspector {
private PrimitiveObjectInspector inspector;
public KISSInspector(ObjectInspector arg) {
inspector = (PrimitiveObjectInspector) arg;
}
public boolean sameAsTypeIn(ListObjectInspector loi) {
PrimitiveObjectInspector poi = (PrimitiveObjectInspector) loi.getListElementObjectInspector();
return poi.getPrimitiveCategory() == getCategory();
}
public PrimitiveCategory getCategory() {
return inspector.getPrimitiveCategory();
}
public AbstractPrimitiveJavaObjectInspector getAnInspector() {
return PrimitiveObjectInspectorFactory.getPrimitiveJavaObjectInspector(getCategory());
}
public Object get(Object value) {
return inspector.getPrimitiveJavaObject(value);
}
public float toFloat(Object value) {
float result;
value = get(value);
switch(getCategory()) {
case STRING:
long timestamp = Utils.stringToTimestamp((String) value);
result = (timestamp < 0) ? 0L : (new Long(timestamp)).floatValue();
break;
case BOOLEAN:
result = ((Boolean) value).booleanValue() ? 1.0f : 0.0f;
break;
case UNKNOWN:
result = 0.0f;
break;
case VOID:
result = 0.0f;
break;
default: // all other types are numerical
result = ((Number) value).floatValue();
break;
}
return result;
}
public long toLong(Object value) {
long result;
value = get(value);
switch(getCategory()) {
case STRING:
long timestamp = Utils.stringToTimestamp((String) value);
result = (timestamp < 0) ? 0L : (new Long(timestamp)).longValue();
break;
case BOOLEAN:
result = ((Boolean) value).booleanValue() ? 1L : 0L;
break;
case UNKNOWN:
result = 0L;
break;
case VOID:
result = 0L;
break;
default: // all other types are numerical
result = ((Number) value).longValue();
break;
}
return result;
}
public boolean isNull() {
return getCategory() == PrimitiveCategory.VOID;
}
public boolean isString() {
return getCategory() == PrimitiveCategory.STRING;
}
public static boolean isPrimitive(ObjectInspector oi) {
return oi.getCategory() == ObjectInspector.Category.PRIMITIVE;
}
public static boolean isList(ObjectInspector oi) {
return oi.getCategory() == ObjectInspector.Category.LIST;
}
public boolean equalPrimitive(Object first, Object second) {
if((first == null && second != null) || (first != null && second == null))
return false;
if(first == null && second == null)
return true;
first = get(first);
second = get(second);
boolean result;
switch(getCategory()) {
case STRING:
result = ((String) first).compareTo((String) second) == 0;
break;
case BOOLEAN:
result = ((Boolean) first).equals((Boolean) second);
break;
case UNKNOWN:
result = first.equals(second);
break;
case VOID:
result = first.equals(second);
break;
default: // all other types are numerical
result = ((Integer) first).intValue() == ((Integer) second).intValue();
break;
}
return result;
}
}