Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 48 additions & 7 deletions ruby/red-arrow/lib/arrow/array-builder.rb
Original file line number Diff line number Diff line change
Expand Up @@ -74,14 +74,26 @@ def detect_builder_info(value, builder_info)
detected: true,
}
when Integer
if value < 0
builder_info ||= {}
min = builder_info[:min] || value
max = builder_info[:max] || value
min = value if value < min
max = value if value > max
bit_length = value.bit_length

if builder_info[:builder_type] == :int || value < 0
{
builder: IntArrayBuilder.new,
detected: true,
builder_type: :int,
min: min,
max: max,
bit_length: [builder_info[:bit_length] || 0, bit_length].max
}
else
{
builder: UIntArrayBuilder.new,
builder_type: :uint,
min: min,
max: max,
bit_length: [builder_info[:bit_length] || 0, bit_length].max
}
end
when Time
Expand Down Expand Up @@ -150,18 +162,19 @@ def detect_builder_info(value, builder_info)
end
end
when ::Array
sub_builder_info = nil
sub_builder_info = builder_info && builder_info[:value_builder_info]
value.each do |sub_value|
sub_builder_info = detect_builder_info(sub_value, sub_builder_info)
break if sub_builder_info and sub_builder_info[:detected]
end
if sub_builder_info
sub_builder = sub_builder_info[:builder]
return builder_info unless sub_builder
sub_builder = sub_builder_info[:builder] || create_builder(sub_builder_info)
return sub_builder_info unless sub_builder
sub_value_data_type = sub_builder.value_data_type
field = Field.new("item", sub_value_data_type)
{
builder: ListArrayBuilder.new(ListDataType.new(field)),
value_builder_info: sub_builder_info,
detected: sub_builder_info[:detected],
}
else
Expand All @@ -186,6 +199,34 @@ def create_builder(builder_info)
data_type = Decimal256DataType.new(builder_info[:precision],
builder_info[:scale])
Decimal256ArrayBuilder.new(data_type)
when :int
required_bit_length = builder_info[:bit_length] + 1
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we need +1 only for :int?


if required_bit_length <= 8
Int8ArrayBuilder.new
elsif required_bit_length <= 16
Int16ArrayBuilder.new
elsif required_bit_length <= 32
Int32ArrayBuilder.new
elsif required_bit_length <= 64
Int64ArrayBuilder.new
else
StringArrayBuilder.new
end
when :uint
required_bit_length = builder_info[:bit_length]

if required_bit_length <= 8
UInt8ArrayBuilder.new
elsif required_bit_length <= 16
UInt16ArrayBuilder.new
elsif required_bit_length <= 32
UInt32ArrayBuilder.new
elsif required_bit_length <= 64
UInt64ArrayBuilder.new
else
StringArrayBuilder.new
end
else
nil
end
Expand Down
Loading
Loading