data-generator/data-generator-plugin/src/main/java/it/cavallium/data/generator/plugin/ComputedTypeSupplier.java

58 lines
2.1 KiB
Java
Raw Normal View History

2023-01-19 01:36:57 +01:00
package it.cavallium.data.generator.plugin;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
2023-01-20 01:14:37 +01:00
import java.util.Comparator;
2023-01-19 01:36:57 +01:00
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Stream;
public class ComputedTypeSupplier {
private final Int2ObjectMap<Map<String, ComputedType>> computedTypeMap;
private final Int2ObjectMap<Map<String, List<ComputedType>>> computedTypeDependentsCacheMap = new Int2ObjectOpenHashMap<>();
2023-01-20 01:14:37 +01:00
private final ComputedVersion currentVersion;
2023-01-19 01:36:57 +01:00
2023-01-20 01:14:37 +01:00
public ComputedTypeSupplier(Int2ObjectMap<Map<String, ComputedType>> computedTypeMap, ComputedVersion currentVersion) {
2023-01-19 01:36:57 +01:00
this.computedTypeMap = computedTypeMap;
2023-01-20 01:14:37 +01:00
this.currentVersion = currentVersion;
2023-01-19 01:36:57 +01:00
}
public ComputedType get(VersionedType type) {
2023-01-20 01:14:37 +01:00
var computedType = computedTypeMap.get(type.version().getVersion()).get(type.type());
2023-01-19 01:36:57 +01:00
if (computedType == null) {
throw new IllegalStateException("Type " + type + " does not exist");
}
return computedType;
}
2023-01-20 01:14:37 +01:00
public ComputedType get(String type) {
return get(new VersionedType(type, currentVersion));
}
2023-01-19 01:36:57 +01:00
public Stream<ComputedType> getDependencies(VersionedType type) {
2023-01-20 01:14:37 +01:00
return computedTypeMap.get(type.version().getVersion()).get(type.type()).getDependencies();
2023-01-19 01:36:57 +01:00
}
public Stream<ComputedType> getDependents(VersionedType type) {
synchronized (computedTypeDependentsCacheMap) {
return computedTypeDependentsCacheMap
2023-01-20 01:14:37 +01:00
.computeIfAbsent(type.version().getVersion(), x -> new HashMap<>())
2023-01-19 01:36:57 +01:00
.computeIfAbsent(type.type(),
2023-01-20 01:14:37 +01:00
typeName -> Objects.requireNonNull(computedTypeMap.get(type.version().getVersion()), () -> "Version " + type.version() + " does not exist")
.values().stream().filter(computedType ->
computedType.getDependencies().anyMatch(y -> Objects.equals(y.getName(), typeName))).toList())
2023-01-19 01:36:57 +01:00
.stream();
}
}
2023-01-20 01:14:37 +01:00
/**
* Get dependents from the current version
*/
public Stream<ComputedType> getDependents(String type) {
return getDependents(new VersionedType(type, currentVersion));
}
2023-01-19 01:36:57 +01:00
}