模型设计
public class StringFieldValue extends FieldValue {
public StringFieldValue(String value) {
this.value = value;
}
@Override
public String getSqlCondition() {
return "'" + this.value + "'";
}
@Override
public String getQlCondition() {
return this.value;
}
@Override
public String getValue() {
return value;
}
}
public class DoubleFieldValue extends FieldValue {
public DoubleFieldValue(Double value) {
this.value = value;
}
public DoubleFieldValue(String str){
this(Double.valueOf(str));
}
@Override
public String getSqlCondition() {
return String.valueOf(this.value);
}
@Override
public String getQlCondition() {
return String.valueOf(this.value);
}
@Override
public Double getValue() {
return this.value;
}
}
public class LongFieldValue extends FieldValue {
public LongFieldValue(Long value) {
this.value = value;
}
public LongFieldValue(String str){
this(Long.valueOf(str));
}
@Override
public String getSqlCondition() {
return String.valueOf(this.value);
}
@Override
public String getQlCondition() {
return String.valueOf(this.value);
}
@Override
public Long getValue() {
return this.value;
}
}
值类型对象解析器
fun parseFieldValue(fieldCondition: FieldCondition, fieldValueType: KFieldValueType): List?> {
val values = fieldCondition.values
if (values == null || values.isEmpty()) {
ExceptionHelper.bizError("illegal value size,values length must greater than 0.")
}
// 特征值类型
lateinit var clazz: Class>
when (fieldValueType) {
KFieldValueType.STRING -> clazz = StringFieldValue::class.java
KFieldValueType.LONG -> clazz = LongFieldValue::class.java
KFieldValueType.DOUBLE -> clazz = DoubleFieldValue::class.java
else -> ExceptionHelper.bizError("$fieldValueType fieldValueType not supported!")
}
return FieldValue.create(clazz, *values.toTypedArray())
}
定义表字段的值类型
public enum KFieldValueType {
STRING("string"),
LONG("long"),
DOUBLE("double"),
MAP_STRING_STRING("map_string_string"),
MAP_STRING_LONG("map_string_long"),
MAP_STRING_DOUBLE("map_string_double"),
LIST_STRING("list_string"),
BITMAP("bitmap"),
;
private final String value;
KFieldValueType(String value) {
this.value = value;
}
public String getValue() {
return this.value;
}
public static KFieldValueType getByValue(String value) {
if (value == null) {
return null;
}
for (KFieldValueType kFieldValueType : values()) {
if (kFieldValueType.value.equalsIgnoreCase(value)) {
return kFieldValueType;
}
}
return null;
}
public String map2HiveColumnType() {
switch (this) {
case STRING:
return "string";
case LONG:
return "bigint";
case DOUBLE:
return "double";
case MAP_STRING_STRING:
return "map";
case MAP_STRING_LONG:
return "map";
case MAP_STRING_DOUBLE:
return "map";
case LIST_STRING:
return "array";
case BITMAP:
return "array";
default:
throw new IllegalArgumentException("FIELD TYPE NOT SUPPORT");
}
}
public String map2ChColumnType() {
switch (this) {
case STRING:
return "String";
case LONG:
return "Int64";
case DOUBLE:
return "Float64";
case MAP_STRING_STRING:
return "Map(String,String)";
case MAP_STRING_LONG:
return "Map(String,Int64)";
case MAP_STRING_DOUBLE:
return "Map(String,Float64)";
case LIST_STRING:
return "Array(String)";
case BITMAP:
return "BitMap64 BitEngineEncode";
default:
throw ExceptionHelper.bizError("No such field type in clickhouse");
}
}
}