CavalliumDBEngine/src/main/java/it/cavallium/dbengine/client/query/QueryMoshi.java

88 lines
3.4 KiB
Java
Raw Normal View History

2021-05-07 12:05:14 +02:00
package it.cavallium.dbengine.client.query;
2021-06-20 01:09:06 +02:00
import com.squareup.moshi.JsonAdapter;
import it.cavallium.dbengine.buffers.Buf;
2021-06-20 01:09:06 +02:00
import it.cavallium.dbengine.client.IntOpenHashSetJsonAdapter;
2021-05-07 12:05:14 +02:00
import it.cavallium.dbengine.client.query.current.CurrentVersion;
2023-01-22 01:48:35 +01:00
import it.cavallium.dbengine.client.query.current.IBaseType;
import it.cavallium.dbengine.client.query.current.IType;
import it.cavallium.dbengine.utils.BooleanListJsonAdapter;
import it.cavallium.dbengine.utils.ByteListJsonAdapter;
import it.cavallium.dbengine.utils.CharListJsonAdapter;
import it.cavallium.dbengine.utils.IntListJsonAdapter;
import it.cavallium.dbengine.utils.LongListJsonAdapter;
import it.cavallium.dbengine.utils.MoshiPolymorphic;
import it.cavallium.dbengine.utils.ShortListJsonAdapter;
2021-06-20 01:09:06 +02:00
import it.unimi.dsi.fastutil.booleans.BooleanList;
import it.unimi.dsi.fastutil.chars.CharList;
import it.unimi.dsi.fastutil.ints.IntList;
import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
import it.unimi.dsi.fastutil.longs.LongList;
2022-02-11 15:29:30 +01:00
import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
import it.unimi.dsi.fastutil.objects.Object2ObjectMaps;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
2021-06-20 01:09:06 +02:00
import it.unimi.dsi.fastutil.shorts.ShortList;
2021-05-07 12:05:14 +02:00
import java.util.HashSet;
2021-06-20 01:09:06 +02:00
import java.util.Map;
2021-05-07 12:05:14 +02:00
import java.util.Set;
public class QueryMoshi extends MoshiPolymorphic<IType> {
private final Set<Class<IType>> abstractClasses;
private final Set<Class<IType>> concreteClasses;
2021-06-20 01:09:06 +02:00
private final Map<Class<?>, JsonAdapter<?>> extraAdapters;
2021-05-07 12:05:14 +02:00
@SuppressWarnings({"unchecked", "RedundantCast", "rawtypes"})
public QueryMoshi() {
2021-07-13 23:07:39 +02:00
super(true, GetterStyle.RECORDS_GETTERS);
2021-05-07 12:05:14 +02:00
HashSet<Class<IType>> abstractClasses = new HashSet<>();
HashSet<Class<IType>> concreteClasses = new HashSet<>();
2021-06-20 01:09:06 +02:00
// Add all super types with their implementations
2021-05-07 12:05:14 +02:00
for (var superTypeClass : CurrentVersion.getSuperTypeClasses()) {
2023-01-22 01:48:35 +01:00
for (Class<? extends IBaseType> superTypeSubtypesClass : CurrentVersion.getSuperTypeSubtypesClasses(
2021-05-07 12:05:14 +02:00
superTypeClass)) {
concreteClasses.add((Class<IType>) (Class) superTypeSubtypesClass);
}
abstractClasses.add((Class<IType>) (Class) superTypeClass);
}
2021-06-20 01:09:06 +02:00
2023-01-22 01:48:35 +01:00
// Add IBaseType with all basic types
abstractClasses.add((Class<IType>) (Class) IBaseType.class);
for (BaseType BaseType : BaseType.values()) {
concreteClasses.add((Class<IType>) (Class) CurrentVersion.getClass(BaseType));
2021-06-20 01:09:06 +02:00
}
2021-05-07 12:05:14 +02:00
this.abstractClasses = abstractClasses;
this.concreteClasses = concreteClasses;
2022-02-11 15:29:30 +01:00
Object2ObjectMap<Class<?>, JsonAdapter<?>> extraAdapters = new Object2ObjectOpenHashMap<>();
2021-06-20 01:09:06 +02:00
extraAdapters.put(BooleanList.class, new BooleanListJsonAdapter());
extraAdapters.put(Buf.class, new ByteListJsonAdapter());
2021-06-20 01:09:06 +02:00
extraAdapters.put(ShortList.class, new ShortListJsonAdapter());
extraAdapters.put(CharList.class, new CharListJsonAdapter());
extraAdapters.put(IntList.class, new IntListJsonAdapter());
extraAdapters.put(LongList.class, new LongListJsonAdapter());
extraAdapters.put(IntOpenHashSet.class, new IntOpenHashSetJsonAdapter());
2022-02-11 15:29:30 +01:00
this.extraAdapters = Object2ObjectMaps.unmodifiable(extraAdapters);
2021-06-20 01:09:06 +02:00
}
@Override
public Map<Class<?>, JsonAdapter<?>> getExtraAdapters() {
return extraAdapters;
2021-05-07 12:05:14 +02:00
}
@Override
protected Set<Class<IType>> getAbstractClasses() {
return abstractClasses;
}
@Override
protected Set<Class<IType>> getConcreteClasses() {
return concreteClasses;
}
@Override
protected boolean shouldIgnoreField(String fieldName) {
2021-06-20 01:09:06 +02:00
return fieldName.contains("$");
2021-05-07 12:05:14 +02:00
}
}