{"record":{"id":"b99f9e533460baa6","repo":"apache/beam","slug":"unable-to-find-translator-for-basic-operator-operatorclass","errorCode":null,"errorMessage":"Unable to find translator for basic operator [${operatorClass}] with name [${operatorName}]","messagePattern":"Unable to find translator for basic operator \\[(.+?)\\] with name \\[(.+?)\\]","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"sdks/java/extensions/euphoria/src/main/java/org/apache/beam/sdk/extensions/euphoria/core/translate/OperatorTransform.java","lineNumber":59,"sourceCode":"\n  public static <InputT, OutputT, OperatorT extends Operator<OutputT>> PCollection<OutputT> apply(\n      OperatorT operator, PCollectionList<InputT> inputs) {\n\n    final Optional<OperatorTranslator<InputT, OutputT, OperatorT>> maybeTranslator =\n        TranslatorProvider.of(inputs.getPipeline()).findTranslator(operator);\n\n    if (maybeTranslator.isPresent()) {\n      final PCollection<OutputT> output =\n          inputs.apply(\n              operator.getName().orElseGet(() -> operator.getClass().getName()),\n              new OperatorTransform<>(operator, maybeTranslator.orElse(null)));\n      Preconditions.checkState(\n          output.getTypeDescriptor() != null,\n          \"Translator should always return a typed PCollection.\");\n      return output;\n    }\n\n    throw new IllegalStateException(\n        \"Unable to find translator for basic operator [\"\n            + operator.getClass()\n            + \"] with name [\"\n            + operator.getName().orElse(null)\n            + \"]\");\n  }\n\n  private final OperatorT operator;\n  private final OperatorTranslator<InputT, OutputT, OperatorT> translator;\n\n  private OperatorTransform(\n      OperatorT operator, OperatorTranslator<InputT, OutputT, OperatorT> translator) {\n    this.operator = operator;\n    this.translator = translator;\n  }\n\n  @Override\n  public PCollection<OutputT> expand(PCollectionList<InputT> inputs) {","sourceCodeStart":41,"sourceCodeEnd":77,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/extensions/euphoria/src/main/java/org/apache/beam/sdk/extensions/euphoria/core/translate/OperatorTransform.java#L41-L77","documentation":"OperatorTransform.apply looks up a translator for a Euphoria operator via TranslatorProvider/Visitor; if no translator is registered for the operator's class it throws IllegalStateException. Every basic operator must have a matching translator in the provider registry.","triggerScenarios":"Calling pipeline.apply(operator output) with a custom operator subclass or an operator whose translator is not registered in the TranslatorProvider passed to the translation.","commonSituations":"Adding a new custom Euphoria operator without registering its translator; wiring the wrong TranslatorProvider into a test or pipeline; typos in translator registration.","solutions":["Register a translator for the operator class in your TranslatorProvider/builder","Use a built-in Euphoria operator instead of the custom one","Check that the provider passed to OperatorTransform includes the needed translator (e.g. via DefaultTranslatorProvider)","Ensure operator.getClass() matches the class key used at registration (no anonymous/subclass mismatch)"],"exampleFix":"// before\nTranslatorProvider provider = DefaultTranslatorProvider.of(); // custom Op has no translator\n// after\nTranslatorProvider provider = TranslatorProvider CompositeBuilder of(DefaultTranslatorProvider.of())\n    .addTranslator(Op.class, new OpTranslator()).build();","handlingStrategy":"validation","validationCode":"if (provider.findTranslator(operator.getClass()) == null) { throw new IllegalArgumentException(\"No translator registered for \" + operator.getClass()); }","typeGuard":"boolean hasTranslator(Operator<?> op, TranslatorProvider p) { return p.findTranslator(op.getClass()) != null; }","tryCatchPattern":"try { OperatorTransform.apply(operator, input, context); } catch (IllegalStateException e) { /* register translator or fall back to built-in operator */ }","preventionTips":["Register a translator for every custom operator","Use DefaultTranslatorProvider as base and extend it","Verify with a unit test that all operators in the pipeline resolve translators"],"tags":["missing-translator","operator-registration","beam","euphoria"],"backgroundTag":"resource-not-found","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-20T03:17:13.778Z"}