Skip to content

Commit 07692f4

Browse files
committed
adding more working cases, found option cases not to work
1 parent 92aee4d commit 07692f4

File tree

3 files changed

+67
-7
lines changed

3 files changed

+67
-7
lines changed

core/3.2/src/main/scala/org/apache/spark/sql/KotlinReflection.scala

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import org.apache.spark.sql.catalyst.analysis.GetColumnByOrdinal
2828
import org.apache.spark.sql.catalyst.expressions.objects._
2929
import org.apache.spark.sql.catalyst.expressions.{Expression, _}
3030
import org.apache.spark.sql.catalyst.util.ArrayBasedMapData
31-
import org.apache.spark.sql.catalyst.{InternalRow, ScalaReflection, WalkedTypePath}
31+
import org.apache.spark.sql.catalyst.{DefinedByConstructorParams, InternalRow, ScalaReflection, WalkedTypePath}
3232
import org.apache.spark.sql.types._
3333
import org.apache.spark.unsafe.types.{CalendarInterval, UTF8String}
3434
import org.apache.spark.util.Utils
@@ -42,11 +42,12 @@ import java.lang.Exception
4242
* for classes whose fields are entirely defined by constructor params but should not be
4343
* case classes.
4444
*/
45-
trait DefinedByConstructorParams
45+
//trait DefinedByConstructorParams
4646

4747
/**
4848
* KotlinReflection is heavily inspired by ScalaReflection and even extends it just to add several methods
4949
*/
50+
//noinspection RedundantBlock
5051
object KotlinReflection extends KotlinReflection {
5152
/**
5253
* Returns the Spark SQL DataType for a given java class. Where this is not an exact mapping
@@ -916,9 +917,18 @@ object KotlinReflection extends KotlinReflection {
916917
}
917918
//</editor-fold>
918919

919-
case _ if predefinedDt.isDefined => {
920+
// Kotlin specific cases
921+
case t if predefinedDt.isDefined => {
922+
923+
// if (seenTypeSet.contains(t)) {
924+
// throw new UnsupportedOperationException(
925+
// s"cannot have circular references in class, but got the circular reference of class $t"
926+
// )
927+
// }
928+
920929
predefinedDt.get match {
921930

931+
// Kotlin data class
922932
case dataType: KDataTypeWrapper => {
923933
val cls = dataType.cls
924934
val properties = getJavaBeanReadableProperties(cls)
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package org.jetbrains.kotlinx.spark.extensions
2+
3+
case class DemoCaseClass[T](a: Int, b: T)

kotlin-spark-api/3.2/src/test/kotlin/org/jetbrains/kotlinx/spark/api/EncodingTest.kt

Lines changed: 51 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import org.apache.spark.sql.Dataset
2727
import org.apache.spark.sql.types.Decimal
2828
import org.apache.spark.unsafe.types.CalendarInterval
2929
import org.jetbrains.kotlinx.spark.api.tuples.*
30+
import org.jetbrains.kotlinx.spark.extensions.DemoCaseClass
3031
import scala.*
3132
import java.math.BigDecimal
3233
import java.sql.Date
@@ -177,13 +178,59 @@ class EncodingTest : ShouldSpec({
177178
context("schema") {
178179
withSpark(props = mapOf("spark.sql.codegen.comments" to true)) {
179180

180-
should("handle Scala case class datasets") {
181+
should("handle Scala Case class datasets") {
182+
val caseClasses = listOf(
183+
DemoCaseClass(1, "1"),
184+
DemoCaseClass(2, "2"),
185+
DemoCaseClass(3, "3"),
186+
)
187+
val dataset = caseClasses.toDS()
188+
dataset.show()
189+
dataset.collectAsList() shouldBe caseClasses
190+
}
191+
192+
should("handle Scala Case class with data class datasets") {
193+
val caseClasses = listOf(
194+
DemoCaseClass(1, "1" to 1L),
195+
DemoCaseClass(2, "2" to 2L),
196+
DemoCaseClass(3, "3" to 3L),
197+
)
198+
val dataset = caseClasses.toDS()
199+
dataset.show()
200+
dataset.collectAsList() shouldBe caseClasses
201+
}
202+
203+
should("handle data class with Scala Case class datasets") {
204+
val caseClasses = listOf(
205+
1 to DemoCaseClass(1, "1"),
206+
2 to DemoCaseClass(2, "2"),
207+
3 to DemoCaseClass(3, "3"),
208+
)
209+
val dataset = caseClasses.toDS()
210+
dataset.show()
211+
dataset.collectAsList() shouldBe caseClasses
212+
}
213+
214+
should("handle data class with Scala Case class & deeper datasets") {
215+
val caseClasses = listOf(
216+
1 to DemoCaseClass(1, "1" to DemoCaseClass(1, 1.0)),
217+
2 to DemoCaseClass(2, "2" to DemoCaseClass(2, 2.0)),
218+
3 to DemoCaseClass(3, "3" to DemoCaseClass(3, 3.0)),
219+
)
220+
val dataset = caseClasses.toDS()
221+
dataset.show()
222+
dataset.collectAsList() shouldBe caseClasses
223+
}
224+
225+
226+
should("handle Scala Option datasets") {
181227
val caseClasses = listOf(Some(1), Some(2), Some(3))
182228
val dataset = caseClasses.toDS()
229+
dataset.show()
183230
dataset.collectAsList() shouldBe caseClasses
184231
}
185232

186-
should("handle Scala case class case class datasets") {
233+
should("handle Scala Option Option datasets") {
187234
val caseClasses = listOf(
188235
Some(Some(1)),
189236
Some(Some(2)),
@@ -193,7 +240,7 @@ class EncodingTest : ShouldSpec({
193240
dataset.collectAsList() shouldBe caseClasses
194241
}
195242

196-
should("handle data class Scala case class datasets") {
243+
should("handle data class Scala Option datasets") {
197244
val caseClasses = listOf(
198245
Some(1) to Some(2),
199246
Some(3) to Some(4),
@@ -203,7 +250,7 @@ class EncodingTest : ShouldSpec({
203250
dataset.collectAsList() shouldBe caseClasses
204251
}
205252

206-
should("handle Scala case class data class datasets") {
253+
should("handle Scala Option data class datasets") {
207254
val caseClasses = listOf(
208255
Some(1 to 2),
209256
Some(3 to 4),

0 commit comments

Comments
 (0)