From 934c54d05e20fcc6a2e33a9e8f9b71b1444bc8f3 Mon Sep 17 00:00:00 2001 From: Ziyang Hu Date: Wed, 3 Aug 2022 18:40:15 +0800 Subject: [PATCH] fix comparison --- src/data/compare.rs | 58 +++++++++++++++++++++++++++++++-------------- src/data/encode.rs | 2 +- 2 files changed, 41 insertions(+), 19 deletions(-) diff --git a/src/data/compare.rs b/src/data/compare.rs index 07065e59..0fc113fa 100644 --- a/src/data/compare.rs +++ b/src/data/compare.rs @@ -53,10 +53,13 @@ pub(crate) fn compare_key(a: &[u8], b: &[u8]) -> Ordering { #[inline] fn compare_key_triple_eav(a: &[u8], b: &[u8]) -> Ordering { - let (a_e, a_a, a_t) = decode_ea_key(a).unwrap(); - let (b_e, b_a, b_t) = decode_ea_key(b).unwrap(); + return_if_resolved!(a[..8].cmp(&b[..8])); + if a.len() == 8 || b.len() == 8 { + return a.len().cmp(&b.len()); + } + let (_a_e, a_a, a_t) = decode_ea_key(a).unwrap(); + let (_b_e, b_a, b_t) = decode_ea_key(b).unwrap(); - return_if_resolved!(a_e.cmp(&b_e)); return_if_resolved!(a_a.cmp(&b_a)); let a_v = decode_value_from_key(a).unwrap(); @@ -68,10 +71,14 @@ fn compare_key_triple_eav(a: &[u8], b: &[u8]) -> Ordering { #[inline] fn compare_key_triple_aev(a: &[u8], b: &[u8]) -> Ordering { - let (a_a, a_e, a_t) = decode_ae_key(a).unwrap(); - let (b_a, b_e, b_t) = decode_ae_key(b).unwrap(); + return_if_resolved!(a[..8].cmp(&b[..8])); + if a.len() == 8 || b.len() == 8 { + return a.len().cmp(&b.len()); + } + + let (_a_a, a_e, a_t) = decode_ae_key(a).unwrap(); + let (_b_a, b_e, b_t) = decode_ae_key(b).unwrap(); - return_if_resolved!(a_a.cmp(&b_a)); return_if_resolved!(a_e.cmp(&b_e)); let a_v = decode_value_from_key(a).unwrap(); @@ -83,10 +90,13 @@ fn compare_key_triple_aev(a: &[u8], b: &[u8]) -> Ordering { #[inline] fn compare_key_triple_ave(a: &[u8], b: &[u8]) -> Ordering { - let (a_a, a_e, a_t) = decode_ae_key(a).unwrap(); - let (b_a, b_e, b_t) = decode_ae_key(b).unwrap(); + return_if_resolved!(a[..8].cmp(&b[..8])); + if a.len() == 8 || b.len() == 8 { + return a.len().cmp(&b.len()); + } - return_if_resolved!(a_a.cmp(&b_a)); + let (_a_a, a_e, a_t) = decode_ae_key(a).unwrap(); + let (_b_a, b_e, b_t) = decode_ae_key(b).unwrap(); let a_v = decode_value_from_key(a).unwrap(); let b_v = decode_value_from_key(b).unwrap(); @@ -98,10 +108,14 @@ fn compare_key_triple_ave(a: &[u8], b: &[u8]) -> Ordering { #[inline] fn compare_key_triple_vae(a: &[u8], b: &[u8]) -> Ordering { - let (a_v, a_a, a_e, a_t) = decode_vae_key(a).unwrap(); - let (b_v, b_a, b_e, b_t) = decode_vae_key(b).unwrap(); + return_if_resolved!(a[..8].cmp(&b[..8])); + if a.len() == 8 || b.len() == 8 { + return a.len().cmp(&b.len()); + } + + let (_a_v, a_a, a_e, a_t) = decode_vae_key(a).unwrap(); + let (_b_v, b_a, b_e, b_t) = decode_vae_key(b).unwrap(); - return_if_resolved!(a_v.cmp(&b_v)); return_if_resolved!(a_a.cmp(&b_a)); return_if_resolved!(a_e.cmp(&b_e)); a_t.cmp(&b_t).reverse() @@ -109,12 +123,16 @@ fn compare_key_triple_vae(a: &[u8], b: &[u8]) -> Ordering { #[inline] fn compare_key_attr_by_id(a: &[u8], b: &[u8]) -> Ordering { + return_if_resolved!(a[..8].cmp(&b[..8])); + if a.len() == 8 || b.len() == 8 { + return a.len().cmp(&b.len()); + } + debug_assert_eq!(a[0], StorageTag::AttrById as u8); debug_assert_eq!(b[0], StorageTag::AttrById as u8); - let (a_a, a_t) = decode_attr_key_by_id(a).unwrap(); - let (b_a, b_t) = decode_attr_key_by_id(b).unwrap(); + let (_a_a, a_t) = decode_attr_key_by_id(a).unwrap(); + let (_b_a, b_t) = decode_attr_key_by_id(b).unwrap(); - return_if_resolved!(a_a.cmp(&b_a)); a_t.cmp(&b_t).reverse() } @@ -130,9 +148,13 @@ fn compare_key_unique_entity_attr(a: &[u8], b: &[u8]) -> Ordering { #[inline] fn compare_key_unique_attr_val(a: &[u8], b: &[u8]) -> Ordering { - let (a_a, a_v) = decode_sentinel_attr_val(a).unwrap(); - let (b_a, b_v) = decode_sentinel_attr_val(b).unwrap(); - return_if_resolved!(a_a.cmp(&b_a)); + return_if_resolved!(a[..8].cmp(&b[..8])); + if a.len() == 8 || b.len() == 8 { + return a.len().cmp(&b.len()); + } + + let (_a_a, a_v) = decode_sentinel_attr_val(a).unwrap(); + let (_b_a, b_v) = decode_sentinel_attr_val(b).unwrap(); a_v.cmp(&b_v) } diff --git a/src/data/encode.rs b/src/data/encode.rs index 8557d3a6..b0d6af2e 100644 --- a/src/data/encode.rs +++ b/src/data/encode.rs @@ -14,7 +14,7 @@ use crate::data::value::DataValue; use crate::runtime::transact::TxLog; #[repr(u8)] -#[derive(Ord, PartialOrd, Eq, PartialEq, Debug)] +#[derive(Ord, PartialOrd, Eq, PartialEq, Debug, Copy, Clone)] pub(crate) enum StorageTag { TripleEntityAttrValue = 1, TripleAttrEntityValue = 2,