You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by ze...@apache.org on 2023/04/01 21:21:15 UTC

[arrow] branch main updated: GH-34832: [Go] Add Record SetColumn method (#34794)

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 c582300007 GH-34832: [Go] Add Record SetColumn method  (#34794)
c582300007 is described below

commit c582300007c3aa261682e43bf24de77f50c2ca9e
Author: Yevgeny Pats <ye...@gmail.com>
AuthorDate: Sat Apr 1 17:21:03 2023 -0400

    GH-34832: [Go] Add Record SetColumn method  (#34794)
    
    Small [method](https://arrow.apache.org/docs/cpp/api/table.html#_CPPv4NK5arrow11RecordBatch9SetColumnEiRKNSt10shared_ptrI5FieldEERKNSt10shared_ptrI5ArrayEE) similar to the c/c++ implementation.
    
    * Closes: #34832
    
    Authored-by: Yevgeny Pats <16...@users.noreply.github.com>
    Signed-off-by: Matt Topol <zo...@gmail.com>
---
 go/arrow/array/record.go      | 26 ++++++++++++++++++++++++++
 go/arrow/array/record_test.go | 20 ++++++++++++++++++++
 go/arrow/record.go            |  1 +
 3 files changed, 47 insertions(+)

diff --git a/go/arrow/array/record.go b/go/arrow/array/record.go
index 3b55d83d4a..b00a59d16f 100644
--- a/go/arrow/array/record.go
+++ b/go/arrow/array/record.go
@@ -154,6 +154,32 @@ func NewRecord(schema *arrow.Schema, cols []arrow.Array, nrows int64) *simpleRec
 	return rec
 }
 
+func (rec *simpleRecord) SetColumn(i int, arr arrow.Array) (arrow.Record, error) {
+	if i < 0 || i >= len(rec.arrs) {
+		return nil, fmt.Errorf("arrow/array: column index out of range [0, %d): got=%d", len(rec.arrs), i)
+	}
+
+	if arr.Len() != int(rec.rows) {
+		return nil, fmt.Errorf("arrow/array: mismatch number of rows in column %q: got=%d, want=%d",
+			rec.schema.Field(i).Name,
+			arr.Len(), rec.rows,
+		)
+	}
+
+	f := rec.schema.Field(i)
+	if !arrow.TypeEqual(f.Type, arr.DataType()) {
+		return nil, fmt.Errorf("arrow/array: column %q type mismatch: got=%v, want=%v",
+			f.Name,
+			arr.DataType(), f.Type,
+		)
+	}
+	arrs := make([]arrow.Array, len(rec.arrs))
+	copy(arrs, rec.arrs)
+	arrs[i] = arr
+
+	return NewRecord(rec.schema, arrs, rec.rows), nil
+}
+
 func (rec *simpleRecord) validate() error {
 	if rec.rows == 0 && len(rec.arrs) == 0 {
 		return nil
diff --git a/go/arrow/array/record_test.go b/go/arrow/array/record_test.go
index 2724d3943c..d9e62ce2b8 100644
--- a/go/arrow/array/record_test.go
+++ b/go/arrow/array/record_test.go
@@ -56,6 +56,15 @@ func TestRecord(t *testing.T) {
 	}()
 	defer col2.Release()
 
+	col2_1 := func() arrow.Array {
+		b := array.NewFloat64Builder(mem)
+		defer b.Release()
+
+		b.AppendValues([]float64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, nil)
+		return b.NewFloat64Array()
+	}()
+	defer col2_1.Release()
+
 	cols := []arrow.Array{col1, col2}
 	rec := array.NewRecord(schema, cols, -1)
 	defer rec.Release()
@@ -82,6 +91,17 @@ func TestRecord(t *testing.T) {
 	if got, want := rec.ColumnName(0), schema.Field(0).Name; got != want {
 		t.Fatalf("invalid column name: got=%q, want=%q", got, want)
 	}
+	if _, err := rec.SetColumn(0, col2_1); err == nil {
+		t.Fatalf("expected an error")
+	}
+	newRec, err := rec.SetColumn(1, col2_1);
+	if err != nil {
+		t.Fatalf("unexpected error: %v", err)
+	}
+	defer newRec.Release()
+	if !reflect.DeepEqual(newRec.Column(1), col2_1) {
+		t.Fatalf("invalid column: got=%q, want=%q", rec.Column(1), col2_1)
+	}
 
 	for _, tc := range []struct {
 		i, j int64
diff --git a/go/arrow/record.go b/go/arrow/record.go
index fa63641d5a..b93f1015b9 100644
--- a/go/arrow/record.go
+++ b/go/arrow/record.go
@@ -37,6 +37,7 @@ type Record interface {
 	Columns() []Array
 	Column(i int) Array
 	ColumnName(i int) string
+	SetColumn(i int, col Array) (Record, error)
 
 	// NewSlice constructs a zero-copy slice of the record with the indicated
 	// indices i and j, corresponding to array[i:j].