@@ -46,8 +46,6 @@ private[sql] trait CompressibleColumnBuilder[T <: NativeType]
46
46
47
47
this : NativeColumnBuilder [T ] with WithCompressionSchemes =>
48
48
49
- import CompressionScheme ._
50
-
51
49
var compressionEncoders : Seq [Encoder [T ]] = _
52
50
53
51
abstract override def initialize (initialSize : Int , columnName : String , useCompression : Boolean ) {
@@ -81,28 +79,32 @@ private[sql] trait CompressibleColumnBuilder[T <: NativeType]
81
79
}
82
80
}
83
81
84
- abstract override def build () = {
85
- val rawBuffer = super .build()
82
+ override def build () = {
83
+ val nonNullBuffer = buildNonNulls()
84
+ val typeId = nonNullBuffer.getInt()
86
85
val encoder : Encoder [T ] = {
87
86
val candidate = compressionEncoders.minBy(_.compressionRatio)
88
87
if (isWorthCompressing(candidate)) candidate else PassThrough .encoder
89
88
}
90
89
91
- val headerSize = columnHeaderSize(rawBuffer)
90
+ // Header = column type ID + null count + null positions
91
+ val headerSize = 4 + 4 + nulls.limit()
92
92
val compressedSize = if (encoder.compressedSize == 0 ) {
93
- rawBuffer.limit - headerSize
93
+ nonNullBuffer.remaining()
94
94
} else {
95
95
encoder.compressedSize
96
96
}
97
97
98
- // Reserves 4 bytes for compression scheme ID
99
98
val compressedBuffer = ByteBuffer
99
+ // Reserves 4 bytes for compression scheme ID
100
100
.allocate(headerSize + 4 + compressedSize)
101
101
.order(ByteOrder .nativeOrder)
102
-
103
- copyColumnHeader(rawBuffer, compressedBuffer)
102
+ // Write the header
103
+ .putInt(typeId)
104
+ .putInt(nullCount)
105
+ .put(nulls)
104
106
105
107
logInfo(s " Compressor for [ $columnName]: $encoder, ratio: ${encoder.compressionRatio}" )
106
- encoder.compress(rawBuffer , compressedBuffer, columnType)
108
+ encoder.compress(nonNullBuffer , compressedBuffer, columnType)
107
109
}
108
110
}
0 commit comments