[ 
https://issues.apache.org/jira/browse/ARROW-1859?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16266146#comment-16266146
 ] 

ASF GitHub Bot commented on ARROW-1859:
---------------------------------------

wesm closed pull request #1361: ARROW-1859: [GLib] Add GArrowDictionaryDataType
URL: https://github.com/apache/arrow/pull/1361
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/c_glib/arrow-glib/Makefile.am b/c_glib/arrow-glib/Makefile.am
index e8073115d..39222a548 100644
--- a/c_glib/arrow-glib/Makefile.am
+++ b/c_glib/arrow-glib/Makefile.am
@@ -45,10 +45,12 @@ libarrow_glib_la_headers =                  \
        array.h                                 \
        array-builder.h                         \
        arrow-glib.h                            \
+       basic-array.h                           \
        basic-data-type.h                       \
        buffer.h                                \
        chunked-array.h                         \
        column.h                                \
+       composite-array.h                       \
        composite-data-type.h                   \
        data-type.h                             \
        error.h                                 \
@@ -86,12 +88,13 @@ libarrow_glib_la_generated_sources =                \
        $(libarrow_glib_la_generated_headers)
 
 libarrow_glib_la_sources =                     \
-       array.cpp                               \
        array-builder.cpp                       \
+       basic-array.cpp                         \
        basic-data-type.cpp                     \
        buffer.cpp                              \
        chunked-array.cpp                       \
        column.cpp                              \
+       composite-array.cpp                     \
        composite-data-type.cpp                 \
        error.cpp                               \
        field.cpp                               \
@@ -125,6 +128,7 @@ libarrow_glib_la_cpp_headers =                      \
        array.hpp                               \
        array-builder.hpp                       \
        arrow-glib.hpp                          \
+       basic-array.hpp                         \
        basic-data-type.hpp                     \
        buffer.hpp                              \
        chunked-array.hpp                       \
diff --git a/c_glib/arrow-glib/array.h b/c_glib/arrow-glib/array.h
index e988a8aae..9a845597d 100644
--- a/c_glib/arrow-glib/array.h
+++ b/c_glib/arrow-glib/array.h
@@ -19,1226 +19,5 @@
 
 #pragma once
 
