blob: 170fc2d852a36386f1e455d29b7c983380ddd097 [file] [log] [blame]
// 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
import (
"testing"
"time"
)
func TestTypeEqual(t *testing.T) {
tests := []struct {
left, right DataType
want bool
checkMetadata bool
}{
{
nil, nil, true, false,
},
{
nil, PrimitiveTypes.Uint8, false, false,
},
{
PrimitiveTypes.Float32, nil, false, false,
},
{
PrimitiveTypes.Float64, PrimitiveTypes.Int32, false, false,
},
{
Null, Null, true, false,
},
{
&BinaryType{}, &StringType{}, false, false,
},
{
&LargeBinaryType{}, &LargeStringType{}, false, false,
},
{
BinaryTypes.LargeBinary, &LargeBinaryType{}, true, false,
},
{
BinaryTypes.LargeString, &LargeStringType{}, true, false,
},
{
&Time32Type{Unit: Second}, &Time32Type{Unit: Second}, true, false,
},
{
&Time32Type{Unit: Millisecond}, &Time32Type{Unit: Second}, false, false,
},
{
&Time64Type{Unit: Nanosecond}, &Time64Type{Unit: Nanosecond}, true, false,
},
{
&Time64Type{Unit: Nanosecond}, &Time64Type{Unit: Microsecond}, false, false,
},
{
&TimestampType{Unit: Second, TimeZone: "UTC"}, &TimestampType{Unit: Second, TimeZone: "UTC"}, true, false,
},
{
&TimestampType{Unit: Microsecond, TimeZone: "UTC"}, &TimestampType{Unit: Millisecond, TimeZone: "UTC"}, false, false,
},
{
&TimestampType{Unit: Second, TimeZone: "UTC"}, &TimestampType{Unit: Second, TimeZone: "CET"}, false, false,
},
{
&TimestampType{Unit: Second, TimeZone: "UTC"}, &TimestampType{Unit: Nanosecond, TimeZone: "CET"}, false, false,
},
{
&ListType{elem: Field{Type: PrimitiveTypes.Uint64}}, &ListType{elem: Field{Type: PrimitiveTypes.Uint64}}, true, false,
},
{
&ListType{elem: Field{Type: PrimitiveTypes.Uint64}}, &ListType{elem: Field{Type: PrimitiveTypes.Uint32}}, false, false,
},
{
&ListType{elem: Field{Type: &Time32Type{Unit: Millisecond}}}, &ListType{elem: Field{Type: &Time32Type{Unit: Millisecond}}}, true, false,
},
{
&ListType{elem: Field{Type: &Time32Type{Unit: Millisecond}}}, &ListType{elem: Field{Type: &Time32Type{Unit: Second}}}, false, false,
},
{
&ListType{elem: Field{Type: &ListType{elem: Field{Type: PrimitiveTypes.Uint16}}}}, &ListType{elem: Field{Type: &ListType{elem: Field{Type: PrimitiveTypes.Uint16}}}}, true, false,
},
{
&ListType{elem: Field{Type: &ListType{elem: Field{Type: PrimitiveTypes.Uint16}}}}, &ListType{elem: Field{Type: &ListType{elem: Field{Type: PrimitiveTypes.Uint8}}}}, false, false,
},
{
&ListType{elem: Field{Type: &ListType{elem: Field{Type: &ListType{elem: Field{Type: PrimitiveTypes.Uint16}}}}}}, &ListType{elem: Field{Type: &ListType{elem: Field{Type: PrimitiveTypes.Uint8}}}}, false, false,
},
{
&ListType{elem: Field{Type: PrimitiveTypes.Uint64, Nullable: true}}, &ListType{elem: Field{Type: PrimitiveTypes.Uint64, Nullable: false}}, false, true,
},
{
&FixedSizeListType{n: 2, elem: Field{Type: PrimitiveTypes.Uint64, Nullable: false}}, &FixedSizeListType{n: 3, elem: Field{Type: PrimitiveTypes.Uint64, Nullable: false}}, false, true,
},
{
&FixedSizeListType{n: 2, elem: Field{Type: PrimitiveTypes.Uint64, Nullable: false}}, &FixedSizeListType{n: 2, elem: Field{Type: PrimitiveTypes.Uint64, Nullable: false}}, true, true,
},
{
&FixedSizeListType{n: 2, elem: Field{Type: PrimitiveTypes.Uint64, Nullable: false}}, &FixedSizeListType{n: 2, elem: Field{Type: PrimitiveTypes.Uint64, Nullable: true}}, false, true,
},
{
&StructType{
fields: []Field{
{Name: "f1", Type: PrimitiveTypes.Uint16, Nullable: true},
},
index: map[string][]int{"f1": []int{0}},
},
&StructType{
fields: []Field{
{Name: "f1", Type: PrimitiveTypes.Uint32, Nullable: true},
},
index: map[string][]int{"f1": []int{0}},
},
false, true,
},
{
&StructType{
fields: []Field{
{Name: "f1", Type: PrimitiveTypes.Uint32, Nullable: false},
},
index: map[string][]int{"f1": []int{0}},
},
&StructType{
fields: []Field{
{Name: "f1", Type: PrimitiveTypes.Uint32, Nullable: true},
},
index: map[string][]int{"f1": []int{0}},
},
false, false,
},
{
&StructType{
fields: []Field{
{Name: "f0", Type: PrimitiveTypes.Uint32, Nullable: true},
},
index: map[string][]int{"f0": []int{0}},
},
&StructType{
fields: []Field{
{Name: "f1", Type: PrimitiveTypes.Uint32, Nullable: true},
},
index: map[string][]int{"f1": []int{0}},
},
false, false,
},
{
&StructType{
fields: []Field{
{Name: "f1", Type: PrimitiveTypes.Uint32, Nullable: true},
},
index: map[string][]int{"f1": []int{0}},
},
&StructType{
fields: []Field{
{Name: "f1", Type: PrimitiveTypes.Uint32, Nullable: true},
{Name: "f2", Type: PrimitiveTypes.Uint32, Nullable: true},
},
index: map[string][]int{"f1": []int{0}, "f2": []int{1}},
},
false, true,
},
{
&StructType{
fields: []Field{
{Name: "f1", Type: PrimitiveTypes.Uint32, Nullable: true},
},
index: map[string][]int{"f1": []int{0}},
},
&StructType{
fields: []Field{
{Name: "f1", Type: PrimitiveTypes.Uint32, Nullable: true},
{Name: "f2", Type: PrimitiveTypes.Uint32, Nullable: true},
},
index: map[string][]int{"f1": []int{0}, "f2": []int{1}},
},
false, false,
},
{
&StructType{
fields: []Field{
{Name: "f1", Type: PrimitiveTypes.Uint32, Nullable: true},
},
index: map[string][]int{"f1": []int{0}},
},
&StructType{
fields: []Field{
{Name: "f2", Type: PrimitiveTypes.Uint32, Nullable: true},
},
index: map[string][]int{"f2": []int{0}},
},
false, false,
},
{
&StructType{
fields: []Field{
{Name: "f1", Type: PrimitiveTypes.Uint16, Nullable: true},
{Name: "f2", Type: PrimitiveTypes.Float32, Nullable: false},
},
index: map[string][]int{"f1": []int{0}, "f2": []int{1}},
},
&StructType{
fields: []Field{
{Name: "f1", Type: PrimitiveTypes.Uint16, Nullable: true},
{Name: "f2", Type: PrimitiveTypes.Float32, Nullable: false},
},
index: map[string][]int{"f1": []int{0}, "f2": []int{1}},
},
true, false,
},
{
&StructType{
fields: []Field{
{Name: "f1", Type: PrimitiveTypes.Uint16, Nullable: true},
{Name: "f2", Type: PrimitiveTypes.Float32, Nullable: false},
},
index: map[string][]int{"f1": []int{0}, "f2": []int{1}},
},
&StructType{
fields: []Field{
{Name: "f1", Type: PrimitiveTypes.Uint16, Nullable: true},
{Name: "f2", Type: PrimitiveTypes.Float32, Nullable: false},
},
index: map[string][]int{"f1": []int{0}, "f2": []int{1}},
},
true, false,
},
{
&StructType{
fields: []Field{
{Name: "f1", Type: PrimitiveTypes.Uint16, Nullable: true},
{Name: "f2", Type: PrimitiveTypes.Float32, Nullable: false},
},
index: map[string][]int{"f1": []int{0}, "f2": []int{1}},
meta: MetadataFrom(map[string]string{"k1": "v1", "k2": "v2"}),
},
&StructType{
fields: []Field{
{Name: "f1", Type: PrimitiveTypes.Uint16, Nullable: true},
{Name: "f2", Type: PrimitiveTypes.Float32, Nullable: false},
},
index: map[string][]int{"f1": []int{0}, "f2": []int{1}},
meta: MetadataFrom(map[string]string{"k2": "v2", "k1": "v1"}),
},
true, true,
},
{
&StructType{
fields: []Field{
{Name: "f1", Type: PrimitiveTypes.Uint32, Nullable: true},
},
index: map[string][]int{"f1": []int{0}},
meta: MetadataFrom(map[string]string{"k1": "v1"}),
},
&StructType{
fields: []Field{
{Name: "f1", Type: PrimitiveTypes.Uint32, Nullable: true},
},
index: map[string][]int{"f1": []int{0}},
meta: MetadataFrom(map[string]string{"k1": "v2"}),
},
true, false,
},
{
&StructType{
fields: []Field{
{Name: "f1", Type: PrimitiveTypes.Uint16, Nullable: true, Metadata: MetadataFrom(map[string]string{"k1": "v1"})},
{Name: "f2", Type: PrimitiveTypes.Float32, Nullable: false},
},
index: map[string][]int{"f1": []int{0}, "f2": []int{1}},
},
&StructType{
fields: []Field{
{Name: "f1", Type: PrimitiveTypes.Uint16, Nullable: true, Metadata: MetadataFrom(map[string]string{"k1": "v2"})},
{Name: "f2", Type: PrimitiveTypes.Float32, Nullable: false},
},
index: map[string][]int{"f1": []int{0}, "f2": []int{1}},
},
false, true,
},
{
&StructType{
fields: []Field{
{Name: "f1", Type: PrimitiveTypes.Uint16, Nullable: true},
{Name: "f1", Type: PrimitiveTypes.Uint32, Nullable: true},
},
index: map[string][]int{"f1": []int{0, 1}},
},
&StructType{
fields: []Field{
{Name: "f1", Type: PrimitiveTypes.Uint16, Nullable: true},
{Name: "f1", Type: PrimitiveTypes.Uint32, Nullable: true},
},
index: map[string][]int{"f1": []int{0, 1}},
},
true, true,
},
{
&StructType{
fields: []Field{
{Name: "f1", Type: PrimitiveTypes.Uint32, Nullable: true},
{Name: "f1", Type: PrimitiveTypes.Uint16, Nullable: true},
},
index: map[string][]int{"f1": []int{0, 1}},
},
&StructType{
fields: []Field{
{Name: "f1", Type: PrimitiveTypes.Uint16, Nullable: true},
{Name: "f1", Type: PrimitiveTypes.Uint32, Nullable: true},
},
index: map[string][]int{"f1": []int{0, 1}},
},
false, true,
},
{
MapOf(BinaryTypes.String, PrimitiveTypes.Int32),
MapOf(BinaryTypes.String, PrimitiveTypes.Int32),
true, false,
},
{
MapOf(PrimitiveTypes.Int32, FixedWidthTypes.Timestamp_ns),
MapOf(PrimitiveTypes.Int32, FixedWidthTypes.Timestamp_ns),
true, false,
},
{
MapOf(BinaryTypes.String, &TimestampType{
Unit: 0,
TimeZone: "UTC",
loc: time.UTC,
}),
MapOf(BinaryTypes.String, &TimestampType{
Unit: 0,
TimeZone: "UTC",
loc: nil,
}),
true, false,
},
{
MapOf(PrimitiveTypes.Int32, FixedWidthTypes.Timestamp_ns),
MapOf(PrimitiveTypes.Int32, FixedWidthTypes.Timestamp_us),
false, false,
},
{
MapOf(BinaryTypes.String, FixedWidthTypes.Timestamp_ns),
MapOf(PrimitiveTypes.Int32, FixedWidthTypes.Timestamp_ns),
false, false,
},
{
MapOfWithMetadata(BinaryTypes.String, MetadataFrom(map[string]string{"key": "v1"}), FixedWidthTypes.Timestamp_ns, MetadataFrom(map[string]string{"item": "v1"})),
MapOfWithMetadata(BinaryTypes.String, MetadataFrom(map[string]string{"key": "v1"}), FixedWidthTypes.Timestamp_ns, MetadataFrom(map[string]string{"item": "v1"})),
true, true,
},
{
MapOfWithMetadata(BinaryTypes.String, MetadataFrom(map[string]string{"key": "v1"}), FixedWidthTypes.Timestamp_ns, MetadataFrom(map[string]string{"item": "v1"})),
MapOfWithMetadata(BinaryTypes.String, MetadataFrom(map[string]string{"key": "v2"}), FixedWidthTypes.Timestamp_ns, MetadataFrom(map[string]string{"item": "v2"})),
true, false,
},
{
MapOfWithMetadata(BinaryTypes.String, MetadataFrom(map[string]string{"key": "v1"}), FixedWidthTypes.Timestamp_ns, MetadataFrom(map[string]string{"item": "v1"})),
MapOfWithMetadata(BinaryTypes.String, MetadataFrom(map[string]string{"key": "v1"}), FixedWidthTypes.Timestamp_ns, MetadataFrom(map[string]string{"item": "v2"})),
false, true,
},
{
MapOfWithMetadata(BinaryTypes.String, MetadataFrom(map[string]string{"key": "v1"}), FixedWidthTypes.Timestamp_ns, MetadataFrom(map[string]string{"item": "v1"})),
MapOfWithMetadata(BinaryTypes.String, MetadataFrom(map[string]string{"key": "v2"}), FixedWidthTypes.Timestamp_ns, MetadataFrom(map[string]string{"item": "v1"})),
false, true,
},
}
for _, test := range tests {
t.Run("", func(t *testing.T) {
var got bool
if test.checkMetadata {
got = TypeEqual(test.left, test.right, CheckMetadata())
} else {
got = TypeEqual(test.left, test.right)
}
if got != test.want {
t.Fatalf("TypeEqual(%v, %v, %v): got=%v, want=%v", test.left, test.right, test.checkMetadata, got, test.want)
}
})
}
}