{"record":{"id":"b1c2cda5fdeb9517","repo":"apache/beam","slug":"boolean-cross-product-parameter-required-to-explode-more","errorCode":null,"errorMessage":"boolean cross product parameter required to explode more than one field","messagePattern":"boolean cross product parameter required to explode more than one field","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/transforms/providers/JavaExplodeTransformProvider.java","lineNumber":158,"sourceCode":"              .get(INPUT_ROWS_TAG)\n              .apply(\n                  \"Explode\",\n                  ParDo.of(\n                      createDoFn(\n                          configuration.getFields(),\n                          configuration.getCrossProduct(),\n                          outputSchema)));\n      result.setRowSchema(outputSchema);\n\n      return PCollectionRowTuple.of(OUTPUT_ROWS_TAG, result);\n    }\n\n    private static DoFn<Row, Row> createDoFn(\n        List<String> fields, Boolean crossProductObj, Schema outputSchema) {\n      boolean crossProduct;\n      if (crossProductObj == null) {\n        if (fields.size() > 1) {\n          throw new IllegalArgumentException(\n              \"boolean cross product parameter required to explode more than one field\");\n        }\n        crossProduct = false;\n      } else {\n        crossProduct = crossProductObj;\n      }\n      int numFields = outputSchema.getFields().size();\n      boolean[] toExplode =\n          Booleans.toArray(\n              IntStream.range(0, numFields)\n                  .mapToObj(index -> fields.contains(outputSchema.getField(index).getName()))\n                  .collect(Collectors.toList()));\n      if (crossProduct) {\n        return new DoFn<Row, Row>() {\n          @ProcessElement\n          public void processElement(@Element Row inputRow, OutputReceiver<Row> out) {\n            emitCrossProduct(inputRow, 0, new Object[numFields], out);\n          }","sourceCodeStart":140,"sourceCodeEnd":176,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/transforms/providers/JavaExplodeTransformProvider.java#L140-L176","documentation":"When exploding multiple fields, the transform needs to know whether to produce the cross product of elements across fields or explode them independently. If the 'crossProduct' configuration option is null (unset) and more than one field is configured, this IllegalArgumentException is thrown because the semantics would be ambiguous.","triggerScenarios":"Constructing the transform with a fields list of size > 1 and crossProduct left as null; createDoFn is called during expand() with crossProductObj == null.","commonSituations":"Forgetting to set the crossProduct boolean when configuring explosion of 2+ fields; config deserialization that omits the optional boolean.","solutions":["Explicitly set the crossProduct boolean (true or false) when exploding more than one field","Explode one field per transform instance if cross-product semantics are not needed","Default the config value in your pipeline configuration file"],"exampleFix":"// before\nJavaExplodeTransformProvider.configure().setFields(Arrays.asList(\"a\", \"b\")).create();\n// after\nJavaExplodeTransformProvider.configure().setFields(Arrays.asList(\"a\", \"b\")).setCrossProduct(true).create();","handlingStrategy":"validation","validationCode":"if (fields != null && fields.size() > 1 && crossProduct == null)\n  throw new IllegalArgumentException(\"crossProduct must be set when exploding multiple fields\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always set crossProduct explicitly when exploding more than one field","Centralize transform configuration construction to enforce this rule"],"tags":["java","apache-beam","configuration"],"backgroundTag":"missing-required-argument","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}