-#include <arrow-glib/buffer.h>
-#include <arrow-glib/compute.h>
-#include <arrow-glib/data-type.h>
-
-G_BEGIN_DECLS
-
-#define GARROW_TYPE_ARRAY \
-  (garrow_array_get_type())
-#define GARROW_ARRAY(obj) \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj), GARROW_TYPE_ARRAY, GArrowArray))
-#define GARROW_ARRAY_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_CAST((klass), GARROW_TYPE_ARRAY, GArrowArrayClass))
-#define GARROW_IS_ARRAY(obj) \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj), GARROW_TYPE_ARRAY))
-#define GARROW_IS_ARRAY_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_TYPE((klass), GARROW_TYPE_ARRAY))
-#define GARROW_ARRAY_GET_CLASS(obj) \
-  (G_TYPE_INSTANCE_GET_CLASS((obj), GARROW_TYPE_ARRAY, GArrowArrayClass))
-
-typedef struct _GArrowArray         GArrowArray;
-typedef struct _GArrowArrayClass    GArrowArrayClass;
-
-/**
- * GArrowArray:
- *
- * It wraps `arrow::Array`.
- */
-struct _GArrowArray
-{
-  /*< private >*/
-  GObject parent_instance;
-};
-
-struct _GArrowArrayClass
-{
-  GObjectClass parent_class;
-};
-
-GType          garrow_array_get_type    (void) G_GNUC_CONST;
-
-gboolean       garrow_array_equal       (GArrowArray *array,
-                                         GArrowArray *other_array);
-gboolean       garrow_array_equal_approx(GArrowArray *array,
-                                         GArrowArray *other_array);
-gboolean       garrow_array_equal_range (GArrowArray *array,
-                                         gint64 start_index,
-                                         GArrowArray *other_array,
-                                         gint64 other_start_index,
-                                         gint64 end_index);
-
-gboolean       garrow_array_is_null     (GArrowArray *array,
-                                         gint64 i);
-gboolean       garrow_array_is_valid    (GArrowArray *array,
-                                         gint64 i);
-gint64         garrow_array_get_length  (GArrowArray *array);
-gint64         garrow_array_get_offset  (GArrowArray *array);
-gint64         garrow_array_get_n_nulls (GArrowArray *array);
-GArrowBuffer  *garrow_array_get_null_bitmap(GArrowArray *array);
-GArrowDataType *garrow_array_get_value_data_type(GArrowArray *array);
-GArrowType     garrow_array_get_value_type(GArrowArray *array);
-GArrowArray   *garrow_array_slice       (GArrowArray *array,
-                                         gint64 offset,
-                                         gint64 length);
-gchar         *garrow_array_to_string   (GArrowArray *array,
-                                         GError **error);
-
-GArrowArray   *garrow_array_cast        (GArrowArray *array,
-                                         GArrowDataType *target_data_type,
-                                         GArrowCastOptions *options,
-                                         GError **error);
-
-#define GARROW_TYPE_NULL_ARRAY                  \
-  (garrow_null_array_get_type())
-#define GARROW_NULL_ARRAY(obj)                          \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
-                              GARROW_TYPE_NULL_ARRAY,   \
-                              GArrowNullArray))
-#define GARROW_NULL_ARRAY_CLASS(klass)                  \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
-                           GARROW_TYPE_NULL_ARRAY,      \
-                           GArrowNullArrayClass))
-#define GARROW_IS_NULL_ARRAY(obj)                       \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                    \
-                              GARROW_TYPE_NULL_ARRAY))
-#define GARROW_IS_NULL_ARRAY_CLASS(klass)               \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
-                           GARROW_TYPE_NULL_ARRAY))
-#define GARROW_NULL_ARRAY_GET_CLASS(obj)                \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
-                             GARROW_TYPE_NULL_ARRAY,    \
-                             GArrowNullArrayClass))
-
-typedef struct _GArrowNullArray         GArrowNullArray;
-typedef struct _GArrowNullArrayClass    GArrowNullArrayClass;
-
-/**
- * GArrowNullArray:
- *
- * It wraps `arrow::NullArray`.
- */
-struct _GArrowNullArray
-{
-  /*< private >*/
-  GArrowArray parent_instance;
-};
-
-struct _GArrowNullArrayClass
-{
-  GArrowArrayClass parent_class;
-};
-
-GType garrow_null_array_get_type(void) G_GNUC_CONST;
-
-GArrowNullArray *garrow_null_array_new(gint64 length);
-
-
-#define GARROW_TYPE_PRIMITIVE_ARRAY             \
-  (garrow_primitive_array_get_type())
-#define GARROW_PRIMITIVE_ARRAY(obj)                             \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
-                              GARROW_TYPE_PRIMITIVE_ARRAY,      \
-                              GArrowPrimitiveArray))
-#define GARROW_PRIMITIVE_ARRAY_CLASS(klass)             \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
-                           GARROW_TYPE_PRIMITIVE_ARRAY, \
-                           GArrowPrimitiveArrayClass))
-#define GARROW_IS_PRIMITIVE_ARRAY(obj)                          \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_PRIMITIVE_ARRAY))
-#define GARROW_IS_PRIMITIVE_ARRAY_CLASS(klass)                  \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
-                           GARROW_TYPE_PRIMITIVE_ARRAY))
-#define GARROW_PRIMITIVE_ARRAY_GET_CLASS(obj)                   \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
-                             GARROW_TYPE_PRIMITIVE_ARRAY,       \
-                             GArrowPrimitiveArrayClass))
-
-typedef struct _GArrowPrimitiveArray         GArrowPrimitiveArray;
-typedef struct _GArrowPrimitiveArrayClass    GArrowPrimitiveArrayClass;
-
-/**
- * GArrowPrimitiveArray:
- *
- * It wraps `arrow::PrimitiveArray`.
- */
-struct _GArrowPrimitiveArray
-{
-  /*< private >*/
-  GArrowArray parent_instance;
-};
-
-struct _GArrowPrimitiveArrayClass
-{
-  GArrowArrayClass parent_class;
-};
-
-GType garrow_primitive_array_get_type(void) G_GNUC_CONST;
-
-GArrowBuffer *garrow_primitive_array_get_buffer(GArrowPrimitiveArray *array);
-
-
-#define GARROW_TYPE_BOOLEAN_ARRAY               \
-  (garrow_boolean_array_get_type())
-#define GARROW_BOOLEAN_ARRAY(obj)                               \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
-                              GARROW_TYPE_BOOLEAN_ARRAY,        \
-                              GArrowBooleanArray))
-#define GARROW_BOOLEAN_ARRAY_CLASS(klass)               \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
-                           GARROW_TYPE_BOOLEAN_ARRAY,   \
-                           GArrowBooleanArrayClass))
-#define GARROW_IS_BOOLEAN_ARRAY(obj)                            \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_BOOLEAN_ARRAY))
-#define GARROW_IS_BOOLEAN_ARRAY_CLASS(klass)            \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
-                           GARROW_TYPE_BOOLEAN_ARRAY))
-#define GARROW_BOOLEAN_ARRAY_GET_CLASS(obj)             \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
-                             GARROW_TYPE_BOOLEAN_ARRAY, \
-                             GArrowBooleanArrayClass))
-
-typedef struct _GArrowBooleanArray         GArrowBooleanArray;
-typedef struct _GArrowBooleanArrayClass    GArrowBooleanArrayClass;
-
-/**
- * GArrowBooleanArray:
- *
- * It wraps `arrow::BooleanArray`.
- */
-struct _GArrowBooleanArray
-{
-  /*< private >*/
-  GArrowPrimitiveArray parent_instance;
-};
-
-struct _GArrowBooleanArrayClass
-{
-  GArrowPrimitiveArrayClass parent_class;
-};
-
-GType          garrow_boolean_array_get_type  (void) G_GNUC_CONST;
-
-GArrowBooleanArray *garrow_boolean_array_new(gint64 length,
-                                             GArrowBuffer *data,
-                                             GArrowBuffer *null_bitmap,
-                                             gint64 n_nulls);
-
-gboolean       garrow_boolean_array_get_value (GArrowBooleanArray *array,
-                                               gint64 i);
-gboolean      *garrow_boolean_array_get_values(GArrowBooleanArray *array,
-                                               gint64 *length);
-
-
-#define GARROW_TYPE_INT8_ARRAY                  \
-  (garrow_int8_array_get_type())
-#define GARROW_INT8_ARRAY(obj)                          \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
-                              GARROW_TYPE_INT8_ARRAY,   \
-                              GArrowInt8Array))
-#define GARROW_INT8_ARRAY_CLASS(klass)                  \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
-                           GARROW_TYPE_INT8_ARRAY,      \
-                           GArrowInt8ArrayClass))
-#define GARROW_IS_INT8_ARRAY(obj)                       \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                    \
-                              GARROW_TYPE_INT8_ARRAY))
-#define GARROW_IS_INT8_ARRAY_CLASS(klass)               \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
-                           GARROW_TYPE_INT8_ARRAY))
-#define GARROW_INT8_ARRAY_GET_CLASS(obj)                \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
-                             GARROW_TYPE_INT8_ARRAY,    \
-                             GArrowInt8ArrayClass))
-
-typedef struct _GArrowInt8Array         GArrowInt8Array;
-typedef struct _GArrowInt8ArrayClass    GArrowInt8ArrayClass;
-
-/**
- * GArrowInt8Array:
- *
- * It wraps `arrow::Int8Array`.
- */
-struct _GArrowInt8Array
-{
-  /*< private >*/
-  GArrowPrimitiveArray parent_instance;
-};
-
-struct _GArrowInt8ArrayClass
-{
-  GArrowPrimitiveArrayClass parent_class;
-};
-
-GType garrow_int8_array_get_type(void) G_GNUC_CONST;
-
-GArrowInt8Array *garrow_int8_array_new(gint64 length,
-                                       GArrowBuffer *data,
-                                       GArrowBuffer *null_bitmap,
-                                       gint64 n_nulls);
-
-gint8 garrow_int8_array_get_value(GArrowInt8Array *array,
-                                  gint64 i);
-const gint8 *garrow_int8_array_get_values(GArrowInt8Array *array,
-                                          gint64 *length);
-
-
-#define GARROW_TYPE_UINT8_ARRAY                 \
-  (garrow_uint8_array_get_type())
-#define GARROW_UINT8_ARRAY(obj)                         \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
-                              GARROW_TYPE_UINT8_ARRAY,  \
-                              GArrowUInt8Array))
-#define GARROW_UINT8_ARRAY_CLASS(klass)                 \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
-                           GARROW_TYPE_UINT8_ARRAY,     \
-                           GArrowUInt8ArrayClass))
-#define GARROW_IS_UINT8_ARRAY(obj)                      \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                    \
-                              GARROW_TYPE_UINT8_ARRAY))
-#define GARROW_IS_UINT8_ARRAY_CLASS(klass)              \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
-                           GARROW_TYPE_UINT8_ARRAY))
-#define GARROW_UINT8_ARRAY_GET_CLASS(obj)               \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
-                             GARROW_TYPE_UINT8_ARRAY,   \
-                             GArrowUInt8ArrayClass))
-
-typedef struct _GArrowUInt8Array         GArrowUInt8Array;
-typedef struct _GArrowUInt8ArrayClass    GArrowUInt8ArrayClass;
-
-/**
- * GArrowUInt8Array:
- *
- * It wraps `arrow::UInt8Array`.
- */
-struct _GArrowUInt8Array
-{
-  /*< private >*/
-  GArrowPrimitiveArray parent_instance;
-};
-
-struct _GArrowUInt8ArrayClass
-{
-  GArrowPrimitiveArrayClass parent_class;
-};
-
-GType garrow_uint8_array_get_type(void) G_GNUC_CONST;
-
-GArrowUInt8Array *garrow_uint8_array_new(gint64 length,
-                                         GArrowBuffer *data,
-                                         GArrowBuffer *null_bitmap,
-                                         gint64 n_nulls);
-
-guint8 garrow_uint8_array_get_value(GArrowUInt8Array *array,
-                                    gint64 i);
-const guint8 *garrow_uint8_array_get_values(GArrowUInt8Array *array,
-                                            gint64 *length);
-
-
-#define GARROW_TYPE_INT16_ARRAY                  \
-  (garrow_int16_array_get_type())
-#define GARROW_INT16_ARRAY(obj)                         \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
-                              GARROW_TYPE_INT16_ARRAY,  \
-                              GArrowInt16Array))
-#define GARROW_INT16_ARRAY_CLASS(klass)                 \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
-                           GARROW_TYPE_INT16_ARRAY,     \
-                           GArrowInt16ArrayClass))
-#define GARROW_IS_INT16_ARRAY(obj)                      \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                    \
-                              GARROW_TYPE_INT16_ARRAY))
-#define GARROW_IS_INT16_ARRAY_CLASS(klass)              \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
-                           GARROW_TYPE_INT16_ARRAY))
-#define GARROW_INT16_ARRAY_GET_CLASS(obj)               \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
-                             GARROW_TYPE_INT16_ARRAY,   \
-                             GArrowInt16ArrayClass))
-
-typedef struct _GArrowInt16Array         GArrowInt16Array;
-typedef struct _GArrowInt16ArrayClass    GArrowInt16ArrayClass;
-
-/**
- * GArrowInt16Array:
- *
- * It wraps `arrow::Int16Array`.
- */
-struct _GArrowInt16Array
-{
-  /*< private >*/
-  GArrowPrimitiveArray parent_instance;
-};
-
-struct _GArrowInt16ArrayClass
-{
-  GArrowPrimitiveArrayClass parent_class;
-};
-
-GType garrow_int16_array_get_type(void) G_GNUC_CONST;
-
-GArrowInt16Array *garrow_int16_array_new(gint64 length,
-                                         GArrowBuffer *data,
-                                         GArrowBuffer *null_bitmap,
-                                         gint64 n_nulls);
-
-gint16 garrow_int16_array_get_value(GArrowInt16Array *array,
-                                    gint64 i);
-const gint16 *garrow_int16_array_get_values(GArrowInt16Array *array,
-                                            gint64 *length);
-
-
-#define GARROW_TYPE_UINT16_ARRAY                 \
-  (garrow_uint16_array_get_type())
-#define GARROW_UINT16_ARRAY(obj)                        \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
-                              GARROW_TYPE_UINT16_ARRAY, \
-                              GArrowUInt16Array))
-#define GARROW_UINT16_ARRAY_CLASS(klass)                \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
-                           GARROW_TYPE_UINT16_ARRAY,    \
-                           GArrowUInt16ArrayClass))
-#define GARROW_IS_UINT16_ARRAY(obj)                             \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_UINT16_ARRAY))
-#define GARROW_IS_UINT16_ARRAY_CLASS(klass)             \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
-                           GARROW_TYPE_UINT16_ARRAY))
-#define GARROW_UINT16_ARRAY_GET_CLASS(obj)              \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
-                             GARROW_TYPE_UINT16_ARRAY,  \
-                             GArrowUInt16ArrayClass))
-
-typedef struct _GArrowUInt16Array         GArrowUInt16Array;
-typedef struct _GArrowUInt16ArrayClass    GArrowUInt16ArrayClass;
-
-/**
- * GArrowUInt16Array:
- *
- * It wraps `arrow::UInt16Array`.
- */
-struct _GArrowUInt16Array
-{
-  /*< private >*/
-  GArrowPrimitiveArray parent_instance;
-};
-
-struct _GArrowUInt16ArrayClass
-{
-  GArrowPrimitiveArrayClass parent_class;
-};
-
-GType garrow_uint16_array_get_type(void) G_GNUC_CONST;
-
-GArrowUInt16Array *garrow_uint16_array_new(gint64 length,
-                                           GArrowBuffer *data,
-                                           GArrowBuffer *null_bitmap,
-                                           gint64 n_nulls);
-
-guint16 garrow_uint16_array_get_value(GArrowUInt16Array *array,
-                                      gint64 i);
-const guint16 *garrow_uint16_array_get_values(GArrowUInt16Array *array,
-                                              gint64 *length);
-
-
-#define GARROW_TYPE_INT32_ARRAY                 \
-  (garrow_int32_array_get_type())
-#define GARROW_INT32_ARRAY(obj)                         \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
-                              GARROW_TYPE_INT32_ARRAY,  \
-                              GArrowInt32Array))
-#define GARROW_INT32_ARRAY_CLASS(klass)                 \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
-                           GARROW_TYPE_INT32_ARRAY,     \
-                           GArrowInt32ArrayClass))
-#define GARROW_IS_INT32_ARRAY(obj)                      \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                    \
-                              GARROW_TYPE_INT32_ARRAY))
-#define GARROW_IS_INT32_ARRAY_CLASS(klass)              \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
-                           GARROW_TYPE_INT32_ARRAY))
-#define GARROW_INT32_ARRAY_GET_CLASS(obj)               \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
-                             GARROW_TYPE_INT32_ARRAY,   \
-                             GArrowInt32ArrayClass))
-
-typedef struct _GArrowInt32Array         GArrowInt32Array;
-typedef struct _GArrowInt32ArrayClass    GArrowInt32ArrayClass;
-
-/**
- * GArrowInt32Array:
- *
- * It wraps `arrow::Int32Array`.
- */
-struct _GArrowInt32Array
-{
-  /*< private >*/
-  GArrowPrimitiveArray parent_instance;
-};
-
-struct _GArrowInt32ArrayClass
-{
-  GArrowPrimitiveArrayClass parent_class;
-};
-
-GType garrow_int32_array_get_type(void) G_GNUC_CONST;
-
-GArrowInt32Array *garrow_int32_array_new(gint64 length,
-                                         GArrowBuffer *data,
-                                         GArrowBuffer *null_bitmap,
-                                         gint64 n_nulls);
-
-gint32 garrow_int32_array_get_value(GArrowInt32Array *array,
-                                    gint64 i);
-const gint32 *garrow_int32_array_get_values(GArrowInt32Array *array,
-                                            gint64 *length);
-
-
-#define GARROW_TYPE_UINT32_ARRAY                \
-  (garrow_uint32_array_get_type())
-#define GARROW_UINT32_ARRAY(obj)                        \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
-                              GARROW_TYPE_UINT32_ARRAY, \
-                              GArrowUInt32Array))
-#define GARROW_UINT32_ARRAY_CLASS(klass)                \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
-                           GARROW_TYPE_UINT32_ARRAY,    \
-                           GArrowUInt32ArrayClass))
-#define GARROW_IS_UINT32_ARRAY(obj)                             \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_UINT32_ARRAY))
-#define GARROW_IS_UINT32_ARRAY_CLASS(klass)             \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
-                           GARROW_TYPE_UINT32_ARRAY))
-#define GARROW_UINT32_ARRAY_GET_CLASS(obj)              \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
-                             GARROW_TYPE_UINT32_ARRAY,  \
-                             GArrowUInt32ArrayClass))
-
-typedef struct _GArrowUInt32Array         GArrowUInt32Array;
-typedef struct _GArrowUInt32ArrayClass    GArrowUInt32ArrayClass;
-
-/**
- * GArrowUInt32Array:
- *
- * It wraps `arrow::UInt32Array`.
- */
-struct _GArrowUInt32Array
-{
-  /*< private >*/
-  GArrowPrimitiveArray parent_instance;
-};
-
-struct _GArrowUInt32ArrayClass
-{
-  GArrowPrimitiveArrayClass parent_class;
-};
-
-GType garrow_uint32_array_get_type(void) G_GNUC_CONST;
-
-GArrowUInt32Array *garrow_uint32_array_new(gint64 length,
-                                           GArrowBuffer *data,
-                                           GArrowBuffer *null_bitmap,
-                                           gint64 n_nulls);
-
-guint32 garrow_uint32_array_get_value(GArrowUInt32Array *array,
-                                      gint64 i);
-const guint32 *garrow_uint32_array_get_values(GArrowUInt32Array *array,
-                                              gint64 *length);
-
-
-#define GARROW_TYPE_INT64_ARRAY                 \
-  (garrow_int64_array_get_type())
-#define GARROW_INT64_ARRAY(obj)                         \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
-                              GARROW_TYPE_INT64_ARRAY,  \
-                              GArrowInt64Array))
-#define GARROW_INT64_ARRAY_CLASS(klass)                 \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
-                           GARROW_TYPE_INT64_ARRAY,     \
-                           GArrowInt64ArrayClass))
-#define GARROW_IS_INT64_ARRAY(obj)                      \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                    \
-                              GARROW_TYPE_INT64_ARRAY))
-#define GARROW_IS_INT64_ARRAY_CLASS(klass)              \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
-                           GARROW_TYPE_INT64_ARRAY))
-#define GARROW_INT64_ARRAY_GET_CLASS(obj)               \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
-                             GARROW_TYPE_INT64_ARRAY,   \
-                             GArrowInt64ArrayClass))
-
-typedef struct _GArrowInt64Array         GArrowInt64Array;
-typedef struct _GArrowInt64ArrayClass    GArrowInt64ArrayClass;
-
-/**
- * GArrowInt64Array:
- *
- * It wraps `arrow::Int64Array`.
- */
-struct _GArrowInt64Array
-{
-  /*< private >*/
-  GArrowPrimitiveArray parent_instance;
-};
-
-struct _GArrowInt64ArrayClass
-{
-  GArrowPrimitiveArrayClass parent_class;
-};
-
-GType garrow_int64_array_get_type(void) G_GNUC_CONST;
-
-GArrowInt64Array *garrow_int64_array_new(gint64 length,
-                                         GArrowBuffer *data,
-                                         GArrowBuffer *null_bitmap,
-                                         gint64 n_nulls);
-
-gint64 garrow_int64_array_get_value(GArrowInt64Array *array,
-                                    gint64 i);
-const gint64 *garrow_int64_array_get_values(GArrowInt64Array *array,
-                                            gint64 *length);
-
-
-#define GARROW_TYPE_UINT64_ARRAY                \
-  (garrow_uint64_array_get_type())
-#define GARROW_UINT64_ARRAY(obj)                        \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
-                              GARROW_TYPE_UINT64_ARRAY, \
-                              GArrowUInt64Array))
-#define GARROW_UINT64_ARRAY_CLASS(klass)                \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
-                           GARROW_TYPE_UINT64_ARRAY,    \
-                           GArrowUInt64ArrayClass))
-#define GARROW_IS_UINT64_ARRAY(obj)                             \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_UINT64_ARRAY))
-#define GARROW_IS_UINT64_ARRAY_CLASS(klass)             \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
-                           GARROW_TYPE_UINT64_ARRAY))
-#define GARROW_UINT64_ARRAY_GET_CLASS(obj)              \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
-                             GARROW_TYPE_UINT64_ARRAY,  \
-                             GArrowUInt64ArrayClass))
-
-typedef struct _GArrowUInt64Array         GArrowUInt64Array;
-typedef struct _GArrowUInt64ArrayClass    GArrowUInt64ArrayClass;
-
-/**
- * GArrowUInt64Array:
- *
- * It wraps `arrow::UInt64Array`.
- */
-struct _GArrowUInt64Array
-{
-  /*< private >*/
-  GArrowPrimitiveArray parent_instance;
-};
-
-struct _GArrowUInt64ArrayClass
-{
-  GArrowPrimitiveArrayClass parent_class;
-};
-
-GType garrow_uint64_array_get_type(void) G_GNUC_CONST;
-
-GArrowUInt64Array *garrow_uint64_array_new(gint64 length,
-                                           GArrowBuffer *data,
-                                           GArrowBuffer *null_bitmap,
-                                           gint64 n_nulls);
-
-guint64 garrow_uint64_array_get_value(GArrowUInt64Array *array,
-                                      gint64 i);
-const guint64 *garrow_uint64_array_get_values(GArrowUInt64Array *array,
-                                              gint64 *length);
-
-
-#define GARROW_TYPE_FLOAT_ARRAY                 \
-  (garrow_float_array_get_type())
-#define GARROW_FLOAT_ARRAY(obj)                         \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
-                              GARROW_TYPE_FLOAT_ARRAY,  \
-                              GArrowFloatArray))
-#define GARROW_FLOAT_ARRAY_CLASS(klass)                 \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
-                           GARROW_TYPE_FLOAT_ARRAY,     \
-                           GArrowFloatArrayClass))
-#define GARROW_IS_FLOAT_ARRAY(obj)                      \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                    \
-                              GARROW_TYPE_FLOAT_ARRAY))
-#define GARROW_IS_FLOAT_ARRAY_CLASS(klass)              \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
-                           GARROW_TYPE_FLOAT_ARRAY))
-#define GARROW_FLOAT_ARRAY_GET_CLASS(obj)               \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
-                             GARROW_TYPE_FLOAT_ARRAY,   \
-                             GArrowFloatArrayClass))
-
-typedef struct _GArrowFloatArray         GArrowFloatArray;
-typedef struct _GArrowFloatArrayClass    GArrowFloatArrayClass;
-
-/**
- * GArrowFloatArray:
- *
- * It wraps `arrow::FloatArray`.
- */
-struct _GArrowFloatArray
-{
-  /*< private >*/
-  GArrowPrimitiveArray parent_instance;
-};
-
-struct _GArrowFloatArrayClass
-{
-  GArrowPrimitiveArrayClass parent_class;
-};
-
-GType garrow_float_array_get_type(void) G_GNUC_CONST;
-
-GArrowFloatArray *garrow_float_array_new(gint64 length,
-                                         GArrowBuffer *data,
-                                         GArrowBuffer *null_bitmap,
-                                         gint64 n_nulls);
-
-gfloat garrow_float_array_get_value(GArrowFloatArray *array,
-                                    gint64 i);
-const gfloat *garrow_float_array_get_values(GArrowFloatArray *array,
-                                            gint64 *length);
-
-
-#define GARROW_TYPE_DOUBLE_ARRAY                \
-  (garrow_double_array_get_type())
-#define GARROW_DOUBLE_ARRAY(obj)                        \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
-                              GARROW_TYPE_DOUBLE_ARRAY, \
-                              GArrowDoubleArray))
-#define GARROW_DOUBLE_ARRAY_CLASS(klass)                \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
-                           GARROW_TYPE_DOUBLE_ARRAY,    \
-                           GArrowDoubleArrayClass))
-#define GARROW_IS_DOUBLE_ARRAY(obj)                             \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_DOUBLE_ARRAY))
-#define GARROW_IS_DOUBLE_ARRAY_CLASS(klass)             \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
-                           GARROW_TYPE_DOUBLE_ARRAY))
-#define GARROW_DOUBLE_ARRAY_GET_CLASS(obj)              \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
-                             GARROW_TYPE_DOUBLE_ARRAY,  \
-                             GArrowDoubleArrayClass))
-
-typedef struct _GArrowDoubleArray         GArrowDoubleArray;
-typedef struct _GArrowDoubleArrayClass    GArrowDoubleArrayClass;
-
-/**
- * GArrowDoubleArray:
- *
- * It wraps `arrow::DoubleArray`.
- */
-struct _GArrowDoubleArray
-{
-  /*< private >*/
-  GArrowPrimitiveArray parent_instance;
-};
-
-struct _GArrowDoubleArrayClass
-{
-  GArrowPrimitiveArrayClass parent_class;
-};
-
-GType garrow_double_array_get_type(void) G_GNUC_CONST;
-
-GArrowDoubleArray *garrow_double_array_new(gint64 length,
-                                           GArrowBuffer *data,
-                                           GArrowBuffer *null_bitmap,
-                                           gint64 n_nulls);
-
-gdouble garrow_double_array_get_value(GArrowDoubleArray *array,
-                                      gint64 i);
-const gdouble *garrow_double_array_get_values(GArrowDoubleArray *array,
-                                              gint64 *length);
-
-
-#define GARROW_TYPE_BINARY_ARRAY                \
-  (garrow_binary_array_get_type())
-#define GARROW_BINARY_ARRAY(obj)                        \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
-                              GARROW_TYPE_BINARY_ARRAY, \
-                              GArrowBinaryArray))
-#define GARROW_BINARY_ARRAY_CLASS(klass)                \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
-                           GARROW_TYPE_BINARY_ARRAY,    \
-                           GArrowBinaryArrayClass))
-#define GARROW_IS_BINARY_ARRAY(obj)                             \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_BINARY_ARRAY))
-#define GARROW_IS_BINARY_ARRAY_CLASS(klass)             \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
-                           GARROW_TYPE_BINARY_ARRAY))
-#define GARROW_BINARY_ARRAY_GET_CLASS(obj)              \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
-                             GARROW_TYPE_BINARY_ARRAY,  \
-                             GArrowBinaryArrayClass))
-
-typedef struct _GArrowBinaryArray         GArrowBinaryArray;
-typedef struct _GArrowBinaryArrayClass    GArrowBinaryArrayClass;
-
-/**
- * GArrowBinaryArray:
- *
- * It wraps `arrow::BinaryArray`.
- */
-struct _GArrowBinaryArray
-{
-  /*< private >*/
-  GArrowArray parent_instance;
-};
-
-struct _GArrowBinaryArrayClass
-{
-  GArrowArrayClass parent_class;
-};
-
-GType garrow_binary_array_get_type(void) G_GNUC_CONST;
-
-GArrowBinaryArray *garrow_binary_array_new(gint64 length,
-                                           GArrowBuffer *value_offsets,
-                                           GArrowBuffer *data,
-                                           GArrowBuffer *null_bitmap,
-                                           gint64 n_nulls);
-
-GBytes *garrow_binary_array_get_value(GArrowBinaryArray *array,
-                                      gint64 i);
-GArrowBuffer *garrow_binary_array_get_buffer(GArrowBinaryArray *array);
-GArrowBuffer *garrow_binary_array_get_offsets_buffer(GArrowBinaryArray *array);
-
-#define GARROW_TYPE_STRING_ARRAY                \
-  (garrow_string_array_get_type())
-#define GARROW_STRING_ARRAY(obj)                        \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
-                              GARROW_TYPE_STRING_ARRAY, \
-                              GArrowStringArray))
-#define GARROW_STRING_ARRAY_CLASS(klass)                \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
-                           GARROW_TYPE_STRING_ARRAY,    \
-                           GArrowStringArrayClass))
-#define GARROW_IS_STRING_ARRAY(obj)                             \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_STRING_ARRAY))
-#define GARROW_IS_STRING_ARRAY_CLASS(klass)             \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
-                           GARROW_TYPE_STRING_ARRAY))
-#define GARROW_STRING_ARRAY_GET_CLASS(obj)              \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
-                             GARROW_TYPE_STRING_ARRAY,  \
-                             GArrowStringArrayClass))
-
-typedef struct _GArrowStringArray         GArrowStringArray;
-typedef struct _GArrowStringArrayClass    GArrowStringArrayClass;
-
-/**
- * GArrowStringArray:
- *
- * It wraps `arrow::StringArray`.
- */
-struct _GArrowStringArray
-{
-  /*< private >*/
-  GArrowBinaryArray parent_instance;
-};
-
-struct _GArrowStringArrayClass
-{
-  GArrowBinaryArrayClass parent_class;
-};
-
-GType garrow_string_array_get_type(void) G_GNUC_CONST;
-
-GArrowStringArray *garrow_string_array_new(gint64 length,
-                                           GArrowBuffer *value_offsets,
-                                           GArrowBuffer *data,
-                                           GArrowBuffer *null_bitmap,
-                                           gint64 n_nulls);
-
-gchar *garrow_string_array_get_string(GArrowStringArray *array,
-                                      gint64 i);
-
-
-#define GARROW_TYPE_DATE32_ARRAY                \
-  (garrow_date32_array_get_type())
-#define GARROW_DATE32_ARRAY(obj)                        \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
-                              GARROW_TYPE_DATE32_ARRAY, \
-                              GArrowDate32Array))
-#define GARROW_DATE32_ARRAY_CLASS(klass)                \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
-                           GARROW_TYPE_DATE32_ARRAY,    \
-                           GArrowDate32ArrayClass))
-#define GARROW_IS_DATE32_ARRAY(obj)                             \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_DATE32_ARRAY))
-#define GARROW_IS_DATE32_ARRAY_CLASS(klass)             \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
-                           GARROW_TYPE_DATE32_ARRAY))
-#define GARROW_DATE32_ARRAY_GET_CLASS(obj)              \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
-                             GARROW_TYPE_DATE32_ARRAY,  \
-                             GArrowDate32ArrayClass))
-
-typedef struct _GArrowDate32Array         GArrowDate32Array;
-typedef struct _GArrowDate32ArrayClass    GArrowDate32ArrayClass;
-
-/**
- * GArrowDate32Array:
- *
- * It wraps `arrow::Date32Array`.
- */
-struct _GArrowDate32Array
-{
-  /*< private >*/
-  GArrowPrimitiveArray parent_instance;
-};
-
-struct _GArrowDate32ArrayClass
-{
-  GArrowPrimitiveArrayClass parent_class;
-};
-
-GType garrow_date32_array_get_type(void) G_GNUC_CONST;
-
-GArrowDate32Array *garrow_date32_array_new(gint64 length,
-                                           GArrowBuffer *data,
-                                           GArrowBuffer *null_bitmap,
-                                           gint64 n_nulls);
-
-gint32 garrow_date32_array_get_value(GArrowDate32Array *array,
-                                     gint64 i);
-const gint32 *garrow_date32_array_get_values(GArrowDate32Array *array,
-                                             gint64 *length);
-
-
-#define GARROW_TYPE_DATE64_ARRAY                \
-  (garrow_date64_array_get_type())
-#define GARROW_DATE64_ARRAY(obj)                        \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
-                              GARROW_TYPE_DATE64_ARRAY, \
-                              GArrowDate64Array))
-#define GARROW_DATE64_ARRAY_CLASS(klass)                \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
-                           GARROW_TYPE_DATE64_ARRAY,    \
-                           GArrowDate64ArrayClass))
-#define GARROW_IS_DATE64_ARRAY(obj)                             \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_DATE64_ARRAY))
-#define GARROW_IS_DATE64_ARRAY_CLASS(klass)             \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
-                           GARROW_TYPE_DATE64_ARRAY))
-#define GARROW_DATE64_ARRAY_GET_CLASS(obj)              \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
-                             GARROW_TYPE_DATE64_ARRAY,  \
-                             GArrowDate64ArrayClass))
-
-typedef struct _GArrowDate64Array         GArrowDate64Array;
-typedef struct _GArrowDate64ArrayClass    GArrowDate64ArrayClass;
-
-/**
- * GArrowDate64Array:
- *
- * It wraps `arrow::Date64Array`.
- */
-struct _GArrowDate64Array
-{
-  /*< private >*/
-  GArrowPrimitiveArray parent_instance;
-};
-
-struct _GArrowDate64ArrayClass
-{
-  GArrowPrimitiveArrayClass parent_class;
-};
-
-GType garrow_date64_array_get_type(void) G_GNUC_CONST;
-
-GArrowDate64Array *garrow_date64_array_new(gint64 length,
-                                           GArrowBuffer *data,
-                                           GArrowBuffer *null_bitmap,
-                                           gint64 n_nulls);
-
-gint64 garrow_date64_array_get_value(GArrowDate64Array *array,
-                                     gint64 i);
-const gint64 *garrow_date64_array_get_values(GArrowDate64Array *array,
-                                             gint64 *length);
-
-
-#define GARROW_TYPE_TIMESTAMP_ARRAY             \
-  (garrow_timestamp_array_get_type())
-#define GARROW_TIMESTAMP_ARRAY(obj)                             \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
-                              GARROW_TYPE_TIMESTAMP_ARRAY,      \
-                              GArrowTimestampArray))
-#define GARROW_TIMESTAMP_ARRAY_CLASS(klass)             \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
-                           GARROW_TYPE_TIMESTAMP_ARRAY, \
-                           GArrowTimestampArrayClass))
-#define GARROW_IS_TIMESTAMP_ARRAY(obj)                          \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_TIMESTAMP_ARRAY))
-#define GARROW_IS_TIMESTAMP_ARRAY_CLASS(klass)                  \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
-                           GARROW_TYPE_TIMESTAMP_ARRAY))
-#define GARROW_TIMESTAMP_ARRAY_GET_CLASS(obj)                   \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
-                             GARROW_TYPE_TIMESTAMP_ARRAY,       \
-                             GArrowTimestampArrayClass))
-
-typedef struct _GArrowTimestampArray         GArrowTimestampArray;
-typedef struct _GArrowTimestampArrayClass    GArrowTimestampArrayClass;
-
-/**
- * GArrowTimestampArray:
- *
- * It wraps `arrow::TimestampArray`.
- */
-struct _GArrowTimestampArray
-{
-  /*< private >*/
-  GArrowPrimitiveArray parent_instance;
-};
-
-struct _GArrowTimestampArrayClass
-{
-  GArrowPrimitiveArrayClass parent_class;
-};
-
-GType garrow_timestamp_array_get_type(void) G_GNUC_CONST;
-
-GArrowTimestampArray *garrow_timestamp_array_new(GArrowTimestampDataType 
*data_type,
-                                                 gint64 length,
-                                                 GArrowBuffer *data,
-                                                 GArrowBuffer *null_bitmap,
-                                                 gint64 n_nulls);
-
-gint64 garrow_timestamp_array_get_value(GArrowTimestampArray *array,
-                                        gint64 i);
-const gint64 *garrow_timestamp_array_get_values(GArrowTimestampArray *array,
-                                                gint64 *length);
-
-
-#define GARROW_TYPE_TIME32_ARRAY                \
-  (garrow_time32_array_get_type())
-#define GARROW_TIME32_ARRAY(obj)                        \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
-                              GARROW_TYPE_TIME32_ARRAY, \
-                              GArrowTime32Array))
-#define GARROW_TIME32_ARRAY_CLASS(klass)                \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
-                           GARROW_TYPE_TIME32_ARRAY,    \
-                           GArrowTime32ArrayClass))
-#define GARROW_IS_TIME32_ARRAY(obj)                             \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_TIME32_ARRAY))
-#define GARROW_IS_TIME32_ARRAY_CLASS(klass)             \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
-                           GARROW_TYPE_TIME32_ARRAY))
-#define GARROW_TIME32_ARRAY_GET_CLASS(obj)              \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
-                             GARROW_TYPE_TIME32_ARRAY,  \
-                             GArrowTime32ArrayClass))
-
-typedef struct _GArrowTime32Array         GArrowTime32Array;
-typedef struct _GArrowTime32ArrayClass    GArrowTime32ArrayClass;
-
-/**
- * GArrowTime32Array:
- *
- * It wraps `arrow::Time32Array`.
- */
-struct _GArrowTime32Array
-{
-  /*< private >*/
-  GArrowPrimitiveArray parent_instance;
-};
-
-struct _GArrowTime32ArrayClass
-{
-  GArrowPrimitiveArrayClass parent_class;
-};
-
-GType garrow_time32_array_get_type(void) G_GNUC_CONST;
-
-GArrowTime32Array *garrow_time32_array_new(GArrowTime32DataType *data_type,
-                                           gint64 length,
-                                           GArrowBuffer *data,
-                                           GArrowBuffer *null_bitmap,
-                                           gint64 n_nulls);
-
-gint32 garrow_time32_array_get_value(GArrowTime32Array *array,
-                                     gint64 i);
-const gint32 *garrow_time32_array_get_values(GArrowTime32Array *array,
-                                             gint64 *length);
-
-
-#define GARROW_TYPE_TIME64_ARRAY                \
-  (garrow_time64_array_get_type())
-#define GARROW_TIME64_ARRAY(obj)                        \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
-                              GARROW_TYPE_TIME64_ARRAY, \
-                              GArrowTime64Array))
-#define GARROW_TIME64_ARRAY_CLASS(klass)                \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
-                           GARROW_TYPE_TIME64_ARRAY,    \
-                           GArrowTime64ArrayClass))
-#define GARROW_IS_TIME64_ARRAY(obj)                             \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_TIME64_ARRAY))
-#define GARROW_IS_TIME64_ARRAY_CLASS(klass)             \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
-                           GARROW_TYPE_TIME64_ARRAY))
-#define GARROW_TIME64_ARRAY_GET_CLASS(obj)              \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
-                             GARROW_TYPE_TIME64_ARRAY,  \
-                             GArrowTime64ArrayClass))
-
-typedef struct _GArrowTime64Array         GArrowTime64Array;
-typedef struct _GArrowTime64ArrayClass    GArrowTime64ArrayClass;
-
-/**
- * GArrowTime64Array:
- *
- * It wraps `arrow::Time64Array`.
- */
-struct _GArrowTime64Array
-{
-  /*< private >*/
-  GArrowPrimitiveArray parent_instance;
-};
-
-struct _GArrowTime64ArrayClass
-{
-  GArrowPrimitiveArrayClass parent_class;
-};
-
-GType garrow_time64_array_get_type(void) G_GNUC_CONST;
-
-GArrowTime64Array *garrow_time64_array_new(GArrowTime64DataType *data_type,
-                                           gint64 length,
-                                           GArrowBuffer *data,
-                                           GArrowBuffer *null_bitmap,
-                                           gint64 n_nulls);
-
-gint64 garrow_time64_array_get_value(GArrowTime64Array *array,
-                                     gint64 i);
-const gint64 *garrow_time64_array_get_values(GArrowTime64Array *array,
-                                             gint64 *length);
-
-
-#define GARROW_TYPE_LIST_ARRAY                  \
-  (garrow_list_array_get_type())
-#define GARROW_LIST_ARRAY(obj)                          \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
-                              GARROW_TYPE_LIST_ARRAY,   \
-                              GArrowListArray))
-#define GARROW_LIST_ARRAY_CLASS(klass)                  \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
-                           GARROW_TYPE_LIST_ARRAY,      \
-                           GArrowListArrayClass))
-#define GARROW_IS_LIST_ARRAY(obj)                       \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                    \
-                              GARROW_TYPE_LIST_ARRAY))
-#define GARROW_IS_LIST_ARRAY_CLASS(klass)               \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
-                           GARROW_TYPE_LIST_ARRAY))
-#define GARROW_LIST_ARRAY_GET_CLASS(obj)                \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
-                             GARROW_TYPE_LIST_ARRAY,    \
-                             GArrowListArrayClass))
-
-typedef struct _GArrowListArray         GArrowListArray;
-typedef struct _GArrowListArrayClass    GArrowListArrayClass;
-
-/**
- * GArrowListArray:
- *
- * It wraps `arrow::ListArray`.
- */
-struct _GArrowListArray
-{
-  /*< private >*/
-  GArrowArray parent_instance;
-};
-
-struct _GArrowListArrayClass
-{
-  GArrowArrayClass parent_class;
-};
-
-GType garrow_list_array_get_type(void) G_GNUC_CONST;
-
-GArrowListArray *garrow_list_array_new(gint64 length,
-                                       GArrowBuffer *value_offsets,
-                                       GArrowArray *values,
-                                       GArrowBuffer *null_bitmap,
-                                       gint64 n_nulls);
-
-GArrowDataType *garrow_list_array_get_value_type(GArrowListArray *array);
-GArrowArray *garrow_list_array_get_value(GArrowListArray *array,
-                                         gint64 i);
-
-
-#define GARROW_TYPE_STRUCT_ARRAY                \
-  (garrow_struct_array_get_type())
-#define GARROW_STRUCT_ARRAY(obj)                        \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
-                              GARROW_TYPE_STRUCT_ARRAY, \
-                              GArrowStructArray))
-#define GARROW_STRUCT_ARRAY_CLASS(klass)                \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
-                           GARROW_TYPE_STRUCT_ARRAY,    \
-                           GArrowStructArrayClass))
-#define GARROW_IS_STRUCT_ARRAY(obj)                             \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_STRUCT_ARRAY))
-#define GARROW_IS_STRUCT_ARRAY_CLASS(klass)             \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
-                           GARROW_TYPE_STRUCT_ARRAY))
-#define GARROW_STRUCT_ARRAY_GET_CLASS(obj)              \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
-                             GARROW_TYPE_STRUCT_ARRAY,  \
-                             GArrowStructArrayClass))
-
-typedef struct _GArrowStructArray         GArrowStructArray;
-typedef struct _GArrowStructArrayClass    GArrowStructArrayClass;
-
-/**
- * GArrowStructArray:
- *
- * It wraps `arrow::StructArray`.
- */
-struct _GArrowStructArray
-{
-  /*< private >*/
-  GArrowArray parent_instance;
-};
-
-struct _GArrowStructArrayClass
-{
-  GArrowArrayClass parent_class;
-};
-
-GType garrow_struct_array_get_type(void) G_GNUC_CONST;
-
-GArrowStructArray *garrow_struct_array_new(GArrowDataType *data_type,
-                                           gint64 length,
-                                           GList *children,
-                                           GArrowBuffer *null_bitmap,
-                                           gint64 n_nulls);
-
-GArrowArray *garrow_struct_array_get_field(GArrowStructArray *array,
-                                           gint i);
-GList *garrow_struct_array_get_fields(GArrowStructArray *array);
-
-G_END_DECLS
+#include <arrow-glib/basic-array.h>
+#include <arrow-glib/composite-array.h>
diff --git a/c_glib/arrow-glib/array.hpp b/c_glib/arrow-glib/array.hpp
index d2dff22c4..e575c4253 100644
--- a/c_glib/arrow-glib/array.hpp
+++ b/c_glib/arrow-glib/array.hpp
@@ -19,9 +19,5 @@
 
 #pragma once
 
