Github user viirya commented on a diff in the pull request:
https://github.com/apache/spark/pull/20984#discussion_r180361913
--- Diff:
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/util/ArrayData.scala
---
@@ -164,3 +167,40 @@ abstract class ArrayData extends SpecializedGetters
with Serializable {
}
}
}
+
+class ArrayDataIndexedSeq[T](arrayData: ArrayData, dataType: DataType)
extends IndexedSeq[T] {
+
+ private def getAccessor(dataType: DataType): (Int) => Any = dataType
match {
+ case BooleanType => (idx: Int) => arrayData.getBoolean(idx)
+ case ByteType => (idx: Int) => arrayData.getByte(idx)
+ case ShortType => (idx: Int) => arrayData.getShort(idx)
+ case IntegerType => (idx: Int) => arrayData.getInt(idx)
+ case LongType => (idx: Int) => arrayData.getLong(idx)
+ case FloatType => (idx: Int) => arrayData.getFloat(idx)
+ case DoubleType => (idx: Int) => arrayData.getDouble(idx)
+ case d: DecimalType => (idx: Int) => arrayData.getDecimal(idx,
d.precision, d.scale)
+ case CalendarIntervalType => (idx: Int) => arrayData.getInterval(idx)
+ case StringType => (idx: Int) => arrayData.getUTF8String(idx)
+ case BinaryType => (idx: Int) => arrayData.getBinary(idx)
+ case s: StructType => (idx: Int) => arrayData.getStruct(idx, s.length)
+ case _: ArrayType => (idx: Int) => arrayData.getArray(idx)
+ case _: MapType => (idx: Int) => arrayData.getMap(idx)
+ case u: UserDefinedType[_] => getAccessor(u.sqlType)
+ case _ => (idx: Int) => arrayData.get(idx, dataType)
+ }
+
+ private val accessor: (Int) => Any = getAccessor(dataType)
+
+ override def apply(idx: Int): T = if (0 <= idx && idx <
arrayData.numElements()) {
--- End diff --
Ok.
---
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]