From 987d0c80f80be2fa687a055ada1755f7d5a657a9 Mon Sep 17 00:00:00 2001 From: Ziyang Hu Date: Mon, 18 Jul 2022 22:25:54 +0800 Subject: [PATCH] very simple tuple implementation --- src/data/tuple.rs | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/data/tuple.rs b/src/data/tuple.rs index 50a56361..5b1196b2 100644 --- a/src/data/tuple.rs +++ b/src/data/tuple.rs @@ -1,3 +1,5 @@ +use std::cmp::{min, Ordering}; + use rmp_serde::Serializer; use serde::Serialize; @@ -66,6 +68,21 @@ impl<'a> EncodedTuple<'a> { Ok(u32::from_be_bytes([self.0[4], self.0[5], self.0[6], self.0[7]]) as usize) } } + fn force_get(&self, idx: usize) -> DataValue { + let pos = if idx == 0 { + let arity = u32::from_be_bytes([self.0[4], self.0[5], self.0[6], self.0[7]]) as usize; + 4 * (arity + 1) + } else { + let len_pos = (idx + 1) * 4; + u32::from_be_bytes([ + self.0[len_pos], + self.0[len_pos + 1], + self.0[len_pos + 2], + self.0[len_pos + 3], + ]) as usize + }; + rmp_serde::from_slice(&self.0[pos..]).unwrap() + } pub(crate) fn get(&self, idx: usize) -> anyhow::Result { let pos = if idx == 0 { 4 * (self.arity()? + 1) @@ -125,6 +142,32 @@ impl<'a> Iterator for EncodedTupleIter<'a> { } } +pub(crate) fn rusty_temp_cmp(a: &[u8], b: &[u8]) -> i8 { + let a = EncodedTuple(a); + let b = EncodedTuple(b); + match a.prefix().unwrap().cmp(&b.prefix().unwrap()) { + Ordering::Greater => return 1, + Ordering::Equal => {} + Ordering::Less => return -1, + } + let a_len = a.arity().unwrap(); + let b_len = b.arity().unwrap(); + for idx in 0..min(a_len, b_len) { + let av = a.force_get(idx); + let bv = b.force_get(idx); + match av.cmp(&bv) { + Ordering::Greater => return 1, + Ordering::Equal => {} + Ordering::Less => return -1, + } + } + match a_len.cmp(&b_len) { + Ordering::Greater => 1, + Ordering::Equal => 0, + Ordering::Less => -1, + } +} + #[cfg(test)] mod tests { use serde_json::json;