@@ -8,6 +8,8 @@ import com.fasterxml.jackson.databind.node.ObjectNode
8
8
import com.fasterxml.jackson.databind.node.TextNode
9
9
import io.airbyte.config.StreamDescriptor
10
10
import io.airbyte.protocol.models.AirbyteMessage
11
+ import io.airbyte.protocol.models.AirbyteRecordMessageMeta
12
+ import io.airbyte.protocol.models.AirbyteRecordMessageMetaChange
11
13
12
14
class JsonValueAdapter (private val node : JsonNode ) : Value {
13
15
override fun asBoolean (): Boolean = node.asBoolean()
@@ -38,6 +40,30 @@ data class AirbyteJsonRecordAdapter(private val message: AirbyteMessage) : Airby
38
40
data.set<JsonNode >(fieldName, createNode(value))
39
41
}
40
42
43
+ override fun trackFieldError (
44
+ fieldName : String ,
45
+ change : AirbyteRecord .Change ,
46
+ reason : AirbyteRecord .Reason ,
47
+ ) {
48
+ val metaChange =
49
+ AirbyteRecordMessageMetaChange ()
50
+ .withChange(change.toProtocol())
51
+ .withField(fieldName)
52
+ .withReason(reason.toProtocol())
53
+
54
+ // handling all the cascading layers of potential null objects
55
+ // very thread-unsafe
56
+ if (message.record != null ) {
57
+ if (message.record.meta == null ) {
58
+ message.record.withMeta(AirbyteRecordMessageMeta ().withChanges(mutableListOf ()))
59
+ }
60
+ if (message.record.meta.changes == null ) {
61
+ message.record.meta.withChanges(mutableListOf ())
62
+ }
63
+ message.record.meta.changes.add(metaChange)
64
+ }
65
+ }
66
+
41
67
private fun <T : Any > createNode (value : T ): JsonNode =
42
68
when (value) {
43
69
is Boolean -> BooleanNode .valueOf(value)
@@ -46,4 +72,15 @@ data class AirbyteJsonRecordAdapter(private val message: AirbyteMessage) : Airby
46
72
is String -> TextNode .valueOf(value)
47
73
else -> TODO (" Unsupported type ${value::class .java.name} " )
48
74
}
75
+
76
+ private fun AirbyteRecord.Change.toProtocol () =
77
+ when (this ) {
78
+ AirbyteRecord .Change .NULLED -> AirbyteRecordMessageMetaChange .Change .NULLED
79
+ AirbyteRecord .Change .TRUNCATED -> AirbyteRecordMessageMetaChange .Change .TRUNCATED
80
+ }
81
+
82
+ private fun AirbyteRecord.Reason.toProtocol () =
83
+ when (this ) {
84
+ AirbyteRecord .Reason .PLATFORM_SERIALIZATION_ERROR -> AirbyteRecordMessageMetaChange .Reason .PLATFORM_SERIALIZATION_ERROR
85
+ }
49
86
}
0 commit comments