You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by we...@apache.org on 2017/05/09 12:59:05 UTC
arrow git commit: ARROW-984: [GLib] Add Go examples
Repository: arrow
Updated Branches:
refs/heads/master af0c21e9a -> 74ad4a82b
ARROW-984: [GLib] Add Go examples
Author: Kouhei Sutou <ko...@clear-code.com>
Closes #661 from kou/glib-example-go and squashes the following commits:
22e35cb [Kouhei Sutou] [GLib] Add Go examples
Project: http://git-wip-us.apache.org/repos/asf/arrow/repo
Commit: http://git-wip-us.apache.org/repos/asf/arrow/commit/74ad4a82
Tree: http://git-wip-us.apache.org/repos/asf/arrow/tree/74ad4a82
Diff: http://git-wip-us.apache.org/repos/asf/arrow/diff/74ad4a82
Branch: refs/heads/master
Commit: 74ad4a82b1c6c376809dd0e2a2be9fe2fa54a9ac
Parents: af0c21e
Author: Kouhei Sutou <ko...@clear-code.com>
Authored: Tue May 9 08:58:59 2017 -0400
Committer: Wes McKinney <we...@twosigma.com>
Committed: Tue May 9 08:58:59 2017 -0400
----------------------------------------------------------------------
c_glib/.gitignore | 5 +
c_glib/example/go/Makefile | 35 ++++++
c_glib/example/go/README.md | 78 +++++++++++++
c_glib/example/go/arrow-1.0/arrow.go.in | 38 +++++++
c_glib/example/go/arrow-1.0/config.json | 21 ++++
c_glib/example/go/read-batch.go | 100 +++++++++++++++++
c_glib/example/go/read-stream.go | 101 +++++++++++++++++
c_glib/example/go/write-batch.go | 162 +++++++++++++++++++++++++++
c_glib/example/go/write-stream.go | 162 +++++++++++++++++++++++++++
9 files changed, 702 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/arrow/blob/74ad4a82/c_glib/.gitignore
----------------------------------------------------------------------
diff --git a/c_glib/.gitignore b/c_glib/.gitignore
index 6f2de80..796b842 100644
--- a/c_glib/.gitignore
+++ b/c_glib/.gitignore
@@ -41,3 +41,8 @@ Makefile.in
/example/build
/example/read-batch
/example/read-stream
+!/example/go/Makefile
+/example/go/read-batch
+/example/go/read-stream
+/example/go/write-batch
+/example/go/write-stream
http://git-wip-us.apache.org/repos/asf/arrow/blob/74ad4a82/c_glib/example/go/Makefile
----------------------------------------------------------------------
diff --git a/c_glib/example/go/Makefile b/c_glib/example/go/Makefile
new file mode 100644
index 0000000..d883112
--- /dev/null
+++ b/c_glib/example/go/Makefile
@@ -0,0 +1,35 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License. See accompanying LICENSE file.
+
+PROGRAMS = \
+ read-batch \
+ read-stream \
+ write-batch \
+ write-stream
+
+all: build
+
+generate:
+ $$GOPATH/bin/gir-generator \
+ -o $$GOPATH/src/gir/arrow-1.0 \
+ -config arrow-1.0/config.json \
+ arrow-1.0/arrow.go.in
+
+build: $(PROGRAMS)
+
+clean:
+ rm -f $(PROGRAMS)
+
+.SUFFIXES: .go
+
+.go:
+ go build -o $@ $<
http://git-wip-us.apache.org/repos/asf/arrow/blob/74ad4a82/c_glib/example/go/README.md
----------------------------------------------------------------------
diff --git a/c_glib/example/go/README.md b/c_glib/example/go/README.md
new file mode 100644
index 0000000..2054055
--- /dev/null
+++ b/c_glib/example/go/README.md
@@ -0,0 +1,78 @@
+<!---
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License. See accompanying LICENSE file.
+-->
+
+# Arrow Go example
+
+There are Go example codes in this directory.
+
+## How to run
+
+All example codes use
+[go-gir-generator](https://github.com/linuxdeepin/go-gir-generator) to
+use Arrow GLib based bindings.
+
+See [../../README.md](../../README.md) how to install Arrow GLib. You
+can use packages to install Arrow GLib. The following instructions
+assumes that you've installed Arrow GLib by package. Package name is
+`libarrow-glib-dev` on Debian GNU/Linux and Ubuntu, `arrow-glib-devel`
+on CentOS.
+
+Here are command lines to install go-gir-generator on Debian GNU/Linux
+and Ubuntu:
+
+```text
+% sudo apt install -V -y libarrow-glib-dev golang git libgirepository1.0-dev libgudev-1.0-dev
+% export GOPATH=$HOME
+% go get github.com/linuxdeepin/go-gir-generator
+% cd $GOPATH/src/github.com/linuxdeepin/go-gir-generator
+% make build copyfile
+% mkdir -p $GOPATH/bin/
+% cp -a out/gir-generator $GOPATH/bin/
+% cp -a out/src/gir/ $GOPATH/src/
+```
+
+Now, you can generate Arrow bindings for Go:
+
+```text
+% git clone https://github.com/apache/arrow.git ~/arrow
+% cd ~/arrow/c_glib/example/go
+% make generate
+```
+
+Then you can build all example codes:
+
+```text
+% cd ~/arrow/c_glib/example/go
+% make
+% ./write-batch # Write data in batch mode
+% ./read-batch # Read the written batch mode data
+% ./write-stream # Write data in stream mode
+% ./read-stream # Read the written stream mode data
+```
+
+## Go example codes
+
+Here are example codes in this directory:
+
+ * `write-batch.go`: It shows how to write Arrow array to file in
+ batch mode.
+
+ * `read-batch.go`: It shows how to read Arrow array from file in
+ batch mode.
+
+ * `write-stream.go`: It shows how to write Arrow array to file in
+ stream mode.
+
+ * `read-stream.go`: It shows how to read Arrow array from file in
+ stream mode.
http://git-wip-us.apache.org/repos/asf/arrow/blob/74ad4a82/c_glib/example/go/arrow-1.0/arrow.go.in
----------------------------------------------------------------------
diff --git a/c_glib/example/go/arrow-1.0/arrow.go.in b/c_glib/example/go/arrow-1.0/arrow.go.in
new file mode 100644
index 0000000..bd124af
--- /dev/null
+++ b/c_glib/example/go/arrow-1.0/arrow.go.in
@@ -0,0 +1,38 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package arrow
+
+/*
+#include "arrow.gen.h"
+#cgo pkg-config: arrow-glib
+
+[<.g_list_funcs>]
+[<.g_error_free>]
+[<.g_free>]
+*/
+import "C"
+import "unsafe"
+
+import (
+ "gir/glib-2.0"
+ "gir/gobject-2.0"
+)
+
+[<.go_utils>]
+
+[<.go_bindings>]
http://git-wip-us.apache.org/repos/asf/arrow/blob/74ad4a82/c_glib/example/go/arrow-1.0/config.json
----------------------------------------------------------------------
diff --git a/c_glib/example/go/arrow-1.0/config.json b/c_glib/example/go/arrow-1.0/config.json
new file mode 100644
index 0000000..eea9a89
--- /dev/null
+++ b/c_glib/example/go/arrow-1.0/config.json
@@ -0,0 +1,21 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+{
+ "namespace": "Arrow",
+ "version": "1.0"
+}
http://git-wip-us.apache.org/repos/asf/arrow/blob/74ad4a82/c_glib/example/go/read-batch.go
----------------------------------------------------------------------
diff --git a/c_glib/example/go/read-batch.go b/c_glib/example/go/read-batch.go
new file mode 100644
index 0000000..3ad8423
--- /dev/null
+++ b/c_glib/example/go/read-batch.go
@@ -0,0 +1,100 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package main
+
+import (
+ "os"
+ "log"
+ "fmt"
+ "strings"
+)
+
+import "gir/arrow-1.0"
+
+func PrintColumnValue(column *arrow.Array, i int64) {
+ valueType := column.GetValueType()
+ switch valueType {
+ case arrow.TypeUint8:
+ fmt.Print(arrow.ToUInt8Array(column).GetValue(i))
+ case arrow.TypeUint16:
+ fmt.Print(arrow.ToUInt16Array(column).GetValue(i))
+ case arrow.TypeUint32:
+ fmt.Print(arrow.ToUInt32Array(column).GetValue(i))
+ case arrow.TypeUint64:
+ fmt.Print(arrow.ToUInt64Array(column).GetValue(i))
+ case arrow.TypeInt8:
+ fmt.Print(arrow.ToInt8Array(column).GetValue(i))
+ case arrow.TypeInt16:
+ fmt.Print(arrow.ToInt16Array(column).GetValue(i))
+ case arrow.TypeInt32:
+ fmt.Print(arrow.ToInt32Array(column).GetValue(i))
+ case arrow.TypeInt64:
+ fmt.Print(arrow.ToInt64Array(column).GetValue(i))
+ case arrow.TypeFloat:
+ fmt.Print(arrow.ToFloatArray(column).GetValue(i))
+ case arrow.TypeDouble:
+ fmt.Print(arrow.ToDoubleArray(column).GetValue(i))
+ default:
+ fmt.Printf("unknown(%s)", valueType)
+ }
+}
+
+func PrintRecordBatch(recordBatch *arrow.RecordBatch) {
+ nColumns := recordBatch.GetNColumns()
+ for i := uint32(0); i < nColumns; i++ {
+ column := recordBatch.GetColumn(i)
+ columnName := recordBatch.GetColumnName(i)
+ fmt.Printf(" %s: [", columnName)
+ nRows := recordBatch.GetNRows()
+ for j := int64(0); j < nRows; j++ {
+ if j > 0 {
+ fmt.Print(", ")
+ }
+ PrintColumnValue(column, j)
+ }
+ fmt.Println("]")
+ }
+}
+
+func main() {
+ var path string
+ if len(os.Args) < 2 {
+ path = "/tmp/batch.arrow"
+ } else {
+ path = os.Args[1]
+ }
+ input, err := arrow.NewMemoryMappedInputStream(path);
+ if err != nil {
+ log.Fatalf("Failed to open path: <%s>: %v", path, err)
+ }
+ reader, err := arrow.NewFileReader(input)
+ if err != nil {
+ log.Fatalf("Failed to parse data: %v", err)
+ }
+ var i uint32
+ nRecordBatches := reader.GetNRecordBatches()
+ for i = 0; i < nRecordBatches; i++ {
+ recordBatch, err := reader.GetRecordBatch(i)
+ if err != nil {
+ log.Fatalf("Failed to get record batch[%d]: %v", i, err)
+ }
+ fmt.Println(strings.Repeat("=", 40))
+ fmt.Printf("record-batch[%d]:\n", i)
+ PrintRecordBatch(recordBatch)
+ }
+}
http://git-wip-us.apache.org/repos/asf/arrow/blob/74ad4a82/c_glib/example/go/read-stream.go
----------------------------------------------------------------------
diff --git a/c_glib/example/go/read-stream.go b/c_glib/example/go/read-stream.go
new file mode 100644
index 0000000..f336798
--- /dev/null
+++ b/c_glib/example/go/read-stream.go
@@ -0,0 +1,101 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package main
+
+import (
+ "os"
+ "log"
+ "fmt"
+ "strings"
+)
+
+import "gir/arrow-1.0"
+
+func PrintColumnValue(column *arrow.Array, i int64) {
+ valueType := column.GetValueType()
+ switch valueType {
+ case arrow.TypeUint8:
+ fmt.Print(arrow.ToUInt8Array(column).GetValue(i))
+ case arrow.TypeUint16:
+ fmt.Print(arrow.ToUInt16Array(column).GetValue(i))
+ case arrow.TypeUint32:
+ fmt.Print(arrow.ToUInt32Array(column).GetValue(i))
+ case arrow.TypeUint64:
+ fmt.Print(arrow.ToUInt64Array(column).GetValue(i))
+ case arrow.TypeInt8:
+ fmt.Print(arrow.ToInt8Array(column).GetValue(i))
+ case arrow.TypeInt16:
+ fmt.Print(arrow.ToInt16Array(column).GetValue(i))
+ case arrow.TypeInt32:
+ fmt.Print(arrow.ToInt32Array(column).GetValue(i))
+ case arrow.TypeInt64:
+ fmt.Print(arrow.ToInt64Array(column).GetValue(i))
+ case arrow.TypeFloat:
+ fmt.Print(arrow.ToFloatArray(column).GetValue(i))
+ case arrow.TypeDouble:
+ fmt.Print(arrow.ToDoubleArray(column).GetValue(i))
+ default:
+ fmt.Printf("unknown(%s)", valueType)
+ }
+}
+
+func PrintRecordBatch(recordBatch *arrow.RecordBatch) {
+ nColumns := recordBatch.GetNColumns()
+ for i := uint32(0); i < nColumns; i++ {
+ column := recordBatch.GetColumn(i)
+ columnName := recordBatch.GetColumnName(i)
+ fmt.Printf(" %s: [", columnName)
+ nRows := recordBatch.GetNRows()
+ for j := int64(0); j < nRows; j++ {
+ if j > 0 {
+ fmt.Print(", ")
+ }
+ PrintColumnValue(column, j)
+ }
+ fmt.Println("]")
+ }
+}
+
+func main() {
+ var path string
+ if len(os.Args) < 2 {
+ path = "/tmp/stream.arrow"
+ } else {
+ path = os.Args[1]
+ }
+ input, err := arrow.NewMemoryMappedInputStream(path);
+ if err != nil {
+ log.Fatalf("Failed to open path: <%s>: %v", path, err)
+ }
+ reader, err := arrow.NewStreamReader(input)
+ if err != nil {
+ log.Fatalf("Failed to parse data: %v", err)
+ }
+ for i := 0; true; i++ {
+ recordBatch, err := reader.GetNextRecordBatch()
+ if err != nil {
+ log.Fatalf("Failed to get next record batch: %v", err)
+ }
+ if recordBatch == nil {
+ break
+ }
+ fmt.Println(strings.Repeat("=", 40))
+ fmt.Printf("record-batch[%d]:\n", i)
+ PrintRecordBatch(recordBatch)
+ }
+}
http://git-wip-us.apache.org/repos/asf/arrow/blob/74ad4a82/c_glib/example/go/write-batch.go
----------------------------------------------------------------------
diff --git a/c_glib/example/go/write-batch.go b/c_glib/example/go/write-batch.go
new file mode 100644
index 0000000..f5e946a
--- /dev/null
+++ b/c_glib/example/go/write-batch.go
@@ -0,0 +1,162 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package main
+
+import (
+ "os"
+ "log"
+)
+
+import "gir/arrow-1.0"
+
+func BuildUInt8Array() *arrow.Array {
+ builder := arrow.NewUInt8ArrayBuilder()
+ for _, value := range []uint8{1, 2, 4, 8} {
+ builder.Append(value)
+ }
+ return builder.Finish()
+}
+
+func BuildUInt16Array() *arrow.Array {
+ builder := arrow.NewUInt16ArrayBuilder()
+ for _, value := range []uint16{1, 2, 4, 8} {
+ builder.Append(value)
+ }
+ return builder.Finish()
+}
+
+func BuildUInt32Array() *arrow.Array {
+ builder := arrow.NewUInt32ArrayBuilder()
+ for _, value := range []uint32{1, 2, 4, 8} {
+ builder.Append(value)
+ }
+ return builder.Finish()
+}
+
+func BuildUInt64Array() *arrow.Array {
+ builder := arrow.NewUInt64ArrayBuilder()
+ for _, value := range []uint64{1, 2, 4, 8} {
+ builder.Append(value)
+ }
+ return builder.Finish()
+}
+
+func BuildInt8Array() *arrow.Array {
+ builder := arrow.NewInt8ArrayBuilder()
+ for _, value := range []int8{1, -2, 4, -8} {
+ builder.Append(value)
+ }
+ return builder.Finish()
+}
+
+func BuildInt16Array() *arrow.Array {
+ builder := arrow.NewInt16ArrayBuilder()
+ for _, value := range []int16{1, -2, 4, -8} {
+ builder.Append(value)
+ }
+ return builder.Finish()
+}
+
+func BuildInt32Array() *arrow.Array {
+ builder := arrow.NewInt32ArrayBuilder()
+ for _, value := range []int32{1, -2, 4, -8} {
+ builder.Append(value)
+ }
+ return builder.Finish()
+}
+
+func BuildInt64Array() *arrow.Array {
+ builder := arrow.NewInt64ArrayBuilder()
+ for _, value := range []int64{1, -2, 4, -8} {
+ builder.Append(value)
+ }
+ return builder.Finish()
+}
+
+func BuildFloatArray() *arrow.Array {
+ builder := arrow.NewFloatArrayBuilder()
+ for _, value := range []float32{1.1, -2.2, 4.4, -8.8} {
+ builder.Append(value)
+ }
+ return builder.Finish()
+}
+
+func BuildDoubleArray() *arrow.Array {
+ builder := arrow.NewDoubleArrayBuilder()
+ for _, value := range []float64{1.1, -2.2, 4.4, -8.8} {
+ builder.Append(value)
+ }
+ return builder.Finish()
+}
+
+func main() {
+ var output_path string
+ if len(os.Args) < 2 {
+ output_path = "/tmp/batch.arrow"
+ } else {
+ output_path = os.Args[1]
+ }
+
+ fields := []*arrow.Field{
+ arrow.NewField("uint8", arrow.NewUInt8DataType()),
+ arrow.NewField("uint16", arrow.NewUInt16DataType()),
+ arrow.NewField("uint32", arrow.NewUInt32DataType()),
+ arrow.NewField("uint64", arrow.NewUInt64DataType()),
+ arrow.NewField("int8", arrow.NewInt8DataType()),
+ arrow.NewField("int16", arrow.NewInt16DataType()),
+ arrow.NewField("int32", arrow.NewInt32DataType()),
+ arrow.NewField("int64", arrow.NewInt64DataType()),
+ arrow.NewField("float", arrow.NewFloatDataType()),
+ arrow.NewField("double", arrow.NewDoubleDataType()),
+ }
+ schema := arrow.NewSchema(fields)
+
+ output, err := arrow.NewFileOutputStream(output_path, false)
+ if err != nil {
+ log.Fatalf("Failed to open path: <%s>: %v", output_path, err)
+ }
+ writer, err := arrow.NewFileWriter(output, schema)
+ if err != nil {
+ log.Fatalf("Failed to create writer: %v", err)
+ }
+
+ columns := []*arrow.Array{
+ BuildUInt8Array(),
+ BuildUInt16Array(),
+ BuildUInt32Array(),
+ BuildUInt64Array(),
+ BuildInt8Array(),
+ BuildInt16Array(),
+ BuildInt32Array(),
+ BuildInt64Array(),
+ BuildFloatArray(),
+ BuildDoubleArray(),
+ }
+
+ recordBatch := arrow.NewRecordBatch(schema, 4, columns)
+ writer.WriteRecordBatch(recordBatch)
+
+ slicedColumns := make([]*arrow.Array, len(columns))
+ for i, column := range columns {
+ slicedColumns[i] = column.Slice(1, 3)
+ }
+ recordBatch = arrow.NewRecordBatch(schema, 3, slicedColumns)
+ writer.WriteRecordBatch(recordBatch)
+
+ writer.Close()
+}
http://git-wip-us.apache.org/repos/asf/arrow/blob/74ad4a82/c_glib/example/go/write-stream.go
----------------------------------------------------------------------
diff --git a/c_glib/example/go/write-stream.go b/c_glib/example/go/write-stream.go
new file mode 100644
index 0000000..80ebd2b
--- /dev/null
+++ b/c_glib/example/go/write-stream.go
@@ -0,0 +1,162 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package main
+
+import (
+ "os"
+ "log"
+)
+
+import "gir/arrow-1.0"
+
+func BuildUInt8Array() *arrow.Array {
+ builder := arrow.NewUInt8ArrayBuilder()
+ for _, value := range []uint8{1, 2, 4, 8} {
+ builder.Append(value)
+ }
+ return builder.Finish()
+}
+
+func BuildUInt16Array() *arrow.Array {
+ builder := arrow.NewUInt16ArrayBuilder()
+ for _, value := range []uint16{1, 2, 4, 8} {
+ builder.Append(value)
+ }
+ return builder.Finish()
+}
+
+func BuildUInt32Array() *arrow.Array {
+ builder := arrow.NewUInt32ArrayBuilder()
+ for _, value := range []uint32{1, 2, 4, 8} {
+ builder.Append(value)
+ }
+ return builder.Finish()
+}
+
+func BuildUInt64Array() *arrow.Array {
+ builder := arrow.NewUInt64ArrayBuilder()
+ for _, value := range []uint64{1, 2, 4, 8} {
+ builder.Append(value)
+ }
+ return builder.Finish()
+}
+
+func BuildInt8Array() *arrow.Array {
+ builder := arrow.NewInt8ArrayBuilder()
+ for _, value := range []int8{1, -2, 4, -8} {
+ builder.Append(value)
+ }
+ return builder.Finish()
+}
+
+func BuildInt16Array() *arrow.Array {
+ builder := arrow.NewInt16ArrayBuilder()
+ for _, value := range []int16{1, -2, 4, -8} {
+ builder.Append(value)
+ }
+ return builder.Finish()
+}
+
+func BuildInt32Array() *arrow.Array {
+ builder := arrow.NewInt32ArrayBuilder()
+ for _, value := range []int32{1, -2, 4, -8} {
+ builder.Append(value)
+ }
+ return builder.Finish()
+}
+
+func BuildInt64Array() *arrow.Array {
+ builder := arrow.NewInt64ArrayBuilder()
+ for _, value := range []int64{1, -2, 4, -8} {
+ builder.Append(value)
+ }
+ return builder.Finish()
+}
+
+func BuildFloatArray() *arrow.Array {
+ builder := arrow.NewFloatArrayBuilder()
+ for _, value := range []float32{1.1, -2.2, 4.4, -8.8} {
+ builder.Append(value)
+ }
+ return builder.Finish()
+}
+
+func BuildDoubleArray() *arrow.Array {
+ builder := arrow.NewDoubleArrayBuilder()
+ for _, value := range []float64{1.1, -2.2, 4.4, -8.8} {
+ builder.Append(value)
+ }
+ return builder.Finish()
+}
+
+func main() {
+ var output_path string
+ if len(os.Args) < 2 {
+ output_path = "/tmp/stream.arrow"
+ } else {
+ output_path = os.Args[1]
+ }
+
+ fields := []*arrow.Field{
+ arrow.NewField("uint8", arrow.NewUInt8DataType()),
+ arrow.NewField("uint16", arrow.NewUInt16DataType()),
+ arrow.NewField("uint32", arrow.NewUInt32DataType()),
+ arrow.NewField("uint64", arrow.NewUInt64DataType()),
+ arrow.NewField("int8", arrow.NewInt8DataType()),
+ arrow.NewField("int16", arrow.NewInt16DataType()),
+ arrow.NewField("int32", arrow.NewInt32DataType()),
+ arrow.NewField("int64", arrow.NewInt64DataType()),
+ arrow.NewField("float", arrow.NewFloatDataType()),
+ arrow.NewField("double", arrow.NewDoubleDataType()),
+ }
+ schema := arrow.NewSchema(fields)
+
+ output, err := arrow.NewFileOutputStream(output_path, false)
+ if err != nil {
+ log.Fatalf("Failed to open path: <%s>: %v", output_path, err)
+ }
+ writer, err := arrow.NewStreamWriter(output, schema)
+ if err != nil {
+ log.Fatalf("Failed to create writer: %v", err)
+ }
+
+ columns := []*arrow.Array{
+ BuildUInt8Array(),
+ BuildUInt16Array(),
+ BuildUInt32Array(),
+ BuildUInt64Array(),
+ BuildInt8Array(),
+ BuildInt16Array(),
+ BuildInt32Array(),
+ BuildInt64Array(),
+ BuildFloatArray(),
+ BuildDoubleArray(),
+ }
+
+ recordBatch := arrow.NewRecordBatch(schema, 4, columns)
+ writer.WriteRecordBatch(recordBatch)
+
+ slicedColumns := make([]*arrow.Array, len(columns))
+ for i, column := range columns {
+ slicedColumns[i] = column.Slice(1, 3)
+ }
+ recordBatch = arrow.NewRecordBatch(schema, 3, slicedColumns)
+ writer.WriteRecordBatch(recordBatch)
+
+ writer.Close()
+}