-#include <arrow/api.h>
-
-#include <arrow-glib/array.h>
-
-GArrowArray *garrow_array_new_raw(std::shared_ptr<arrow::Array> *arrow_array);
-std::shared_ptr<arrow::Array> garrow_array_get_raw(GArrowArray *array);
+#include <arrow-glib/basic-array.hpp>
+#include <arrow-glib/composite-array.h>
diff --git a/c_glib/arrow-glib/array.cpp b/c_glib/arrow-glib/basic-array.cpp
similarity index 90%
rename from c_glib/arrow-glib/array.cpp
rename to c_glib/arrow-glib/basic-array.cpp
index 4945ca3cf..0698a0409 100644
--- a/c_glib/arrow-glib/array.cpp
+++ b/c_glib/arrow-glib/basic-array.cpp
@@ -24,7 +24,7 @@
 #include <arrow-glib/array.hpp>
 #include <arrow-glib/buffer.hpp>
 #include <arrow-glib/compute.hpp>
-#include <arrow-glib/data-type.hpp>
+#include <arrow-glib/basic-data-type.hpp>
 #include <arrow-glib/error.hpp>
 #include <arrow-glib/type.hpp>
 
@@ -86,9 +86,9 @@ garrow_primitive_array_new(GArrowDataType *data_type,
 G_BEGIN_DECLS
 
 /**
- * SECTION: array
- * @section_id: array-classes
- * @title: Array classes
+ * SECTION: basic-array
+ * @section_id: basic-array-classes
+ * @title: Basic array classes
  * @include: arrow-glib/arrow-glib.h
  *
  * #GArrowArray is a base class for all array classes such as
@@ -194,15 +194,6 @@ G_BEGIN_DECLS
  * nanoseconds since midnight in 64-bit signed integer array. It can
  * store zero or more time data. If you don't have Arrow format data,
  * you need to use #GArrowTime64ArrayBuilder to create a new array.
- *
- * #GArrowListArray is a class for list array. It can store zero or
- * more list data. If you don't have Arrow format data, you need to
- * use #GArrowListArrayBuilder to create a new array.
- *
- * #GArrowStructArray is a class for struct array. It can store zero
- * or more structs. One struct has zero or more fields. If you don't
- * have Arrow format data, you need to use #GArrowStructArrayBuilder
- * to create a new array.
  */
 
 typedef struct GArrowArrayPrivate_ {
@@ -2028,195 +2019,6 @@ garrow_time64_array_get_values(GArrowTime64Array *array,
   return reinterpret_cast<const gint64 *>(values);
 }
 
-
-G_DEFINE_TYPE(GArrowListArray,               \
-              garrow_list_array,             \
-              GARROW_TYPE_ARRAY)
-
-static void
-garrow_list_array_init(GArrowListArray *object)
-{
-}
-
-static void
-garrow_list_array_class_init(GArrowListArrayClass *klass)
-{
-}
-
-/**
- * garrow_list_array_new:
- * @length: The number of elements.
- * @value_offsets: The offsets of @values in Arrow format.
- * @values: The values as #GArrowArray.
- * @null_bitmap: (nullable): The bitmap that shows null elements. The
- *   N-th element is null when the N-th bit is 0, not null otherwise.
- *   If the array has no null elements, the bitmap must be %NULL and
- *   @n_nulls is 0.
- * @n_nulls: The number of null elements. If -1 is specified, the
- *   number of nulls are computed from @null_bitmap.
- *
- * Returns: A newly created #GArrowListArray.
- *
- * Since: 0.4.0
- */
-GArrowListArray *
-garrow_list_array_new(gint64 length,
-                      GArrowBuffer *value_offsets,
-                      GArrowArray *values,
-                      GArrowBuffer *null_bitmap,
-                      gint64 n_nulls)
-{
-  const auto arrow_value_offsets = garrow_buffer_get_raw(value_offsets);
-  const auto arrow_values = garrow_array_get_raw(values);
-  const auto arrow_bitmap = garrow_buffer_get_raw(null_bitmap);
-  auto arrow_data_type = arrow::list(arrow_values->type());
-  auto arrow_list_array =
-    std::make_shared<arrow::ListArray>(arrow_data_type,
-                                       length,
-                                       arrow_value_offsets,
-                                       arrow_values,
-                                       arrow_bitmap,
-                                       n_nulls);
-  auto arrow_array =
-    std::static_pointer_cast<arrow::Array>(arrow_list_array);
-  return GARROW_LIST_ARRAY(garrow_array_new_raw(&arrow_array));
-}
-
-/**
- * garrow_list_array_get_value_type:
- * @array: A #GArrowListArray.
- *
- * Returns: (transfer full): The data type of value in each list.
- */
-GArrowDataType *
-garrow_list_array_get_value_type(GArrowListArray *array)
-{
-  auto arrow_array = garrow_array_get_raw(GARROW_ARRAY(array));
-  auto arrow_list_array =
-    static_cast<arrow::ListArray *>(arrow_array.get());
-  auto arrow_value_type = arrow_list_array->value_type();
-  return garrow_data_type_new_raw(&arrow_value_type);
-}
-
-/**
- * garrow_list_array_get_value:
- * @array: A #GArrowListArray.
- * @i: The index of the target value.
- *
- * Returns: (transfer full): The i-th list.
- */
-GArrowArray *
-garrow_list_array_get_value(GArrowListArray *array,
-                            gint64 i)
-{
-  auto arrow_array = garrow_array_get_raw(GARROW_ARRAY(array));
-  auto arrow_list_array =
-    static_cast<arrow::ListArray *>(arrow_array.get());
-  auto arrow_list =
-    arrow_list_array->values()->Slice(arrow_list_array->value_offset(i),
-                                      arrow_list_array->value_length(i));
-  return garrow_array_new_raw(&arrow_list);
-}
-
-
-G_DEFINE_TYPE(GArrowStructArray,               \
-              garrow_struct_array,             \
-              GARROW_TYPE_ARRAY)
-
-static void
-garrow_struct_array_init(GArrowStructArray *object)
-{
-}
-
-static void
-garrow_struct_array_class_init(GArrowStructArrayClass *klass)
-{
-}
-
-/**
- * garrow_struct_array_new:
- * @data_type: The data type of the struct.
- * @length: The number of elements.
- * @children: (element-type GArrowArray): The arrays for each field
- *   as #GList of #GArrowArray.
- * @null_bitmap: (nullable): The bitmap that shows null elements. The
- *   N-th element is null when the N-th bit is 0, not null otherwise.
- *   If the array has no null elements, the bitmap must be %NULL and
- *   @n_nulls is 0.
- * @n_nulls: The number of null elements. If -1 is specified, the
- *   number of nulls are computed from @null_bitmap.
- *
- * Returns: A newly created #GArrowStructArray.
- *
- * Since: 0.4.0
- */
-GArrowStructArray *
-garrow_struct_array_new(GArrowDataType *data_type,
-                        gint64 length,
-                        GList *children,
-                        GArrowBuffer *null_bitmap,
-                        gint64 n_nulls)
-{
-  const auto arrow_data_type = garrow_data_type_get_raw(data_type);
-  std::vector<std::shared_ptr<arrow::Array>> arrow_children;
-  for (GList *node = children; node; node = node->next) {
-    GArrowArray *child = GARROW_ARRAY(node->data);
-    arrow_children.push_back(garrow_array_get_raw(child));
-  }
-  const auto arrow_bitmap = garrow_buffer_get_raw(null_bitmap);
-  auto arrow_struct_array =
-    std::make_shared<arrow::StructArray>(arrow_data_type,
-                                         length,
-                                         arrow_children,
-                                         arrow_bitmap,
-                                         n_nulls);
-  auto arrow_array =
-    std::static_pointer_cast<arrow::Array>(arrow_struct_array);
-  return GARROW_STRUCT_ARRAY(garrow_array_new_raw(&arrow_array));
-}
-
-/**
- * garrow_struct_array_get_field
- * @array: A #GArrowStructArray.
- * @i: The index of the field in the struct.
- *
- * Returns: (transfer full): The i-th field.
- */
-GArrowArray *
-garrow_struct_array_get_field(GArrowStructArray *array,
-                              gint i)
-{
-  auto arrow_array = garrow_array_get_raw(GARROW_ARRAY(array));
-  auto arrow_struct_array =
-    static_cast<arrow::StructArray *>(arrow_array.get());
-  auto arrow_field = arrow_struct_array->field(i);
-  return garrow_array_new_raw(&arrow_field);
-}
-
-/**
- * garrow_struct_array_get_fields
- * @array: A #GArrowStructArray.
- *
- * Returns: (element-type GArrowArray) (transfer full):
- *   The fields in the struct.
- */
-GList *
-garrow_struct_array_get_fields(GArrowStructArray *array)
-{
-  const auto arrow_array = garrow_array_get_raw(GARROW_ARRAY(array));
-  const auto arrow_struct_array =
-    static_cast<const arrow::StructArray *>(arrow_array.get());
-
-  GList *fields = NULL;
-  for (int i = 0; i < arrow_struct_array->num_fields(); ++i) {
-    auto arrow_field = arrow_struct_array->field(i);
-    GArrowArray *field = garrow_array_new_raw(&arrow_field);
-    fields = g_list_prepend(fields, field);
-  }
-
-  return g_list_reverse(fields);
-}
-
 G_END_DECLS
 
 GArrowArray *
diff --git a/c_glib/arrow-glib/basic-array.h b/c_glib/arrow-glib/basic-array.h
new file mode 100644
index 000000000..c01a04f07
--- /dev/null
+++ b/c_glib/arrow-glib/basic-array.h
@@ -0,0 +1,1115 @@
+/*
+ * 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.
+ */
+
+#pragma once
+
+#include <arrow-glib/buffer.h>
+#include <arrow-glib/compute.h>
+#include <arrow-glib/basic-data-type.h>
+
+G_BEGIN_DECLS
+
+#define GARROW_TYPE_ARRAY (garrow_array_get_type())
+G_DECLARE_DERIVABLE_TYPE(GArrowArray,
+                         garrow_array,
+                         GARROW,
+                         ARRAY,
+                         GObject)
+struct _GArrowArrayClass
+{
+  GObjectClass parent_class;
+};
+
+gboolean       garrow_array_equal       (GArrowArray *array,
+                                         GArrowArray *other_array);
+gboolean       garrow_array_equal_approx(GArrowArray *array,
+                                         GArrowArray *other_array);
+gboolean       garrow_array_equal_range (GArrowArray *array,
+                                         gint64 start_index,
+                                         GArrowArray *other_array,
+                                         gint64 other_start_index,
+                                         gint64 end_index);
+
+gboolean       garrow_array_is_null     (GArrowArray *array,
+                                         gint64 i);
+gboolean       garrow_array_is_valid    (GArrowArray *array,
+                                         gint64 i);
+gint64         garrow_array_get_length  (GArrowArray *array);
+gint64         garrow_array_get_offset  (GArrowArray *array);
+gint64         garrow_array_get_n_nulls (GArrowArray *array);
+GArrowBuffer  *garrow_array_get_null_bitmap(GArrowArray *array);
+GArrowDataType *garrow_array_get_value_data_type(GArrowArray *array);
+GArrowType     garrow_array_get_value_type(GArrowArray *array);
+GArrowArray   *garrow_array_slice       (GArrowArray *array,
+                                         gint64 offset,
+                                         gint64 length);
+gchar         *garrow_array_to_string   (GArrowArray *array,
+                                         GError **error);
+
+GArrowArray   *garrow_array_cast        (GArrowArray *array,
+                                         GArrowDataType *target_data_type,
+                                         GArrowCastOptions *options,
+                                         GError **error);
+
+#define GARROW_TYPE_NULL_ARRAY                  \
+  (garrow_null_array_get_type())
+#define GARROW_NULL_ARRAY(obj)                          \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
+                              GARROW_TYPE_NULL_ARRAY,   \
+                              GArrowNullArray))
+#define GARROW_NULL_ARRAY_CLASS(klass)                  \
+  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
+                           GARROW_TYPE_NULL_ARRAY,      \
+                           GArrowNullArrayClass))
+#define GARROW_IS_NULL_ARRAY(obj)                       \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                    \
+                              GARROW_TYPE_NULL_ARRAY))
+#define GARROW_IS_NULL_ARRAY_CLASS(klass)               \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
+                           GARROW_TYPE_NULL_ARRAY))
+#define GARROW_NULL_ARRAY_GET_CLASS(obj)                \
+  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
+                             GARROW_TYPE_NULL_ARRAY,    \
+                             GArrowNullArrayClass))
+
+typedef struct _GArrowNullArray         GArrowNullArray;
+typedef struct _GArrowNullArrayClass    GArrowNullArrayClass;
+
+/**
+ * GArrowNullArray:
+ *
+ * It wraps `arrow::NullArray`.
+ */
+struct _GArrowNullArray
+{
+  /*< private >*/
+  GArrowArray parent_instance;
+};
+
+struct _GArrowNullArrayClass
+{
+  GArrowArrayClass parent_class;
+};
+
+GType garrow_null_array_get_type(void) G_GNUC_CONST;
+
+GArrowNullArray *garrow_null_array_new(gint64 length);
+
+
+#define GARROW_TYPE_PRIMITIVE_ARRAY             \
+  (garrow_primitive_array_get_type())
+#define GARROW_PRIMITIVE_ARRAY(obj)                             \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
+                              GARROW_TYPE_PRIMITIVE_ARRAY,      \
+                              GArrowPrimitiveArray))
+#define GARROW_PRIMITIVE_ARRAY_CLASS(klass)             \
+  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
+                           GARROW_TYPE_PRIMITIVE_ARRAY, \
+                           GArrowPrimitiveArrayClass))
+#define GARROW_IS_PRIMITIVE_ARRAY(obj)                          \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
+                              GARROW_TYPE_PRIMITIVE_ARRAY))
+#define GARROW_IS_PRIMITIVE_ARRAY_CLASS(klass)                  \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
+                           GARROW_TYPE_PRIMITIVE_ARRAY))
+#define GARROW_PRIMITIVE_ARRAY_GET_CLASS(obj)                   \
+  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
+                             GARROW_TYPE_PRIMITIVE_ARRAY,       \
+                             GArrowPrimitiveArrayClass))
+
+typedef struct _GArrowPrimitiveArray         GArrowPrimitiveArray;
+typedef struct _GArrowPrimitiveArrayClass    GArrowPrimitiveArrayClass;
+
+/**
+ * GArrowPrimitiveArray:
+ *
+ * It wraps `arrow::PrimitiveArray`.
+ */
+struct _GArrowPrimitiveArray
+{
+  /*< private >*/
+  GArrowArray parent_instance;
+};
+
+struct _GArrowPrimitiveArrayClass
+{
+  GArrowArrayClass parent_class;
+};
+
+GType garrow_primitive_array_get_type(void) G_GNUC_CONST;
+
+GArrowBuffer *garrow_primitive_array_get_buffer(GArrowPrimitiveArray *array);
+
+
+#define GARROW_TYPE_BOOLEAN_ARRAY               \
+  (garrow_boolean_array_get_type())
+#define GARROW_BOOLEAN_ARRAY(obj)                               \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
+                              GARROW_TYPE_BOOLEAN_ARRAY,        \
+                              GArrowBooleanArray))
+#define GARROW_BOOLEAN_ARRAY_CLASS(klass)               \
+  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
+                           GARROW_TYPE_BOOLEAN_ARRAY,   \
+                           GArrowBooleanArrayClass))
+#define GARROW_IS_BOOLEAN_ARRAY(obj)                            \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
+                              GARROW_TYPE_BOOLEAN_ARRAY))
+#define GARROW_IS_BOOLEAN_ARRAY_CLASS(klass)            \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
+                           GARROW_TYPE_BOOLEAN_ARRAY))
+#define GARROW_BOOLEAN_ARRAY_GET_CLASS(obj)             \
+  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
+                             GARROW_TYPE_BOOLEAN_ARRAY, \
+                             GArrowBooleanArrayClass))
+
+typedef struct _GArrowBooleanArray         GArrowBooleanArray;
+typedef struct _GArrowBooleanArrayClass    GArrowBooleanArrayClass;
+
+/**
+ * GArrowBooleanArray:
+ *
+ * It wraps `arrow::BooleanArray`.
+ */
+struct _GArrowBooleanArray
+{
+  /*< private >*/
+  GArrowPrimitiveArray parent_instance;
+};
+
+struct _GArrowBooleanArrayClass
+{
+  GArrowPrimitiveArrayClass parent_class;
+};
+
+GType          garrow_boolean_array_get_type  (void) G_GNUC_CONST;
+
+GArrowBooleanArray *garrow_boolean_array_new(gint64 length,
+                                             GArrowBuffer *data,
+                                             GArrowBuffer *null_bitmap,
+                                             gint64 n_nulls);
+
+gboolean       garrow_boolean_array_get_value (GArrowBooleanArray *array,
+                                               gint64 i);
+gboolean      *garrow_boolean_array_get_values(GArrowBooleanArray *array,
+                                               gint64 *length);
+
+
+#define GARROW_TYPE_INT8_ARRAY                  \
+  (garrow_int8_array_get_type())
+#define GARROW_INT8_ARRAY(obj)                          \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
+                              GARROW_TYPE_INT8_ARRAY,   \
+                              GArrowInt8Array))
+#define GARROW_INT8_ARRAY_CLASS(klass)                  \
+  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
+                           GARROW_TYPE_INT8_ARRAY,      \
+                           GArrowInt8ArrayClass))
+#define GARROW_IS_INT8_ARRAY(obj)                       \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                    \
+                              GARROW_TYPE_INT8_ARRAY))
+#define GARROW_IS_INT8_ARRAY_CLASS(klass)               \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
+                           GARROW_TYPE_INT8_ARRAY))
+#define GARROW_INT8_ARRAY_GET_CLASS(obj)                \
+  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
+                             GARROW_TYPE_INT8_ARRAY,    \
+                             GArrowInt8ArrayClass))
+
+typedef struct _GArrowInt8Array         GArrowInt8Array;
+typedef struct _GArrowInt8ArrayClass    GArrowInt8ArrayClass;
+
+/**
+ * GArrowInt8Array:
+ *
+ * It wraps `arrow::Int8Array`.
+ */
+struct _GArrowInt8Array
+{
+  /*< private >*/
+  GArrowPrimitiveArray parent_instance;
+};
+
+struct _GArrowInt8ArrayClass
+{
+  GArrowPrimitiveArrayClass parent_class;
+};
+
+GType garrow_int8_array_get_type(void) G_GNUC_CONST;
+
+GArrowInt8Array *garrow_int8_array_new(gint64 length,
+                                       GArrowBuffer *data,
+                                       GArrowBuffer *null_bitmap,
+                                       gint64 n_nulls);
+
+gint8 garrow_int8_array_get_value(GArrowInt8Array *array,
+                                  gint64 i);
+const gint8 *garrow_int8_array_get_values(GArrowInt8Array *array,
+                                          gint64 *length);
+
+
+#define GARROW_TYPE_UINT8_ARRAY                 \
+  (garrow_uint8_array_get_type())
+#define GARROW_UINT8_ARRAY(obj)                         \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
+                              GARROW_TYPE_UINT8_ARRAY,  \
+                              GArrowUInt8Array))
+#define GARROW_UINT8_ARRAY_CLASS(klass)                 \
+  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
+                           GARROW_TYPE_UINT8_ARRAY,     \
+                           GArrowUInt8ArrayClass))
+#define GARROW_IS_UINT8_ARRAY(obj)                      \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                    \
+                              GARROW_TYPE_UINT8_ARRAY))
+#define GARROW_IS_UINT8_ARRAY_CLASS(klass)              \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
+                           GARROW_TYPE_UINT8_ARRAY))
+#define GARROW_UINT8_ARRAY_GET_CLASS(obj)               \
+  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
+                             GARROW_TYPE_UINT8_ARRAY,   \
+                             GArrowUInt8ArrayClass))
+
+typedef struct _GArrowUInt8Array         GArrowUInt8Array;
+typedef struct _GArrowUInt8ArrayClass    GArrowUInt8ArrayClass;
+
+/**
+ * GArrowUInt8Array:
+ *
+ * It wraps `arrow::UInt8Array`.
+ */
+struct _GArrowUInt8Array
+{
+  /*< private >*/
+  GArrowPrimitiveArray parent_instance;
+};
+
+struct _GArrowUInt8ArrayClass
+{
+  GArrowPrimitiveArrayClass parent_class;
+};
+
+GType garrow_uint8_array_get_type(void) G_GNUC_CONST;
+
+GArrowUInt8Array *garrow_uint8_array_new(gint64 length,
+                                         GArrowBuffer *data,
+                                         GArrowBuffer *null_bitmap,
+                                         gint64 n_nulls);
+
+guint8 garrow_uint8_array_get_value(GArrowUInt8Array *array,
+                                    gint64 i);
+const guint8 *garrow_uint8_array_get_values(GArrowUInt8Array *array,
+                                            gint64 *length);
+
+
+#define GARROW_TYPE_INT16_ARRAY                  \
+  (garrow_int16_array_get_type())
+#define GARROW_INT16_ARRAY(obj)                         \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
+                              GARROW_TYPE_INT16_ARRAY,  \
+                              GArrowInt16Array))
+#define GARROW_INT16_ARRAY_CLASS(klass)                 \
+  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
+                           GARROW_TYPE_INT16_ARRAY,     \
+                           GArrowInt16ArrayClass))
+#define GARROW_IS_INT16_ARRAY(obj)                      \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                    \
+                              GARROW_TYPE_INT16_ARRAY))
+#define GARROW_IS_INT16_ARRAY_CLASS(klass)              \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
+                           GARROW_TYPE_INT16_ARRAY))
+#define GARROW_INT16_ARRAY_GET_CLASS(obj)               \
+  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
+                             GARROW_TYPE_INT16_ARRAY,   \
+                             GArrowInt16ArrayClass))
+
+typedef struct _GArrowInt16Array         GArrowInt16Array;
+typedef struct _GArrowInt16ArrayClass    GArrowInt16ArrayClass;
+
+/**
+ * GArrowInt16Array:
+ *
+ * It wraps `arrow::Int16Array`.
+ */
+struct _GArrowInt16Array
+{
+  /*< private >*/
+  GArrowPrimitiveArray parent_instance;
+};
+
+struct _GArrowInt16ArrayClass
+{
+  GArrowPrimitiveArrayClass parent_class;
+};
+
+GType garrow_int16_array_get_type(void) G_GNUC_CONST;
+
+GArrowInt16Array *garrow_int16_array_new(gint64 length,
+                                         GArrowBuffer *data,
+                                         GArrowBuffer *null_bitmap,
+                                         gint64 n_nulls);
+
+gint16 garrow_int16_array_get_value(GArrowInt16Array *array,
+                                    gint64 i);
+const gint16 *garrow_int16_array_get_values(GArrowInt16Array *array,
+                                            gint64 *length);
+
+
+#define GARROW_TYPE_UINT16_ARRAY                 \
+  (garrow_uint16_array_get_type())
+#define GARROW_UINT16_ARRAY(obj)                        \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
+                              GARROW_TYPE_UINT16_ARRAY, \
+                              GArrowUInt16Array))
+#define GARROW_UINT16_ARRAY_CLASS(klass)                \
+  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
+                           GARROW_TYPE_UINT16_ARRAY,    \
+                           GArrowUInt16ArrayClass))
+#define GARROW_IS_UINT16_ARRAY(obj)                             \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
+                              GARROW_TYPE_UINT16_ARRAY))
+#define GARROW_IS_UINT16_ARRAY_CLASS(klass)             \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
+                           GARROW_TYPE_UINT16_ARRAY))
+#define GARROW_UINT16_ARRAY_GET_CLASS(obj)              \
+  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
+                             GARROW_TYPE_UINT16_ARRAY,  \
+                             GArrowUInt16ArrayClass))
+
+typedef struct _GArrowUInt16Array         GArrowUInt16Array;
+typedef struct _GArrowUInt16ArrayClass    GArrowUInt16ArrayClass;
+
+/**
+ * GArrowUInt16Array:
+ *
+ * It wraps `arrow::UInt16Array`.
+ */
+struct _GArrowUInt16Array
+{
+  /*< private >*/
+  GArrowPrimitiveArray parent_instance;
+};
+
+struct _GArrowUInt16ArrayClass
+{
+  GArrowPrimitiveArrayClass parent_class;
+};
+
+GType garrow_uint16_array_get_type(void) G_GNUC_CONST;
+
+GArrowUInt16Array *garrow_uint16_array_new(gint64 length,
+                                           GArrowBuffer *data,
+                                           GArrowBuffer *null_bitmap,
+                                           gint64 n_nulls);
+
+guint16 garrow_uint16_array_get_value(GArrowUInt16Array *array,
+                                      gint64 i);
+const guint16 *garrow_uint16_array_get_values(GArrowUInt16Array *array,
+                                              gint64 *length);
+
+
+#define GARROW_TYPE_INT32_ARRAY                 \
+  (garrow_int32_array_get_type())
+#define GARROW_INT32_ARRAY(obj)                         \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
+                              GARROW_TYPE_INT32_ARRAY,  \
+                              GArrowInt32Array))
+#define GARROW_INT32_ARRAY_CLASS(klass)                 \
+  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
+                           GARROW_TYPE_INT32_ARRAY,     \
+                           GArrowInt32ArrayClass))
+#define GARROW_IS_INT32_ARRAY(obj)                      \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                    \
+                              GARROW_TYPE_INT32_ARRAY))
+#define GARROW_IS_INT32_ARRAY_CLASS(klass)              \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
+                           GARROW_TYPE_INT32_ARRAY))
+#define GARROW_INT32_ARRAY_GET_CLASS(obj)               \
+  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
+                             GARROW_TYPE_INT32_ARRAY,   \
+                             GArrowInt32ArrayClass))
+
+typedef struct _GArrowInt32Array         GArrowInt32Array;
+typedef struct _GArrowInt32ArrayClass    GArrowInt32ArrayClass;
+
+/**
+ * GArrowInt32Array:
+ *
+ * It wraps `arrow::Int32Array`.
+ */
+struct _GArrowInt32Array
+{
+  /*< private >*/
+  GArrowPrimitiveArray parent_instance;
+};
+
+struct _GArrowInt32ArrayClass
+{
+  GArrowPrimitiveArrayClass parent_class;
+};
+
+GType garrow_int32_array_get_type(void) G_GNUC_CONST;
+
+GArrowInt32Array *garrow_int32_array_new(gint64 length,
+                                         GArrowBuffer *data,
+                                         GArrowBuffer *null_bitmap,
+                                         gint64 n_nulls);
+
+gint32 garrow_int32_array_get_value(GArrowInt32Array *array,
+                                    gint64 i);
+const gint32 *garrow_int32_array_get_values(GArrowInt32Array *array,
+                                            gint64 *length);
+
+
+#define GARROW_TYPE_UINT32_ARRAY                \
+  (garrow_uint32_array_get_type())
+#define GARROW_UINT32_ARRAY(obj)                        \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
+                              GARROW_TYPE_UINT32_ARRAY, \
+                              GArrowUInt32Array))
+#define GARROW_UINT32_ARRAY_CLASS(klass)                \
+  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
+                           GARROW_TYPE_UINT32_ARRAY,    \
+                           GArrowUInt32ArrayClass))
+#define GARROW_IS_UINT32_ARRAY(obj)                             \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
+                              GARROW_TYPE_UINT32_ARRAY))
+#define GARROW_IS_UINT32_ARRAY_CLASS(klass)             \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
+                           GARROW_TYPE_UINT32_ARRAY))
+#define GARROW_UINT32_ARRAY_GET_CLASS(obj)              \
+  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
+                             GARROW_TYPE_UINT32_ARRAY,  \
+                             GArrowUInt32ArrayClass))
+
+typedef struct _GArrowUInt32Array         GArrowUInt32Array;
+typedef struct _GArrowUInt32ArrayClass    GArrowUInt32ArrayClass;
+
+/**
+ * GArrowUInt32Array:
+ *
+ * It wraps `arrow::UInt32Array`.
+ */
+struct _GArrowUInt32Array
+{
+  /*< private >*/
+  GArrowPrimitiveArray parent_instance;
+};
+
+struct _GArrowUInt32ArrayClass
+{
+  GArrowPrimitiveArrayClass parent_class;
+};
+
+GType garrow_uint32_array_get_type(void) G_GNUC_CONST;
+
+GArrowUInt32Array *garrow_uint32_array_new(gint64 length,
+                                           GArrowBuffer *data,
+                                           GArrowBuffer *null_bitmap,
+                                           gint64 n_nulls);
+
+guint32 garrow_uint32_array_get_value(GArrowUInt32Array *array,
+                                      gint64 i);
+const guint32 *garrow_uint32_array_get_values(GArrowUInt32Array *array,
+                                              gint64 *length);
+
+
+#define GARROW_TYPE_INT64_ARRAY                 \
+  (garrow_int64_array_get_type())
+#define GARROW_INT64_ARRAY(obj)                         \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
+                              GARROW_TYPE_INT64_ARRAY,  \
+                              GArrowInt64Array))
+#define GARROW_INT64_ARRAY_CLASS(klass)                 \
+  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
+                           GARROW_TYPE_INT64_ARRAY,     \
+                           GArrowInt64ArrayClass))
+#define GARROW_IS_INT64_ARRAY(obj)                      \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                    \
+                              GARROW_TYPE_INT64_ARRAY))
+#define GARROW_IS_INT64_ARRAY_CLASS(klass)              \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
+                           GARROW_TYPE_INT64_ARRAY))
+#define GARROW_INT64_ARRAY_GET_CLASS(obj)               \
+  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
+                             GARROW_TYPE_INT64_ARRAY,   \
+                             GArrowInt64ArrayClass))
+
+typedef struct _GArrowInt64Array         GArrowInt64Array;
+typedef struct _GArrowInt64ArrayClass    GArrowInt64ArrayClass;
+
+/**
+ * GArrowInt64Array:
+ *
+ * It wraps `arrow::Int64Array`.
+ */
+struct _GArrowInt64Array
+{
+  /*< private >*/
+  GArrowPrimitiveArray parent_instance;
+};
+
+struct _GArrowInt64ArrayClass
+{
+  GArrowPrimitiveArrayClass parent_class;
+};
+
+GType garrow_int64_array_get_type(void) G_GNUC_CONST;
+
+GArrowInt64Array *garrow_int64_array_new(gint64 length,
+                                         GArrowBuffer *data,
+                                         GArrowBuffer *null_bitmap,
+                                         gint64 n_nulls);
+
+gint64 garrow_int64_array_get_value(GArrowInt64Array *array,
+                                    gint64 i);
+const gint64 *garrow_int64_array_get_values(GArrowInt64Array *array,
+                                            gint64 *length);
+
+
+#define GARROW_TYPE_UINT64_ARRAY                \
+  (garrow_uint64_array_get_type())
+#define GARROW_UINT64_ARRAY(obj)                        \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
+                              GARROW_TYPE_UINT64_ARRAY, \
+                              GArrowUInt64Array))
+#define GARROW_UINT64_ARRAY_CLASS(klass)                \
+  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
+                           GARROW_TYPE_UINT64_ARRAY,    \
+                           GArrowUInt64ArrayClass))
+#define GARROW_IS_UINT64_ARRAY(obj)                             \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
+                              GARROW_TYPE_UINT64_ARRAY))
+#define GARROW_IS_UINT64_ARRAY_CLASS(klass)             \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
+                           GARROW_TYPE_UINT64_ARRAY))
+#define GARROW_UINT64_ARRAY_GET_CLASS(obj)              \
+  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
+                             GARROW_TYPE_UINT64_ARRAY,  \
+                             GArrowUInt64ArrayClass))
+
+typedef struct _GArrowUInt64Array         GArrowUInt64Array;
+typedef struct _GArrowUInt64ArrayClass    GArrowUInt64ArrayClass;
+
+/**
+ * GArrowUInt64Array:
+ *
+ * It wraps `arrow::UInt64Array`.
+ */
+struct _GArrowUInt64Array
+{
+  /*< private >*/
+  GArrowPrimitiveArray parent_instance;
+};
+
+struct _GArrowUInt64ArrayClass
+{
+  GArrowPrimitiveArrayClass parent_class;
+};
+
+GType garrow_uint64_array_get_type(void) G_GNUC_CONST;
+
+GArrowUInt64Array *garrow_uint64_array_new(gint64 length,
+                                           GArrowBuffer *data,
+                                           GArrowBuffer *null_bitmap,
+                                           gint64 n_nulls);
+
+guint64 garrow_uint64_array_get_value(GArrowUInt64Array *array,
+                                      gint64 i);
+const guint64 *garrow_uint64_array_get_values(GArrowUInt64Array *array,
+                                              gint64 *length);
+
+
+#define GARROW_TYPE_FLOAT_ARRAY                 \
+  (garrow_float_array_get_type())
+#define GARROW_FLOAT_ARRAY(obj)                         \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
+                              GARROW_TYPE_FLOAT_ARRAY,  \
+                              GArrowFloatArray))
+#define GARROW_FLOAT_ARRAY_CLASS(klass)                 \
+  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
+                           GARROW_TYPE_FLOAT_ARRAY,     \
+                           GArrowFloatArrayClass))
+#define GARROW_IS_FLOAT_ARRAY(obj)                      \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                    \
+                              GARROW_TYPE_FLOAT_ARRAY))
+#define GARROW_IS_FLOAT_ARRAY_CLASS(klass)              \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
+                           GARROW_TYPE_FLOAT_ARRAY))
+#define GARROW_FLOAT_ARRAY_GET_CLASS(obj)               \
+  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
+                             GARROW_TYPE_FLOAT_ARRAY,   \
+                             GArrowFloatArrayClass))
+
+typedef struct _GArrowFloatArray         GArrowFloatArray;
+typedef struct _GArrowFloatArrayClass    GArrowFloatArrayClass;
+
+/**
+ * GArrowFloatArray:
+ *
+ * It wraps `arrow::FloatArray`.
+ */
+struct _GArrowFloatArray
+{
+  /*< private >*/
+  GArrowPrimitiveArray parent_instance;
+};
+
+struct _GArrowFloatArrayClass
+{
+  GArrowPrimitiveArrayClass parent_class;
+};
+
+GType garrow_float_array_get_type(void) G_GNUC_CONST;
+
+GArrowFloatArray *garrow_float_array_new(gint64 length,
+                                         GArrowBuffer *data,
+                                         GArrowBuffer *null_bitmap,
+                                         gint64 n_nulls);
+
+gfloat garrow_float_array_get_value(GArrowFloatArray *array,
+                                    gint64 i);
+const gfloat *garrow_float_array_get_values(GArrowFloatArray *array,
+                                            gint64 *length);
+
+
+#define GARROW_TYPE_DOUBLE_ARRAY                \
+  (garrow_double_array_get_type())
+#define GARROW_DOUBLE_ARRAY(obj)                        \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
+                              GARROW_TYPE_DOUBLE_ARRAY, \
+                              GArrowDoubleArray))
+#define GARROW_DOUBLE_ARRAY_CLASS(klass)                \
+  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
+                           GARROW_TYPE_DOUBLE_ARRAY,    \
+                           GArrowDoubleArrayClass))
+#define GARROW_IS_DOUBLE_ARRAY(obj)                             \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
+                              GARROW_TYPE_DOUBLE_ARRAY))
+#define GARROW_IS_DOUBLE_ARRAY_CLASS(klass)             \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
+                           GARROW_TYPE_DOUBLE_ARRAY))
+#define GARROW_DOUBLE_ARRAY_GET_CLASS(obj)              \
+  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
+                             GARROW_TYPE_DOUBLE_ARRAY,  \
+                             GArrowDoubleArrayClass))
+
+typedef struct _GArrowDoubleArray         GArrowDoubleArray;
+typedef struct _GArrowDoubleArrayClass    GArrowDoubleArrayClass;
+
+/**
+ * GArrowDoubleArray:
+ *
+ * It wraps `arrow::DoubleArray`.
+ */
+struct _GArrowDoubleArray
+{
+  /*< private >*/
+  GArrowPrimitiveArray parent_instance;
+};
+
+struct _GArrowDoubleArrayClass
+{
+  GArrowPrimitiveArrayClass parent_class;
+};
+
+GType garrow_double_array_get_type(void) G_GNUC_CONST;
+
+GArrowDoubleArray *garrow_double_array_new(gint64 length,
+                                           GArrowBuffer *data,
+                                           GArrowBuffer *null_bitmap,
+                                           gint64 n_nulls);
+
+gdouble garrow_double_array_get_value(GArrowDoubleArray *array,
+                                      gint64 i);
+const gdouble *garrow_double_array_get_values(GArrowDoubleArray *array,
+                                              gint64 *length);
+
+
+#define GARROW_TYPE_BINARY_ARRAY                \
+  (garrow_binary_array_get_type())
+#define GARROW_BINARY_ARRAY(obj)                        \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
+                              GARROW_TYPE_BINARY_ARRAY, \
+                              GArrowBinaryArray))
+#define GARROW_BINARY_ARRAY_CLASS(klass)                \
+  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
+                           GARROW_TYPE_BINARY_ARRAY,    \
+                           GArrowBinaryArrayClass))
+#define GARROW_IS_BINARY_ARRAY(obj)                             \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
+                              GARROW_TYPE_BINARY_ARRAY))
+#define GARROW_IS_BINARY_ARRAY_CLASS(klass)             \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
+                           GARROW_TYPE_BINARY_ARRAY))
+#define GARROW_BINARY_ARRAY_GET_CLASS(obj)              \
+  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
+                             GARROW_TYPE_BINARY_ARRAY,  \
+                             GArrowBinaryArrayClass))
+
+typedef struct _GArrowBinaryArray         GArrowBinaryArray;
+typedef struct _GArrowBinaryArrayClass    GArrowBinaryArrayClass;
+
+/**
+ * GArrowBinaryArray:
+ *
+ * It wraps `arrow::BinaryArray`.
+ */
+struct _GArrowBinaryArray
+{
+  /*< private >*/
+  GArrowArray parent_instance;
+};
+
+struct _GArrowBinaryArrayClass
+{
+  GArrowArrayClass parent_class;
+};
+
+GType garrow_binary_array_get_type(void) G_GNUC_CONST;
+
+GArrowBinaryArray *garrow_binary_array_new(gint64 length,
+                                           GArrowBuffer *value_offsets,
+                                           GArrowBuffer *data,
+                                           GArrowBuffer *null_bitmap,
+                                           gint64 n_nulls);
+
+GBytes *garrow_binary_array_get_value(GArrowBinaryArray *array,
+                                      gint64 i);
+GArrowBuffer *garrow_binary_array_get_buffer(GArrowBinaryArray *array);
+GArrowBuffer *garrow_binary_array_get_offsets_buffer(GArrowBinaryArray *array);
+
+#define GARROW_TYPE_STRING_ARRAY                \
+  (garrow_string_array_get_type())
+#define GARROW_STRING_ARRAY(obj)                        \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
+                              GARROW_TYPE_STRING_ARRAY, \
+                              GArrowStringArray))
+#define GARROW_STRING_ARRAY_CLASS(klass)                \
+  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
+                           GARROW_TYPE_STRING_ARRAY,    \
+                           GArrowStringArrayClass))
+#define GARROW_IS_STRING_ARRAY(obj)                             \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
+                              GARROW_TYPE_STRING_ARRAY))
+#define GARROW_IS_STRING_ARRAY_CLASS(klass)             \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
+                           GARROW_TYPE_STRING_ARRAY))
+#define GARROW_STRING_ARRAY_GET_CLASS(obj)              \
+  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
+                             GARROW_TYPE_STRING_ARRAY,  \
+                             GArrowStringArrayClass))
+
+typedef struct _GArrowStringArray         GArrowStringArray;
+typedef struct _GArrowStringArrayClass    GArrowStringArrayClass;
+
+/**
+ * GArrowStringArray:
+ *
+ * It wraps `arrow::StringArray`.
+ */
+struct _GArrowStringArray
+{
+  /*< private >*/
+  GArrowBinaryArray parent_instance;
+};
+
+struct _GArrowStringArrayClass
+{
+  GArrowBinaryArrayClass parent_class;
+};
+
+GType garrow_string_array_get_type(void) G_GNUC_CONST;
+
+GArrowStringArray *garrow_string_array_new(gint64 length,
+                                           GArrowBuffer *value_offsets,
+                                           GArrowBuffer *data,
+                                           GArrowBuffer *null_bitmap,
+                                           gint64 n_nulls);
+
+gchar *garrow_string_array_get_string(GArrowStringArray *array,
+                                      gint64 i);
+
+
+#define GARROW_TYPE_DATE32_ARRAY                \
+  (garrow_date32_array_get_type())
+#define GARROW_DATE32_ARRAY(obj)                        \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
+                              GARROW_TYPE_DATE32_ARRAY, \
+                              GArrowDate32Array))
+#define GARROW_DATE32_ARRAY_CLASS(klass)                \
+  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
+                           GARROW_TYPE_DATE32_ARRAY,    \
+                           GArrowDate32ArrayClass))
+#define GARROW_IS_DATE32_ARRAY(obj)                             \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
+                              GARROW_TYPE_DATE32_ARRAY))
+#define GARROW_IS_DATE32_ARRAY_CLASS(klass)             \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
+                           GARROW_TYPE_DATE32_ARRAY))
+#define GARROW_DATE32_ARRAY_GET_CLASS(obj)              \
+  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
+                             GARROW_TYPE_DATE32_ARRAY,  \
+                             GArrowDate32ArrayClass))
+
+typedef struct _GArrowDate32Array         GArrowDate32Array;
+typedef struct _GArrowDate32ArrayClass    GArrowDate32ArrayClass;
+
+/**
+ * GArrowDate32Array:
+ *
+ * It wraps `arrow::Date32Array`.
+ */
+struct _GArrowDate32Array
+{
+  /*< private >*/
+  GArrowPrimitiveArray parent_instance;
+};
+
+struct _GArrowDate32ArrayClass
+{
+  GArrowPrimitiveArrayClass parent_class;
+};
+
+GType garrow_date32_array_get_type(void) G_GNUC_CONST;
+
+GArrowDate32Array *garrow_date32_array_new(gint64 length,
+                                           GArrowBuffer *data,
+                                           GArrowBuffer *null_bitmap,
+                                           gint64 n_nulls);
+
+gint32 garrow_date32_array_get_value(GArrowDate32Array *array,
+                                     gint64 i);
+const gint32 *garrow_date32_array_get_values(GArrowDate32Array *array,
+                                             gint64 *length);
+
+
+#define GARROW_TYPE_DATE64_ARRAY                \
+  (garrow_date64_array_get_type())
+#define GARROW_DATE64_ARRAY(obj)                        \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
+                              GARROW_TYPE_DATE64_ARRAY, \
+                              GArrowDate64Array))
+#define GARROW_DATE64_ARRAY_CLASS(klass)                \
+  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
+                           GARROW_TYPE_DATE64_ARRAY,    \
+                           GArrowDate64ArrayClass))
+#define GARROW_IS_DATE64_ARRAY(obj)                             \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
+                              GARROW_TYPE_DATE64_ARRAY))
+#define GARROW_IS_DATE64_ARRAY_CLASS(klass)             \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
+                           GARROW_TYPE_DATE64_ARRAY))
+#define GARROW_DATE64_ARRAY_GET_CLASS(obj)              \
+  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
+                             GARROW_TYPE_DATE64_ARRAY,  \
+                             GArrowDate64ArrayClass))
+
+typedef struct _GArrowDate64Array         GArrowDate64Array;
+typedef struct _GArrowDate64ArrayClass    GArrowDate64ArrayClass;
+
+/**
+ * GArrowDate64Array:
+ *
+ * It wraps `arrow::Date64Array`.
+ */
+struct _GArrowDate64Array
+{
+  /*< private >*/
+  GArrowPrimitiveArray parent_instance;
+};
+
+struct _GArrowDate64ArrayClass
+{
+  GArrowPrimitiveArrayClass parent_class;
+};
+
+GType garrow_date64_array_get_type(void) G_GNUC_CONST;
+
+GArrowDate64Array *garrow_date64_array_new(gint64 length,
+                                           GArrowBuffer *data,
+                                           GArrowBuffer *null_bitmap,
+                                           gint64 n_nulls);
+
+gint64 garrow_date64_array_get_value(GArrowDate64Array *array,
+                                     gint64 i);
+const gint64 *garrow_date64_array_get_values(GArrowDate64Array *array,
+                                             gint64 *length);
+
+
+#define GARROW_TYPE_TIMESTAMP_ARRAY             \
+  (garrow_timestamp_array_get_type())
+#define GARROW_TIMESTAMP_ARRAY(obj)                             \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
+                              GARROW_TYPE_TIMESTAMP_ARRAY,      \
+                              GArrowTimestampArray))
+#define GARROW_TIMESTAMP_ARRAY_CLASS(klass)             \
+  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
+                           GARROW_TYPE_TIMESTAMP_ARRAY, \
+                           GArrowTimestampArrayClass))
+#define GARROW_IS_TIMESTAMP_ARRAY(obj)                          \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
+                              GARROW_TYPE_TIMESTAMP_ARRAY))
+#define GARROW_IS_TIMESTAMP_ARRAY_CLASS(klass)                  \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
+                           GARROW_TYPE_TIMESTAMP_ARRAY))
+#define GARROW_TIMESTAMP_ARRAY_GET_CLASS(obj)                   \
+  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
+                             GARROW_TYPE_TIMESTAMP_ARRAY,       \
+                             GArrowTimestampArrayClass))
+
+typedef struct _GArrowTimestampArray         GArrowTimestampArray;
+typedef struct _GArrowTimestampArrayClass    GArrowTimestampArrayClass;
+
+/**
+ * GArrowTimestampArray:
+ *
+ * It wraps `arrow::TimestampArray`.
+ */
+struct _GArrowTimestampArray
+{
+  /*< private >*/
+  GArrowPrimitiveArray parent_instance;
+};
+
+struct _GArrowTimestampArrayClass
+{
+  GArrowPrimitiveArrayClass parent_class;
+};
+
+GType garrow_timestamp_array_get_type(void) G_GNUC_CONST;
+
+GArrowTimestampArray *garrow_timestamp_array_new(GArrowTimestampDataType 
*data_type,
+                                                 gint64 length,
+                                                 GArrowBuffer *data,
+                                                 GArrowBuffer *null_bitmap,
+                                                 gint64 n_nulls);
+
+gint64 garrow_timestamp_array_get_value(GArrowTimestampArray *array,
+                                        gint64 i);
+const gint64 *garrow_timestamp_array_get_values(GArrowTimestampArray *array,
+                                                gint64 *length);
+
+
+#define GARROW_TYPE_TIME32_ARRAY                \
+  (garrow_time32_array_get_type())
+#define GARROW_TIME32_ARRAY(obj)                        \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
+                              GARROW_TYPE_TIME32_ARRAY, \
+                              GArrowTime32Array))
+#define GARROW_TIME32_ARRAY_CLASS(klass)                \
+  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
+                           GARROW_TYPE_TIME32_ARRAY,    \
+                           GArrowTime32ArrayClass))
+#define GARROW_IS_TIME32_ARRAY(obj)                             \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
+                              GARROW_TYPE_TIME32_ARRAY))
+#define GARROW_IS_TIME32_ARRAY_CLASS(klass)             \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
+                           GARROW_TYPE_TIME32_ARRAY))
+#define GARROW_TIME32_ARRAY_GET_CLASS(obj)              \
+  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
+                             GARROW_TYPE_TIME32_ARRAY,  \
+                             GArrowTime32ArrayClass))
+
+typedef struct _GArrowTime32Array         GArrowTime32Array;
+typedef struct _GArrowTime32ArrayClass    GArrowTime32ArrayClass;
+
+/**
+ * GArrowTime32Array:
+ *
+ * It wraps `arrow::Time32Array`.
+ */
+struct _GArrowTime32Array
+{
+  /*< private >*/
+  GArrowPrimitiveArray parent_instance;
+};
+
+struct _GArrowTime32ArrayClass
+{
+  GArrowPrimitiveArrayClass parent_class;
+};
+
+GType garrow_time32_array_get_type(void) G_GNUC_CONST;
+
+GArrowTime32Array *garrow_time32_array_new(GArrowTime32DataType *data_type,
+                                           gint64 length,
+                                           GArrowBuffer *data,
+                                           GArrowBuffer *null_bitmap,
+                                           gint64 n_nulls);
+
+gint32 garrow_time32_array_get_value(GArrowTime32Array *array,
+                                     gint64 i);
+const gint32 *garrow_time32_array_get_values(GArrowTime32Array *array,
+                                             gint64 *length);
+
+
+#define GARROW_TYPE_TIME64_ARRAY                \
+  (garrow_time64_array_get_type())
+#define GARROW_TIME64_ARRAY(obj)                        \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
+                              GARROW_TYPE_TIME64_ARRAY, \
+                              GArrowTime64Array))
+#define GARROW_TIME64_ARRAY_CLASS(klass)                \
+  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
+                           GARROW_TYPE_TIME64_ARRAY,    \
+                           GArrowTime64ArrayClass))
+#define GARROW_IS_TIME64_ARRAY(obj)                             \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
+                              GARROW_TYPE_TIME64_ARRAY))
+#define GARROW_IS_TIME64_ARRAY_CLASS(klass)             \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
+                           GARROW_TYPE_TIME64_ARRAY))
+#define GARROW_TIME64_ARRAY_GET_CLASS(obj)              \
+  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
+                             GARROW_TYPE_TIME64_ARRAY,  \
+                             GArrowTime64ArrayClass))
+
+typedef struct _GArrowTime64Array         GArrowTime64Array;
+typedef struct _GArrowTime64ArrayClass    GArrowTime64ArrayClass;
+
+/**
+ * GArrowTime64Array:
+ *
+ * It wraps `arrow::Time64Array`.
+ */
+struct _GArrowTime64Array
+{
+  /*< private >*/
+  GArrowPrimitiveArray parent_instance;
+};
+
+struct _GArrowTime64ArrayClass
+{
+  GArrowPrimitiveArrayClass parent_class;
+};
+
+GType garrow_time64_array_get_type(void) G_GNUC_CONST;
+
+GArrowTime64Array *garrow_time64_array_new(GArrowTime64DataType *data_type,
+                                           gint64 length,
+                                           GArrowBuffer *data,
+                                           GArrowBuffer *null_bitmap,
+                                           gint64 n_nulls);
+
+gint64 garrow_time64_array_get_value(GArrowTime64Array *array,
+                                     gint64 i);
+const gint64 *garrow_time64_array_get_values(GArrowTime64Array *array,
+                                             gint64 *length);
+
+G_END_DECLS
diff --git a/c_glib/arrow-glib/basic-array.hpp 
b/c_glib/arrow-glib/basic-array.hpp
new file mode 100644
index 000000000..52b94a51f
--- /dev/null
+++ b/c_glib/arrow-glib/basic-array.hpp
@@ -0,0 +1,27 @@
+/*
+ * 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.
+ */
+
+#pragma once
+
+#include <arrow/api.h>
+
+#include <arrow-glib/basic-array.h>
+
+GArrowArray *garrow_array_new_raw(std::shared_ptr<arrow::Array> *arrow_array);
+std::shared_ptr<arrow::Array> garrow_array_get_raw(GArrowArray *array);
diff --git a/c_glib/arrow-glib/basic-data-type.cpp 
b/c_glib/arrow-glib/basic-data-type.cpp
index 62f8a7e4d..dcafe06d6 100644
--- a/c_glib/arrow-glib/basic-data-type.cpp
+++ b/c_glib/arrow-glib/basic-data-type.cpp
@@ -220,6 +220,37 @@ garrow_data_type_get_id(GArrowDataType *data_type)
 }
 
 
