public Target construct()

in runtime/src/main/java/com/google/cloud/verticals/foundations/dataharmonization/function/whistle/VarTarget.java [139:189]


    public Target construct(RuntimeContext ctx, Data... args) {
      if (args.length > 3
          || args.length == 0
          || stream(args).anyMatch(a -> !a.isPrimitive() || a.asPrimitive().string() == null)) {
        throw new IllegalArgumentException(
            String.format(
                "Must provide one to three string arguments to %s (provided %d) that specifies the"
                    + " variable to write to (optional, defaults to %s), the path on it to write,"
                    + " and the merge mode to use (optional, defaults to 'replace', if specified,"
                    + " var name must be specified too)."
                    + " E.x %1$s(\"my_var\",\".field1[0].field2\"):..., or"
                    + " %1$s(\".field1[0].field2\"):..., or"
                    + " %1$s(\"my_var\",\".field1[0].field2\", \"extend\"):...",
                getName(), args.length, WhistleFunction.OUTPUT_VAR));
      }

      String var = WhistleFunction.OUTPUT_VAR;
      Path path = Path.empty();
      MergeMode mode = DEFAULT_MERGE_MODE;

      if (args.length == 1) {
        // Merge with $this
        path = Path.parse(args[0].asPrimitive().string());

        // TODO(rpolyano): Uncomment when default merge mode depends on options (rather than being
        //  const)
        // if (path.isEmpty()) {
        //   mode = MergeMode.MERGE;
        // }
      }
      if (args.length >= 2) {
        var = args[0].asPrimitive().string();
        path = Path.parse(args[1].asPrimitive().string());

        if (!var.equals(WhistleFunction.OUTPUT_VAR) && path.isEmpty()) {
          mode = MergeMode.REPLACE;
        }
      }
      if (args.length == 3) {
        if (!MergeModeExperiment.isEnabled(ctx)) {
          throw new UnsupportedOperationException(
              String.format(
                  "Merge modes are an experimental feature and must be enabled by adding option"
                      + " \"%s\" to the top of your file.",
                  new MergeModeExperiment().getName()));
        }
        mode = MergeMode.valueOf(args[2].asPrimitive().string().toUpperCase(Locale.ROOT));
      }

      return new VarTarget(var, path, mode);
    }