in src/core-metadata/src/main/java/org/apache/kylin/metadata/tuple/Tuple.java [92:122]
public void setMeasureValue(int idx, Object fieldValue) {
fieldValue = convertWritableToJava(fieldValue);
String dataType = getDataTypeName(idx);
// special handling for BigDecimal, allow double be aggregated as
// BigDecimal during cube build for best precision
if ("double".equals(dataType) && fieldValue instanceof BigDecimal) {
fieldValue = ((BigDecimal) fieldValue).doubleValue();
} else if ("decimal".equals(dataType) && fieldValue instanceof BigDecimal) {
fieldValue = normalizeDecimal((BigDecimal) fieldValue);
} else if ("integer".equals(dataType) && fieldValue instanceof Number) {
fieldValue = ((Number) fieldValue).intValue();
} else if ("smallint".equals(dataType) && fieldValue instanceof Number) {
fieldValue = ((Number) fieldValue).shortValue();
} else if ("tinyint".equals(dataType)) {
fieldValue = ((Number) fieldValue).byteValue();
} else if ("float".equals(dataType) && fieldValue instanceof BigDecimal) {
fieldValue = ((BigDecimal) fieldValue).floatValue();
} else if ("date".equals(dataType) && fieldValue instanceof Long) {
long millis = ((Long) fieldValue).longValue();
fieldValue = (int) (millis / (1000 * 3600 * 24));
} else if ("smallint".equals(dataType) && fieldValue instanceof Long) {
fieldValue = ((Long) fieldValue).shortValue();
} else if ((!"varchar".equals(dataType) || !"char".equals(dataType)) && fieldValue instanceof String) {
fieldValue = convertOptiqCellValue((String) fieldValue, dataType);
} else if ("bigint".equals(dataType) && fieldValue instanceof Double) {
fieldValue = ((Double) fieldValue).longValue();
}
values[idx] = fieldValue;
}