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
94 changes: 23 additions & 71 deletions arrow-array/src/array/map_array.rs
Original file line number Diff line number Diff line change
Expand Up @@ -372,13 +372,9 @@ impl MapArray {
let entry_offsets_buffer = Buffer::from(entry_offsets.to_byte_slice());
let keys_data = StringArray::from_iter_values(keys);

let keys_field = Arc::new(Field::new(
Field::MAP_KEY_FIELD_DEFAULT_NAME,
DataType::Utf8,
false,
));
let keys_field = Arc::new(Field::new("keys", DataType::Utf8, false));
let values_field = Arc::new(Field::new(
Field::MAP_VALUE_FIELD_DEFAULT_NAME,
"values",
values.data_type().clone(),
values.null_count() > 0,
));
Expand All @@ -390,7 +386,7 @@ impl MapArray {

let map_data_type = DataType::Map(
Arc::new(Field::new(
Field::MAP_ENTRIES_FIELD_DEFAULT_NAME,
"entries",
entry_struct.data_type().clone(),
false,
)),
Expand Down Expand Up @@ -635,16 +631,8 @@ mod tests {
// [[0, 1, 2], [3, 4, 5], [6, 7]]
let entry_offsets = Buffer::from([0, 3, 6, 8].to_byte_slice());

let keys = Arc::new(Field::new(
Field::MAP_KEY_FIELD_DEFAULT_NAME,
DataType::Int32,
false,
));
let values = Arc::new(Field::new(
Field::MAP_VALUE_FIELD_DEFAULT_NAME,
DataType::UInt32,
false,
));
let keys = Arc::new(Field::new("keys", DataType::Int32, false));
let values = Arc::new(Field::new("values", DataType::UInt32, false));
let entry_struct = StructArray::from(vec![
(keys, make_array(keys_data)),
(values, make_array(values_data)),
Expand All @@ -653,7 +641,7 @@ mod tests {
// Construct a map array from the above two
let map_data_type = DataType::Map(
Arc::new(Field::new(
Field::MAP_ENTRIES_FIELD_DEFAULT_NAME,
"entries",
entry_struct.data_type().clone(),
false,
)),
Expand Down Expand Up @@ -689,16 +677,8 @@ mod tests {
// [[0, 1, 2], [3, 4, 5], [6, 7]]
let entry_offsets = Buffer::from([0, 3, 6, 8].to_byte_slice());

let keys_field = Arc::new(Field::new(
Field::MAP_KEY_FIELD_DEFAULT_NAME,
DataType::Int32,
false,
));
let values_field = Arc::new(Field::new(
Field::MAP_VALUE_FIELD_DEFAULT_NAME,
DataType::UInt32,
true,
));
let keys_field = Arc::new(Field::new("keys", DataType::Int32, false));
let values_field = Arc::new(Field::new("values", DataType::UInt32, true));
let entry_struct = StructArray::from(vec![
(keys_field.clone(), make_array(key_data)),
(values_field.clone(), make_array(value_data.clone())),
Expand All @@ -707,7 +687,7 @@ mod tests {
// Construct a map array from the above two
let map_data_type = DataType::Map(
Arc::new(Field::new(
Field::MAP_ENTRIES_FIELD_DEFAULT_NAME,
"entries",
entry_struct.data_type().clone(),
false,
)),
Expand Down Expand Up @@ -818,16 +798,8 @@ mod tests {
// [[3, 4, 5], [6, 7]]
let entry_offsets = Buffer::from([0, 3, 5].to_byte_slice());

let keys = Arc::new(Field::new(
Field::MAP_KEY_FIELD_DEFAULT_NAME,
DataType::Int32,
false,
));
let values = Arc::new(Field::new(
Field::MAP_VALUE_FIELD_DEFAULT_NAME,
DataType::UInt32,
false,
));
let keys = Arc::new(Field::new("keys", DataType::Int32, false));
let values = Arc::new(Field::new("values", DataType::UInt32, false));
let entry_struct = StructArray::from(vec![
(keys, make_array(keys_data)),
(values, make_array(values_data)),
Expand All @@ -836,7 +808,7 @@ mod tests {
// Construct a map array from the above two
let map_data_type = DataType::Map(
Arc::new(Field::new(
Field::MAP_ENTRIES_FIELD_DEFAULT_NAME,
"entries",
entry_struct.data_type().clone(),
false,
)),
Expand Down Expand Up @@ -867,8 +839,8 @@ mod tests {
// A DictionaryArray has similar buffer layout to a MapArray
// but the meaning of the values differs
let struct_t = DataType::Struct(Fields::from(vec![
Field::new(Field::MAP_KEY_FIELD_DEFAULT_NAME, DataType::Int32, true),
Field::new(Field::MAP_VALUE_FIELD_DEFAULT_NAME, DataType::UInt32, true),
Field::new("keys", DataType::Int32, true),
Field::new("values", DataType::UInt32, true),
]));
let dict_t = DataType::Dictionary(Box::new(DataType::Int32), Box::new(struct_t));
let _ = MapArray::from(ArrayData::new_empty(&dict_t));
Expand Down Expand Up @@ -899,16 +871,8 @@ mod tests {

let key_array = Arc::new(StringArray::from(vec!["a", "b", "c"])) as ArrayRef;
let value_array = Arc::new(UInt32Array::from(vec![0u32, 10, 20])) as ArrayRef;
let keys_field = Arc::new(Field::new(
Field::MAP_KEY_FIELD_DEFAULT_NAME,
DataType::Utf8,
false,
));
let values_field = Arc::new(Field::new(
Field::MAP_VALUE_FIELD_DEFAULT_NAME,
DataType::UInt32,
false,
));
let keys_field = Arc::new(Field::new("keys", DataType::Utf8, false));
let values_field = Arc::new(Field::new("values", DataType::UInt32, false));
let struct_array =
StructArray::from(vec![(keys_field, key_array), (values_field, value_array)]);
assert_eq!(
Expand All @@ -932,20 +896,16 @@ mod tests {
fn test_try_new() {
let offsets = OffsetBuffer::new(vec![0, 1, 4, 5].into());
let fields = Fields::from(vec![
Field::new(Field::MAP_KEY_FIELD_DEFAULT_NAME, DataType::Int32, false),
Field::new(Field::MAP_VALUE_FIELD_DEFAULT_NAME, DataType::Int32, false),
Field::new("key", DataType::Int32, false),
Field::new("values", DataType::Int32, false),
]);
let columns = vec![
Arc::new(Int32Array::from(vec![1, 2, 3, 4, 5])) as _,
Arc::new(Int32Array::from(vec![1, 2, 3, 4, 5])) as _,
];

let entries = StructArray::new(fields.clone(), columns, None);
let field = Arc::new(Field::new(
Field::MAP_ENTRIES_FIELD_DEFAULT_NAME,
DataType::Struct(fields),
false,
));
let field = Arc::new(Field::new("entries", DataType::Struct(fields), false));

MapArray::new(field.clone(), offsets.clone(), entries.clone(), None, false);

Expand Down Expand Up @@ -998,11 +958,7 @@ mod tests {
];

let s = StructArray::new(fields.clone(), columns, None);
let field = Arc::new(Field::new(
Field::MAP_ENTRIES_FIELD_DEFAULT_NAME,
DataType::Struct(fields),
false,
));
let field = Arc::new(Field::new("entries", DataType::Struct(fields), false));
let err = MapArray::try_new(field, offsets, s, None, false).unwrap_err();

assert_eq!(
Expand All @@ -1017,16 +973,12 @@ mod tests {
let keys = Int32Array::from(vec![Some(1), None]);
let values = Int32Array::from(vec![None, Some(2)]);
let fields = Fields::from(vec![
Field::new(Field::MAP_KEY_FIELD_DEFAULT_NAME, DataType::Int32, true),
Field::new(Field::MAP_VALUE_FIELD_DEFAULT_NAME, DataType::Int32, true),
Field::new("keys", DataType::Int32, true),
Field::new("values", DataType::Int32, true),
]);
let entries =
StructArray::new(fields.clone(), vec![Arc::new(keys), Arc::new(values)], None);
let field = Arc::new(Field::new(
Field::MAP_ENTRIES_FIELD_DEFAULT_NAME,
DataType::Struct(fields),
false,
));
let field = Arc::new(Field::new("entries", DataType::Struct(fields), false));

let err = MapArray::try_new(field, OffsetBuffer::from_lengths([2]), entries, None, false)
.unwrap_err();
Expand Down
6 changes: 3 additions & 3 deletions arrow-array/src/array/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1178,10 +1178,10 @@ mod tests {
fn test_null_map() {
let data_type = DataType::Map(
Arc::new(Field::new(
Field::MAP_ENTRIES_FIELD_DEFAULT_NAME,
"entry",
DataType::Struct(Fields::from(vec![
Field::new(Field::MAP_KEY_FIELD_DEFAULT_NAME, DataType::Utf8, false),
Field::new(Field::MAP_VALUE_FIELD_DEFAULT_NAME, DataType::Int32, true),
Field::new("key", DataType::Utf8, false),
Field::new("value", DataType::Int32, true),
])),
false,
)),
Expand Down
46 changes: 13 additions & 33 deletions arrow-array/src/builder/map_builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -79,9 +79,9 @@ pub struct MapFieldNames {
impl Default for MapFieldNames {
fn default() -> Self {
Self {
entry: Field::MAP_ENTRIES_FIELD_DEFAULT_NAME.to_string(),
key: Field::MAP_KEY_FIELD_DEFAULT_NAME.to_string(),
value: Field::MAP_VALUE_FIELD_DEFAULT_NAME.to_string(),
entry: "entries".to_string(),
key: "keys".to_string(),
value: "values".to_string(),
}
}
}
Expand Down Expand Up @@ -395,14 +395,10 @@ mod tests {
map.data_type(),
&DataType::Map(
Arc::new(Field::new(
Field::MAP_ENTRIES_FIELD_DEFAULT_NAME,
"entries",
DataType::Struct(
vec![
Arc::new(Field::new(
Field::MAP_KEY_FIELD_DEFAULT_NAME,
DataType::Int32,
false
)),
Arc::new(Field::new("keys", DataType::Int32, false)),
value_field.clone()
]
.into()
Expand All @@ -423,14 +419,10 @@ mod tests {
map.data_type(),
&DataType::Map(
Arc::new(Field::new(
Field::MAP_ENTRIES_FIELD_DEFAULT_NAME,
"entries",
DataType::Struct(
vec![
Arc::new(Field::new(
Field::MAP_KEY_FIELD_DEFAULT_NAME,
DataType::Int32,
false
)),
Arc::new(Field::new("keys", DataType::Int32, false)),
value_field
]
.into()
Expand All @@ -447,7 +439,7 @@ mod tests {
let mut key_metadata = HashMap::new();
key_metadata.insert("foo".to_string(), "bar".to_string());
let key_field = Arc::new(
Field::new("other_key", DataType::Int32, false).with_metadata(key_metadata.clone()),
Field::new("keys", DataType::Int32, false).with_metadata(key_metadata.clone()),
);
let mut builder = MapBuilder::new(None, Int32Builder::new(), Int32Builder::new())
.with_keys_field(key_field.clone());
Expand All @@ -461,18 +453,14 @@ mod tests {
map.data_type(),
&DataType::Map(
Arc::new(Field::new(
Field::MAP_ENTRIES_FIELD_DEFAULT_NAME,
"entries",
DataType::Struct(
vec![
Arc::new(
Field::new("other_key", DataType::Int32, false)
Field::new("keys", DataType::Int32, false)
.with_metadata(key_metadata)
),
Arc::new(Field::new(
Field::MAP_VALUE_FIELD_DEFAULT_NAME,
DataType::Int32,
true
))
Arc::new(Field::new("values", DataType::Int32, true))
]
.into()
),
Expand Down Expand Up @@ -523,11 +511,7 @@ mod tests {
#[should_panic(expected = "Keys field must not be nullable")]
fn test_with_nullable_keys_field() {
let mut builder = MapBuilder::new(None, Int32Builder::new(), Int32Builder::new())
.with_keys_field(Arc::new(Field::new(
Field::MAP_KEY_FIELD_DEFAULT_NAME,
DataType::Int32,
true,
)));
.with_keys_field(Arc::new(Field::new("keys", DataType::Int32, true)));

builder.keys().append_value(1);
builder.values().append_value(2);
Expand All @@ -540,11 +524,7 @@ mod tests {
#[should_panic(expected = "Incorrect datatype")]
fn test_keys_field_type_mismatch() {
let mut builder = MapBuilder::new(None, Int32Builder::new(), Int32Builder::new())
.with_keys_field(Arc::new(Field::new(
Field::MAP_KEY_FIELD_DEFAULT_NAME,
DataType::Utf8,
false,
)));
.with_keys_field(Arc::new(Field::new("keys", DataType::Utf8, false)));

builder.keys().append_value(1);
builder.values().append_value(2);
Expand Down
14 changes: 3 additions & 11 deletions arrow-avro/benches/avro_writer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -623,18 +623,10 @@ static DECIMAL256_DATA: Lazy<Vec<RecordBatch>> = Lazy::new(|| {
static MAP_DATA: Lazy<Vec<RecordBatch>> = Lazy::new(|| {
use arrow_array::builder::{MapBuilder, StringBuilder};

let key_field = Arc::new(Field::new(
Field::MAP_KEY_FIELD_DEFAULT_NAME,
DataType::Utf8,
false,
));
let value_field = Arc::new(Field::new(
Field::MAP_VALUE_FIELD_DEFAULT_NAME,
DataType::Utf8,
true,
));
let key_field = Arc::new(Field::new("keys", DataType::Utf8, false));
let value_field = Arc::new(Field::new("values", DataType::Utf8, true));
let entry_struct = Field::new(
Field::MAP_ENTRIES_FIELD_DEFAULT_NAME,
"entries",
DataType::Struct(vec![key_field.as_ref().clone(), value_field.as_ref().clone()].into()),
false,
);
Expand Down
6 changes: 3 additions & 3 deletions arrow-avro/src/codec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -931,12 +931,12 @@ impl Codec {
}
Self::Struct(f) => DataType::Struct(f.iter().map(|x| x.field()).collect()),
Self::Map(value_type) => {
let val_field = value_type.field_with_name(Field::MAP_VALUE_FIELD_DEFAULT_NAME);
let val_field = value_type.field_with_name("value");
DataType::Map(
Arc::new(Field::new(
Field::MAP_ENTRIES_FIELD_DEFAULT_NAME,
"entries",
DataType::Struct(Fields::from(vec![
Field::new(Field::MAP_KEY_FIELD_DEFAULT_NAME, DataType::Utf8, false),
Field::new("key", DataType::Utf8, false),
val_field,
])),
false,
Expand Down
Loading
Loading