spark/sql/types/datatype.go (177 lines of code) (raw):
//
// 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 types
import (
"fmt"
"strings"
"github.com/apache/arrow-go/v18/arrow"
)
type DataType interface {
TypeName() string
IsNumeric() bool
ToArrowType() arrow.DataType
}
type BooleanType struct{}
func (t BooleanType) TypeName() string {
return getDataTypeName(t)
}
func (t BooleanType) IsNumeric() bool {
return false
}
func (t BooleanType) ToArrowType() arrow.DataType {
return arrow.FixedWidthTypes.Boolean
}
type ByteType struct{}
func (t ByteType) IsNumeric() bool {
return true
}
func (t ByteType) ToArrowType() arrow.DataType {
return arrow.PrimitiveTypes.Int8
}
func (t ByteType) TypeName() string {
return getDataTypeName(t)
}
type ShortType struct{}
func (t ShortType) TypeName() string {
return getDataTypeName(t)
}
func (t ShortType) IsNumeric() bool {
return true
}
func (t ShortType) ToArrowType() arrow.DataType {
return arrow.PrimitiveTypes.Int16
}
type IntegerType struct{}
func (t IntegerType) TypeName() string {
return getDataTypeName(t)
}
func (t IntegerType) IsNumeric() bool {
return true
}
func (t IntegerType) ToArrowType() arrow.DataType {
return arrow.PrimitiveTypes.Int32
}
type LongType struct{}
func (t LongType) TypeName() string {
return getDataTypeName(t)
}
func (t LongType) IsNumeric() bool {
return true
}
func (t LongType) ToArrowType() arrow.DataType {
return arrow.PrimitiveTypes.Int64
}
type FloatType struct{}
func (t FloatType) TypeName() string {
return getDataTypeName(t)
}
func (t FloatType) IsNumeric() bool {
return true
}
func (t FloatType) ToArrowType() arrow.DataType {
return arrow.PrimitiveTypes.Float32
}
type DoubleType struct{}
func (t DoubleType) TypeName() string {
return getDataTypeName(t)
}
func (t DoubleType) IsNumeric() bool {
return true
}
func (t DoubleType) ToArrowType() arrow.DataType {
return arrow.PrimitiveTypes.Float64
}
type DecimalType struct {
Precision int32
Scale int32
}
func (t DecimalType) TypeName() string {
return getDataTypeName(t)
}
func (t DecimalType) IsNumeric() bool {
return true
}
func (t DecimalType) ToArrowType() arrow.DataType {
return &arrow.Decimal128Type{
Precision: t.Precision,
Scale: t.Scale,
}
}
type StringType struct{}
func (t StringType) TypeName() string {
return getDataTypeName(t)
}
func (t StringType) IsNumeric() bool {
return false
}
func (t StringType) ToArrowType() arrow.DataType {
return arrow.BinaryTypes.String
}
type BinaryType struct{}
func (t BinaryType) TypeName() string {
return getDataTypeName(t)
}
func (t BinaryType) IsNumeric() bool {
return false
}
func (t BinaryType) ToArrowType() arrow.DataType {
return arrow.BinaryTypes.Binary
}
type TimestampType struct{}
func (t TimestampType) TypeName() string {
return getDataTypeName(t)
}
func (t TimestampType) IsNumeric() bool {
return false
}
func (t TimestampType) ToArrowType() arrow.DataType {
return arrow.FixedWidthTypes.Timestamp_ms
}
type TimestampNtzType struct{}
func (t TimestampNtzType) TypeName() string {
return getDataTypeName(t)
}
func (t TimestampNtzType) IsNumeric() bool {
return false
}
func (t TimestampNtzType) ToArrowType() arrow.DataType {
return arrow.FixedWidthTypes.Timestamp_ns
}
type DateType struct{}
func (t DateType) TypeName() string {
return getDataTypeName(t)
}
func (t DateType) IsNumeric() bool {
return false
}
func (t DateType) ToArrowType() arrow.DataType {
return arrow.FixedWidthTypes.Date32
}
type UnsupportedType struct {
TypeInfo any
}
func (t UnsupportedType) TypeName() string {
return getDataTypeName(t)
}
func (t UnsupportedType) IsNumeric() bool {
return false
}
func (t UnsupportedType) ToArrowType() arrow.DataType {
return nil
}
func getDataTypeName(dataType DataType) string {
typeName := fmt.Sprintf("%T", dataType)
nonQualifiedTypeName := strings.Split(typeName, ".")[1]
return strings.TrimSuffix(nonQualifiedTypeName, "Type")
}
var (
BOOLEAN = BooleanType{}
BYTE = ByteType{}
SHORT = ShortType{}
INTEGER = IntegerType{}
LONG = LongType{}
FLOAT = FloatType{}
DOUBLE = DoubleType{}
DATE = DateType{}
TIMESTAMP = TimestampType{}
TIMESTAMP_NTZ = TimestampNtzType{}
STRING = StringType{}
)