+G_DEFINE_ABSTRACT_TYPE(GArrowFixedWidthDataType,                 \
+                       garrow_fixed_width_data_type,             \
+                       GARROW_TYPE_DATA_TYPE)
+
+static void
+garrow_fixed_width_data_type_init(GArrowFixedWidthDataType *object)
+{
+}
+
+static void
+garrow_fixed_width_data_type_class_init(GArrowFixedWidthDataTypeClass *klass)
+{
+}
+
+/**
+ * garrow_fixed_width_data_type_get_id:
+ * @data_type: A #GArrowFixedWidthDataType.
+ *
+ * Returns: The number of bits for one data.
+ */
+gint
+garrow_fixed_width_data_type_get_bit_width(GArrowFixedWidthDataType *data_type)
+{
+  const auto arrow_data_type =
+    garrow_data_type_get_raw(GARROW_DATA_TYPE(data_type));
+  const auto arrow_fixed_width_type =
+    std::static_pointer_cast<arrow::FixedWidthType>(arrow_data_type);
+  return arrow_fixed_width_type->bit_width();
+}
+
+
 G_DEFINE_TYPE(GArrowNullDataType,                \
               garrow_null_data_type,             \
               GARROW_TYPE_DATA_TYPE)
@@ -254,7 +285,7 @@ garrow_null_data_type_new(void)
 
 G_DEFINE_TYPE(GArrowBooleanDataType,                \
               garrow_boolean_data_type,             \
-              GARROW_TYPE_DATA_TYPE)
+              GARROW_TYPE_FIXED_WIDTH_DATA_TYPE)
 
 static void
 garrow_boolean_data_type_init(GArrowBooleanDataType *object)
