1use crate::{
2 BBoxQuantization, CustomOrdWrapper, Point, Point3D, VectorPoints, VectorPoints3D,
3 delta_decode_array, delta_encode_array, unweave_and_delta_decode_3d_array,
4 unweave_and_delta_decode_array, weave_and_delta_encode_3d_array, weave_and_delta_encode_array,
5};
6use alloc::{collections::BTreeMap, string::String, vec::Vec};
7use core::cell::RefCell;
8use pbf::{ProtoRead, ProtoWrite, Protobuf};
9use s2json::BBOX;
10
11#[derive(Debug, Default, Clone, PartialEq, PartialOrd, Eq, Ord)]
14pub enum OColumnName {
15 #[default]
17 String = 1,
18 Unsigned = 2,
21 Signed = 3,
23 Float = 4,
26 Double = 5,
29 Points = 6,
35 Points3D = 7,
41 Indices = 8,
45 Shapes = 9,
47 BBox = 10,
51}
52impl From<u64> for OColumnName {
53 fn from(value: u64) -> Self {
54 match value {
55 1 => OColumnName::String,
56 2 => OColumnName::Unsigned,
57 3 => OColumnName::Signed,
58 4 => OColumnName::Float,
59 5 => OColumnName::Double,
60 6 => OColumnName::Points,
61 7 => OColumnName::Points3D,
62 8 => OColumnName::Indices,
63 9 => OColumnName::Shapes,
64 10 => OColumnName::BBox,
65 _ => OColumnName::String,
66 }
67 }
68}
69impl From<OColumnName> for u64 {
70 fn from(col: OColumnName) -> Self {
71 col as u64
72 }
73}
74
75#[derive(Debug)]
81pub enum ColumnContainer<T> {
82 Pos(usize),
84 Data(T),
86}
87
88#[derive(Debug, Default)]
93pub struct ColumnCacheReader {
94 string: Vec<String>,
96 unsigned: Vec<u64>,
98 signed: Vec<i64>,
100 float: Vec<f32>,
102 double: Vec<f64>,
104 points: Vec<VectorPoints>,
106 points_3d: Vec<VectorPoints3D>,
108 indices: Vec<Vec<u32>>,
110 shapes: Vec<Vec<usize>>,
112 bbox: Vec<BBOX>,
114}
115impl ColumnCacheReader {
116 pub fn new() -> Self {
118 ColumnCacheReader { ..Default::default() }
119 }
120
121 pub fn get_string(&mut self, index: usize) -> String {
123 self.string[index].clone()
124 }
125
126 pub fn get_unsigned(&self, index: usize) -> u64 {
128 self.unsigned[index]
129 }
130
131 pub fn get_signed(&self, index: usize) -> i64 {
133 self.signed[index]
134 }
135
136 pub fn get_float(&self, index: usize) -> f32 {
138 self.float[index]
139 }
140
141 pub fn get_double(&self, index: usize) -> f64 {
143 self.double[index]
144 }
145
146 pub fn get_points(&mut self, index: usize) -> VectorPoints {
148 self.points[index].clone()
149 }
150
151 pub fn get_points_3d(&mut self, index: usize) -> VectorPoints3D {
153 self.points_3d[index].clone()
154 }
155
156 pub fn get_indices(&mut self, index: usize) -> Vec<u32> {
158 self.indices[index].clone()
159 }
160
161 pub fn get_shapes(&mut self, index: usize) -> Vec<usize> {
163 self.shapes[index].clone()
164 }
165
166 pub fn get_bbox(&mut self, index: usize) -> BBOX {
168 self.bbox[index]
169 }
170}
171impl ProtoRead for ColumnCacheReader {
172 fn read(&mut self, tag: u64, pb: &mut Protobuf) {
173 let col: OColumnName = tag.into();
174 match col {
175 OColumnName::String => self.string.push(pb.read_string()),
176 OColumnName::Unsigned => self.unsigned.push(pb.read_varint::<u64>()),
177 OColumnName::Signed => self.signed.push(pb.read_s_varint::<i64>()),
178 OColumnName::Float => self.float.push(pb.read_varint::<f32>()),
179 OColumnName::Double => self.double.push(pb.read_varint::<f64>()),
180 OColumnName::Points => {
181 self.points.push(unweave_and_delta_decode_array(&pb.read_packed::<u64>()))
182 }
183 OColumnName::Points3D => {
184 self.points_3d.push(unweave_and_delta_decode_3d_array(&pb.read_packed::<u64>()))
185 }
186 OColumnName::Indices => self.indices.push(delta_decode_array(&pb.read_packed::<u32>())),
187 OColumnName::Shapes => self.shapes.push(pb.read_packed::<usize>()),
188 OColumnName::BBox => self.bbox.push(BBOX::dequantize(&pb.read_packed::<u8>()[..])),
189 }
190 }
191}
192
193#[derive(Debug, Default, Clone, PartialEq, PartialOrd, Eq, Ord)]
197pub struct OColumnBaseChunk {
198 pub index: usize,
201 pub count: usize,
203}
204#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord)]
208pub enum ColumnValue {
209 Number(usize),
211 Column(RefCell<OColumnBaseChunk>),
213}
214impl From<usize> for ColumnValue {
215 fn from(index: usize) -> Self {
216 ColumnValue::Number(index)
217 }
218}
219impl From<RefCell<OColumnBaseChunk>> for ColumnValue {
220 fn from(chunk: RefCell<OColumnBaseChunk>) -> Self {
221 ColumnValue::Column(chunk)
222 }
223}
224pub type OColumnBaseWrite<K> = BTreeMap<K, RefCell<OColumnBaseChunk>>;
226
227pub type OColumnBaseFloatWrite<K> = BTreeMap<CustomOrdWrapper<K>, RefCell<OColumnBaseChunk>>;
229
230#[derive(Debug, Default)]
234pub struct ColumnCacheWriter {
235 string: OColumnBaseWrite<String>,
237 unsigned: OColumnBaseWrite<u64>,
239 signed: OColumnBaseWrite<i64>,
241 float: OColumnBaseFloatWrite<f32>,
243 double: OColumnBaseFloatWrite<f64>,
245 points: OColumnBaseWrite<Vec<Point>>,
247 points_3d: OColumnBaseWrite<Vec<Point3D>>,
249 indices: OColumnBaseWrite<Vec<u32>>,
251 shapes: OColumnBaseWrite<Vec<ColumnValue>>,
253 bbox: OColumnBaseWrite<BBOX>,
255}
256impl ColumnCacheWriter {
257 pub fn add_string(&mut self, value: String) -> usize {
259 add(&mut self.string, value)
260 }
261
262 pub fn add_u64(&mut self, value: u64) -> RefCell<OColumnBaseChunk> {
264 add_number(&mut self.unsigned, value)
265 }
266
267 pub fn add_i64(&mut self, value: i64) -> RefCell<OColumnBaseChunk> {
269 add_number(&mut self.signed, value)
270 }
271
272 pub fn add_f32(&mut self, value: f32) -> RefCell<OColumnBaseChunk> {
274 add_number(&mut self.float, CustomOrdWrapper(value))
275 }
276
277 pub fn add_f64(&mut self, value: f64) -> RefCell<OColumnBaseChunk> {
279 add_number(&mut self.double, CustomOrdWrapper(value))
280 }
281
282 pub fn add_points(&mut self, value: Vec<Point>) -> usize {
284 add(&mut self.points, value)
285 }
286
287 pub fn add_points_3d(&mut self, value: Vec<Point3D>) -> usize {
289 add(&mut self.points_3d, value)
290 }
291
292 pub fn add_indices(&mut self, value: Vec<u32>) -> usize {
294 add(&mut self.indices, value)
295 }
296
297 pub fn add_shapes(&mut self, value: Vec<ColumnValue>) -> usize {
299 add(&mut self.shapes, value)
300 }
301
302 pub fn add_bbox(&mut self, value: BBOX) -> usize {
304 add(&mut self.bbox, value)
305 }
306}
307impl ProtoWrite for ColumnCacheWriter {
308 fn write(&self, pbf: &mut Protobuf) {
309 let mut strings: Vec<(&String, &RefCell<OColumnBaseChunk>)> = self.string.iter().collect();
311 let mut unsigned: Vec<(&u64, &RefCell<OColumnBaseChunk>)> = self.unsigned.iter().collect();
312 let mut signed: Vec<(&i64, &RefCell<OColumnBaseChunk>)> = self.signed.iter().collect();
313 let mut float: Vec<(&CustomOrdWrapper<f32>, &RefCell<OColumnBaseChunk>)> =
314 self.float.iter().collect();
315 let mut double: Vec<(&CustomOrdWrapper<f64>, &RefCell<OColumnBaseChunk>)> =
316 self.double.iter().collect();
317 let mut points: Vec<(&Vec<Point>, &RefCell<OColumnBaseChunk>)> =
318 self.points.iter().collect();
319 let mut points_3d: Vec<(&Vec<Point3D>, &RefCell<OColumnBaseChunk>)> =
320 self.points_3d.iter().collect();
321 let mut indices: Vec<(&Vec<u32>, &RefCell<OColumnBaseChunk>)> =
322 self.indices.iter().collect();
323 let mut shapes: Vec<(&Vec<ColumnValue>, &RefCell<OColumnBaseChunk>)> =
324 self.shapes.iter().collect();
325 let mut bbox: Vec<(&BBOX, &RefCell<OColumnBaseChunk>)> = self.bbox.iter().collect();
326
327 strings.sort_by(|a, b| a.1.borrow().index.cmp(&b.1.borrow().index));
334 unsigned.sort_by(|a, b| a.1.borrow().index.cmp(&b.1.borrow().index));
335 signed.sort_by(|a, b| a.1.borrow().index.cmp(&b.1.borrow().index));
336 float.sort_by(|a, b| a.1.borrow().index.cmp(&b.1.borrow().index));
337 double.sort_by(|a, b| a.1.borrow().index.cmp(&b.1.borrow().index));
338 points.sort_by(|a, b| a.1.borrow().index.cmp(&b.1.borrow().index));
339 points_3d.sort_by(|a, b| a.1.borrow().index.cmp(&b.1.borrow().index));
340 indices.sort_by(|a, b| a.1.borrow().index.cmp(&b.1.borrow().index));
341 shapes.sort_by(|a, b| a.1.borrow().index.cmp(&b.1.borrow().index));
342 bbox.sort_by(|a, b| a.1.borrow().index.cmp(&b.1.borrow().index));
343
344 for string in strings {
347 pbf.write_string_field(OColumnName::String.into(), string.0);
348 }
349 for u in unsigned {
351 pbf.write_varint_field(OColumnName::Unsigned.into(), *u.0);
352 }
353 for s in signed {
355 pbf.write_s_varint_field(OColumnName::Signed.into(), *s.0);
356 }
357 for f in float {
359 pbf.write_varint_field(OColumnName::Float.into(), f.0.0);
360 }
361 for d in double {
363 pbf.write_varint_field(OColumnName::Double.into(), d.0.0);
364 }
365 for p in points {
367 pbf.write_packed_varint(OColumnName::Points.into(), &weave_and_delta_encode_array(p.0));
368 }
369 for p_3d in points_3d {
371 pbf.write_packed_varint(
372 OColumnName::Points3D.into(),
373 &weave_and_delta_encode_3d_array(p_3d.0),
374 );
375 }
376 for i in indices {
378 pbf.write_packed_varint(OColumnName::Indices.into(), &delta_encode_array(i.0));
379 }
380 for s in shapes {
382 let packed: Vec<usize> =
383 s.0.iter()
384 .map(|v| match v {
385 ColumnValue::Number(n) => *n,
386 ColumnValue::Column(c) => c.borrow().index,
387 })
388 .collect();
389 pbf.write_packed_varint(OColumnName::Shapes.into(), &packed);
390 }
391 for bbox in bbox {
393 pbf.write_packed_varint(OColumnName::BBox.into(), &bbox.0.quantize());
394 }
395 }
396}
397
398pub fn add<T>(col: &mut OColumnBaseWrite<T>, value: T) -> usize
400where
401 T: Ord,
402{
403 if let Some(col) = col.get_mut(&value) {
404 let mut chunk = col.borrow_mut();
405 chunk.count += 1;
406 chunk.index
407 } else {
408 let index = col.len();
409 col.insert(value, RefCell::new(OColumnBaseChunk { index, count: 1 }));
410 index
411 }
412}
413
414pub fn add_number<T>(col: &mut OColumnBaseWrite<T>, value: T) -> RefCell<OColumnBaseChunk>
416where
417 T: Ord,
418{
419 if let Some(chunk) = col.get_mut(&value) {
420 {
421 let mut chunk_mut = chunk.borrow_mut();
422 chunk_mut.count += 1;
423 }
424 chunk.clone()
425 } else {
426 let index = col.len();
427 let new_chunk = RefCell::new(OColumnBaseChunk { index, count: 1 });
428 col.insert(value, new_chunk.clone());
429 new_chunk
430 }
431}
432
433