Skip to content

Commit 17f21c7

Browse files
committed
Fix #104. Bug with codegen in case of diamond schema inheritance
1 parent 2960fd4 commit 17f21c7

File tree

2 files changed

+17
-4
lines changed

2 files changed

+17
-4
lines changed

src/main/kotlin/org/jetbrains/kotlinx/dataframe/impl/codeGen/SchemaProcessorImpl.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,21 +66,21 @@ internal class SchemaProcessorImpl(
6666

6767
return schema.columns.asIterable().sortedBy { it.key }.flatMapIndexed { index, column ->
6868
val (columnName, columnSchema) = column
69-
69+
val fieldType = getFieldType(columnSchema)
7070
// find all fields that were already generated for this column name in base interfaces
7171
val superFields = requiredSuperMarkers.mapNotNull { it.getField(columnName) }
7272

73-
val fieldsToOverride = superFields.filter { it.columnSchema != columnSchema }
73+
val fieldsToOverride = superFields.filter { it.columnSchema != columnSchema }.map { it.fieldName }.distinct()
7474

7575
val newFields = when {
7676
fieldsToOverride.isNotEmpty() -> fieldsToOverride.map {
77-
GeneratedField(it.fieldName, it.columnName, true, columnSchema, getFieldType(columnSchema))
77+
GeneratedField(it, columnName, true, columnSchema, fieldType)
7878
}
7979
superFields.isNotEmpty() -> emptyList()
8080
else -> {
8181
val fieldName = generateValidFieldName(columnName, index, usedFieldNames)
8282
usedFieldNames.add(fieldName.quotedIfNeeded)
83-
listOf(GeneratedField(fieldName, columnName, false, columnSchema, getFieldType(columnSchema)))
83+
listOf(GeneratedField(fieldName, columnName, false, columnSchema, fieldType))
8484
}
8585
}
8686
newFields

src/test/kotlin/org/jetbrains/kotlinx/dataframe/codeGen/ReplCodeGenTests.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ class ReplCodeGenTests : BaseTest() {
5353
override val x: List<Int>
5454
}
5555

56+
@DataSchema
57+
interface D : A
58+
5659
val df = dataFrameOf("x")(listOf(1))
5760
}
5861

@@ -170,4 +173,14 @@ class ReplCodeGenTests : BaseTest() {
170173
val c = repl.process(Test3.df, Test3::df)
171174
c.declarations.shouldBeEmpty()
172175
}
176+
177+
@Test
178+
fun `process diamond inheritance`() {
179+
val repl = ReplCodeGenerator.create()
180+
repl.process<Test3.A>()
181+
repl.process<Test3.B>()
182+
repl.process<Test3.D>()
183+
val c = repl.process(Test3.df, Test3::df)
184+
"""val .*ColumnsContainer<\w*>.x:""".toRegex().findAll(c.declarations).count() shouldBe 1
185+
}
173186
}

0 commit comments

Comments
 (0)