From bc5cfe53792d393831a89afcc7618cfa78f6d2e2 Mon Sep 17 00:00:00 2001 From: Ziyang Hu Date: Thu, 27 Oct 2022 16:14:58 +0800 Subject: [PATCH] remove 'reverse' nonsense --- Cargo.lock | 1 + Cargo.toml | 1 + src/data/functions.rs | 1 - src/data/json.rs | 1 - src/data/mod.rs | 1 + src/data/value.rs | 13 +++---------- src/query/sort.rs | 39 +++++++++++++++++++-------------------- src/runtime/db.rs | 5 +++-- src/runtime/in_mem.rs | 12 ------------ 9 files changed, 28 insertions(+), 46 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 24b1758d..3984fbb4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -339,6 +339,7 @@ version = "0.1.0" dependencies = [ "approx", "base64", + "byteorder", "casey", "chrono", "chrono-tz", diff --git a/Cargo.toml b/Cargo.toml index 83216f9a..ba59184c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -34,6 +34,7 @@ chrono = "0.4.19" chrono-tz = "0.6.3" priority-queue = "1.2.3" ordered-float = "3.0.0" +byteorder = "1.4.3" num-traits = "0.2.15" itertools = "0.10.3" regex = "1.6.0" diff --git a/src/data/functions.rs b/src/data/functions.rs index de2f7f0b..9591e5dd 100644 --- a/src/data/functions.rs +++ b/src/data/functions.rs @@ -43,7 +43,6 @@ fn ensure_same_value_type(a: &DataValue, b: &DataValue) -> Result<()> { | (Regex(_), Regex(_)) | (List(_), List(_)) | (Set(_), Set(_)) - | (Rev(_), Rev(_)) | (Guard, Guard) | (Bot, Bot) ) { diff --git a/src/data/json.rs b/src/data/json.rs index d655fed2..9afcc81c 100644 --- a/src/data/json.rs +++ b/src/data/json.rs @@ -84,7 +84,6 @@ impl From for JsonValue { DataValue::List(l) => { JsonValue::Array(l.iter().map(|v| JsonValue::from(v.clone())).collect()) } - DataValue::Rev(v) => JsonValue::from(*v.0), DataValue::Bot => panic!("found bottom"), DataValue::Guard => panic!("found guard"), DataValue::Set(l) => { diff --git a/src/data/mod.rs b/src/data/mod.rs index f642301d..5d9ea6b7 100644 --- a/src/data/mod.rs +++ b/src/data/mod.rs @@ -11,6 +11,7 @@ pub(crate) mod program; pub(crate) mod aggr; pub(crate) mod functions; pub(crate) mod relation; +pub(crate) mod memcmp; #[cfg(test)] mod tests; diff --git a/src/data/value.rs b/src/data/value.rs index d4b8a55b..e171f1dc 100644 --- a/src/data/value.rs +++ b/src/data/value.rs @@ -2,7 +2,7 @@ * Copyright 2022, The Cozo Project Authors. Licensed under AGPL-3 or later. */ -use std::cmp::{Ordering, Reverse}; +use std::cmp::Ordering; use std::collections::BTreeSet; use std::fmt::{Debug, Display, Formatter}; use std::hash::{Hash, Hasher}; @@ -102,8 +102,6 @@ pub(crate) enum DataValue { List(Vec), #[serde(rename = "H", alias = "Set")] Set(BTreeSet), - #[serde(rename = "R", alias = "Rev")] - Rev(Reverse>), #[serde(rename = "G", alias = "Guard")] Guard, #[serde(rename = "_", alias = "Bot")] @@ -181,11 +179,10 @@ impl Display for Num { } else { write!(f, r#"to_float("INF")"#) } - } - else { + } else { write!(f, "{}", n) } - }, + } } } } @@ -256,9 +253,6 @@ impl Display for DataValue { } DataValue::List(ls) => f.debug_list().entries(ls).finish(), DataValue::Set(s) => f.debug_list().entries(s).finish(), - DataValue::Rev(rev) => { - write!(f, "{}", rev.0) - } DataValue::Guard => { write!(f, "null") } @@ -355,7 +349,6 @@ mod tests { dbg!(s); } - #[test] fn display_datavalues() { println!("{}", DataValue::Null); diff --git a/src/query/sort.rs b/src/query/sort.rs index 2c0dca72..f7910fc4 100644 --- a/src/query/sort.rs +++ b/src/query/sort.rs @@ -2,7 +2,7 @@ * Copyright 2022, The Cozo Project Authors. Licensed under AGPL-3 or later. */ -use std::cmp::Reverse; +use std::cmp::{Ordering}; use std::collections::BTreeMap; use itertools::Itertools; @@ -11,7 +11,6 @@ use miette::Result; use crate::data::program::SortDir; use crate::data::symb::Symbol; use crate::data::tuple::Tuple; -use crate::data::value::DataValue; use crate::runtime::in_mem::InMemRelation; use crate::runtime::transact::SessionTx; @@ -21,29 +20,29 @@ impl SessionTx { original: InMemRelation, sorters: &[(Symbol, SortDir)], head: &[Symbol], - ) -> Result { + ) -> Result> { let head_indices: BTreeMap<_, _> = head.iter().enumerate().map(|(i, k)| (k, i)).collect(); let idx_sorters = sorters .iter() .map(|(k, dir)| (head_indices[k], *dir)) .collect_vec(); - let ret = self.new_temp_store(original.rule_name.symbol().span); - for (idx, tuple) in original.scan_all().enumerate() { - let tuple = tuple?; - let mut key = idx_sorters - .iter() - .map(|(idx, dir)| { - let mut val = tuple.0[*idx].clone(); - if *dir == SortDir::Dsc { - val = DataValue::Rev(Reverse(Box::new(val))); + + let mut all_data: Vec<_> = original.scan_all().try_collect()?; + all_data.sort_by(|a, b| { + for (idx, dir) in &idx_sorters { + match a.0[*idx].cmp(&b.0[*idx]) { + Ordering::Equal => {} + o => { + return match dir { + SortDir::Asc => o, + SortDir::Dsc => o.reverse(), + } } - val - }) - .collect_vec(); - key.push(DataValue::from(idx as i64)); - let key = Tuple(key); - ret.put_kv(key, tuple, 0); - } - Ok(ret) + } + } + Ordering::Equal + }); + + Ok(all_data) } } diff --git a/src/runtime/db.rs b/src/runtime/db.rs index 567022ac..20f632bf 100644 --- a/src/runtime/db.rs +++ b/src/runtime/db.rs @@ -603,15 +603,16 @@ impl Db { let sorted_result = tx.sort_and_collect(result, &input_program.out_opts.sorters, &entry_head)?; let sorted_iter = if let Some(offset) = input_program.out_opts.offset { - Left(sorted_result.scan_sorted().skip(offset)) + Left(sorted_result.into_iter().skip(offset)) } else { - Right(sorted_result.scan_sorted()) + Right(sorted_result.into_iter()) }; let sorted_iter = if let Some(limit) = input_program.out_opts.limit { Left(sorted_iter.take(limit)) } else { Right(sorted_iter) }; + let sorted_iter = sorted_iter.map(|t| Ok(t)); if let Some((meta, relation_op)) = &input_program.out_opts.store_relation { let to_clear = tx .execute_relation( diff --git a/src/runtime/in_mem.rs b/src/runtime/in_mem.rs index 5b182f80..ba4a4c49 100644 --- a/src/runtime/in_mem.rs +++ b/src/runtime/in_mem.rs @@ -141,12 +141,6 @@ impl InMemRelation { let mut target = db.get(epoch as usize).unwrap().try_write().unwrap(); target.insert(tuple, Tuple::default()); } - pub(crate) fn put_kv(&self, tuple: Tuple, val: Tuple, epoch: u32) { - self.ensure_mem_db_for_epoch(epoch); - let db = self.mem_db.try_read().unwrap(); - let mut target = db.get(epoch as usize).unwrap().try_write().unwrap(); - target.insert(tuple, val); - } pub(crate) fn normal_aggr_put( &self, tuple: &Tuple, @@ -315,12 +309,6 @@ impl InMemRelation { pub(crate) fn scan_all(&self) -> impl Iterator> { self.scan_all_for_epoch(0) } - pub(crate) fn scan_sorted(&self) -> impl Iterator> { - self.ensure_mem_db_for_epoch(0); - let target = self.mem_db.try_read().unwrap(); - let target = target.get(0).unwrap().try_read().unwrap(); - target.clone().into_iter().map(|(_k, v)| Ok(v)) - } pub(crate) fn scan_prefix(&self, prefix: &Tuple) -> impl Iterator> { self.scan_prefix_for_epoch(prefix, 0) }