package org.rakam.collection; import com.fasterxml.jackson.annotation.JsonCreator; public enum FieldType { STRING, INTEGER, DECIMAL, DOUBLE, LONG, BOOLEAN, DATE, TIME, TIMESTAMP, BINARY, ARRAY_STRING, ARRAY_INTEGER, ARRAY_DECIMAL, ARRAY_DOUBLE, ARRAY_LONG, ARRAY_BOOLEAN, ARRAY_DATE, ARRAY_TIME, ARRAY_TIMESTAMP, ARRAY_BINARY, MAP_STRING, MAP_INTEGER, MAP_DECIMAL, MAP_DOUBLE, MAP_LONG, MAP_BOOLEAN, MAP_DATE, MAP_TIME, MAP_TIMESTAMP, MAP_BINARY; private static final FieldType values[] = values(); @JsonCreator public static FieldType fromString(String key) { return key == null ? null : FieldType.valueOf(key.toUpperCase()); } public boolean isArray() { return ordinal() > 9 && !isMap(); } public boolean isMap() { return ordinal() > 19; } public boolean isNumeric() { return this == INTEGER || this == DECIMAL || this == DOUBLE || this == LONG; } public FieldType getArrayElementType() { if(!isArray()) { throw new IllegalStateException("type is not array"); } return values[ordinal() - 10]; } public FieldType getMapValueType() { if(!isMap()) { throw new IllegalStateException("type is not map"); } return values[ordinal() - 20]; } public FieldType convertToMapValueType() { if(isMap()) { throw new IllegalStateException("type is already a map"); } if(isArray()) { throw new IllegalStateException("type is already a array"); } return values[ordinal() + 20]; } public FieldType convertToArrayType() { if(ordinal() > 9) { throw new IllegalStateException("type is already array"); } return values[ordinal() + 10]; } public String getPrettyName() { if (isArray()) { return "ARRAY<"+getArrayElementType().toString()+">"; } if(isMap()) { return "MAP<STRING, "+getMapValueType().toString()+">"; } return toString(); } }