@@ -1015,12 +1046,15 @@ 
garrow_data_type_new_raw(std::shared_ptr<arrow::DataType> *arrow_data_type)
   case arrow::Type::type::STRUCT:
     type = GARROW_TYPE_STRUCT_DATA_TYPE;
     break;
+  case arrow::Type::type::DICTIONARY:
+    type = GARROW_TYPE_DICTIONARY_DATA_TYPE;
+    break;
   default:
     type = GARROW_TYPE_DATA_TYPE;
     break;
   }
   data_type = GARROW_DATA_TYPE(g_object_new(type,
-                                            "data_type", arrow_data_type,
+                                            "data-type", arrow_data_type,
                                             NULL));
   return data_type;
 }
diff --git a/c_glib/arrow-glib/basic-data-type.h 
b/c_glib/arrow-glib/basic-data-type.h
index d3d52c612..bc0192f1b 100644
--- a/c_glib/arrow-glib/basic-data-type.h
+++ b/c_glib/arrow-glib/basic-data-type.h
@@ -19,57 +19,45 @@
 
 #pragma once
 
+#include <arrow-glib/gobject-type.h>
 #include <arrow-glib/type.h>
 
 G_BEGIN_DECLS
 
-#define GARROW_TYPE_DATA_TYPE                   \
-  (garrow_data_type_get_type())
-#define GARROW_DATA_TYPE(obj)                           \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
-                              GARROW_TYPE_DATA_TYPE,    \
-                              GArrowDataType))
-#define GARROW_DATA_TYPE_CLASS(klass)                   \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
-                           GARROW_TYPE_DATA_TYPE,       \
-                           GArrowDataTypeClass))
-#define GARROW_IS_DATA_TYPE(obj)                        \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                    \
-                              GARROW_TYPE_DATA_TYPE))
-#define GARROW_IS_DATA_TYPE_CLASS(klass)                \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
-                           GARROW_TYPE_DATA_TYPE))
-#define GARROW_DATA_TYPE_GET_CLASS(obj)                 \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
-                             GARROW_TYPE_DATA_TYPE,     \
-                             GArrowDataTypeClass))
-
-typedef struct _GArrowDataType         GArrowDataType;
-typedef struct _GArrowDataTypeClass    GArrowDataTypeClass;
-
-/**
- * GArrowDataType:
- *
- * It wraps `arrow::DataType`.
- */
-struct _GArrowDataType
-{
-  /*< private >*/
-  GObject parent_instance;
-};
-
+#define GARROW_TYPE_DATA_TYPE (garrow_data_type_get_type())
+G_DECLARE_DERIVABLE_TYPE(GArrowDataType,
+                         garrow_data_type,
+                         GARROW,
+                         DATA_TYPE,
+                         GObject)
 struct _GArrowDataTypeClass
 {
   GObjectClass parent_class;
 };
 
