Skip to content

Commit 3988e5d

Browse files
authored
Support private properties in Kotlin data classes (#14)
YOJ accepts private constructors and uses private fields for POJOs. Do the same for private Kotlin `data class` properties (call `setAccessible()`).
1 parent 622288e commit 3988e5d

File tree

2 files changed

+19
-4
lines changed

2 files changed

+19
-4
lines changed

databind/src/main/java/tech/ydb/yoj/databind/schema/reflect/KotlinDataClassComponent.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import kotlin.jvm.JvmClassMappingKt;
44
import kotlin.reflect.KCallable;
5+
import kotlin.reflect.jvm.KCallablesJvm;
56
import kotlin.reflect.jvm.ReflectJvmMapping;
67
import tech.ydb.yoj.databind.FieldValueType;
78
import tech.ydb.yoj.databind.schema.Column;
@@ -26,6 +27,7 @@ public final class KotlinDataClassComponent implements ReflectField {
2627

2728
public KotlinDataClassComponent(Reflector reflector, String name, KCallable<?> callable) {
2829
this.callable = callable;
30+
KCallablesJvm.setAccessible(this.callable, true);
2931

3032
this.name = name;
3133

databind/src/test/kotlin/tech/ydb/yoj/databind/schema/KotlinSchemaTest.kt

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package tech.ydb.yoj.databind.schema
33
import org.assertj.core.api.Assertions.assertThat
44
import org.junit.BeforeClass
55
import org.junit.Test
6+
import java.util.Map.entry
67

78
class KotlinSchemaTest {
89
@Test
@@ -69,13 +70,21 @@ class KotlinSchemaTest {
6970
assertThat(schema!!.getField("notFlatEntity").isFlat).isFalse()
7071
}
7172

73+
@Test
74+
fun testPrivateProp() {
75+
val ue = UberEntity(null, null, null, null, PrivatePropEntity(42))
76+
assertThat(schema!!.flatten(ue)).containsOnly(entry("privatePropEntity_privateProp", 42))
77+
assertThat(schema!!.newInstance(mapOf("privatePropEntity_privateProp" to 42))).isEqualTo(ue)
78+
}
79+
7280
private class TestSchema<T>(entityType: Class<T>) : Schema<T>(entityType)
7381

7482
private data class UberEntity(
75-
val entity1: Entity1,
76-
val flatEntity: FlatEntity,
77-
val twoFieldEntity: TwoFieldEntity,
78-
val notFlatEntity: NotFlatEntity,
83+
val entity1: Entity1?,
84+
val flatEntity: FlatEntity?,
85+
val twoFieldEntity: TwoFieldEntity?,
86+
val notFlatEntity: NotFlatEntity?,
87+
val privatePropEntity: PrivatePropEntity
7988
)
8089

8190
private data class Entity1(val entity2: Entity2)
@@ -96,6 +105,10 @@ class KotlinSchemaTest {
96105
val otherTwoFieldEntity: TwoFieldEntity,
97106
)
98107

108+
private data class PrivatePropEntity(
109+
private val privateProp: Int
110+
)
111+
99112
companion object {
100113
private var schema: Schema<UberEntity>? = null
101114

0 commit comments

Comments
 (0)