in runtime/src/main/java/com/google/cloud/verticals/foundations/dataharmonization/function/DefaultOverloadSelector.java [59:95]
static double distance(@Nonnull Class<? extends Data> want, @Nonnull Data got) {
Set<Class<?>> gotClasses = new HashSet<>();
gotClasses.add(got.getClass());
if (gotClasses.contains(want) || (want.equals(NullData.class) && got.isNullOrEmpty())) {
return 0;
}
if (got.isArray()) {
gotClasses.add(Array.class);
}
if (got.isContainer()) {
gotClasses.add(Container.class);
}
if (got.isDataset()) {
gotClasses.add(Dataset.class);
}
if (got.isPrimitive()) {
gotClasses.add(Primitive.class);
}
if (Arrays.asList(got.getClass().getInterfaces()).contains(Data.class)) {
gotClasses.add(Data.class);
}
if (want.isInterface() && gotClasses.contains(want)) {
return 1;
}
if (want.isAssignableFrom(got.getClass())) {
return 2;
}
if (got.isClass(WrapperData.class) && got.isClass(want)) {
return WRAPPER_EPSILON + distance(want, got.asClass(want));
}
return Double.POSITIVE_INFINITY;
}