-GType      garrow_data_type_get_type  (void) G_GNUC_CONST;
 gboolean   garrow_data_type_equal     (GArrowDataType *data_type,
                                        GArrowDataType *other_data_type);
 gchar     *garrow_data_type_to_string (GArrowDataType *data_type);
 GArrowType garrow_data_type_get_id    (GArrowDataType *data_type);
 
 
+#define GARROW_TYPE_FIXED_WIDTH_DATA_TYPE 
(garrow_fixed_width_data_type_get_type())
+G_DECLARE_DERIVABLE_TYPE(GArrowFixedWidthDataType,
+                         garrow_fixed_width_data_type,
+                         GARROW,
+                         FIXED_WIDTH_DATA_TYPE,
+                         GArrowDataType)
+struct _GArrowFixedWidthDataTypeClass
+{
+  GArrowDataTypeClass parent_class;
+};
+
+gint garrow_fixed_width_data_type_get_bit_width(GArrowFixedWidthDataType 
*data_type);
+/* TODO:
+GList *garrow_fixed_width_data_type_get_buffer_layout(GArrowFixedWidthDataType 
*data_type);
+*/
+
+
 #define GARROW_TYPE_NULL_DATA_TYPE              \
   (garrow_null_data_type_get_type())
 #define GARROW_NULL_DATA_TYPE(obj)                              \
