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

58 lines
2.1 KiB
Java

package it.cavallium.data.generator.plugin;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import java.util.Comparator;
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<>();
private final ComputedVersion currentVersion;
public ComputedTypeSupplier(Int2ObjectMap<Map<String, ComputedType>> computedTypeMap, ComputedVersion currentVersion) {
this.computedTypeMap = computedTypeMap;
this.currentVersion = currentVersion;
}
public ComputedType get(VersionedType type) {
var computedType = computedTypeMap.get(type.version().getVersion()).get(type.type());
if (computedType == null) {
throw new IllegalStateException("Type " + type + " does not exist");
}
return computedType;
}
public ComputedType get(String type) {
return get(new VersionedType(type, currentVersion));
}
public Stream<ComputedType> getDependencies(VersionedType type) {
return computedTypeMap.get(type.version().getVersion()).get(type.type()).getDependencies();
}
public Stream<ComputedType> getDependents(VersionedType type) {
synchronized (computedTypeDependentsCacheMap) {
return computedTypeDependentsCacheMap
.computeIfAbsent(type.version().getVersion(), x -> new HashMap<>())
.computeIfAbsent(type.type(),
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())
.stream();
}
}
/**
* Get dependents from the current version
*/
public Stream<ComputedType> getDependents(String type) {
return getDependents(new VersionedType(type, currentVersion));
}
}