You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by we...@apache.org on 2017/11/26 19:17:32 UTC

[arrow] branch master updated: ARROW-1859: [GLib] Add GArrowDictionaryDataType

This is an automated email from the ASF dual-hosted git repository.

wesm pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow.git


The following commit(s) were added to refs/heads/master by this push:
     new ebb6c76  ARROW-1859: [GLib] Add GArrowDictionaryDataType
ebb6c76 is described below

commit ebb6c764687c197fbd5269b6500568d11dafaf31
Author: Kouhei Sutou <ko...@clear-code.com>
AuthorDate: Sun Nov 26 14:17:28 2017 -0500

    ARROW-1859: [GLib] Add GArrowDictionaryDataType
    
    Author: Kouhei Sutou <ko...@clear-code.com>
    
    Closes #1361 from kou/glib-dictionary-data-type and squashes the following commits:
    
    6ccce1f8 [Kouhei Sutou] [GLib] Add GArrowDictionaryDataType
---
 c_glib/arrow-glib/Makefile.am                    |    6 +-
 c_glib/arrow-glib/array.h                        | 1225 +---------------------
 c_glib/arrow-glib/array.hpp                      |    8 +-
 c_glib/arrow-glib/{array.cpp => basic-array.cpp} |  206 +---
 c_glib/arrow-glib/{array.h => basic-array.h}     |  143 +--
 c_glib/arrow-glib/{array.hpp => basic-array.hpp} |    2 +-
 c_glib/arrow-glib/basic-data-type.cpp            |   38 +-
 c_glib/arrow-glib/basic-data-type.h              |  104 +-
 c_glib/arrow-glib/composite-array.cpp            |  237 +++++
 c_glib/arrow-glib/composite-array.h              |  132 +++
 c_glib/arrow-glib/composite-data-type.cpp        |   86 ++
 c_glib/arrow-glib/composite-data-type.h          |   25 +
 c_glib/arrow-glib/meson.build                    |    6 +-
 c_glib/doc/reference/arrow-glib-docs.xml         |    3 +-
 c_glib/test/test-dictionary-data-type.rb         |   56 +
 15 files changed, 631 insertions(+), 1646 deletions(-)

diff --git a/c_glib/arrow-glib/Makefile.am b/c_glib/arrow-glib/Makefile.am
index e807311..39222a5 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 e988a8a..9a84559 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 d2dff22..e575c42 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 4945ca3..0698a04 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/array.h b/c_glib/arrow-glib/basic-array.h
similarity index 89%
copy from c_glib/arrow-glib/array.h
copy to c_glib/arrow-glib/basic-array.h
index e988a8a..c01a04f 100644
--- a/c_glib/arrow-glib/array.h
+++ b/c_glib/arrow-glib/basic-array.h
@@ -21,44 +21,21 @@
 
 #include <arrow-glib/buffer.h>
 #include <arrow-glib/compute.h>
-#include <arrow-glib/data-type.h>
+#include <arrow-glib/basic-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;
-};
-
+#define GARROW_TYPE_ARRAY (garrow_array_get_type())
+G_DECLARE_DERIVABLE_TYPE(GArrowArray,
+                         garrow_array,
+                         GARROW,
+                         ARRAY,
+                         GObject)
 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,
@@ -1135,110 +1112,4 @@ gint64 garrow_time64_array_get_value(GArrowTime64Array *array,
 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
diff --git a/c_glib/arrow-glib/array.hpp b/c_glib/arrow-glib/basic-array.hpp
similarity index 96%
copy from c_glib/arrow-glib/array.hpp
copy to c_glib/arrow-glib/basic-array.hpp
index d2dff22..52b94a5 100644
--- a/c_glib/arrow-glib/array.hpp
+++ b/c_glib/arrow-glib/basic-array.hpp
@@ -21,7 +21,7 @@
 
 #include <arrow/api.h>
 
-#include <arrow-glib/array.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 62f8a7e..dcafe06 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 d3d52c6..bc0192f 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 0000000..445103d
--- /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 0000000..ebf9554
--- /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 ce3d78c..7ce8a97 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 9dac5bd..11b8301 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 aeec417..25968e6 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 e267ea2..51e7b2a 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 0000000..5530a04
--- /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

-- 
To stop receiving notification emails like this one, please contact
['"commits@arrow.apache.org" <co...@arrow.apache.org>'].