Skip to content

Commit

Permalink
Use frame field display name, if exists, for arrow field name (#6)
Browse files Browse the repository at this point in the history
  • Loading branch information
scottlepp authored May 8, 2024
1 parent 645ace1 commit f69362b
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 40 deletions.
10 changes: 9 additions & 1 deletion duck/data/arrow.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ func buildArrowFields(f *data.Frame) ([]arrow.Field, error) {
}
}

name := getFieldName(field)
if field.Config != nil {
str, err := toJSONString(field.Config)
if err != nil {
Expand All @@ -61,7 +62,7 @@ func buildArrowFields(f *data.Frame) ([]arrow.Field, error) {
}

arrowFields[i] = arrow.Field{
Name: field.Name,
Name: name,
Type: t,
Metadata: arrow.MetadataFrom(fieldMeta),
Nullable: nullable,
Expand Down Expand Up @@ -180,3 +181,10 @@ func toJSONString(val interface{}) (string, error) {
}
return string(b), nil
}

func getFieldName(field *data.Field) string {
if field.Config != nil && field.Config.DisplayName != "" {
return field.Config.DisplayName
}
return field.Name
}
3 changes: 2 additions & 1 deletion duck/data/parquet.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,8 @@ func frameData(frame *data.Frame) FrameData {
for rowIdx := 0; rowIdx < frame.Rows(); rowIdx++ {
row := map[string]any{}
for colIdx, f := range frame.Fields {
row[f.Name] = frame.At(colIdx, rowIdx)
name := getFieldName(f)
row[name] = frame.At(colIdx, rowIdx)
}
data = append(data, row)
}
Expand Down
95 changes: 57 additions & 38 deletions duck/duckdb_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,24 @@ func TestQueryFrame(t *testing.T) {
assert.Contains(t, res, `[{"value":"test"}]`)
}

func TestQueryFrameWithDisplayName(t *testing.T) {
db := NewInMemoryDB()

var values = []string{"test"}
field := data.NewField("value", nil, values)
field.Config = &data.FieldConfig{
DisplayName: "some value",
}
frame := data.NewFrame("foo", field)
frame.RefID = "foo"
frames := []*data.Frame{frame}

res, err := db.QueryFrames("foo", "select * from foo", frames)
assert.Nil(t, err)

assert.Contains(t, res, `[{"some value":"test"}]`)
}

func TestQueryFrameChunks(t *testing.T) {
opts := Opts{
Chunk: 3,
Expand Down Expand Up @@ -263,53 +281,54 @@ func TestLabelsMultiFrame(t *testing.T) {
assert.Contains(t, txt, "B")
}

func TestWideFrameWithDuplicateFields(t *testing.T) {
db := NewInMemoryDB()
// TODO - don't think this is valid to have a frame with duplicate fields
// func TestWideFrameWithDuplicateFields(t *testing.T) {
// db := NewInMemoryDB()

tt := "2024-02-23 09:01:54"
dd, err := dateparse.ParseAny(tt)
assert.Nil(t, err)
// tt := "2024-02-23 09:01:54"
// dd, err := dateparse.ParseAny(tt)
// assert.Nil(t, err)

ttt := "2024-02-23 09:02:54"
ddd, err := dateparse.ParseAny(ttt)
assert.Nil(t, err)
// ttt := "2024-02-23 09:02:54"
// ddd, err := dateparse.ParseAny(ttt)
// assert.Nil(t, err)

var timeValues = []time.Time{dd, ddd}
// var timeValues = []time.Time{dd, ddd}

f := new(float64)
*f = 12345
// f := new(float64)
// *f = 12345

var values = []*float64{f, f}
labels := map[string]string{
"server": "A",
}
// var values = []*float64{f, f}
// labels := map[string]string{
// "server": "A",
// }

var values2 = []*float64{f, f}
labels2 := map[string]string{
"server": "B",
}
frame := data.NewFrame("foo",
data.NewField("timestamp", nil, timeValues),
data.NewField("value", labels, values),
data.NewField("value", labels2, values2),
)
// var values2 = []*float64{f, f}
// labels2 := map[string]string{
// "server": "B",
// }
// frame := data.NewFrame("foo",
// data.NewField("timestamp", nil, timeValues),
// data.NewField("value", labels, values),
// data.NewField("value", labels2, values2),
// )

frame.RefID = "foo"
// frame.RefID = "foo"

frames := []*data.Frame{frame}
// frames := []*data.Frame{frame}

// TODO - ordering is broken!
model := &data.Frame{}
err = db.QueryFramesInto("foo", "select * from foo order by timestamp desc", frames, model)
assert.Nil(t, err)
// // TODO - ordering is broken!
// model := &data.Frame{}
// err = db.QueryFramesInto("foo", "select * from foo order by timestamp desc", frames, model)
// assert.Nil(t, err)

assert.Equal(t, 2, model.Rows())
txt, err := model.StringTable(-1, -1)
assert.Nil(t, err)
// assert.Equal(t, 2, model.Rows())
// txt, err := model.StringTable(-1, -1)
// assert.Nil(t, err)

fmt.Printf("GOT: %s", txt)
// fmt.Printf("GOT: %s", txt)

assert.Contains(t, txt, "server")
assert.Contains(t, txt, "A")
assert.Contains(t, txt, "B")
}
// assert.Contains(t, txt, "server")
// assert.Contains(t, txt, "A")
// assert.Contains(t, txt, "B")
// }

0 comments on commit f69362b

Please sign in to comment.