in pig/src/main/java/com/twitter/elephantbird/pig/piggybank/Invoker.java [148:197]
private static <T> T convertToExpectedArg(Class<T> klass, Object obj) throws ExecException {
if (ARRAY_CLASSES.contains(klass)) {
DataBag dbag = (DataBag) obj;
if (STRING_ARRAY_CLASS.equals(klass)) {
List<String> dataList = Lists.newArrayList();
for (Tuple t : dbag) {
dataList.add( (String) t.get(0));
}
String[] dataArray = new String[dataList.size()];
for (int i = 0; i < dataList.size(); i++) {
dataArray[i] = dataList.get(i);
}
obj = dataArray;
} else {
List<Number> dataList = bagToNumberList(dbag);
if (DOUBLE_ARRAY_CLASS.equals(klass)) {
double[] dataArray = new double[dataList.size()];
for (int i = 0; i < dataList.size(); i++) {
dataArray[i] = dataList.get(i).doubleValue();
}
obj = dataArray;
} else if (INT_ARRAY_CLASS.equals(klass)) {
int[] dataArray = new int[dataList.size()];
for (int i = 0; i < dataList.size(); i++) {
dataArray[i] = dataList.get(i).intValue();
}
obj = dataArray;
} else if (FLOAT_ARRAY_CLASS.equals(klass)) {
float[] dataArray = new float[dataList.size()];
for (int i = 0; i < dataList.size(); i++) {
dataArray[i] = dataList.get(i).floatValue();
}
obj = dataArray;
} else if (LONG_ARRAY_CLASS.equals(klass)) {
long[] dataArray = new long[dataList.size()];
for (int i = 0; i < dataList.size(); i++) {
dataArray[i] = dataList.get(i).longValue();
}
obj = dataArray;
}
}
}
try {
return klass.cast(obj);
} catch (ClassCastException e) {
LOG.error("Error in dynamic argument processing. Casting to: "
+ klass + " from: " + obj.getClass(), e);
throw new ExecException(e);
}
}