github.com/segmentio/parquet-go@v0.0.0-20230712180008-5d42db8f0d47/encoding/values.go (about) 1 package encoding 2 3 import ( 4 "fmt" 5 6 "github.com/segmentio/parquet-go/deprecated" 7 "github.com/segmentio/parquet-go/internal/unsafecast" 8 ) 9 10 type Kind int32 11 12 const ( 13 Undefined Kind = iota 14 Boolean 15 Int32 16 Int64 17 Int96 18 Float 19 Double 20 ByteArray 21 FixedLenByteArray 22 ) 23 24 func (kind Kind) String() string { 25 switch kind { 26 case Boolean: 27 return "BOOLEAN" 28 case Int32: 29 return "INT32" 30 case Int64: 31 return "INT64" 32 case Int96: 33 return "INT96" 34 case Float: 35 return "FLOAT" 36 case Double: 37 return "DOUBLE" 38 case ByteArray: 39 return "BYTE_ARRAY" 40 case FixedLenByteArray: 41 return "FIXED_LEN_BYTE_ARRAY" 42 default: 43 return "UNDEFINED" 44 } 45 } 46 47 type Values struct { 48 kind Kind 49 size int32 50 data []byte 51 offsets []uint32 52 } 53 54 func (v *Values) assertKind(kind Kind) { 55 if kind != v.kind { 56 panic(fmt.Sprintf("cannot convert values of type %s to type %s", v.kind, kind)) 57 } 58 } 59 60 func (v *Values) assertSize(size int) { 61 if size != int(v.size) { 62 panic(fmt.Sprintf("cannot convert values of size %d to size %d", v.size, size)) 63 } 64 } 65 66 func (v *Values) Size() int64 { 67 return int64(len(v.data)) 68 } 69 70 func (v *Values) Kind() Kind { 71 return v.kind 72 } 73 74 func (v *Values) Data() (data []byte, offsets []uint32) { 75 return v.data, v.offsets 76 } 77 78 func (v *Values) Boolean() []byte { 79 v.assertKind(Boolean) 80 return v.data 81 } 82 83 func (v *Values) Int32() []int32 { 84 v.assertKind(Int32) 85 return unsafecast.BytesToInt32(v.data) 86 } 87 88 func (v *Values) Int64() []int64 { 89 v.assertKind(Int64) 90 return unsafecast.BytesToInt64(v.data) 91 } 92 93 func (v *Values) Int96() []deprecated.Int96 { 94 v.assertKind(Int96) 95 return deprecated.BytesToInt96(v.data) 96 } 97 98 func (v *Values) Float() []float32 { 99 v.assertKind(Float) 100 return unsafecast.BytesToFloat32(v.data) 101 } 102 103 func (v *Values) Double() []float64 { 104 v.assertKind(Double) 105 return unsafecast.BytesToFloat64(v.data) 106 } 107 108 func (v *Values) ByteArray() (data []byte, offsets []uint32) { 109 v.assertKind(ByteArray) 110 return v.data, v.offsets 111 } 112 113 func (v *Values) FixedLenByteArray() (data []byte, size int) { 114 v.assertKind(FixedLenByteArray) 115 return v.data, int(v.size) 116 } 117 118 func (v *Values) Uint32() []uint32 { 119 v.assertKind(Int32) 120 return unsafecast.BytesToUint32(v.data) 121 } 122 123 func (v *Values) Uint64() []uint64 { 124 v.assertKind(Int64) 125 return unsafecast.BytesToUint64(v.data) 126 } 127 128 func (v *Values) Uint128() [][16]byte { 129 v.assertKind(FixedLenByteArray) 130 v.assertSize(16) 131 return unsafecast.BytesToUint128(v.data) 132 } 133 134 func BooleanValues(values []byte) Values { 135 return Values{ 136 kind: Boolean, 137 data: values, 138 } 139 } 140 141 func Int32Values(values []int32) Values { 142 return Values{ 143 kind: Int32, 144 data: unsafecast.Int32ToBytes(values), 145 } 146 } 147 148 func Int64Values(values []int64) Values { 149 return Values{ 150 kind: Int64, 151 data: unsafecast.Int64ToBytes(values), 152 } 153 } 154 155 func Int96Values(values []deprecated.Int96) Values { 156 return Values{ 157 kind: Int96, 158 data: deprecated.Int96ToBytes(values), 159 } 160 } 161 162 func FloatValues(values []float32) Values { 163 return Values{ 164 kind: Float, 165 data: unsafecast.Float32ToBytes(values), 166 } 167 } 168 169 func DoubleValues(values []float64) Values { 170 return Values{ 171 kind: Double, 172 data: unsafecast.Float64ToBytes(values), 173 } 174 } 175 176 func ByteArrayValues(values []byte, offsets []uint32) Values { 177 return Values{ 178 kind: ByteArray, 179 data: values, 180 offsets: offsets, 181 } 182 } 183 184 func FixedLenByteArrayValues(values []byte, size int) Values { 185 return Values{ 186 kind: FixedLenByteArray, 187 size: int32(size), 188 data: values, 189 } 190 } 191 192 func Uint32Values(values []uint32) Values { 193 return Int32Values(unsafecast.Uint32ToInt32(values)) 194 } 195 196 func Uint64Values(values []uint64) Values { 197 return Int64Values(unsafecast.Uint64ToInt64(values)) 198 } 199 200 func Uint128Values(values [][16]byte) Values { 201 return FixedLenByteArrayValues(unsafecast.Uint128ToBytes(values), 16) 202 } 203 204 func Int32ValuesFromBytes(values []byte) Values { 205 return Values{ 206 kind: Int32, 207 data: values, 208 } 209 } 210 211 func Int64ValuesFromBytes(values []byte) Values { 212 return Values{ 213 kind: Int64, 214 data: values, 215 } 216 } 217 218 func Int96ValuesFromBytes(values []byte) Values { 219 return Values{ 220 kind: Int96, 221 data: values, 222 } 223 } 224 225 func FloatValuesFromBytes(values []byte) Values { 226 return Values{ 227 kind: Float, 228 data: values, 229 } 230 } 231 232 func DoubleValuesFromBytes(values []byte) Values { 233 return Values{ 234 kind: Double, 235 data: values, 236 } 237 } 238 239 func EncodeBoolean(dst []byte, src Values, enc Encoding) ([]byte, error) { 240 return enc.EncodeBoolean(dst, src.Boolean()) 241 } 242 243 func EncodeInt32(dst []byte, src Values, enc Encoding) ([]byte, error) { 244 return enc.EncodeInt32(dst, src.Int32()) 245 } 246 247 func EncodeInt64(dst []byte, src Values, enc Encoding) ([]byte, error) { 248 return enc.EncodeInt64(dst, src.Int64()) 249 } 250 251 func EncodeInt96(dst []byte, src Values, enc Encoding) ([]byte, error) { 252 return enc.EncodeInt96(dst, src.Int96()) 253 } 254 255 func EncodeFloat(dst []byte, src Values, enc Encoding) ([]byte, error) { 256 return enc.EncodeFloat(dst, src.Float()) 257 } 258 259 func EncodeDouble(dst []byte, src Values, enc Encoding) ([]byte, error) { 260 return enc.EncodeDouble(dst, src.Double()) 261 } 262 263 func EncodeByteArray(dst []byte, src Values, enc Encoding) ([]byte, error) { 264 values, offsets := src.ByteArray() 265 return enc.EncodeByteArray(dst, values, offsets) 266 } 267 268 func EncodeFixedLenByteArray(dst []byte, src Values, enc Encoding) ([]byte, error) { 269 data, size := src.FixedLenByteArray() 270 return enc.EncodeFixedLenByteArray(dst, data, size) 271 } 272 273 func DecodeBoolean(dst Values, src []byte, enc Encoding) (Values, error) { 274 values, err := enc.DecodeBoolean(dst.Boolean(), src) 275 return BooleanValues(values), err 276 } 277 278 func DecodeInt32(dst Values, src []byte, enc Encoding) (Values, error) { 279 values, err := enc.DecodeInt32(dst.Int32(), src) 280 return Int32Values(values), err 281 } 282 283 func DecodeInt64(dst Values, src []byte, enc Encoding) (Values, error) { 284 values, err := enc.DecodeInt64(dst.Int64(), src) 285 return Int64Values(values), err 286 } 287 288 func DecodeInt96(dst Values, src []byte, enc Encoding) (Values, error) { 289 values, err := enc.DecodeInt96(dst.Int96(), src) 290 return Int96Values(values), err 291 } 292 293 func DecodeFloat(dst Values, src []byte, enc Encoding) (Values, error) { 294 values, err := enc.DecodeFloat(dst.Float(), src) 295 return FloatValues(values), err 296 } 297 298 func DecodeDouble(dst Values, src []byte, enc Encoding) (Values, error) { 299 values, err := enc.DecodeDouble(dst.Double(), src) 300 return DoubleValues(values), err 301 } 302 303 func DecodeByteArray(dst Values, src []byte, enc Encoding) (Values, error) { 304 values, offsets := dst.ByteArray() 305 values, offsets, err := enc.DecodeByteArray(values, src, offsets) 306 return ByteArrayValues(values, offsets), err 307 } 308 309 func DecodeFixedLenByteArray(dst Values, src []byte, enc Encoding) (Values, error) { 310 data, size := dst.FixedLenByteArray() 311 values, err := enc.DecodeFixedLenByteArray(data, src, size) 312 return FixedLenByteArrayValues(values, size), err 313 }