11package streams.kafka.connect.sink
22
33import com.github.jcustenborder.kafka.connect.utils.data.AbstractConverter
4+ import com.google.common.base.Preconditions
45import org.apache.kafka.connect.data.Schema
56import org.apache.kafka.connect.data.Struct
7+ import org.apache.kafka.connect.errors.DataException
68import org.neo4j.driver.v1.Values
79import java.math.BigDecimal
10+ import java.math.BigInteger
811import java.time.LocalTime
912import java.time.ZoneId
1013import java.util.*
1114import java.util.concurrent.TimeUnit
1215
1316
14- class ValueConverter : AbstractConverter <MutableMap <String , Any >>() {
17+ class ValueConverter : AbstractConverter <MutableMap <String , Any ? >>() {
1518
1619 private val UTC = ZoneId .of(" UTC" )
1720
18- private fun setValue (result : MutableMap <String , Any >? , fieldName : String? , value : Any? ) {
19- if (result != null && fieldName != null && value != null ) {
20- result[fieldName] = Values .value(value)
21+ private fun setValue (result : MutableMap <String , Any ? >? , fieldName : String? , value : Any? ) {
22+ if (result != null && fieldName != null ) {
23+ result[fieldName] = Values .value(value) ? : Values . NULL
2124 }
2225 }
2326
24- override fun newValue (): MutableMap <String , Any > {
27+ override fun newValue (): MutableMap <String , Any ? > {
2528 return mutableMapOf ()
2629 }
2730
28- override fun setBytesField (result : MutableMap <String , Any >? , fieldName : String? , value : ByteArray? ) {
31+ override fun setBytesField (result : MutableMap <String , Any ? >? , fieldName : String? , value : ByteArray? ) {
2932 setValue(result, fieldName, value)
3033 }
3134
32- override fun setStringField (result : MutableMap <String , Any >? , fieldName : String? , value : String? ) {
35+ override fun setStringField (result : MutableMap <String , Any ? >? , fieldName : String? , value : String? ) {
3336 setValue(result, fieldName, value)
3437 }
3538
36- override fun setFloat32Field (result : MutableMap <String , Any >? , fieldName : String? , value : Float? ) {
39+ override fun setFloat32Field (result : MutableMap <String , Any ? >? , fieldName : String? , value : Float? ) {
3740 setValue(result, fieldName, value)
3841 }
3942
40- override fun setInt32Field (result : MutableMap <String , Any >? , fieldName : String? , value : Int? ) {
43+ override fun setInt32Field (result : MutableMap <String , Any ? >? , fieldName : String? , value : Int? ) {
4144 setValue(result, fieldName, value)
4245 }
4346
44- override fun setArray (result : MutableMap <String , Any >? , fieldName : String? , schema : Schema ? , array : MutableList <Any ?>? ) {
45- setValue(result, fieldName, array)
47+ override fun setArray (result : MutableMap <String , Any ?>? , fieldName : String? , schema : Schema ? , array : MutableList <Any ?>? ) {
48+ val convertedArray = array?.map { convertInner(it) }
49+ setValue(result, fieldName, convertedArray)
4650 }
4751
48- override fun setTimestampField (result : MutableMap <String , Any >? , fieldName : String? , value : Date ? ) {
52+ override fun setTimestampField (result : MutableMap <String , Any ? >? , fieldName : String? , value : Date ? ) {
4953 if (value != null ) {
5054 val localDate = value.toInstant().atZone(UTC ).toLocalDateTime()
5155 setValue(result, fieldName, localDate)
56+ } else {
57+ setNullField(result, fieldName)
5258 }
5359
5460 }
5561
56- override fun setTimeField (result : MutableMap <String , Any >? , fieldName : String? , value : Date ? ) {
62+ override fun setTimeField (result : MutableMap <String , Any ? >? , fieldName : String? , value : Date ? ) {
5763 if (value != null ) {
5864 val time = LocalTime .ofNanoOfDay(TimeUnit .MILLISECONDS .toNanos(value.time))
5965 setValue(result, fieldName, time)
66+ } else {
67+ setNullField(result, fieldName)
6068 }
6169 }
6270
63- override fun setInt8Field (result : MutableMap <String , Any >? , fieldName : String? , value : Byte? ) {
71+ override fun setInt8Field (result : MutableMap <String , Any ? >? , fieldName : String? , value : Byte? ) {
6472 setValue(result, fieldName, value)
6573 }
6674
67- override fun setStructField (result : MutableMap <String , Any >? , fieldName : String? , value : Struct ? ) {
75+ override fun setStructField (result : MutableMap <String , Any ? >? , fieldName : String? , value : Struct ? ) {
6876 if (value != null ) {
69- val converted = convert(value) as Map <String , Any >
70- setValue(result, fieldName, converted)
77+ val converted = convert(value) as MutableMap <Any ?, Any ?>
78+ setMap(result, fieldName, null , converted)
79+ } else {
80+ setNullField(result, fieldName)
7181 }
7282 }
7383
74- override fun setMap (result : MutableMap <String , Any >? , fieldName : String? , schema : Schema ? , map : MutableMap <Any ?, Any ?>? ) {
75- setValue(result, fieldName, map)
84+ override fun setMap (result : MutableMap <String , Any ?>? , fieldName : String? , schema : Schema ? , map : MutableMap <Any ?, Any ?>? ) {
85+ val newMap = map
86+ ?.mapKeys { it.key.toString() }
87+ ?.mapValues { convertInner(it.value) }
88+ setValue(result, fieldName, newMap)
7689 }
7790
78- override fun setNullField (result : MutableMap <String , Any >? , fieldName : String? ) {}
91+ override fun setNullField (result : MutableMap <String , Any ?>? , fieldName : String? ) {
92+ setValue(result, fieldName, null )
93+ }
7994
80- override fun setFloat64Field (result : MutableMap <String , Any >? , fieldName : String? , value : Double? ) {
95+ override fun setFloat64Field (result : MutableMap <String , Any ? >? , fieldName : String? , value : Double? ) {
8196 setValue(result, fieldName, value)
8297 }
8398
84- override fun setInt16Field (result : MutableMap <String , Any >? , fieldName : String? , value : Short? ) {
99+ override fun setInt16Field (result : MutableMap <String , Any ? >? , fieldName : String? , value : Short? ) {
85100 setValue(result, fieldName, value)
86101 }
87102
88- override fun setInt64Field (result : MutableMap <String , Any >? , fieldName : String? , value : Long? ) {
103+ override fun setInt64Field (result : MutableMap <String , Any ? >? , fieldName : String? , value : Long? ) {
89104 setValue(result, fieldName, value)
90105 }
91106
92- override fun setBooleanField (result : MutableMap <String , Any >? , fieldName : String? , value : Boolean? ) {
107+ override fun setBooleanField (result : MutableMap <String , Any ? >? , fieldName : String? , value : Boolean? ) {
93108 setValue(result, fieldName, value)
94109 }
95110
96- override fun setDecimalField (result : MutableMap <String , Any >? , fieldName : String? , value : BigDecimal ? ) {
111+ override fun setDecimalField (result : MutableMap <String , Any ? >? , fieldName : String? , value : BigDecimal ? ) {
97112 setValue(result, fieldName, value)
98113 }
99114
100- override fun setDateField (result : MutableMap <String , Any >? , fieldName : String? , value : Date ? ) {
115+ override fun setDateField (result : MutableMap <String , Any ? >? , fieldName : String? , value : Date ? ) {
101116 if (value != null ) {
102117 val localDate = value.toInstant().atZone(UTC ).toLocalDate()
103118 setValue(result, fieldName, localDate)
119+ } else {
120+ setNullField(result, fieldName)
104121 }
105122 }
106123
124+ private fun convertInner (value : Any? ): Any? {
125+ return when (value) {
126+ is Struct , is Map <* , * > -> convert(value)
127+ else -> value
128+ }
129+ }
107130}
0 commit comments