// Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package arrow // OffsetTraits is a convenient interface over the various type traits // constants such as arrow.Int32Traits allowing types with offsets, like // BinaryType, StringType, LargeBinaryType and LargeStringType to have // a method to return information about their offset type and how many bytes // would be required to allocate an offset buffer for them. type OffsetTraits interface { // BytesRequired returns the number of bytes required to be allocated // in order to hold the passed in number of elements of this type. BytesRequired(int) int } type BinaryType struct{} func (t *BinaryType) ID() Type { return BINARY } func (t *BinaryType) Name() string { return "binary" } func (t *BinaryType) String() string { return "binary" } func (t *BinaryType) binary() {} func (t *BinaryType) Fingerprint() string { return typeFingerprint(t) } func (t *BinaryType) Layout() DataTypeLayout { return DataTypeLayout{Buffers: []BufferSpec{SpecBitmap(), SpecFixedWidth(Int32SizeBytes), SpecVariableWidth()}} } func (t *BinaryType) OffsetTypeTraits() OffsetTraits { return Int32Traits } func (BinaryType) IsUtf8() bool { return false } type StringType struct{} func (t *StringType) ID() Type { return STRING } func (t *StringType) Name() string { return "utf8" } func (t *StringType) String() string { return "utf8" } func (t *StringType) binary() {} func (t *StringType) Fingerprint() string { return typeFingerprint(t) } func (t *StringType) Layout() DataTypeLayout { return DataTypeLayout{Buffers: []BufferSpec{SpecBitmap(), SpecFixedWidth(Int32SizeBytes), SpecVariableWidth()}} } func (t *StringType) OffsetTypeTraits() OffsetTraits { return Int32Traits } func (StringType) IsUtf8() bool { return true } type LargeBinaryType struct{} func (t *LargeBinaryType) ID() Type { return LARGE_BINARY } func (t *LargeBinaryType) Name() string { return "large_binary" } func (t *LargeBinaryType) String() string { return "large_binary" } func (t *LargeBinaryType) binary() {} func (t *LargeBinaryType) Fingerprint() string { return typeFingerprint(t) } func (t *LargeBinaryType) Layout() DataTypeLayout { return DataTypeLayout{Buffers: []BufferSpec{SpecBitmap(), SpecFixedWidth(Int64SizeBytes), SpecVariableWidth()}} } func (t *LargeBinaryType) OffsetTypeTraits() OffsetTraits { return Int64Traits } func (LargeBinaryType) IsUtf8() bool { return false } type LargeStringType struct{} func (t *LargeStringType) ID() Type { return LARGE_STRING } func (t *LargeStringType) Name() string { return "large_utf8" } func (t *LargeStringType) String() string { return "large_utf8" } func (t *LargeStringType) binary() {} func (t *LargeStringType) Fingerprint() string { return typeFingerprint(t) } func (t *LargeStringType) Layout() DataTypeLayout { return DataTypeLayout{Buffers: []BufferSpec{SpecBitmap(), SpecFixedWidth(Int64SizeBytes), SpecVariableWidth()}} } func (t *LargeStringType) OffsetTypeTraits() OffsetTraits { return Int64Traits } func (LargeStringType) IsUtf8() bool { return true } var ( BinaryTypes = struct { Binary BinaryDataType String BinaryDataType LargeBinary BinaryDataType LargeString BinaryDataType }{ Binary: &BinaryType{}, String: &StringType{}, LargeBinary: &LargeBinaryType{}, LargeString: &LargeStringType{}, } )