mirror of
https://github.com/tiennm99/zfoo.git
synced 2026-10-17 02:14:58 +00:00
chore[orm]: simplify MapCodec
This commit is contained in:
1 parent
193eb40dbe
commit
a56c4e0072
13 files changed
+69
-207
No files matched your search
@@ -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.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 基础类型作为key的map解析器 (key 默认不能为null)
|
* 基础类型作为key的map解析器 (key 默认不能为null)
|
||||||
* @Author:lqh
|
* @Author:lqh
|
||||||
* @Date:2024/6/17 13:55
|
* @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 Class<Map<K, V>> encoderClass;
|
||||||
private final Codec<K> keyCodec;
|
private final Codec<K> keyCodec;
|
||||||
private final Codec<V> valueCodec;
|
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.encoderClass = encoderClass;
|
||||||
this.keyCodec = keyCodec;
|
this.keyCodec = keyCodec;
|
||||||
this.valueCodec = valueCodec;
|
this.valueCodec = valueCodec;
|
||||||
@@ -50,8 +51,8 @@ public class BaseTypeKeyMapCodec<K,V> implements Codec<Map<K, V>> {
|
|||||||
reader.readStartDocument();
|
reader.readStartDocument();
|
||||||
var map = new HashMap<K, V>();
|
var map = new HashMap<K, V>();
|
||||||
while (BsonType.END_OF_DOCUMENT != reader.readBsonType()) {
|
while (BsonType.END_OF_DOCUMENT != reader.readBsonType()) {
|
||||||
MapKeyCodec<K> codec = (MapKeyCodec<K>) BaseTypeEnum.getCodec(keyCodec.getEncoderClass());
|
var keyDecodeFunction = (Function<String, K>) MapKeyCodecEnum.keyDecode(keyCodec.getEncoderClass());
|
||||||
K key = codec.decode(reader.readName());
|
K key = keyDecodeFunction.apply(reader.readName());
|
||||||
V value = null;
|
V value = null;
|
||||||
if (BsonType.NULL == reader.getCurrentBsonType()) {
|
if (BsonType.NULL == reader.getCurrentBsonType()) {
|
||||||
reader.readNull();
|
reader.readNull();
|
||||||
@@ -25,8 +25,8 @@ public class MapCodecProvider implements PropertyCodecProvider {
|
|||||||
}
|
}
|
||||||
var keyType = typeParameters.get(0);
|
var keyType = typeParameters.get(0);
|
||||||
var valueType = typeParameters.get(1);
|
var valueType = typeParameters.get(1);
|
||||||
if (BaseTypeEnum.containsKeyType(keyType.getType())){
|
if (MapKeyCodecEnum.containsKeyDecode(keyType.getType())) {
|
||||||
return new BaseTypeKeyMapCodec(type.getType(), registry.get(keyType), registry.get(valueType));
|
return new MapCodec(type.getType(), registry.get(keyType), registry.get(valueType));
|
||||||
}
|
}
|
||||||
return null;
|
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