{"record":{"id":"902017203bd9c345","repo":"apache/seatunnel","slug":"unsupported-operation-902017","errorCode":"UNSUPPORTED_OPERATION","errorMessage":"Unsupported write row kind: ","messagePattern":"Unsupported write row kind: ","errorType":"error_code","errorClass":"EasysearchConnectorException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-easysearch/src/main/java/org/apache/seatunnel/connectors/seatunnel/easysearch/serialize/EasysearchRowSerializer.java","lineNumber":67,"sourceCode":"        this.indexSerializer =\n                IndexSerializerFactory.getIndexSerializer(indexInfo.getIndex(), seaTunnelRowType);\n        this.seaTunnelRowType = seaTunnelRowType;\n        this.keyExtractor =\n                KeyExtractor.createKeyExtractor(\n                        seaTunnelRowType, indexInfo.getPrimaryKeys(), indexInfo.getKeyDelimiter());\n    }\n\n    @Override\n    public String serializeRow(SeaTunnelRow row) {\n        switch (row.getRowKind()) {\n            case INSERT:\n            case UPDATE_AFTER:\n                return serializeUpsert(row);\n            case UPDATE_BEFORE:\n            case DELETE:\n                return serializeDelete(row);\n            default:\n                throw new EasysearchConnectorException(\n                        UNSUPPORTED_OPERATION, \"Unsupported write row kind: \" + row.getRowKind());\n        }\n    }\n\n    private String serializeUpsert(SeaTunnelRow row) {\n        String key = keyExtractor.apply(row);\n        Map<String, Object> document = toDocumentMap(row);\n\n        try {\n            if (key != null) {\n                Map<String, String> upsertMetadata = createMetadata(row, key);\n                /**\n                 * format example: { \"update\" : {\"_index\" : \"${your_index}\", \"_id\" :\n                 * \"${your_document_id}\"} }\\n { \"doc\" : ${your_document_json}, \"doc_as_upsert\" :\n                 * true }\n                 */\n                return new StringBuilder()\n                        .append(\"{ \\\"update\\\" :\")","sourceCodeStart":49,"sourceCodeEnd":85,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-easysearch/src/main/java/org/apache/seatunnel/connectors/seatunnel/easysearch/serialize/EasysearchRowSerializer.java#L49-L85","documentation":"EasysearchRowSerializer.serializeRow switches on the row's RowKind; only INSERT, UPDATE_AFTER, UPDATE_BEFORE and DELETE are serializable to bulk actions. Any other kind hits the default branch and throws UNSUPPORTED_OPERATION.","triggerScenarios":"Feeding a SeaTunnelRow with an unexpected RowKind (e.g. UPDATE_BEFORE forwarded when the serializer expected to skip it internally, or a custom RowKind) into the Easysearch sink with CDC/upsert mode.","commonSituations":"Upstream transform emitting row kinds not expected by the sink; misconfigured CDC pipeline where DELETE/UPDATE rows are disabled in sink options but still arrive; connector version mismatch changing RowKind handling.","solutions":["Check sink options controlling supported delete/update modes and align them with the data stream.","Filter or transform upstream so only INSERT/UPDATE_AFTER rows reach the sink if deletes are unsupported.","Review the upstream transform/connector emitting the unexpected RowKind.","Verify connector version consistency between transforms and sink."],"exampleFix":"// before\nrowStream.map(r -> r); // rows with unsupported kind reach sink\n// after\nrowStream.filter(r -> r.getRowKind() != RowKind.UPDATE_BEFORE);","handlingStrategy":"validation","validationCode":"if (row.getRowKind() != RowKind.INSERT && row.getRowKind() != RowKind.UPDATE_AFTER && row.getRowKind() != RowKind.DELETE) { throw new IllegalArgumentException(\"row kind not supported by easysearch sink: \" + row.getRowKind()); }","typeGuard":"boolean isSupportedKind(SeaTunnelRow r) { RowKind k = r.getRowKind(); return k == RowKind.INSERT || k == RowKind.UPDATE_AFTER || k == RowKind.DELETE; }","tryCatchPattern":"try { sink.write(row); } catch (EasysearchConnectorException e) { /* filter/convert row kind, or dead-letter the row */ }","preventionTips":["Filter UPDATE_BEFORE rows upstream","Align sink CDC options with upstream row kinds","Keep transform and connector versions consistent"],"tags":["easysearch","rowkind","serialization","cdc"],"backgroundTag":"unsupported-operation","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}