chore[orm]: simplify MapCodec

This commit is contained in:
godotg
2024-06-17 16:44:14 +08:00
parent 193eb40dbe
commit a56c4e0072
13 changed files with 69 additions and 207 deletions
@@ -1,63 +0,0 @@
package com.zfoo.orm.codec;
import com.zfoo.orm.codec.basetype.*;
import java.io.Serializable;
import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 基础类型枚举
* @Authorlqh
* @Date2024/6/17 11:41
*/
public enum BaseTypeEnum {
Character(Character.class, new CharacterMapCodec()),
Boolean(Boolean.class, new BooleanMapCodec()),
Byte(Byte.class, new ByteMapCodec()),
Short(Short.class, new ShortMapCodec()),
Integer(Integer.class, new IntMapCodec()),
Long(Long.class, new LongMapCodec()),
Float(Float.class, new FloatMapCodec()),
Double(Double.class, new DoubleMapCodec()),
;
private final Class<?> clazz;
private final MapKeyCodec<? extends Serializable> mapKeyCodec;
BaseTypeEnum(Class<?> clazz, MapKeyCodec<? extends Serializable> mapKeyCodec) {
this.clazz = clazz;
this.mapKeyCodec = mapKeyCodec;
}
public static final Map<Class<?>, MapKeyCodec<? extends Serializable>> baseTypeMap = Arrays.stream(values()).collect(Collectors.toMap(BaseTypeEnum::getClazz, BaseTypeEnum::getMapKeyCodec));
public Class<?> getClazz() {
return clazz;
}
public MapKeyCodec<? extends Serializable> getMapKeyCodec() {
return mapKeyCodec;
}
public static boolean containsKeyType(Class<?> keyClass){
return baseTypeMap.containsKey(keyClass);
}
public static MapKeyCodec<? extends Serializable> getCodec(Class<?> clazz) {
return baseTypeMap.get(clazz);
}
}
@@ -9,19 +9,20 @@ import org.bson.codecs.EncoderContext;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
/**
* 基础类型作为key的map解析器 (key 默认不能为null)
* @Authorlqh
* @Date2024/6/17 13:55
*/
public class BaseTypeKeyMapCodec<K,V> implements Codec<Map<K, V>> {
public class MapCodec<K, V> implements Codec<Map<K, V>> {
private final Class<Map<K, V>> encoderClass;
private final Codec<K> keyCodec;
private final Codec<V> valueCodec;
BaseTypeKeyMapCodec(final Class<Map<K, V>> encoderClass, final Codec<K> keyCodec, final Codec<V> valueCodec) {
MapCodec(final Class<Map<K, V>> encoderClass, final Codec<K> keyCodec, final Codec<V> valueCodec) {
this.encoderClass = encoderClass;
this.keyCodec = keyCodec;
this.valueCodec = valueCodec;
@@ -50,8 +51,8 @@ public class BaseTypeKeyMapCodec<K,V> implements Codec<Map<K, V>> {
reader.readStartDocument();
var map = new HashMap<K, V>();
while (BsonType.END_OF_DOCUMENT != reader.readBsonType()) {
MapKeyCodec<K> codec = (MapKeyCodec<K>) BaseTypeEnum.getCodec(keyCodec.getEncoderClass());
K key = codec.decode(reader.readName());
var keyDecodeFunction = (Function<String, K>) MapKeyCodecEnum.keyDecode(keyCodec.getEncoderClass());
K key = keyDecodeFunction.apply(reader.readName());
V value = null;
if (BsonType.NULL == reader.getCurrentBsonType()) {
reader.readNull();
@@ -25,8 +25,8 @@ public class MapCodecProvider implements PropertyCodecProvider {
}
var keyType = typeParameters.get(0);
var valueType = typeParameters.get(1);
if (BaseTypeEnum.containsKeyType(keyType.getType())){
return new BaseTypeKeyMapCodec(type.getType(), registry.get(keyType), registry.get(valueType));
if (MapKeyCodecEnum.containsKeyDecode(keyType.getType())) {
return new MapCodec(type.getType(), registry.get(keyType), registry.get(valueType));
}
return null;
}
@@ -1,13 +0,0 @@
package com.zfoo.orm.codec;
/**
* map key编码接口
* @Authorlqh
* @Date2024/6/17 13:51
*/
public interface MapKeyCodec<K> {
/**
* 解析
*/
K decode(String key);
}
@@ -0,0 +1,62 @@
package com.zfoo.orm.codec;
import java.util.Arrays;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 基础类型枚举
*
* @Authorlqh
* @Date2024/6/17 11:41
*/
public enum MapKeyCodecEnum {
char_key(Character.class, (Function<String, Character>) key -> key.charAt(0)),
bool_key(Boolean.class, (Function<String, Boolean>) Boolean::valueOf),
byte_key(Byte.class, (Function<String, Byte>) Byte::valueOf),
short_key(Short.class, (Function<String, Short>) Short::valueOf),
int_key(Integer.class, (Function<String, Integer>) Integer::valueOf),
long_key(Long.class, (Function<String, Long>) Long::valueOf),
float_key(Float.class, (Function<String, Float>) Float::valueOf),
double_key(Double.class, (Function<String, Double>) Double::valueOf),
;
private final Class<?> keyType;
private final Function<String, ?> keyDecodeFunction;
MapKeyCodecEnum(Class<?> keyType, Function<String, ?> keyDecodeFunction) {
this.keyType = keyType;
this.keyDecodeFunction = keyDecodeFunction;
}
public static final Map<Class<?>, Function<String, ?>> keyDecodeMap = Arrays.stream(values()).collect(Collectors.toMap(MapKeyCodecEnum::getKeyType, MapKeyCodecEnum::getKeyDecodeFunction));
public Class<?> getKeyType() {
return keyType;
}
public Function<String, ?> getKeyDecodeFunction() {
return keyDecodeFunction;
}
public static boolean containsKeyDecode(Class<?> keyClass) {
return keyDecodeMap.containsKey(keyClass);
}
public static Function<String, ?> keyDecode(Class<?> clazz) {
return keyDecodeMap.get(clazz);
}
}
@@ -1,15 +0,0 @@
package com.zfoo.orm.codec.basetype;
import com.zfoo.orm.codec.MapKeyCodec;
/**
* @Authorlqh
* @Date2024/6/17 11:32
*/
public class BooleanMapCodec implements MapKeyCodec<Boolean> {
@Override
public Boolean decode(String key) {
return Boolean.valueOf(key);
}
}
@@ -1,15 +0,0 @@
package com.zfoo.orm.codec.basetype;
import com.zfoo.orm.codec.MapKeyCodec;
/**
* @Authorlqh
* @Date2024/6/17 11:39
*/
public class ByteMapCodec implements MapKeyCodec<Byte> {
@Override
public Byte decode(String key) {
return Byte.valueOf(key);
}
}
@@ -1,17 +0,0 @@
package com.zfoo.orm.codec.basetype;
import com.zfoo.orm.codec.MapKeyCodec;
/**
* @Authorlqh
* @Date2024/6/17 11:34
*/
public class CharacterMapCodec implements MapKeyCodec<Character> {
@Override
public Character decode(String key) {
return key.charAt(0);
}
}
@@ -1,15 +0,0 @@
package com.zfoo.orm.codec.basetype;
import com.zfoo.orm.codec.MapKeyCodec;
/**
* @Authorlqh
* @Date2024/6/17 11:35
*/
public class DoubleMapCodec implements MapKeyCodec<Double> {
@Override
public Double decode(String key) {
return Double.valueOf(key);
}
}
@@ -1,15 +0,0 @@
package com.zfoo.orm.codec.basetype;
import com.zfoo.orm.codec.MapKeyCodec;
/**
* @Authorlqh
* @Date2024/6/17 11:38
*/
public class FloatMapCodec implements MapKeyCodec<Float> {
@Override
public Float decode(String key) {
return Float.valueOf(key);
}
}
@@ -1,17 +0,0 @@
package com.zfoo.orm.codec.basetype;
import com.zfoo.orm.codec.MapKeyCodec;
/**
* map解析器
*
* @Authorlqh
* @Date2024/6/14 10:32
*/
public class IntMapCodec implements MapKeyCodec<Integer> {
@Override
public Integer decode(String key) {
return Integer.valueOf(key);
}
}
@@ -1,17 +0,0 @@
package com.zfoo.orm.codec.basetype;
import com.zfoo.orm.codec.MapKeyCodec;
/**
* map解析器
*
* @Authorlqh
* @Date2024/6/14 10:32
*/
public class LongMapCodec implements MapKeyCodec<Long> {
@Override
public Long decode(String key) {
return Long.valueOf(key);
}
}
@@ -1,14 +0,0 @@
package com.zfoo.orm.codec.basetype;
import com.zfoo.orm.codec.MapKeyCodec;
/**
* @Authorlqh
* @Date2024/6/17 11:38
*/
public class ShortMapCodec implements MapKeyCodec<Short> {
@Override
public Short decode(String key) {
return Short.valueOf(key);
}
}