@@ -38,6 +38,8 @@ import org.jetbrains.kotlinx.dataframe.impl.io.SerializationKeys.TYPES
38
38
import org.jetbrains.kotlinx.dataframe.impl.io.SerializationKeys.VERSION
39
39
import org.jetbrains.kotlinx.dataframe.io.ARRAY_COLUMN_NAME
40
40
import org.jetbrains.kotlinx.dataframe.io.Base64ImageEncodingOptions
41
+ import org.jetbrains.kotlinx.dataframe.io.DataframeConvertableEncodingOptions
42
+ import org.jetbrains.kotlinx.dataframe.io.EncodingOptions
41
43
import org.jetbrains.kotlinx.dataframe.io.VALUE_COLUMN_NAME
42
44
import org.jetbrains.kotlinx.dataframe.jupyter.KotlinNotebookPluginUtils
43
45
import org.jetbrains.kotlinx.dataframe.jupyter.KotlinNotebookPluginUtils.isDataframeConvertable
@@ -111,14 +113,14 @@ internal fun encodeRowWithMetadata(
111
113
frame : ColumnsContainer <* >,
112
114
index : Int ,
113
115
rowLimit : Int? = null,
114
- imageEncodingOptions : Base64ImageEncodingOptions ? = null ,
116
+ encodingOptions : List < EncodingOptions > ,
115
117
): JsonElement ? {
116
118
val values: List <Pair <String , JsonElement >> = frame.columns().map { col ->
117
119
when (col) {
118
120
is ColumnGroup <* > -> {
119
121
val schema = col.schema()
120
122
buildJsonObject {
121
- put(DATA , encodeRowWithMetadata(col, index, rowLimit, imageEncodingOptions ) ? : JsonPrimitive (null ))
123
+ put(DATA , encodeRowWithMetadata(col, index, rowLimit, encodingOptions ) ? : JsonPrimitive (null ))
122
124
putJsonObject(METADATA ) {
123
125
put(KIND , JsonPrimitive (ColumnKind .Group .toString()))
124
126
put(COLUMNS , Json .encodeToJsonElement(schema.columns.keys))
@@ -135,9 +137,9 @@ internal fun encodeRowWithMetadata(
135
137
136
138
is FrameColumn <* > -> {
137
139
val data = if (rowLimit == null ) {
138
- encodeFrameWithMetadata(col[index], null , imageEncodingOptions )
140
+ encodeFrameWithMetadata(col[index], null , encodingOptions )
139
141
} else {
140
- encodeFrameWithMetadata(col[index].take(rowLimit), rowLimit, imageEncodingOptions )
142
+ encodeFrameWithMetadata(col[index].take(rowLimit), rowLimit, encodingOptions )
141
143
}
142
144
val schema = col.schema.value
143
145
buildJsonObject {
@@ -158,34 +160,32 @@ internal fun encodeRowWithMetadata(
158
160
}
159
161
}
160
162
161
- else -> encodeValue(col, index, imageEncodingOptions )
163
+ else -> encodeValue(col, index, encodingOptions )
162
164
}.let { col.name to it }
163
165
}
164
166
if (values.isEmpty()) return null
165
167
return JsonObject (values.toMap())
166
168
}
167
169
168
- internal fun encodeValue (
169
- col : AnyCol ,
170
- index : Int ,
171
- imageEncodingOptions : Base64ImageEncodingOptions ? = null,
172
- ): JsonElement =
170
+ internal fun encodeValue (col : AnyCol , index : Int , encodingOptions : List <EncodingOptions >): JsonElement =
173
171
when {
174
- isDataframeConvertable(col[index]) -> if (col[index] == null ) {
175
- JsonPrimitive (null )
176
- } else {
177
- val data = encodeFrameWithMetadata(
178
- KotlinNotebookPluginUtils .convertToDataFrame(col[index]!! ),
179
- null ,
180
- imageEncodingOptions,
181
- )
182
- buildJsonObject {
183
- put(DATA , data)
184
- putJsonObject(METADATA ) {
185
- put(KIND , JsonPrimitive (CellKind .DataFrameConvertable .toString()))
172
+ isDataframeConvertable(col[index]) && encodingOptions.get<DataframeConvertableEncodingOptions >() != null ->
173
+ if (col[index] == null ) {
174
+ JsonPrimitive (null )
175
+ } else {
176
+ val options = encodingOptions.get<DataframeConvertableEncodingOptions >()!!
177
+ val data = encodeFrameWithMetadata(
178
+ KotlinNotebookPluginUtils .convertToDataFrame(col[index]!! ),
179
+ options.rowsLimit,
180
+ encodingOptions,
181
+ )
182
+ buildJsonObject {
183
+ put(DATA , data)
184
+ putJsonObject(METADATA ) {
185
+ put(KIND , JsonPrimitive (CellKind .DataFrameConvertable .toString()))
186
+ }
186
187
}
187
188
}
188
- }
189
189
190
190
col.isList() -> col[index]?.let { list ->
191
191
val values = (list as List <* >).map { convert(it) }
@@ -194,14 +194,22 @@ internal fun encodeValue(
194
194
195
195
col.typeClass in valueTypes -> convert(col[index])
196
196
197
- col.typeClass == BufferedImage ::class && imageEncodingOptions != null ->
197
+ col.typeClass == BufferedImage ::class && encodingOptions.get< Base64ImageEncodingOptions >() != null ->
198
198
col[index]?.let { image ->
199
- JsonPrimitive (encodeBufferedImageAsBase64(image as BufferedImage , imageEncodingOptions))
199
+ JsonPrimitive (
200
+ encodeBufferedImageAsBase64(
201
+ image as BufferedImage ,
202
+ encodingOptions.get<Base64ImageEncodingOptions >()!! ,
203
+ ),
204
+ )
200
205
} ? : JsonPrimitive (" " )
201
206
202
207
else -> JsonPrimitive (col[index]?.toString())
203
208
}
204
209
210
+ @Suppress(" UNCHECKED_CAST" )
211
+ private inline fun <reified T : EncodingOptions > List<EncodingOptions>.get (): T ? = this .find { it is T } as T ?
212
+
205
213
private fun encodeBufferedImageAsBase64 (
206
214
image : BufferedImage ,
207
215
imageEncodingOptions : Base64ImageEncodingOptions = Base64ImageEncodingOptions (),
@@ -236,7 +244,7 @@ private fun createJsonTypeDescriptor(columnSchema: ColumnSchema): JsonObject =
236
244
internal fun encodeFrameWithMetadata (
237
245
frame : AnyFrame ,
238
246
rowLimit : Int? = null,
239
- imageEncodingOptions : Base64ImageEncodingOptions ? = null ,
247
+ encodingOptions : List < EncodingOptions > ,
240
248
): JsonArray {
241
249
val valueColumn = frame.extractValueColumn()
242
250
val arrayColumn = frame.extractArrayColumn()
@@ -250,13 +258,13 @@ internal fun encodeFrameWithMetadata(
250
258
encodeFrameWithMetadata(
251
259
it as AnyFrame ,
252
260
rowLimit,
253
- imageEncodingOptions ,
261
+ encodingOptions ,
254
262
)
255
263
} else {
256
264
null
257
265
}
258
266
}
259
- ? : encodeRowWithMetadata(frame, rowIndex, rowLimit, imageEncodingOptions )
267
+ ? : encodeRowWithMetadata(frame, rowIndex, rowLimit, encodingOptions )
260
268
}
261
269
262
270
return buildJsonArray { addAll(data.map { convert(it) }) }
@@ -364,7 +372,7 @@ internal fun encodeDataFrameWithMetadata(
364
372
frame : AnyFrame ,
365
373
rowLimit : Int ,
366
374
nestedRowLimit : Int? = null,
367
- imageEncodingOptions : Base64ImageEncodingOptions ? = null ,
375
+ encodingOptions : List < EncodingOptions > ,
368
376
): JsonObject =
369
377
buildJsonObject {
370
378
put(VERSION , JsonPrimitive (SERIALIZATION_VERSION ))
@@ -385,7 +393,7 @@ internal fun encodeDataFrameWithMetadata(
385
393
encodeFrameWithMetadata(
386
394
frame = frame.take(rowLimit),
387
395
rowLimit = nestedRowLimit,
388
- imageEncodingOptions = imageEncodingOptions ,
396
+ encodingOptions = encodingOptions ,
389
397
),
390
398
)
391
399
}
0 commit comments