@@ -114,47 +102,17 @@ GType               garrow_null_data_type_get_type (void) 
G_GNUC_CONST;
 GArrowNullDataType *garrow_null_data_type_new      (void);
 
 
-#define GARROW_TYPE_BOOLEAN_DATA_TYPE           \
-  (garrow_boolean_data_type_get_type())
-#define GARROW_BOOLEAN_DATA_TYPE(obj)                           \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
-                              GARROW_TYPE_BOOLEAN_DATA_TYPE,    \
-                              GArrowBooleanDataType))
-#define GARROW_BOOLEAN_DATA_TYPE_CLASS(klass)                   \
-  (G_TYPE_CHECK_CLASS_CAST((klass),                             \
-                           GARROW_TYPE_BOOLEAN_DATA_TYPE,       \
-                           GArrowBooleanDataTypeClass))
-#define GARROW_IS_BOOLEAN_DATA_TYPE(obj)                        \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
-                              GARROW_TYPE_BOOLEAN_DATA_TYPE))
-#define GARROW_IS_BOOLEAN_DATA_TYPE_CLASS(klass)                \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
-                           GARROW_TYPE_BOOLEAN_DATA_TYPE))
-#define GARROW_BOOLEAN_DATA_TYPE_GET_CLASS(obj)                 \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
-                             GARROW_TYPE_BOOLEAN_DATA_TYPE,     \
-                             GArrowBooleanDataTypeClass))
-
-typedef struct _GArrowBooleanDataType         GArrowBooleanDataType;
-typedef struct _GArrowBooleanDataTypeClass    GArrowBooleanDataTypeClass;
-
-/**
- * GArrowBooleanDataType:
- *
- * It wraps `arrow::BooleanType`.
- */
-struct _GArrowBooleanDataType
-{
-  /*< private >*/
-  GArrowDataType parent_instance;
-};
-
+#define GARROW_TYPE_BOOLEAN_DATA_TYPE (garrow_boolean_data_type_get_type())
+G_DECLARE_DERIVABLE_TYPE(GArrowBooleanDataType,
+                         garrow_boolean_data_type,
+                         GARROW,
+                         BOOLEAN_DATA_TYPE,
+                         GArrowFixedWidthDataType)
 struct _GArrowBooleanDataTypeClass
 {
-  GArrowDataTypeClass parent_class;
+  GArrowFixedWidthDataTypeClass parent_class;
 };
 
-GType                  garrow_boolean_data_type_get_type (void) G_GNUC_CONST;
 GArrowBooleanDataType *garrow_boolean_data_type_new      (void);
 
 
