fix comparison

main
Ziyang Hu 2 years ago
parent 490066f0a2
commit 934c54d05e

@ -53,10 +53,13 @@ pub(crate) fn compare_key(a: &[u8], b: &[u8]) -> Ordering {
#[inline] #[inline]
fn compare_key_triple_eav(a: &[u8], b: &[u8]) -> Ordering { fn compare_key_triple_eav(a: &[u8], b: &[u8]) -> Ordering {
let (a_e, a_a, a_t) = decode_ea_key(a).unwrap(); return_if_resolved!(a[..8].cmp(&b[..8]));
let (b_e, b_a, b_t) = decode_ea_key(b).unwrap(); 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)); return_if_resolved!(a_a.cmp(&b_a));
let a_v = decode_value_from_key(a).unwrap(); let a_v = decode_value_from_key(a).unwrap();
@ -68,10 +71,14 @@ fn compare_key_triple_eav(a: &[u8], b: &[u8]) -> Ordering {
#[inline] #[inline]
fn compare_key_triple_aev(a: &[u8], b: &[u8]) -> Ordering { fn compare_key_triple_aev(a: &[u8], b: &[u8]) -> Ordering {
let (a_a, a_e, a_t) = decode_ae_key(a).unwrap(); return_if_resolved!(a[..8].cmp(&b[..8]));
let (b_a, b_e, b_t) = decode_ae_key(b).unwrap(); 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)); return_if_resolved!(a_e.cmp(&b_e));
let a_v = decode_value_from_key(a).unwrap(); let a_v = decode_value_from_key(a).unwrap();
@ -83,10 +90,13 @@ fn compare_key_triple_aev(a: &[u8], b: &[u8]) -> Ordering {
#[inline] #[inline]
fn compare_key_triple_ave(a: &[u8], b: &[u8]) -> Ordering { fn compare_key_triple_ave(a: &[u8], b: &[u8]) -> Ordering {
let (a_a, a_e, a_t) = decode_ae_key(a).unwrap(); return_if_resolved!(a[..8].cmp(&b[..8]));
let (b_a, b_e, b_t) = decode_ae_key(b).unwrap(); 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 a_v = decode_value_from_key(a).unwrap();
let b_v = decode_value_from_key(b).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] #[inline]
fn compare_key_triple_vae(a: &[u8], b: &[u8]) -> Ordering { fn compare_key_triple_vae(a: &[u8], b: &[u8]) -> Ordering {
let (a_v, a_a, a_e, a_t) = decode_vae_key(a).unwrap(); return_if_resolved!(a[..8].cmp(&b[..8]));
let (b_v, b_a, b_e, b_t) = decode_vae_key(b).unwrap(); 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_a.cmp(&b_a));
return_if_resolved!(a_e.cmp(&b_e)); return_if_resolved!(a_e.cmp(&b_e));
a_t.cmp(&b_t).reverse() a_t.cmp(&b_t).reverse()
@ -109,12 +123,16 @@ fn compare_key_triple_vae(a: &[u8], b: &[u8]) -> Ordering {
#[inline] #[inline]
fn compare_key_attr_by_id(a: &[u8], b: &[u8]) -> Ordering { 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!(a[0], StorageTag::AttrById as u8);
debug_assert_eq!(b[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 (_a_a, a_t) = decode_attr_key_by_id(a).unwrap();
let (b_a, b_t) = decode_attr_key_by_id(b).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() a_t.cmp(&b_t).reverse()
} }
@ -130,9 +148,13 @@ fn compare_key_unique_entity_attr(a: &[u8], b: &[u8]) -> Ordering {
#[inline] #[inline]
fn compare_key_unique_attr_val(a: &[u8], b: &[u8]) -> Ordering { fn compare_key_unique_attr_val(a: &[u8], b: &[u8]) -> Ordering {
let (a_a, a_v) = decode_sentinel_attr_val(a).unwrap(); return_if_resolved!(a[..8].cmp(&b[..8]));
let (b_a, b_v) = decode_sentinel_attr_val(b).unwrap(); if a.len() == 8 || b.len() == 8 {
return_if_resolved!(a_a.cmp(&b_a)); 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) a_v.cmp(&b_v)
} }

@ -14,7 +14,7 @@ use crate::data::value::DataValue;
use crate::runtime::transact::TxLog; use crate::runtime::transact::TxLog;
#[repr(u8)] #[repr(u8)]
#[derive(Ord, PartialOrd, Eq, PartialEq, Debug)] #[derive(Ord, PartialOrd, Eq, PartialEq, Debug, Copy, Clone)]
pub(crate) enum StorageTag { pub(crate) enum StorageTag {
TripleEntityAttrValue = 1, TripleEntityAttrValue = 1,
TripleAttrEntityValue = 2, TripleAttrEntityValue = 2,

Loading…
Cancel
Save