in runtime/src/main/java/com/google/cloud/verticals/foundations/dataharmonization/function/DefaultOverloadSelector.java [105:146]
public static double distance(@Nonnull Signature want, @Nonnull Data[] gotArgs) {
double sum = 0;
List<Class<? extends Data>> args = want.getArgs();
int i;
for (i = 0; i < args.size(); i++) {
if (i == args.size() - 1 && want.isVariadic()) {
boolean doNotUnpackArray = Array.class.isAssignableFrom(want.getLastArgType());
Data[] remainingGotArgs = normalizeVariadic(gotArgs, i, doNotUnpackArray);
if (!doNotUnpackArray
&& gotArgs.length == i + 1
&& gotArgs[i] != null
&& gotArgs[i].isArray()) {
sum += 0.1;
}
int finalI = i;
sum +=
stream(remainingGotArgs)
.mapToDouble(gotArg -> gotArg != null ? distance(args.get(finalI), gotArg) : 0)
.max()
.orElse(0);
i = gotArgs.length;
break;
}
// Not enough args given.
if (i >= gotArgs.length) {
return Double.POSITIVE_INFINITY;
}
if (gotArgs[i] == null) {
continue;
}
sum += distance(args.get(i), gotArgs[i]);
}
// Too many args given.
if (i < gotArgs.length) {
return Double.POSITIVE_INFINITY;
}
return sum;
}