diff --git a/c_glib/arrow-glib/composite-array.cpp 
b/c_glib/arrow-glib/composite-array.cpp
new file mode 100644
index 000000000..445103d37
--- /dev/null
+++ b/c_glib/arrow-glib/composite-array.cpp
@@ -0,0 +1,237 @@
+/*
+ * 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <arrow-glib/array.hpp>
+#include <arrow-glib/buffer.hpp>
+#include <arrow-glib/compute.hpp>
+#include <arrow-glib/data-type.hpp>
+#include <arrow-glib/error.hpp>
+#include <arrow-glib/type.hpp>
+
+G_BEGIN_DECLS
+
+/**
+ * SECTION: composite-array
+ * @section_id: composite-array-classes
+ * @title: Composite array classes
+ * @include: arrow-glib/arrow-glib.h
+ *
+ * #GArrowListArray is a class for list array. It can store zero or
+ * more list data. If you don't have Arrow format data, you need to
+ * use #GArrowListArrayBuilder to create a new array.
+ *
+ * #GArrowStructArray is a class for struct array. It can store zero
+ * or more structs. One struct has zero or more fields. If you don't
+ * have Arrow format data, you need to use #GArrowStructArrayBuilder
+ * to create a new array.
+ */
+
+G_DEFINE_TYPE(GArrowListArray,               \
+              garrow_list_array,             \
+              GARROW_TYPE_ARRAY)
+
+static void
+garrow_list_array_init(GArrowListArray *object)
+{
+}
+
+static void
+garrow_list_array_class_init(GArrowListArrayClass *klass)
+{
+}
+
+/**
+ * garrow_list_array_new:
+ * @length: The number of elements.
+ * @value_offsets: The offsets of @values in Arrow format.
+ * @values: The values as #GArrowArray.
+ * @null_bitmap: (nullable): The bitmap that shows null elements. The
+ *   N-th element is null when the N-th bit is 0, not null otherwise.
+ *   If the array has no null elements, the bitmap must be %NULL and
+ *   @n_nulls is 0.
+ * @n_nulls: The number of null elements. If -1 is specified, the
+ *   number of nulls are computed from @null_bitmap.
+ *
+ * Returns: A newly created #GArrowListArray.
+ *
+ * Since: 0.4.0
+ */
+GArrowListArray *
+garrow_list_array_new(gint64 length,
+                      GArrowBuffer *value_offsets,
+                      GArrowArray *values,
+                      GArrowBuffer *null_bitmap,
+                      gint64 n_nulls)
+{
+  const auto arrow_value_offsets = garrow_buffer_get_raw(value_offsets);
+  const auto arrow_values = garrow_array_get_raw(values);
+  const auto arrow_bitmap = garrow_buffer_get_raw(null_bitmap);
+  auto arrow_data_type = arrow::list(arrow_values->type());
+  auto arrow_list_array =
+    std::make_shared<arrow::ListArray>(arrow_data_type,
+                                       length,
+                                       arrow_value_offsets,
+                                       arrow_values,
+                                       arrow_bitmap,
+                                       n_nulls);
+  auto arrow_array =
+    std::static_pointer_cast<arrow::Array>(arrow_list_array);
+  return GARROW_LIST_ARRAY(garrow_array_new_raw(&arrow_array));
+}
+
+/**
+ * garrow_list_array_get_value_type:
+ * @array: A #GArrowListArray.
+ *
+ * Returns: (transfer full): The data type of value in each list.
+ */
+GArrowDataType *
+garrow_list_array_get_value_type(GArrowListArray *array)
+{
+  auto arrow_array = garrow_array_get_raw(GARROW_ARRAY(array));
+  auto arrow_list_array =
+    static_cast<arrow::ListArray *>(arrow_array.get());
+  auto arrow_value_type = arrow_list_array->value_type();
+  return garrow_data_type_new_raw(&arrow_value_type);
+}
+
+/**
+ * garrow_list_array_get_value:
+ * @array: A #GArrowListArray.
+ * @i: The index of the target value.
+ *
+ * Returns: (transfer full): The i-th list.
+ */
+GArrowArray *
+garrow_list_array_get_value(GArrowListArray *array,
+                            gint64 i)
+{
+  auto arrow_array = garrow_array_get_raw(GARROW_ARRAY(array));
+  auto arrow_list_array =
+    static_cast<arrow::ListArray *>(arrow_array.get());
+  auto arrow_list =
+    arrow_list_array->values()->Slice(arrow_list_array->value_offset(i),
+                                      arrow_list_array->value_length(i));
+  return garrow_array_new_raw(&arrow_list);
+}
+
+
+G_DEFINE_TYPE(GArrowStructArray,               \
+              garrow_struct_array,             \
+              GARROW_TYPE_ARRAY)
+
+static void
+garrow_struct_array_init(GArrowStructArray *object)
+{
+}
+
+static void
+garrow_struct_array_class_init(GArrowStructArrayClass *klass)
+{
+}
+
+/**
+ * garrow_struct_array_new:
+ * @data_type: The data type of the struct.
+ * @length: The number of elements.
+ * @children: (element-type GArrowArray): The arrays for each field
+ *   as #GList of #GArrowArray.
+ * @null_bitmap: (nullable): The bitmap that shows null elements. The
+ *   N-th element is null when the N-th bit is 0, not null otherwise.
+ *   If the array has no null elements, the bitmap must be %NULL and
+ *   @n_nulls is 0.
+ * @n_nulls: The number of null elements. If -1 is specified, the
+ *   number of nulls are computed from @null_bitmap.
+ *
+ * Returns: A newly created #GArrowStructArray.
+ *
+ * Since: 0.4.0
+ */
+GArrowStructArray *
+garrow_struct_array_new(GArrowDataType *data_type,
+                        gint64 length,
+                        GList *children,
+                        GArrowBuffer *null_bitmap,
+                        gint64 n_nulls)
+{
+  const auto arrow_data_type = garrow_data_type_get_raw(data_type);
+  std::vector<std::shared_ptr<arrow::Array>> arrow_children;
+  for (GList *node = children; node; node = node->next) {
+    GArrowArray *child = GARROW_ARRAY(node->data);
+    arrow_children.push_back(garrow_array_get_raw(child));
+  }
+  const auto arrow_bitmap = garrow_buffer_get_raw(null_bitmap);
+  auto arrow_struct_array =
+    std::make_shared<arrow::StructArray>(arrow_data_type,
+                                         length,
+                                         arrow_children,
+                                         arrow_bitmap,
+                                         n_nulls);
+  auto arrow_array =
+    std::static_pointer_cast<arrow::Array>(arrow_struct_array);
+  return GARROW_STRUCT_ARRAY(garrow_array_new_raw(&arrow_array));
+}
+
+/**
+ * garrow_struct_array_get_field
+ * @array: A #GArrowStructArray.
+ * @i: The index of the field in the struct.
+ *
+ * Returns: (transfer full): The i-th field.
+ */
+GArrowArray *
+garrow_struct_array_get_field(GArrowStructArray *array,
+                              gint i)
+{
+  auto arrow_array = garrow_array_get_raw(GARROW_ARRAY(array));
+  auto arrow_struct_array =
+    static_cast<arrow::StructArray *>(arrow_array.get());
+  auto arrow_field = arrow_struct_array->field(i);
+  return garrow_array_new_raw(&arrow_field);
+}
+
+/**
+ * garrow_struct_array_get_fields
+ * @array: A #GArrowStructArray.
+ *
+ * Returns: (element-type GArrowArray) (transfer full):
+ *   The fields in the struct.
+ */
+GList *
+garrow_struct_array_get_fields(GArrowStructArray *array)
+{
+  const auto arrow_array = garrow_array_get_raw(GARROW_ARRAY(array));
+  const auto arrow_struct_array =
+    static_cast<const arrow::StructArray *>(arrow_array.get());
+
+  GList *fields = NULL;
+  for (int i = 0; i < arrow_struct_array->num_fields(); ++i) {
+    auto arrow_field = arrow_struct_array->field(i);
+    GArrowArray *field = garrow_array_new_raw(&arrow_field);
+    fields = g_list_prepend(fields, field);
+  }
+
+  return g_list_reverse(fields);
+}
+
+G_END_DECLS
diff --git a/c_glib/arrow-glib/composite-array.h 
b/c_glib/arrow-glib/composite-array.h
new file mode 100644
index 000000000..ebf955498
--- /dev/null
+++ b/c_glib/arrow-glib/composite-array.h
@@ -0,0 +1,132 @@
+/*
+ * 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.
+ */
+
+#pragma once
+
+#include <arrow-glib/basic-array.h>
+#include <arrow-glib/data-type.h>
+
+G_BEGIN_DECLS
+
+#define GARROW_TYPE_LIST_ARRAY                  \
+  (garrow_list_array_get_type())
+#define GARROW_LIST_ARRAY(obj)                          \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
+                              GARROW_TYPE_LIST_ARRAY,   \
+                              GArrowListArray))
+#define GARROW_LIST_ARRAY_CLASS(klass)                  \
+  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
+                           GARROW_TYPE_LIST_ARRAY,      \
+                           GArrowListArrayClass))
+#define GARROW_IS_LIST_ARRAY(obj)                       \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                    \
+                              GARROW_TYPE_LIST_ARRAY))
+#define GARROW_IS_LIST_ARRAY_CLASS(klass)               \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
+                           GARROW_TYPE_LIST_ARRAY))
+#define GARROW_LIST_ARRAY_GET_CLASS(obj)                \
+  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
+                             GARROW_TYPE_LIST_ARRAY,    \
+                             GArrowListArrayClass))
+
+typedef struct _GArrowListArray         GArrowListArray;
+typedef struct _GArrowListArrayClass    GArrowListArrayClass;
+
+/**
+ * GArrowListArray:
+ *
+ * It wraps `arrow::ListArray`.
+ */
+struct _GArrowListArray
+{
+  /*< private >*/
+  GArrowArray parent_instance;
+};
+
+struct _GArrowListArrayClass
+{
+  GArrowArrayClass parent_class;
+};
+
+GType garrow_list_array_get_type(void) G_GNUC_CONST;
+
+GArrowListArray *garrow_list_array_new(gint64 length,
+                                       GArrowBuffer *value_offsets,
+                                       GArrowArray *values,
+                                       GArrowBuffer *null_bitmap,
+                                       gint64 n_nulls);
+
+GArrowDataType *garrow_list_array_get_value_type(GArrowListArray *array);
+GArrowArray *garrow_list_array_get_value(GArrowListArray *array,
+                                         gint64 i);
+
+
+#define GARROW_TYPE_STRUCT_ARRAY                \
+  (garrow_struct_array_get_type())
+#define GARROW_STRUCT_ARRAY(obj)                        \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
+                              GARROW_TYPE_STRUCT_ARRAY, \
+                              GArrowStructArray))
+#define GARROW_STRUCT_ARRAY_CLASS(klass)                \
+  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
+                           GARROW_TYPE_STRUCT_ARRAY,    \
+                           GArrowStructArrayClass))
+#define GARROW_IS_STRUCT_ARRAY(obj)                             \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
+                              GARROW_TYPE_STRUCT_ARRAY))
+#define GARROW_IS_STRUCT_ARRAY_CLASS(klass)             \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
+                           GARROW_TYPE_STRUCT_ARRAY))
+#define GARROW_STRUCT_ARRAY_GET_CLASS(obj)              \
+  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
+                             GARROW_TYPE_STRUCT_ARRAY,  \
+                             GArrowStructArrayClass))
+
+typedef struct _GArrowStructArray         GArrowStructArray;
+typedef struct _GArrowStructArrayClass    GArrowStructArrayClass;
+
+/**
+ * GArrowStructArray:
+ *
+ * It wraps `arrow::StructArray`.
+ */
+struct _GArrowStructArray
+{
+  /*< private >*/
+  GArrowArray parent_instance;
+};
+
+struct _GArrowStructArrayClass
+{
+  GArrowArrayClass parent_class;
+};
+
+GType garrow_struct_array_get_type(void) G_GNUC_CONST;
+
+GArrowStructArray *garrow_struct_array_new(GArrowDataType *data_type,
+                                           gint64 length,
+                                           GList *children,
+                                           GArrowBuffer *null_bitmap,
+                                           gint64 n_nulls);
+
+GArrowArray *garrow_struct_array_get_field(GArrowStructArray *array,
+                                           gint i);
+GList *garrow_struct_array_get_fields(GArrowStructArray *array);
+
+G_END_DECLS
diff --git a/c_glib/arrow-glib/composite-data-type.cpp 
b/c_glib/arrow-glib/composite-data-type.cpp
index ce3d78ca0..7ce8a978e 100644
--- a/c_glib/arrow-glib/composite-data-type.cpp
+++ b/c_glib/arrow-glib/composite-data-type.cpp
@@ -21,6 +21,7 @@
 #  include <config.h>
 #endif
 
+#include <arrow-glib/basic-array.hpp>
 #include <arrow-glib/data-type.hpp>
 #include <arrow-glib/enums.h>
 #include <arrow-glib/error.hpp>
@@ -38,6 +39,8 @@ G_BEGIN_DECLS
  * #GArrowListDataType is a class for list data type.
  *
  * #GArrowStructDataType is a class for struct data type.
+ *
+ * #GArrowDictionaryDataType is a class for dictionary data type.
  */
 
 G_DEFINE_TYPE(GArrowListDataType,                \
@@ -133,4 +136,87 @@ garrow_struct_data_type_new(GList *fields)
   return data_type;
 }
 
+
+G_DEFINE_TYPE(GArrowDictionaryDataType,                \
+              garrow_dictionary_data_type,             \
+              GARROW_TYPE_FIXED_WIDTH_DATA_TYPE)
+
+static void
+garrow_dictionary_data_type_init(GArrowDictionaryDataType *object)
+{
+}
+
+static void
+garrow_dictionary_data_type_class_init(GArrowDictionaryDataTypeClass *klass)
+{
+}
+
+/**
+ * garrow_dictionary_data_type_new:
+ * @index_data_type: The data type of index.
+ * @dictionary: The dictionary.
+ * @ordered: Whether dictionary contents are ordered or not.
+ *
+ * Returns: The newly created dictionary data type.
+ */
+GArrowDictionaryDataType *
+garrow_dictionary_data_type_new(GArrowDataType *index_data_type,
+                                GArrowArray *dictionary,
+                                gboolean ordered)
+{
+  auto arrow_index_data_type = garrow_data_type_get_raw(index_data_type);
+  auto arrow_dictionary = garrow_array_get_raw(dictionary);
+  auto arrow_data_type = arrow::dictionary(arrow_index_data_type,
+                                           arrow_dictionary,
+                                           ordered);
+  return 
GARROW_DICTIONARY_DATA_TYPE(garrow_data_type_new_raw(&arrow_data_type));
+}
+
+/**
+ * garrow_dictionary_data_type_get_index_data_type:
+ * @data_type: The #GArrowDictionaryDataType.
+ *
+ * Returns: (transfer full): The #GArrowDataType of index.
+ */
+GArrowDataType *
+garrow_dictionary_data_type_get_index_data_type(GArrowDictionaryDataType 
*data_type)
+{
+  auto arrow_data_type = garrow_data_type_get_raw(GARROW_DATA_TYPE(data_type));
+  auto arrow_dictionary_data_type =
+    std::static_pointer_cast<arrow::DictionaryType>(arrow_data_type);
+  auto arrow_index_data_type = arrow_dictionary_data_type->index_type();
+  return garrow_data_type_new_raw(&arrow_index_data_type);
+}
+
+/**
+ * garrow_dictionary_data_type_get_dictionary:
+ * @data_type: The #GArrowDictionaryDataType.
+ *
+ * Returns: (transfer full): The dictionary as #GArrowArray.
+ */
+GArrowArray *
+garrow_dictionary_data_type_get_dictionary(GArrowDictionaryDataType *data_type)
+{
+  auto arrow_data_type = garrow_data_type_get_raw(GARROW_DATA_TYPE(data_type));
+  auto arrow_dictionary_data_type =
+    std::static_pointer_cast<arrow::DictionaryType>(arrow_data_type);
+  auto arrow_dictionary = arrow_dictionary_data_type->dictionary();
+  return garrow_array_new_raw(&arrow_dictionary);
+}
+
+/**
+ * garrow_dictionary_data_type_is_ordered:
+ * @data_type: The #GArrowDictionaryDataType.
+ *
+ * Returns: Whether dictionary contents are ordered or not.
+ */
+gboolean
+garrow_dictionary_data_type_is_ordered(GArrowDictionaryDataType *data_type)
+{
+  auto arrow_data_type = garrow_data_type_get_raw(GARROW_DATA_TYPE(data_type));
+  auto arrow_dictionary_data_type =
+    std::static_pointer_cast<arrow::DictionaryType>(arrow_data_type);
+  return arrow_dictionary_data_type->ordered();
+}
+
 G_END_DECLS
diff --git a/c_glib/arrow-glib/composite-data-type.h 
b/c_glib/arrow-glib/composite-data-type.h
index 9dac5bd84..11b83014f 100644
--- a/c_glib/arrow-glib/composite-data-type.h
+++ b/c_glib/arrow-glib/composite-data-type.h
@@ -19,6 +19,7 @@
 
 #pragma once
 
+#include <arrow-glib/basic-array.h>
 #include <arrow-glib/basic-data-type.h>
 #include <arrow-glib/field.h>
 
@@ -112,4 +113,28 @@ struct _GArrowStructDataTypeClass
 GType                 garrow_struct_data_type_get_type (void) G_GNUC_CONST;
 GArrowStructDataType *garrow_struct_data_type_new      (GList *fields);
 
+
+#define GARROW_TYPE_DICTIONARY_DATA_TYPE 
(garrow_dictionary_data_type_get_type())
+G_DECLARE_DERIVABLE_TYPE(GArrowDictionaryDataType,
+                         garrow_dictionary_data_type,
+                         GARROW,
+                         DICTIONARY_DATA_TYPE,
+                         GArrowFixedWidthDataType)
+struct _GArrowDictionaryDataTypeClass
+{
+  GArrowFixedWidthDataTypeClass parent_class;
+};
+
+GArrowDictionaryDataType *
+garrow_dictionary_data_type_new(GArrowDataType *index_data_type,
+                                GArrowArray *dictionary,
+                                gboolean ordered);
+GArrowDataType *
+garrow_dictionary_data_type_get_index_data_type(GArrowDictionaryDataType 
*data_type);
+GArrowArray *
+garrow_dictionary_data_type_get_dictionary(GArrowDictionaryDataType 
*data_type);
+gboolean
+garrow_dictionary_data_type_is_ordered(GArrowDictionaryDataType *data_type);
+
+
 G_END_DECLS
diff --git a/c_glib/arrow-glib/meson.build b/c_glib/arrow-glib/meson.build
index aeec4172d..25968e69c 100644
--- a/c_glib/arrow-glib/meson.build
+++ b/c_glib/arrow-glib/meson.build
@@ -18,12 +18,13 @@
 # under the License.
 
 sources = files(
-  'array.cpp',
   'array-builder.cpp',
+  'basic-array.cpp',
   'basic-data-type.cpp',
   'buffer.cpp',
   'chunked-array.cpp',
   'column.cpp',
+  'composite-array.cpp',
   'composite-data-type.cpp',
   'error.cpp',
   'field.cpp',
@@ -59,10 +60,12 @@ c_headers = files(
   'array.h',
   'array-builder.h',
   'arrow-glib.h',
+  'basic-array.h',
   'basic-data-type.h',
   'buffer.h',
   'chunked-array.h',
   'column.h',
+  'composite-array.h',
   'composite-data-type.h',
   'data-type.h',
   'error.h',
@@ -102,6 +105,7 @@ cpp_headers = files(
   'array.hpp',
   'array-builder.hpp',
   'arrow-glib.hpp',
+  'basic-array.hpp',
   'basic-data-type.hpp',
   'buffer.hpp',
   'chunked-array.hpp',
diff --git a/c_glib/doc/reference/arrow-glib-docs.xml 
b/c_glib/doc/reference/arrow-glib-docs.xml
index e267ea2f9..51e7b2a6a 100644
--- a/c_glib/doc/reference/arrow-glib-docs.xml
+++ b/c_glib/doc/reference/arrow-glib-docs.xml
@@ -40,7 +40,8 @@
     <title>Data</title>
     <chapter id="array">
       <title>Array</title>
-      <xi:include href="xml/array.xml"/>
+      <xi:include href="xml/basic-array.xml"/>
+      <xi:include href="xml/composite-array.xml"/>
     </chapter>
     <chapter id="array-builder">
       <title>Array builder</title>
diff --git a/c_glib/test/test-dictionary-data-type.rb 
b/c_glib/test/test-dictionary-data-type.rb
new file mode 100644
index 000000000..5530a0415
--- /dev/null
+++ b/c_glib/test/test-dictionary-data-type.rb
@@ -0,0 +1,56 @@
+# 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.
+
+class TestDictionaryDataType < Test::Unit::TestCase
+  include Helper::Buildable
+
+  def setup
+    @index_data_type = Arrow::Int32DataType.new
+    @dictionary = build_string_array(["C", "C++", "Ruby"])
+    @ordered = true
+    @data_type = Arrow::DictionaryDataType.new(@index_data_type,
+                                               @dictionary,
+                                               @ordered)
+  end
+
+  def test_type
+    assert_equal(Arrow::Type::DICTIONARY, @data_type.id)
+  end
+
+  def test_to_s
+    assert_equal("dictionary<values=string, indices=int32, ordered=1>",
+                 @data_type.to_s)
+  end
+
+  def test_bit_width
+    assert_equal(32, @data_type.bit_width)
+  end
+
+  def test_index_data_type
+    assert_equal(@index_data_type, @data_type.index_data_type)
+  end
+
+  def test_dictionary
+    assert_equal(@dictionary, @data_type.dictionary)
+  end
+
+  def test_ordered?
+    assert do
+      @data_type.ordered?
+    end
+  end
+end


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


> [GLib] Add GArrowDictionaryDataType
> -----------------------------------
>
>                 Key: ARROW-1859
>                 URL: https://issues.apache.org/jira/browse/ARROW-1859
>             Project: Apache Arrow
>          Issue Type: New Feature
>          Components: GLib
>            Reporter: Kouhei Sutou
>            Assignee: Kouhei Sutou
>              Labels: pull-request-available
>             Fix For: 0.8.0
>
>




--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to