lump together x and y, and counts

This commit is contained in:
Jan Petykiewicz 2025-04-22 20:16:38 -07:00
parent 9dbfb5e4ec
commit 78d1d6e7de
2 changed files with 39 additions and 53 deletions

View File

@ -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::<Int32Builder>(9).unwrap();
x_builder.append_value(xy_iter.next().unwrap());
let y_builder = text_builder.field_builder::<Int32Builder>(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::<UInt64Builder>(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::<StringBuilder>(11).unwrap();
let string_builder = text_builder.field_builder::<StringBuilder>(10).unwrap();
string_builder.append_value(string);
let props_builder = text_builder.field_builder::<DListBuilder>(12).unwrap();
let props_builder = text_builder.field_builder::<DListBuilder>(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::<Int32Builder>(4).unwrap();
x_builder.append_value(x);
let y_builder = ref_builder.field_builder::<Int32Builder>(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::<UInt64Builder>(4).unwrap();
xy_builder.append_value(xy);
let rep_builder = ref_builder.field_builder::<StructBuilder>(6).unwrap();
println!("ref, {is_aref:?}");
let rep_builder = ref_builder.field_builder::<StructBuilder>(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::<Int32Builder>(0).unwrap();
x0_builder.append_value(x0a);
let y0_builder = rep_builder.field_builder::<Int32Builder>(1).unwrap();
y0_builder.append_value(y0a);
let x1_builder = rep_builder.field_builder::<Int32Builder>(2).unwrap();
x1_builder.append_value(x1a);
let y1_builder = rep_builder.field_builder::<Int32Builder>(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::<UInt64Builder>(0).unwrap();
xy0_builder.append_value(xy0a);
let xy1_builder = rep_builder.field_builder::<UInt64Builder>(1).unwrap();
xy1_builder.append_value(xy1a);
let count0_builder = rep_builder.field_builder::<Int16Builder>(4).unwrap();
count0_builder.append_value(count0);
let count1_builder = rep_builder.field_builder::<Int16Builder>(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::<UInt32Builder>(2).unwrap();
counts_builder.append_value(counts);
} else {
let x0_builder = rep_builder.field_builder::<Int32Builder>(0).unwrap();
x0_builder.append_null();
let y0_builder = rep_builder.field_builder::<Int32Builder>(1).unwrap();
y0_builder.append_null();
let x1_builder = rep_builder.field_builder::<Int32Builder>(2).unwrap();
x1_builder.append_null();
let y1_builder = rep_builder.field_builder::<Int32Builder>(3).unwrap();
y1_builder.append_null();
let count0_builder = rep_builder.field_builder::<Int16Builder>(4).unwrap();
count0_builder.append_null();
let count1_builder = rep_builder.field_builder::<Int16Builder>(5).unwrap();
count1_builder.append_null();
let xy0_builder = rep_builder.field_builder::<UInt64Builder>(0).unwrap();
xy0_builder.append_null();
let xy1_builder = rep_builder.field_builder::<UInt64Builder>(1).unwrap();
xy1_builder.append_null();
let counts_builder = rep_builder.field_builder::<UInt32Builder>(2).unwrap();
counts_builder.append_null();
}
rep_builder.append(is_aref);
let props_builder = ref_builder.field_builder::<DListBuilder>(7).unwrap();
let props_builder = ref_builder.field_builder::<DListBuilder>(6).unwrap();
let (input, ()) = read_properties(input, props_builder)?;
ref_builder.append(true);

View File

@ -112,12 +112,9 @@ pub fn read_library(input: &[u8]) -> IResult<StructArray> {
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<StructArray> {
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<StructArray> {
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),
]));