@@ -29,6 +29,7 @@ import kotlin.reflect.full.isSubclassOf
29
29
import kotlin.reflect.full.memberProperties
30
30
import kotlin.reflect.full.withNullability
31
31
import kotlin.reflect.jvm.javaField
32
+ import kotlin.reflect.typeOf
32
33
33
34
internal val valueTypes = setOf (
34
35
String ::class ,
@@ -163,38 +164,56 @@ internal fun convertToDataFrame(
163
164
}
164
165
}
165
166
166
- val type = property.returnType
167
- val kclass = (type.classifier as KClass <* >)
167
+ val returnType = property.returnType.let { type ->
168
+ if (type.classifier is KClass <* >) {
169
+ type
170
+ } else {
171
+ typeOf<Any >()
172
+ }
173
+ }
174
+ val kclass = (returnType.classifier as KClass <* >)
168
175
when {
169
176
hasExceptions -> DataColumn .createWithTypeInference(it.columnName, values, nullable)
170
- preserveClasses.contains(kclass) || preserveProperties.contains(property) || (maxDepth <= 0 && ! type .shouldBeConvertedToFrameColumn() && ! type .shouldBeConvertedToColumnGroup()) || kclass.isValueType ->
171
- DataColumn .createValueColumn(it.columnName, values, property. returnType.withNullability(nullable))
177
+ kclass == Any :: class || preserveClasses.contains(kclass) || preserveProperties.contains(property) || (maxDepth <= 0 && ! returnType .shouldBeConvertedToFrameColumn() && ! returnType .shouldBeConvertedToColumnGroup()) || kclass.isValueType ->
178
+ DataColumn .createValueColumn(it.columnName, values, returnType.withNullability(nullable))
172
179
kclass == DataFrame ::class && ! nullable -> DataColumn .createFrameColumn(it.columnName, values as List <AnyFrame >)
173
180
kclass == DataRow ::class -> DataColumn .createColumnGroup(it.columnName, (values as List <AnyRow >).concat())
174
181
kclass.isSubclassOf(Iterable ::class ) -> {
175
- val elementType = type.projectUpTo(Iterable ::class ).arguments.firstOrNull()?.type
176
- if (elementType == null ) DataColumn .createValueColumn(
177
- it.columnName,
178
- values,
179
- property.returnType.withNullability(nullable)
180
- )
181
- else {
182
- val elementClass = (elementType.classifier as KClass <* >)
183
- if (elementClass.isValueType) {
184
- val listType = getListType(elementType).withNullability(nullable)
185
- val listValues = values.map {
186
- (it as ? Iterable <* >)?.asList()
182
+ val elementType = returnType.projectUpTo(Iterable ::class ).arguments.firstOrNull()?.type
183
+ if (elementType == null ) {
184
+ DataColumn .createValueColumn(
185
+ it.columnName,
186
+ values,
187
+ returnType.withNullability(nullable)
188
+ )
189
+ } else {
190
+ val elementClass = (elementType.classifier as ? KClass <* >)
191
+
192
+ when {
193
+ elementClass == null -> {
194
+ val listValues = values.map {
195
+ (it as ? Iterable <* >)?.asList()
196
+ }
197
+
198
+ DataColumn .createWithTypeInference(it.columnName, listValues)
199
+ }
200
+ elementClass.isValueType -> {
201
+ val listType = getListType(elementType).withNullability(nullable)
202
+ val listValues = values.map {
203
+ (it as ? Iterable <* >)?.asList()
204
+ }
205
+ DataColumn .createValueColumn(it.columnName, listValues, listType)
187
206
}
188
- DataColumn .createValueColumn(it.columnName, listValues, listType)
189
- } else {
190
- val frames = values.map {
191
- if (it == null ) DataFrame .empty()
192
- else {
193
- require (it is Iterable < * > )
194
- convertToDataFrame(it, elementClass, emptyList(), excludes, preserveClasses, preserveProperties, maxDepth - 1 )
207
+ else -> {
208
+ val frames = values.map {
209
+ if (it == null ) DataFrame .empty()
210
+ else {
211
+ require(it is Iterable < * >)
212
+ convertToDataFrame (it, elementClass, emptyList(), excludes, preserveClasses, preserveProperties, maxDepth - 1 )
213
+ }
195
214
}
215
+ DataColumn .createFrameColumn(it.columnName, frames)
196
216
}
197
- DataColumn .createFrameColumn(it.columnName, frames)
198
217
}
199
218
}
200
219
}
0 commit comments