in runtime/src/main/java/com/google/cloud/verticals/foundations/dataharmonization/function/whistle/WhistleFunction.java [175:231]
private Target builtinSink(RuntimeContext context, String name, Data... args) {
// TODO(rpolyano): Give targets signatures and use regular overload selection.
Set<Target.Constructor> overloads =
context
.getRegistries()
.getTargetRegistry()
.getOverloads(ImmutableSet.of(Builtins.PACKAGE_NAME), name);
boolean multiple = false;
Target matching = null;
for (Target.Constructor overload : overloads) {
try {
Target target = overload.construct(context, args);
if (matching != null) {
multiple = true;
break;
}
matching = target;
} catch (IllegalArgumentException ex) {
// Noop.
}
}
if (matching == null) {
throw new NoMatchingOverloadsException(
new FunctionReference(Builtins.PACKAGE_NAME, name),
context
.getRegistries()
.getTargetRegistry()
.getBestMatchOverloads(
ImmutableSet.of(Builtins.PACKAGE_NAME), name, new LevenshteinDistance(2))
.keySet());
}
if (multiple) {
// TODO(rpolyano): Throw MultipleMatchingOverloadsException
throw new IllegalArgumentException(
String.format(
"Too many targets callable with given args.\nArgs: \n\t%s\nTargets: \n\t%s",
stream(args).map(a -> String.join("/", Core.types(a))).collect(joining("\n\t")),
overloads.stream()
.map(
c -> {
try {
return c.construct(context, args);
} catch (IllegalArgumentException ex) {
return null;
}
})
.filter(Objects::nonNull)
.map(Target::getClass)
.map(Class::getSimpleName)
.collect(joining("\n\t"))));
}
return matching;
}