private Target builtinSink()

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;
  }