mirror of
https://github.com/tiennm99/zfoo.git
synced 2026-05-21 06:24:38 +00:00
chore[orm]: simplify MapCodec
This commit is contained in:
@@ -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;
|
||||
|
||||
/**
|
||||
* 基础类型枚举
|
||||
* @Author:lqh
|
||||
* @Date:2024/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);
|
||||
}
|
||||
}
|
||||
+5
-4
@@ -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)
|
||||
* @Author:lqh
|
||||
* @Date:2024/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编码接口
|
||||
* @Author:lqh
|
||||
* @Date:2024/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;
|
||||
|
||||
/**
|
||||
* 基础类型枚举
|
||||
*
|
||||
* @Author:lqh
|
||||
* @Date:2024/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;
|
||||
|
||||
/**
|
||||
* @Author:lqh
|
||||
* @Date:2024/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;
|
||||
|
||||
/**
|
||||
* @Author:lqh
|
||||
* @Date:2024/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;
|
||||
|
||||
|
||||
/**
|
||||
* @Author:lqh
|
||||
* @Date:2024/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;
|
||||
|
||||
/**
|
||||
* @Author:lqh
|
||||
* @Date:2024/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;
|
||||
|
||||
/**
|
||||
* @Author:lqh
|
||||
* @Date:2024/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解析器
|
||||
*
|
||||
* @Author:lqh
|
||||
* @Date:2024/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解析器
|
||||
*
|
||||
* @Author:lqh
|
||||
* @Date:2024/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;
|
||||
|
||||
/**
|
||||
* @Author:lqh
|
||||
* @Date:2024/6/17 11:38
|
||||
*/
|
||||
public class ShortMapCodec implements MapKeyCodec<Short> {
|
||||
@Override
|
||||
public Short decode(String key) {
|
||||
return Short.valueOf(key);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user