Github user hvanhovell commented on a diff in the pull request: https://github.com/apache/spark/pull/13758#discussion_r67992774 --- Diff: sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/util/GenericArrayData.scala --- @@ -142,3 +196,414 @@ class GenericArrayData(val array: Array[Any]) extends ArrayData { result } } + +final class GenericIntArrayData(val primitiveArray: Array[Int]) extends GenericArrayData { + override def array(): Array[Any] = primitiveArray.toArray + + override def copy(): ArrayData = new GenericIntArrayData(primitiveArray) + + override def numElements(): Int = primitiveArray.length + + override def isNullAt(ordinal: Int): Boolean = false + override def getInt(ordinal: Int): Int = primitiveArray(ordinal) + override def toIntArray(): Array[Int] = { + val array = new Array[Int](numElements) + System.arraycopy(primitiveArray, 0, array, 0, numElements) + array + } + override def toString(): String = primitiveArray.mkString("[", ",", "]") + + override def equals(o: Any): Boolean = { + if (!o.isInstanceOf[GenericIntArrayData]) { + return false + } + + val other = o.asInstanceOf[GenericIntArrayData] + if (other eq null) { + return false + } + + val len = numElements() + if (len != other.numElements()) { + return false + } + + var i = 0 + while (i < len) { + val o1 = primitiveArray(i) + val o2 = other.primitiveArray(i) + if (o1 != o2) { + return false + } + i += 1 + } + true + } + + override def hashCode: Int = { + var result: Int = 37 + var i = 0 + val len = numElements() + while (i < len) { + val update: Int = primitiveArray(i) + result = 37 * result + update + i += 1 + } + result + } +} + +final class GenericLongArrayData(val primitiveArray: Array[Long]) + extends GenericArrayData { + override def array(): Array[Any] = primitiveArray.toArray + + override def copy(): ArrayData = new GenericLongArrayData(primitiveArray) + + override def numElements(): Int = primitiveArray.length + + override def isNullAt(ordinal: Int): Boolean = false + override def getLong(ordinal: Int): Long = primitiveArray(ordinal) + override def toLongArray(): Array[Long] = { + val array = new Array[Long](numElements) + System.arraycopy(primitiveArray, 0, array, 0, numElements) + array + } + override def toString(): String = primitiveArray.mkString("[", ",", "]") + + override def equals(o: Any): Boolean = { + if (!o.isInstanceOf[GenericLongArrayData]) { + return false + } + + val other = o.asInstanceOf[GenericLongArrayData] + if (other eq null) { + return false + } + + val len = numElements() + if (len != other.numElements()) { + return false + } + + var i = 0 + while (i < len) { + val o1 = primitiveArray(i) + val o2 = other.primitiveArray(i) + if (o1 != o2) { + return false + } + i += 1 + } + true + } + + override def hashCode: Int = { + var result: Int = 37 + var i = 0 + val len = numElements() + while (i < len) { + val l = primitiveArray(i) + val update: Int = (l ^ (l >>> 32)).toInt + result = 37 * result + update + i += 1 + } + result + } +} + +final class GenericFloatArrayData(val primitiveArray: Array[Float]) + extends GenericArrayData { + override def array(): Array[Any] = primitiveArray.toArray + + override def copy(): ArrayData = new GenericFloatArrayData(primitiveArray) + + override def numElements(): Int = primitiveArray.length + + override def isNullAt(ordinal: Int): Boolean = false + override def getFloat(ordinal: Int): Float = primitiveArray(ordinal) + override def toFloatArray(): Array[Float] = { + val array = new Array[Float](numElements) + System.arraycopy(primitiveArray, 0, array, 0, numElements) + array + } + override def toString(): String = primitiveArray.mkString("[", ",", "]") + + override def equals(o: Any): Boolean = { + if (!o.isInstanceOf[GenericFloatArrayData]) { + return false + } + + val other = o.asInstanceOf[GenericFloatArrayData] + if (other eq null) { + return false + } + + val len = numElements() + if (len != other.numElements()) { + return false + } + + var i = 0 + while (i < len) { + val o1 = primitiveArray(i) + val o2 = other.primitiveArray(i) + if (java.lang.Float.isNaN(o1)) { + if (!java.lang.Float.isNaN(o2)) { + return false; + } + } else if (o1 != o2) { + return false + } + i += 1 + } + true + } + + override def hashCode: Int = { + var result: Int = 37 + var i = 0 + val len = numElements() + while (i < len) { + val f = primitiveArray(i) + val update: Int = java.lang.Float.floatToIntBits(f) + result = 37 * result + update + i += 1 + } + result + } +} + +final class GenericDoubleArrayData(val primitiveArray: Array[Double]) + extends GenericArrayData { + override def array(): Array[Any] = primitiveArray.toArray + + override def copy(): ArrayData = new GenericDoubleArrayData(primitiveArray) + + override def numElements(): Int = primitiveArray.length + + override def isNullAt(ordinal: Int): Boolean = false + override def getDouble(ordinal: Int): Double = primitiveArray(ordinal) + override def toDoubleArray(): Array[Double] = { + val array = new Array[Double](numElements) + System.arraycopy(primitiveArray, 0, array, 0, numElements) + array + } + override def toString(): String = primitiveArray.mkString("[", ",", "]") + + override def equals(o: Any): Boolean = { + if (!o.isInstanceOf[GenericDoubleArrayData]) { + return false + } + + val other = o.asInstanceOf[GenericDoubleArrayData] + if (other eq null) { + return false + } + + val len = numElements() + if (len != other.numElements()) { + return false + } + + var i = 0 + while (i < len) { + val o1 = primitiveArray(i) + val o2 = other.primitiveArray(i) + if (java.lang.Double.isNaN(o1)) { + if (!java.lang.Double.isNaN(o2)) { + return false; + } + } else if (o1 != o2) { + return false + } + i += 1 + } + true + } + + override def hashCode: Int = { + var result: Int = 37 + var i = 0 + val len = numElements() + while (i < len) { + val d = primitiveArray(i) + val b = java.lang.Double.doubleToLongBits(d) + val update: Int = (b ^ (b >>> 32)).toInt + result = 37 * result + update + i += 1 + } + result + } +} + +final class GenericShortArrayData(val primitiveArray: Array[Short]) + extends GenericArrayData { + override def array(): Array[Any] = primitiveArray.toArray + + override def copy(): ArrayData = new GenericShortArrayData(primitiveArray) + + override def numElements(): Int = primitiveArray.length + + override def isNullAt(ordinal: Int): Boolean = false + override def getShort(ordinal: Int): Short = primitiveArray(ordinal) + override def toShortArray(): Array[Short] = { + val array = new Array[Short](numElements) + System.arraycopy(primitiveArray, 0, array, 0, numElements) + array + } + override def toString(): String = primitiveArray.mkString("[", ",", "]") + + override def equals(o: Any): Boolean = { + if (!o.isInstanceOf[GenericShortArrayData]) { + return false + } + + val other = o.asInstanceOf[GenericShortArrayData] + if (other eq null) { + return false + } + + val len = numElements() + if (len != other.numElements()) { + return false + } + + var i = 0 + while (i < len) { + val o1 = primitiveArray(i) + val o2 = other.primitiveArray(i) + if (o1 != o2) { + return false + } + i += 1 + } + true + } + + override def hashCode: Int = { + var result: Int = 37 + var i = 0 + val len = numElements() + while (i < len) { + val update: Int = primitiveArray(i).toInt + result = 37 * result + update + i += 1 + } + result + } +} + +final class GenericByteArrayData(val primitiveArray: Array[Byte]) + extends GenericArrayData { + override def array(): Array[Any] = primitiveArray.toArray + + override def copy(): ArrayData = new GenericByteArrayData(primitiveArray) + + override def numElements(): Int = primitiveArray.length + + override def isNullAt(ordinal: Int): Boolean = false + override def getByte(ordinal: Int): Byte = primitiveArray(ordinal) + override def toByteArray(): Array[Byte] = { + val array = new Array[Byte](numElements) + System.arraycopy(primitiveArray, 0, array, 0, numElements) + array + } + override def toString(): String = primitiveArray.mkString("[", ",", "]") + + override def equals(o: Any): Boolean = { + if (!o.isInstanceOf[GenericByteArrayData]) { + return false + } + + val other = o.asInstanceOf[GenericByteArrayData] + if (other eq null) { + return false + } + + val len = numElements() + if (len != other.numElements()) { + return false + } + + var i = 0 + while (i < len) { + val o1 = primitiveArray(i) + val o2 = other.primitiveArray(i) + if (o1 != o2) { + return false + } + i += 1 + } + true + } + + override def hashCode: Int = { + var result: Int = 37 + var i = 0 + val len = numElements() + while (i < len) { + val update: Int = primitiveArray(i).toInt + result = 37 * result + update + i += 1 + } + result + } +} + +final class GenericBooleanArrayData(val primitiveArray: Array[Boolean]) --- End diff -- You could just use a bitset here :)...
--- If your project is set up for it, you can reply to this email and have your reply appear on GitHub as well. If your project does not have this feature enabled and wishes so, or if the feature is enabled but not working, please contact infrastructure at infrastruct...@apache.org or file a JIRA ticket with INFRA. --- --------------------------------------------------------------------- To unsubscribe, e-mail: reviews-unsubscr...@spark.apache.org For additional commands, e-mail: reviews-h...@spark.apache.org