Kotlin DataFrame plugin: `unfold` and `toDataFrame` with properties give an empty schema
Los mantenedores suelen responder en 1 día
@koperagen ya está trabajando en esto.
Desde el 29/9/2026.
Evaluación
Este issue todavía no se ha evaluado.
Descripción
When DataFrame.unfold or Iterable.toDataFrame get a list of properties, the plugin derives an empty
schema for the result. At runtime the result has columns, and none of them can be accessed through the
generated accessors.
Reproduce
data class Name(val firstName: String, val lastName: String)
data class Score(val subject: String, val value: Int)
data class Student(val name: Name, val age: Int, val scores: List<Score>)
val df = dataFrameOf(
"id" to listOf(1, 2),
"student" to listOf(
Student(Name("Alice", "Cooper"), 15, listOf(Score("math", 4), Score("biology", 3))),
Student(Name("Bob", "Marley"), 20, listOf(Score("music", 5))),
),
"year" to listOf(2021, 2022),
)
val unfolded = df.unfold(Student::name, Student::age) { student }
unfolded.compileTimeSchema() // empty
unfolded.schema() // id: Int, student: { name: Name, age: Int }, year: Int
val fromList = listOf(Student(Name("Alice", "Cooper"), 15, emptyList())).toDataFrame(Student::age)
fromList.compileTimeSchema() // empty
fromList.schema() // age: Int
Without properties the schemas match: df.unfold(maxDepth = 1) { student } and toDataFrame() give the same
schema at compile time and at runtime. The tests for both cases are in Kotlin/dataframe,
samples/src/test/kotlin/org/jetbrains/kotlinx/dataframe/plugin/UnfoldCompileTimeSchemaTests.kt
(issue 1, case 5): unfold with roots … and toDataFrame with properties …, both @Ignored.
What we see in the source
DataFrameUnfold(kotlin-dataframe.k2/.../impl/api/unfold.kt) declaresval Arguments.properties by ignore(),
but the parameter ofDataFrame.unfoldis calledroots.ToDataFrame(.../impl/api/toDataFrame.kt) does not declare thepropsparameter of
Iterable.toDataFrame(vararg props: KProperty<*>, maxDepth: Int)at all.
We think the interpreters cannot match the vararg argument, so the interpretation fails and the plugin falls
back to an empty schema. We did not confirm this in the plugin itself.
Suggested fix
Read the property references the way Exclude1 and Preserve1 already do, and keep only the columns for
those properties:
class DataFrameUnfold : AbstractSchemaModificationInterpreter() {
val Arguments.receiver: PluginDataFrameSchema by dataFrame()
val Arguments.roots: FirVarargArgumentsExpression by arg(lens = Interpreter.Id)
val Arguments.maxDepth: Int by arg(defaultValue = Present(0))
val Arguments.columns: ColumnsResolver by arg()
override fun Arguments.interpret(): PluginDataFrameSchema {
val rootNames = roots.arguments
.filterIsInstance<FirCallableReferenceAccess>()
.map { it.calleeReference.name.identifier }
return receiver.modify(impliedColumnsResolver = columns) {
replace { columns }.with {
val column = it.asSimpleColumn() as? SimpleDataColumn
if (column == null || !column.type.coneType.canBeUnfolded(session)) {
it
} else {
val unfolded = toDataFrame(maxDepth, column.type.coneType, TraverseConfiguration.EMPTY).columns()
val kept = if (rootNames.isEmpty()) unfolded else unfolded.filter { col -> col.name in rootNames }
SimpleColumnGroup(it.name(), kept).asDataColumn()
}
}
}
}
}
This is a sketch: we did not compile it. Two things to check:
- how a missing vararg argument is passed (the default is no roots);
- that the column name is the property name. It is not for
@ColumnNameproperties and for getters like
getX(), so it is safer to filter by the property symbol than by the name.
ToDataFrame needs the same change for props.
Changes to make together with Kotlin/dataframe #2114
When the library fixes land, the plugin has to change in the same release, or the compile-time schema will
differ from the runtime one:
- roots on a column of simple values (issue 1, case 1): when roots are given, do not return the column
unchanged just becausecanBeUnfoldedisfalsefor its type. - a column of lists of objects (issue 1, case 3): derive a
SimpleFrameColumnfrom the element type
instead of a column group withsize. - maps (issue 1, case 4):
isValueTypematchesStandardClassIds.Map/MutableMapexactly. Match
subtypes ofMap, so that it stays aligned with the library'sKClass.isValueType.
- Lenguaje dominante
- Kotlin
- Estrellas
- 1.1k
- Forks
- 87
- Merge medio
- 2 d 21 h
- PR fusionados (30 d)
- 40
Preparar el entorno
Inicia el contenedor de desarrollo del proyecto en tu navegador, con tu propia cuenta de GitHub.
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de Kotlin/dataframe
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
Los mantenedores suelen responder en 1 día
-
Add `columnOf(vararg DataFrame<T: DataRowSchema>): FrameColumn<T>` overload for compatibilityAbiertoAPI
Dificultad 2/5 1-3 horas Aptitud para principiantes 66/100
Kotlin/dataframe#2202 · 3 comentarios · 1 reacción ·
Los mantenedores suelen responder en 1 día
-
documentation
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
Kotlin/dataframe#2195 · 2 comentarios · 1 reacción ·
Los mantenedores suelen responder en 1 día
-
AX
Dificultad 1/5 Menos de una hora Aptitud para principiantes 90/100
Los mantenedores suelen responder en 1 día
-
Add minimal KDocs for `print` APIsPosiblemente ocupada @zaleslaw la tomó hace 3 días. AbiertoKDocs
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
Los mantenedores suelen responder en 1 día
Todos los issues de Kotlin/dataframe
Issues similares
-
feat: 插入提示词时默认追加到输入框,长按才替换Abiertoenhancement
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 86/100
liberation-data/drivine-cypher-spec#67 ·
Los mantenedores suelen responder en 1 día
-
feature
Dificultad 2/5 1-3 horas Aptitud para principiantes 64/100
-
documentation good first issue help wanted P2 roadmap-v4
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
maziyarpanahi/openmed#5425 ·
Los mantenedores suelen responder en 3 días
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
OneBusAway/vehicle-positions#250 ·
Los mantenedores suelen responder en 1 día