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  }