@@ -66,6 +66,21 @@ func (f *FilterKernelTestSuite) getArr(dt arrow.DataType, str string) arrow.Arra
6666 return arr
6767}
6868
69+ // assertDictionaryLogicalEqual compares two dictionary arrays by decoding both to the
70+ // value type and comparing. Use when logical equality is desired (same decoded values)
71+ // rather than physical (same indices and dictionary). ctx must have an allocator.
72+ func assertDictionaryLogicalEqual (t * testing.T , ctx context.Context , expected , actual arrow.Array , opts ... array.EqualOption ) bool {
73+ valueType := expected .DataType ().(* arrow.DictionaryType ).ValueType
74+ castOpts := compute .NewCastOptions (valueType , true )
75+ decodedExpected , err := compute .CastArray (ctx , expected , castOpts )
76+ require .NoError (t , err )
77+ defer decodedExpected .Release ()
78+ decodedActual , err := compute .CastArray (ctx , actual , castOpts )
79+ require .NoError (t , err )
80+ defer decodedActual .Release ()
81+ return assertArraysEqual (t , decodedExpected , decodedActual , opts ... )
82+ }
83+
6984func (f * FilterKernelTestSuite ) doAssertFilter (values , filter , expected arrow.Array ) {
7085 ctx := compute .WithAllocator (context .TODO (), f .mem )
7186 valDatum := compute .NewDatum (values )
@@ -79,7 +94,11 @@ func (f *FilterKernelTestSuite) doAssertFilter(values, filter, expected arrow.Ar
7994 defer out .Release ()
8095 actual := out .(* compute.ArrayDatum ).MakeArray ()
8196 defer actual .Release ()
82- f .Truef (array .Equal (expected , actual ), "expected: %s\n got: %s" , expected , actual )
97+ if expected .DataType ().ID () == arrow .DICTIONARY {
98+ assertDictionaryLogicalEqual (f .T (), ctx , expected , actual )
99+ } else {
100+ f .Truef (array .Equal (expected , actual ), "expected: %s\n got: %s" , expected , actual )
101+ }
83102 })
84103
85104 // f.Run("drop", func() {
@@ -174,7 +193,12 @@ func (tk *TakeKernelTestSuite) assertTakeArrays(values, indices, expected arrow.
174193 actual , err := compute .TakeArray (tk .ctx , values , indices )
175194 tk .Require ().NoError (err )
176195 defer actual .Release ()
177- assertArraysEqual (tk .T (), expected , actual )
196+
197+ if expected .DataType ().ID () == arrow .DICTIONARY {
198+ assertDictionaryLogicalEqual (tk .T (), tk .ctx , expected , actual )
199+ } else {
200+ assertArraysEqual (tk .T (), expected , actual )
201+ }
178202}
179203
180204func (tk * TakeKernelTestSuite ) takeJSON (dt arrow.DataType , values string , idxType arrow.DataType , indices string ) (arrow.Array , error ) {
@@ -1711,6 +1735,7 @@ func TestTakeKernels(t *testing.T) {
17111735 for _ , dt := range baseBinaryTypes {
17121736 suite .Run (t , & TakeKernelTestString {TakeKernelTestTyped : TakeKernelTestTyped {dt : dt }})
17131737 }
1738+ suite .Run (t , & TakeKernelTestString {TakeKernelTestTyped : TakeKernelTestTyped {dt : & arrow.DictionaryType {IndexType : arrow .PrimitiveTypes .Int8 , ValueType : arrow .BinaryTypes .String }}})
17141739 suite .Run (t , new (TakeKernelLists ))
17151740 suite .Run (t , new (TakeKernelDenseUnion ))
17161741 suite .Run (t , new (TakeKernelTestExtension ))
@@ -1732,6 +1757,7 @@ func TestFilterKernels(t *testing.T) {
17321757 for _ , dt := range baseBinaryTypes {
17331758 suite .Run (t , & FilterKernelWithString {dt : dt })
17341759 }
1760+ suite .Run (t , & FilterKernelWithString {dt : & arrow.DictionaryType {IndexType : arrow .PrimitiveTypes .Int8 , ValueType : arrow .BinaryTypes .String }})
17351761 suite .Run (t , new (FilterKernelWithList ))
17361762 suite .Run (t , new (FilterKernelWithUnion ))
17371763 suite .Run (t , new (FilterKernelExtension ))
0 commit comments