Skip to content

Commit a097e86

Browse files
committed
change the order of resolution in ScalaReflection.scala
1 parent 2d1e916 commit a097e86

File tree

2 files changed

+20
-15
lines changed

2 files changed

+20
-15
lines changed

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/ScalaReflection.scala

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,21 @@ trait ScalaReflection {
122122
case t if t <:< typeOf[Option[_]] =>
123123
val TypeRef(_, _, Seq(optType)) = t
124124
Schema(schemaFor(optType).dataType, nullable = true)
125+
// Need to decide if we actually need a special type here.
126+
case t if t <:< typeOf[Array[Byte]] => Schema(BinaryType, nullable = true)
127+
case t if t <:< typeOf[Array[_]] =>
128+
val TypeRef(_, _, Seq(elementType)) = t
129+
val Schema(dataType, nullable) = schemaFor(elementType)
130+
Schema(ArrayType(dataType, containsNull = nullable), nullable = true)
131+
case t if t <:< typeOf[Seq[_]] =>
132+
val TypeRef(_, _, Seq(elementType)) = t
133+
val Schema(dataType, nullable) = schemaFor(elementType)
134+
Schema(ArrayType(dataType, containsNull = nullable), nullable = true)
135+
case t if t <:< typeOf[Map[_, _]] =>
136+
val TypeRef(_, _, Seq(keyType, valueType)) = t
137+
val Schema(valueDataType, valueNullable) = schemaFor(valueType)
138+
Schema(MapType(schemaFor(keyType).dataType,
139+
valueDataType, valueContainsNull = valueNullable), nullable = true)
125140
case t if t <:< typeOf[Product] =>
126141
val formalTypeArgs = t.typeSymbol.asClass.typeParams
127142
val TypeRef(_, _, actualTypeArgs) = t
@@ -144,21 +159,6 @@ trait ScalaReflection {
144159
schemaFor(p.typeSignature.substituteTypes(formalTypeArgs, actualTypeArgs))
145160
StructField(p.name.toString, dataType, nullable)
146161
}), nullable = true)
147-
// Need to decide if we actually need a special type here.
148-
case t if t <:< typeOf[Array[Byte]] => Schema(BinaryType, nullable = true)
149-
case t if t <:< typeOf[Array[_]] =>
150-
val TypeRef(_, _, Seq(elementType)) = t
151-
val Schema(dataType, nullable) = schemaFor(elementType)
152-
Schema(ArrayType(dataType, containsNull = nullable), nullable = true)
153-
case t if t <:< typeOf[Seq[_]] =>
154-
val TypeRef(_, _, Seq(elementType)) = t
155-
val Schema(dataType, nullable) = schemaFor(elementType)
156-
Schema(ArrayType(dataType, containsNull = nullable), nullable = true)
157-
case t if t <:< typeOf[Map[_, _]] =>
158-
val TypeRef(_, _, Seq(keyType, valueType)) = t
159-
val Schema(valueDataType, valueNullable) = schemaFor(valueType)
160-
Schema(MapType(schemaFor(keyType).dataType,
161-
valueDataType, valueContainsNull = valueNullable), nullable = true)
162162
case t if t <:< typeOf[String] => Schema(StringType, nullable = true)
163163
case t if t <:< typeOf[Timestamp] => Schema(TimestampType, nullable = true)
164164
case t if t <:< typeOf[java.sql.Date] => Schema(DateType, nullable = true)

sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/ScalaReflectionSuite.scala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ case class OptionalData(
6161
case class ComplexData(
6262
arrayField: Seq[Int],
6363
arrayField1: Array[Int],
64+
arrayField2: List[Int],
6465
arrayFieldContainsNull: Seq[java.lang.Integer],
6566
mapField: Map[Int, Long],
6667
mapFieldValueContainsNull: Map[Int, java.lang.Long],
@@ -137,6 +138,10 @@ class ScalaReflectionSuite extends FunSuite {
137138
"arrayField1",
138139
ArrayType(IntegerType, containsNull = false),
139140
nullable = true),
141+
StructField(
142+
"arrayField2",
143+
ArrayType(IntegerType, containsNull = false),
144+
nullable = true),
140145
StructField(
141146
"arrayFieldContainsNull",
142147
ArrayType(IntegerType, containsNull = true),

0 commit comments

Comments
 (0)