Module: Nanoarrow::Utils

Defined in:
lib/nanoarrow/utils.rb

Class Method Summary collapse

Class Method Details

.c_array(obj, schema) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/nanoarrow/utils.rb', line 3

def self.c_array(obj, schema)
  if !schema.nil?
    schema = c_schema(schema)
  end

  if obj.is_a?(CArray) && schema.nil?
    return obj
  end

  if obj.respond_to?(:arrow_c_array)
    raise Todo if schema
    return CArray.import_from_c_capsule(obj.arrow_c_array)
  end

  if obj.is_a?(Capsule) && obj.name == "arrow_array"
    raise Todo if schema
    return CArray.import_from_c_capsule(obj)
  end

  if schema.nil?
    raise Todo
  end
  builder = ArrayFromIterableBuilder.new(schema)
  builder.build_c_array(obj)
end

.c_array_stream(obj, schema) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/nanoarrow/utils.rb', line 29

def self.c_array_stream(obj, schema)
  if !schema.nil?
    schema = c_schema(schema)
  end

  if obj.is_a?(CArrayStream) && schema.nil?
    return obj
  end

  if obj.respond_to?(:arrow_c_stream)
    raise Todo if schema
    return CArrayStream.import_from_c_capsule(obj.arrow_c_stream)
  end

  if obj.is_a?(Capsule) && obj.name == "arrow_array_stream"
    raise Todo if schema
    return CArrayStream.import_from_c_capsule(obj)
  end

  array = c_array(obj, schema)
  CArrayStream.from_c_arrays([array], array.schema, false)
end

.c_schema(obj) ⇒ Object

Raises:

  • (TypeError)


52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/nanoarrow/utils.rb', line 52

def self.c_schema(obj)
  if obj.is_a?(CSchema)
    return obj
  end

  if obj.respond_to?(:arrow_c_schema)
    return CSchema.import_from_c_capsule(obj.arrow_c_schema)
  end

  if obj.is_a?(Capsule) && obj.name == "arrow_schema"
    return CSchema.import_from_c_capsule(obj)
  end

  raise TypeError, "Can't convert object of type #{obj.class.name} to CSchema"
end

.c_schema_from_type_and_params(type, params) ⇒ Object



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
# File 'lib/nanoarrow/utils.rb', line 76

def self.c_schema_from_type_and_params(type, params)
  factory = CSchemaBuilder.new

  if [Type::DECIMAL128, Type::DECIMAL256].include?(type)
    precision = Integer(params.delete(:precision))
    scale = Integer(params.delete(:scale))
    factory.set_type_decimal(type, precision, scale)

  elsif [Type::TIME32, Type::TIME64, Type::TIMESTAMP, Type::DURATION].include?(type)
    time_unit = params.delete(:unit)
    timezone = params.delete(:timezone)
    factory.set_type_date_time(type, TIME_UNITS.fetch(time_unit), timezone)

  elsif type == Type::FIXED_SIZE_BINARY
    factory.set_type_fixed_size(type, Integer(params.delete(:byte_width)))

  elsif type == Type::LIST
    factory.set_format("+l")
    factory.allocate_children(1)
    factory.set_child(0, "item", c_schema(params.delete(:value_type)))

  elsif type == Type::LARGE_LIST
    factory.set_format("+L")
    factory.allocate_children(1)
    factory.set_child(0, "item", c_schema(params.delete(:value_type)))

  elsif type == Type::FIXED_SIZE_LIST
    fixed_size = Integer(params.delete(:list_size))
    factory.set_format("+w:%d" % fixed_size)
    factory.allocate_children(1)
    factory.set_child(0, "item", c_schema(params.delete(:value_type)))

  elsif type == Type::MAP
    key_schema = c_schema(params.delete(:key_type))
    value_schema = c_schema(params.delete(:value_type))

    entries = CSchemaBuilder.allocate
    entries.set_format("+s")
    entries.set_nullable(false)
    entries.allocate_children(2)
    entries.set_child(0, "key", key_schema.modify(nullable: false))
    entries.set_child(1, "value", value_schema)

    factory.set_format("+m")
    factory.allocate_children(1)
    factory.set_child(0, "entries", entries.finish)
    factory.set_nullable(false)

    if params.include?(:keys_sorted)
      factory.set_map_keys_sorted(params.delete(:keys_sorted))
    end

  elsif type == Type::DICTIONARY
    index_type = c_schema(params.delete(:index_type))
    factory.set_format(index_type.format)

    value_type = c_schema(params.delete(:value_type))
    factory.set_dictionary(value_type)

    if params.delete(:dictionary_ordered)
      factory.set_dictionary_ordered(true)
    end

  elsif type == Type::SPARSE_UNION
    type_codes = params.delete(:type_codes)
    type_codes_str = type_codes.map { |code| Integer(code) }.join(",")
    factory.set_format("+us:#{type_codes_str}")

  elsif type == Type::DENSE_UNION
    type_codes = params.delete(:type_codes)
    type_codes_str = type_codes.map { |code| Integer(code) }.join(",")
    factory.set_format("+ud:#{type_codes_str}")

  else
    factory.set_type(type)
  end

  if params.any?
    unused = params.keys.map(&:inspect).join(", ")
    raise ArgumentError, "Unused parameters whilst constructing Schema: #{unused}"
  end

  factory.set_name("")

  factory.finish
end

.c_schema_view(obj) ⇒ Object



68
69
70
71
72
73
74
# File 'lib/nanoarrow/utils.rb', line 68

def self.c_schema_view(obj)
  if obj.is_a?(CSchemaView)
    return obj
  end

  CSchemaView.new(c_schema(obj))
end