Skip to content

Commit

Permalink
framestruct: Fix wrong conversion even if the first column contains n…
Browse files Browse the repository at this point in the history
…ull values (#601)
  • Loading branch information
skurfuerst authored Jun 9, 2023
1 parent c41c9e1 commit e8cf32a
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 3 deletions.
4 changes: 1 addition & 3 deletions data/framestruct/converter.go
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ func (c *converter) convertStruct(field reflect.Value, fieldName string) error {

func (c *converter) convertSlice(s reflect.Value, prefix string) error {
for i := 0; i < s.Len(); i++ {
c.maxLen++
v := s.Index(i)
switch v.Kind() {
case reflect.Map:
Expand Down Expand Up @@ -259,9 +260,6 @@ func (c *converter) convertField(v reflect.Value, fieldName string) (interface{}

func (c *converter) appendToField(name string, value interface{}) {
c.fields[name].Append(value)
if c.fields[name].Len() > c.maxLen {
c.maxLen++
}
}

func (c *converter) createFrame(name string) *data.Frame {
Expand Down
65 changes: 65 additions & 0 deletions data/framestruct/converter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -312,6 +312,71 @@ func TestSlices(t *testing.T) {
require.Equal(t, "baz1", fromPointer(frame.Fields[2].At(1)))
})

t.Run("it flattens a slice of maps that are different sizes even if col0 is not fully-defined", func(t *testing.T) {
maps := []map[string]interface{}{
{
"Thing2": int32(36),
},
{
"Thing1": "foo1",
"Thing3": "baz1",
},
}

// result
// | Thing1 | Thing2 | Thing3 |
// |--------+--------+--------|
// | nil | 36 | nil |
// | foo1 | nil | baz1 |

frame, err := framestruct.ToDataFrame("results", maps)
require.Nil(t, err)

require.Len(t, frame.Fields, 3)
require.Equal(t, 2, frame.Fields[0].Len())
require.Equal(t, 2, frame.Fields[1].Len())
require.Equal(t, 2, frame.Fields[2].Len())

require.Nil(t, frame.Fields[0].At(0))
require.Equal(t, "foo1", fromPointer(frame.Fields[0].At(1)))

require.Equal(t, int32(36), fromPointer(frame.Fields[1].At(0)))
require.Nil(t, frame.Fields[1].At(1))

require.Nil(t, frame.Fields[2].At(0))
require.Equal(t, "baz1", fromPointer(frame.Fields[2].At(1)))
})

t.Run("it flattens a slice of maps that are different sizes even if col0 is not fully-defined (minimal)s", func(t *testing.T) {
maps := []map[string]interface{}{
{
"b": true,
},
{
"a": true,
},
}

// result
// | a | b |
// |------+------|
// | nil | true |
// | true | nil |

frame, err := framestruct.ToDataFrame("results", maps)
require.Nil(t, err)

require.Len(t, frame.Fields, 2)
require.Equal(t, 2, frame.Fields[0].Len())
require.Equal(t, 2, frame.Fields[1].Len())

require.Nil(t, frame.Fields[0].At(0))
require.Equal(t, true, fromPointer(frame.Fields[0].At(1)))

require.Equal(t, true, fromPointer(frame.Fields[1].At(0)))
require.Nil(t, frame.Fields[1].At(1))
})

t.Run("it flattens a slice of maps that contains nil values", func(t *testing.T) {
// like the testcase above, just with "nil" instead of non-defined map keys.
maps := []map[string]interface{}{
Expand Down

0 comments on commit e8cf32a

Please sign in to comment.