@@ -3,6 +3,7 @@ package io.andrewohara.dynamokt
3
3
import software.amazon.awssdk.enhanced.dynamodb.AttributeConverter
4
4
import software.amazon.awssdk.enhanced.dynamodb.AttributeConverterProvider
5
5
import software.amazon.awssdk.enhanced.dynamodb.EnhancedType
6
+ import software.amazon.awssdk.enhanced.dynamodb.internal.mapper.MetaTableSchemaCache
6
7
import software.amazon.awssdk.enhanced.dynamodb.mapper.ImmutableAttribute
7
8
import software.amazon.awssdk.enhanced.dynamodb.mapper.StaticAttributeTag
8
9
import software.amazon.awssdk.enhanced.dynamodb.mapper.StaticAttributeTags
@@ -15,23 +16,23 @@ import kotlin.reflect.full.findAnnotation
15
16
import kotlin.reflect.full.staticFunctions
16
17
import kotlin.reflect.jvm.javaType
17
18
18
- private fun KType.toEnhancedType (): EnhancedType <out Any > {
19
+ private fun KType.toEnhancedType (schemaCache : MetaTableSchemaCache ): EnhancedType <out Any > {
19
20
return when (val clazz = classifier as KClass <Any >) {
20
21
List ::class -> {
21
- val listType = arguments.first().type!! .toEnhancedType()
22
+ val listType = arguments.first().type!! .toEnhancedType(schemaCache )
22
23
EnhancedType .listOf (listType)
23
24
}
24
25
Set ::class -> {
25
- val setType = arguments.first().type!! .toEnhancedType()
26
+ val setType = arguments.first().type!! .toEnhancedType(schemaCache )
26
27
EnhancedType .setOf (setType)
27
28
}
28
29
Map ::class -> {
29
- val (key, value) = arguments.map { it.type!! .toEnhancedType() }
30
+ val (key, value) = arguments.map { it.type!! .toEnhancedType(schemaCache ) }
30
31
EnhancedType .mapOf (key, value)
31
32
}
32
33
else -> {
33
34
if (clazz.isData) {
34
- EnhancedType .documentOf(clazz.java, DataClassTableSchema (clazz))
35
+ EnhancedType .documentOf(clazz.java, recursiveDataClassTableSchema (clazz, schemaCache ))
35
36
} else {
36
37
EnhancedType .of(javaType)
37
38
}
@@ -70,17 +71,24 @@ private fun KProperty1<out Any, *>.tags() = buildList {
70
71
}
71
72
}
72
73
73
- internal fun <Table : Any , Attr : Any ?> KProperty1 <Table , Attr >.toImmutableDataClassAttribute (dataClass : KClass <Table >): ImmutableAttribute <Table , ImmutableDataClassBuilder , Attr > {
74
+ internal fun <Table : Any , Attr : Any ?> KProperty1 <Table , Attr >.toImmutableDataClassAttribute (
75
+ dataClass : KClass <Table >,
76
+ schemaCache : MetaTableSchemaCache
77
+ ): ImmutableAttribute <Table , ImmutableDataClassBuilder , Attr > {
74
78
val converter = findAnnotation<DynamoKtConverted >()
75
79
?.converter
76
80
?.let { it as KClass <AttributeConverter <Attr >> }
77
81
?.let { initConverter(it) }
78
- ? : AttributeConverterProvider .defaultProvider().converterFor(returnType.toEnhancedType())
82
+ ? : AttributeConverterProvider .defaultProvider().converterFor(returnType.toEnhancedType(schemaCache ))
79
83
80
84
val dynamoName = findAnnotation<DynamoKtAttribute >()?.name? : name
81
85
82
86
return ImmutableAttribute
83
- .builder(EnhancedType .of(dataClass.java), EnhancedType .of(ImmutableDataClassBuilder ::class .java), returnType.toEnhancedType() as EnhancedType <Attr >)
87
+ .builder(
88
+ EnhancedType .of(dataClass.java),
89
+ EnhancedType .of(ImmutableDataClassBuilder ::class .java),
90
+ returnType.toEnhancedType(schemaCache) as EnhancedType <Attr >
91
+ )
84
92
.name(dynamoName)
85
93
.getter(::get)
86
94
.setter { builder, value -> builder[name] = value }
0 commit comments