{"record":{"id":"11b8c284e6d55828","repo":"apache/beam","slug":"not-implemented-yet-fielddescriptor-getmessagetype-getname","errorCode":null,"errorMessage":"Not implemented yet ${fieldDescriptor.getMessageType().getName()}","messagePattern":"Not implemented yet (.+?)","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigquery/TableRowToStorageApiProto.java","lineNumber":1910,"sourceCode":"          case MESSAGE:\n            // Handle the various number wrapper types.\n            Message doubleMessage = (Message) fieldValue;\n            if (FLOAT_VALUE_DESCRIPTOR_NAMES.contains(fieldDescriptor.getMessageType().getName())) {\n              float floatValue =\n                  (float)\n                      doubleMessage.getField(\n                          doubleMessage.getDescriptorForType().findFieldByName(\"value\"));\n\n              return DECIMAL_FORMAT.format(floatValue);\n            } else if (DOUBLE_VALUE_DESCRIPTOR_NAMES.contains(\n                fieldDescriptor.getMessageType().getName())) {\n              double doubleValue =\n                  (double)\n                      doubleMessage.getField(\n                          doubleMessage.getDescriptorForType().findFieldByName(\"value\"));\n              return DECIMAL_FORMAT.format(doubleValue);\n            } else {\n              throw new RuntimeException(\n                  \"Not implemented yet \" + fieldDescriptor.getMessageType().getName());\n            }\n          default:\n            return fieldValue.toString();\n        }\n      case BOOL:\n        // Wrapper type.\n        if (fieldDescriptor.getType().equals(FieldDescriptor.Type.MESSAGE)) {\n          Message boolMessage = (Message) fieldValue;\n          if (BOOL_VALUE_DESCRIPTOR_NAMES.contains(fieldDescriptor.getMessageType().getName())) {\n            return boolMessage\n                .getField(boolMessage.getDescriptorForType().findFieldByName(\"value\"))\n                .toString();\n          } else {\n            throw new RuntimeException(\n                \"Not implemented yet \" + fieldDescriptor.getMessageType().getName());\n          }\n        }","sourceCodeStart":1892,"sourceCodeEnd":1928,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigquery/TableRowToStorageApiProto.java#L1892-L1928","documentation":"In the proto-to-TableRow direction, message-typed fields are only decoded for known message types (e.g. numeric/decimal wrapper messages); any other message type reaches a RuntimeException 'Not implemented yet <messageName>'. It marks an unhandled nested message kind in the reverse conversion.","triggerScenarios":"Reading rows back from the Storage API proto (e.g. in CDC or test harness code) where a field's DynamicMessage has a message type other than the recognized numeric wrappers — e.g. a custom or newer logical-type message.","commonSituations":"Schemas containing logical types that map to custom proto messages; Beam internal decimal/timestamp wrappers handled for some but not all types; testing round-trips with hand-crafted protos.","solutions":["Avoid unsupported logical/message-typed columns in the read path or convert them to primitives.","Add/extend the conversion case for the message type if you control the code (fork/patch or upstream PR).","Upgrade Beam — new message types get implemented over time.","Flatten the nested message into primitive columns in your schema."],"exampleFix":"// before\nfield is message type MyLogicalType -> RuntimeException\n// after\nstore as underlying primitive (e.g. STRING/BYTES) and decode in user code","handlingStrategy":"fallback","validationCode":"boolean decodable(FieldDescriptor fd) { return fd.getType() != FieldDescriptor.Type.MESSAGE || KNOWN_MESSAGE_TYPES.contains(fd.getMessageType().getName()); }","typeGuard":"boolean isKnownMessageType(FieldDescriptor fd) { return fd.getMessageType() == null || Set.of(\"BigDecimal\",\"DecimalWrapper\",\"Timestamp\",\"date\").contains(fd.getMessageType().getName()); }","tryCatchPattern":"try { protoToTableRow(message); } catch (RuntimeException e) { if (e.getMessage().startsWith(\"Not implemented yet\")) fallBackToRawStringField(e); else throw e; }","preventionTips":["Prefer primitive BQ column types when data must be read back through this converter","Keep Beam up to date so newly implemented message types are available","Handle custom logical types in user code instead of relying on the built-in decoder"],"tags":["bigquery","protobuf","not-implemented","java"],"backgroundTag":"method-not-implemented","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"}