package com.aliyun.odps.type;
import java.util.ArrayList;
import java.util.List;
import com.aliyun.odps.OdpsType;
/**
* Odps struct 类型
*
* Created by zhenhong.gzh on 16/7/8.
*/
class SimpleStructTypeInfo implements StructTypeInfo {
private List<String> fieldNames;
private List<TypeInfo> fieldTypeInfos;
/**
* 创建 odps struct 类型
*
* @param names
* struct 中字段的名称列表
* @param typeInfos
* struct 中字段的类型列表
*/
SimpleStructTypeInfo(List<String> names, List<TypeInfo> typeInfos) {
validateParameters(names, typeInfos);
this.fieldNames = toLowerCase(names);
this.fieldTypeInfos = new ArrayList<TypeInfo>(typeInfos);
}
private List<String> toLowerCase(List<String> names)
{
List<String> lowerNames = new ArrayList<String>(names.size());
for (String name : names) {
lowerNames.add(name.toLowerCase());
}
return lowerNames;
}
private void validateParameters(List<String> names, List<TypeInfo> typeInfos) {
if (names == null || typeInfos == null || names.isEmpty() || typeInfos.isEmpty()) {
throw new IllegalArgumentException("Invalid name or element type for struct.");
}
if (names.size() != typeInfos.size()) {
throw new IllegalArgumentException(
"The amount of field names must be equal to the amount of field types.");
}
}
@Override
public String getTypeName() {
StringBuilder stringBuilder = new StringBuilder(getOdpsType().name());
stringBuilder.append("<");
for (int i = 0; i < fieldNames.size(); ++i) {
if (i > 0) {
stringBuilder.append(",");
}
stringBuilder.append(fieldNames.get(i));
stringBuilder.append(":");
stringBuilder.append(fieldTypeInfos.get(i).getTypeName());
}
stringBuilder.append(">");
return stringBuilder.toString();
}
/**
* 获取字段的名称列表
*
* @return 字段名称列表
*/
@Override
public List<String> getFieldNames() {
return fieldNames;
}
/**
* 获取字段的类型列表
*
* @return 字段类型列表
*/
@Override
public List<TypeInfo> getFieldTypeInfos() {
return fieldTypeInfos;
}
/**
* 获取字段数量
*
* @return 字段数量
*/
@Override
public int getFieldCount() {
return fieldNames.size();
}
@Override
public OdpsType getOdpsType() {
return OdpsType.STRUCT;
}
@Override
public String toString() {
return getTypeName();
}
}