Skip to content

Commit 1af6992

Browse files
committed
Working exclude classes in toDataFrame
1 parent 70698a4 commit 1af6992

File tree

2 files changed

+30
-3
lines changed

2 files changed

+30
-3
lines changed

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/impl/api/toDataFrame.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ internal class CreateDataFrameDslImpl<T>(
186186
excludes = dsl.excludeProperties,
187187
preserveClasses = dsl.preserveClasses,
188188
preserveProperties = dsl.preserveProperties,
189+
excludeClasses = dsl.excludeClasses,
189190
maxDepth = maxDepth,
190191
)
191192
df.columns().forEach {
@@ -212,6 +213,7 @@ internal fun convertToDataFrame(
212213
excludes: Set<KCallable<*>>,
213214
preserveClasses: Set<KClass<*>>,
214215
preserveProperties: Set<KCallable<*>>,
216+
excludeClasses: Set<KClass<*>>,
215217
maxDepth: Int,
216218
): AnyFrame {
217219
val clazz = type.classifierOrAny()
@@ -231,10 +233,12 @@ internal fun convertToDataFrame(
231233
val columns = properties.mapNotNull {
232234
val property = it
233235
if (excludes.contains(property)) return@mapNotNull null
236+
val klass = it.returnType.classifier as? KClass<*>
237+
if (excludeClasses.contains(klass)) return@mapNotNull null
234238

235239
class ValueClassConverter(val unbox: Method, val box: Method)
236240

237-
val valueClassConverter = (it.returnType.classifier as? KClass<*>)?.let { kClass ->
241+
val valueClassConverter = klass?.let { kClass ->
238242
if (!kClass.isValue) return@let null
239243

240244
val constructor = requireNotNull(kClass.primaryConstructor) {
@@ -374,6 +378,7 @@ internal fun convertToDataFrame(
374378
excludes = excludes,
375379
preserveClasses = preserveClasses,
376380
preserveProperties = preserveProperties,
381+
excludeClasses = excludeClasses,
377382
maxDepth = maxDepth - 1,
378383
)
379384
}
@@ -392,6 +397,7 @@ internal fun convertToDataFrame(
392397
excludes = excludes,
393398
preserveClasses = preserveClasses,
394399
preserveProperties = preserveProperties,
400+
excludeClasses = excludeClasses,
395401
maxDepth = maxDepth - 1,
396402
)
397403
DataColumn.createColumnGroup(name = it.columnName, df = df)

core/src/test/kotlin/org/jetbrains/kotlinx/dataframe/api/toDataFrame.kt

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,11 @@ class CreateDataFrameTests {
156156
df.a[0].v shouldBe 7
157157

158158
val df2 = data.toDataFrame {
159-
preserve(B::row)
160-
properties { preserve(DataFrame::class) }
159+
preserve(B::row) // this@toDataFrame: TraversePropertiesDsl - works
160+
properties {
161+
preserve(DataFrame::class) // this@properties: TraversePropertiesDsl - always works
162+
}
163+
preserve(B::row) // this@toDataFrame: TraversePropertiesDsl - doesn't
161164
}
162165
df2.frame.kind shouldBe ColumnKind.Value
163166
df2.frame.type shouldBe typeOf<DataFrame<A>>()
@@ -186,6 +189,24 @@ class CreateDataFrameTests {
186189
res.schema() shouldBe data.toDataFrame(maxDepth = 0).schema()
187190
}
188191

192+
class NestedExcludeClasses(val s: String, val list1: List<String>)
193+
194+
class ExcludeClasses(val i: Int, val list: List<Int>, val nested: NestedExcludeClasses)
195+
196+
@Test
197+
fun `exclude classes`() {
198+
val list = listOf(
199+
ExcludeClasses(1, listOf(1, 2, 3), NestedExcludeClasses("str", listOf("foo", "bar"))),
200+
)
201+
val df = list.toDataFrame {
202+
properties(maxDepth = 2) {
203+
exclude(List::class)
204+
}
205+
}
206+
207+
df shouldBe list.toDataFrame(maxDepth = 2).remove { "list" and "nested"["list1"] }
208+
}
209+
189210
enum class DummyEnum { A }
190211

191212
@Test

0 commit comments

Comments
 (0)