diff --git a/src/elements.rs b/src/elements.rs index 60aeeb2..7601a63 100644 --- a/src/elements.rs +++ b/src/elements.rs @@ -21,7 +21,7 @@ use std::collections::HashMap; use arrow::array::{ StructBuilder, FixedSizeListBuilder, ListBuilder, StringBuilder, ArrayBuilder, BooleanBuilder, - Int32Builder, Int16Builder, UInt32Builder, UInt8Builder, Float64Builder, + Int32Builder, Int16Builder, UInt64Builder, UInt32Builder, UInt8Builder, Float64Builder, }; @@ -319,17 +319,18 @@ pub fn read_text<'a>( angle_builder.append_option(angle_deg); let (input, mut xy_iter) = XY::read_data(input, header.data_size)?; - let x_builder = text_builder.field_builder::(9).unwrap(); - x_builder.append_value(xy_iter.next().unwrap()); - let y_builder = text_builder.field_builder::(10).unwrap(); - y_builder.append_value(xy_iter.next().unwrap()); + let xx = xy_iter.next().unwrap(); + let yy = xy_iter.next().unwrap(); + let xy = ((xx as u32 as u64) << 32) | (yy as u32 as u64); + let xy_builder = text_builder.field_builder::(9).unwrap(); + xy_builder.append_value(xy); let (input, string_bytes) = STRING::read(input)?; let string = String::from_utf8(string_bytes).unwrap(); - let string_builder = text_builder.field_builder::(11).unwrap(); + let string_builder = text_builder.field_builder::(10).unwrap(); string_builder.append_value(string); - let props_builder = text_builder.field_builder::(12).unwrap(); + let props_builder = text_builder.field_builder::(11).unwrap(); let (input, ()) = read_properties(input, props_builder)?; text_builder.append(true); @@ -406,57 +407,47 @@ pub fn read_ref<'a>( let (input, mut xy_iter) = XY::read_data(input, header.data_size)?; - let x = xy_iter.next().unwrap(); - let y = xy_iter.next().unwrap(); - let x_builder = ref_builder.field_builder::(4).unwrap(); - x_builder.append_value(x); - let y_builder = ref_builder.field_builder::(5).unwrap(); - y_builder.append_value(y); + let xx = xy_iter.next().unwrap(); + let yy = xy_iter.next().unwrap(); + let xy = ((xx as u32 as u64) << 32) | (yy as u32 as u64); + let xy_builder = ref_builder.field_builder::(4).unwrap(); + xy_builder.append_value(xy); - let rep_builder = ref_builder.field_builder::(6).unwrap(); println!("ref, {is_aref:?}"); + let rep_builder = ref_builder.field_builder::(5).unwrap(); if is_aref { if colrow.is_none() { return fail(input, "AREF without COLROW before XY".to_string()) } let (count0, count1) = colrow.unwrap(); - let x0a = (xy_iter.next().unwrap() - x) / (count0 as i32); - let y0a = (xy_iter.next().unwrap() - y) / (count0 as i32); - let x1a = (xy_iter.next().unwrap() - x) / (count1 as i32); - let y1a = (xy_iter.next().unwrap() - y) / (count1 as i32); + let x0a = (xy_iter.next().unwrap() - xx) / (count0 as i32); + let y0a = (xy_iter.next().unwrap() - yy) / (count0 as i32); + let x1a = (xy_iter.next().unwrap() - xx) / (count1 as i32); + let y1a = (xy_iter.next().unwrap() - yy) / (count1 as i32); - let x0_builder = rep_builder.field_builder::(0).unwrap(); - x0_builder.append_value(x0a); - let y0_builder = rep_builder.field_builder::(1).unwrap(); - y0_builder.append_value(y0a); - let x1_builder = rep_builder.field_builder::(2).unwrap(); - x1_builder.append_value(x1a); - let y1_builder = rep_builder.field_builder::(3).unwrap(); - y1_builder.append_value(y1a); + let xy0a = ((x0a as u32 as u64) << 32) | (y0a as u32 as u64); + let xy1a = ((x1a as u32 as u64) << 32) | (y1a as u32 as u64); + let xy0_builder = rep_builder.field_builder::(0).unwrap(); + xy0_builder.append_value(xy0a); + let xy1_builder = rep_builder.field_builder::(1).unwrap(); + xy1_builder.append_value(xy1a); - let count0_builder = rep_builder.field_builder::(4).unwrap(); - count0_builder.append_value(count0); - let count1_builder = rep_builder.field_builder::(5).unwrap(); - count1_builder.append_value(count1); + let counts = ((count0 as u16 as u32) << 16) | (count1 as u16 as u32); + let counts_builder = rep_builder.field_builder::(2).unwrap(); + counts_builder.append_value(counts); } else { - let x0_builder = rep_builder.field_builder::(0).unwrap(); - x0_builder.append_null(); - let y0_builder = rep_builder.field_builder::(1).unwrap(); - y0_builder.append_null(); - let x1_builder = rep_builder.field_builder::(2).unwrap(); - x1_builder.append_null(); - let y1_builder = rep_builder.field_builder::(3).unwrap(); - y1_builder.append_null(); - let count0_builder = rep_builder.field_builder::(4).unwrap(); - count0_builder.append_null(); - let count1_builder = rep_builder.field_builder::(5).unwrap(); - count1_builder.append_null(); + let xy0_builder = rep_builder.field_builder::(0).unwrap(); + xy0_builder.append_null(); + let xy1_builder = rep_builder.field_builder::(1).unwrap(); + xy1_builder.append_null(); + let counts_builder = rep_builder.field_builder::(2).unwrap(); + counts_builder.append_null(); } rep_builder.append(is_aref); - let props_builder = ref_builder.field_builder::(7).unwrap(); + let props_builder = ref_builder.field_builder::(6).unwrap(); let (input, ()) = read_properties(input, props_builder)?; ref_builder.append(true); diff --git a/src/library.rs b/src/library.rs index 18e5a2b..a9b4855 100644 --- a/src/library.rs +++ b/src/library.rs @@ -112,12 +112,9 @@ pub fn read_library(input: &[u8]) -> IResult { let repetition_struct_t = DataType::Struct(Fields::from(vec![ - Field::new("x0", DataType::Int32, false), - Field::new("y0", DataType::Int32, false), - Field::new("x1", DataType::Int32, false), - Field::new("y1", DataType::Int32, false), - Field::new("count0", DataType::Int16, false), - Field::new("count1", DataType::Int16, false), + Field::new("xy0", DataType::UInt64, false), + Field::new("xy1", DataType::UInt64, false), + Field::new("counts", DataType::UInt32, false), ])); let ref_struct_t = DataType::Struct(Fields::from(vec![ @@ -125,8 +122,7 @@ pub fn read_library(input: &[u8]) -> IResult { Field::new("invert_y", DataType::Boolean, true), Field::new("mag", DataType::Float64, true), Field::new("angle_deg", DataType::Float64, true), - Field::new("x", DataType::Int32, false), - Field::new("y", DataType::Int32, false), + Field::new("xy", DataType::UInt64, false), Field::new("repetition", repetition_struct_t, true), Field::new("properties", property_list_t.clone(), true), ])); @@ -141,8 +137,7 @@ pub fn read_library(input: &[u8]) -> IResult { Field::new("invert_y", DataType::Boolean, true), Field::new("mag", DataType::Float64, true), Field::new("angle_deg", DataType::Float64, true), - Field::new("x", DataType::Int32, false), - Field::new("y", DataType::Int32, false), + Field::new("xy", DataType::UInt64, false), Field::new("string", DataType::Utf8, false), Field::new("properties", property_list_t.clone(), true), ]));