This is an automated email from the ASF dual-hosted git repository.

zeroshade pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow.git


The following commit(s) were added to refs/heads/main by this push:
     new 6e9262377a GH-35761: [Go] Fix map comparison in TypeEqual (#35762)
6e9262377a is described below

commit 6e9262377abb46bdaa43ab55f75e1bd693035c97
Author: Herman Schaaf <[email protected]>
AuthorDate: Thu May 25 15:17:57 2023 +0100

    GH-35761: [Go] Fix map comparison in TypeEqual (#35762)
    
    Fixes some edge cases when doing type comparison for the map type.
    * Closes: #35761
    
    Authored-by: Herman Schaaf <[email protected]>
    Signed-off-by: Matt Topol <[email protected]>
---
 go/arrow/compare.go      | 24 ++++++++++++++++++++-
 go/arrow/compare_test.go | 54 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 77 insertions(+), 1 deletion(-)

diff --git a/go/arrow/compare.go b/go/arrow/compare.go
index ee84ccf62d..58569b332c 100644
--- a/go/arrow/compare.go
+++ b/go/arrow/compare.go
@@ -29,7 +29,7 @@ type typeEqualsConfig struct {
 type TypeEqualOption func(*typeEqualsConfig)
 
 // CheckMetadata is an option for TypeEqual that allows checking for metadata
-// equality besides type equality. It only makes sense for STRUCT type.
+// equality besides type equality. It only makes sense for types with metadata.
 func CheckMetadata() TypeEqualOption {
        return func(cfg *typeEqualsConfig) {
                cfg.metadata = true
@@ -70,6 +70,28 @@ func TypeEqual(left, right DataType, opts 
...TypeEqualOption) bool {
                        return false
                }
                return l.n == right.(*FixedSizeListType).n && l.elem.Nullable 
== right.(*FixedSizeListType).elem.Nullable
+       case *MapType:
+               if !TypeEqual(l.KeyType(), right.(*MapType).KeyType(), opts...) 
{
+                       return false
+               }
+               if !TypeEqual(l.ItemType(), right.(*MapType).ItemType(), 
opts...) {
+                       return false
+               }
+               if l.KeyField().Nullable != 
right.(*MapType).KeyField().Nullable {
+                       return false
+               }
+               if l.ItemField().Nullable != 
right.(*MapType).ItemField().Nullable {
+                       return false
+               }
+               if cfg.metadata {
+                       if 
!l.KeyField().Metadata.Equal(right.(*MapType).KeyField().Metadata) {
+                               return false
+                       }
+                       if 
!l.ItemField().Metadata.Equal(right.(*MapType).ItemField().Metadata) {
+                               return false
+                       }
+               }
+               return true
        case *StructType:
                r := right.(*StructType)
                switch {
diff --git a/go/arrow/compare_test.go b/go/arrow/compare_test.go
index 567de47b28..b33da3f3ae 100644
--- a/go/arrow/compare_test.go
+++ b/go/arrow/compare_test.go
@@ -18,6 +18,7 @@ package arrow
 
 import (
        "testing"
+       "time"
 )
 
 func TestTypeEqual(t *testing.T) {
@@ -289,6 +290,59 @@ func TestTypeEqual(t *testing.T) {
                        },
                        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 {

Reply via email to