diff --git a/.gitignore b/.gitignore
index 2cddba5d..2d74f8d7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -30,4 +30,5 @@ _test*
*.db
cozorocks/deps/
-.DS_Store
\ No newline at end of file
+.DS_Store
+flamegraph.svg
\ No newline at end of file
diff --git a/Cargo.toml b/Cargo.toml
index 69d3f408..0a5635ab 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -39,5 +39,8 @@ cozorocks = { path = "cozorocks" }
#[profile.release]
#lto = true
+[profile.release]
+debug = true
+
[workspace]
members = ["cozorocks", "cozohttp", "cozopy", "cozoplay/src-tauri"]
\ No newline at end of file
diff --git a/src/query/relation.rs b/src/query/relation.rs
index 991c81f9..48acab5f 100644
--- a/src/query/relation.rs
+++ b/src/query/relation.rs
@@ -3,11 +3,12 @@ use std::fmt::{Debug, Formatter};
use std::iter;
use anyhow::{anyhow, bail, Context, Result};
+use either::{Left, Right};
use itertools::Itertools;
use crate::data::attr::Attribute;
use crate::data::expr::Expr;
-use crate::data::id::Validity;
+use crate::data::id::{AttrId, EntityId, Validity};
use crate::data::symb::Symbol;
use crate::data::tuple::{Tuple, TupleIter};
use crate::data::value::DataValue;
@@ -623,10 +624,17 @@ impl TripleRelation {
}
fn iter<'a>(&'a self, tx: &'a SessionTx) -> TupleIter<'a> {
- let it = tx
- .triple_a_before_scan(self.attr.id, self.vld)
- .map_ok(|(_, e_id, y)| Tuple(vec![e_id.to_value(), y]));
- self.return_filtered_iter(it, Default::default())
+ if self.attr.with_history {
+ let it = tx
+ .triple_a_before_scan(self.attr.id, self.vld)
+ .map_ok(|(_, e_id, y)| Tuple(vec![e_id.to_value(), y]));
+ self.return_filtered_iter(it, Default::default())
+ } else {
+ let it = tx
+ .triple_a_scan(self.attr.id)
+ .map_ok(|(_, e_id, y)| Tuple(vec![e_id.to_value(), y]));
+ self.return_filtered_iter(it, Default::default())
+ }
}
pub(crate) fn neg_join<'a>(
@@ -713,13 +721,26 @@ impl TripleRelation {
// [f, f] not really a join
let it = left_iter
.map_ok(|tuple| {
- tx.triple_a_before_scan(self.attr.id, self.vld)
- .map_ok(move |(_, e_id, val)| {
- let mut ret = tuple.0.clone();
- ret.push(e_id.to_value());
- ret.push(val);
- Tuple(ret)
- })
+ if self.attr.with_history {
+ Left(tx.triple_a_before_scan(self.attr.id, self.vld).map_ok(
+ move |(_, e_id, val)| {
+ let mut ret = tuple.0.clone();
+ ret.push(e_id.to_value());
+ ret.push(val);
+ Tuple(ret)
+ },
+ ))
+ } else {
+ Right(
+ tx.triple_a_scan(self.attr.id)
+ .map_ok(move |(_, e_id, val)| {
+ let mut ret = tuple.0.clone();
+ ret.push(e_id.to_value());
+ ret.push(val);
+ Tuple(ret)
+ }),
+ )
+ }
})
.flatten_ok()
.map(flatten_err);
@@ -818,7 +839,12 @@ impl TripleRelation {
.unwrap()
.get_entity_id()
.with_context(|| format!("{:?}, {:?}", self, tuple))?;
- match tx.triple_ea_before_scan(eid, self.attr.id, self.vld).next() {
+ let nxt = if self.attr.with_history {
+ tx.triple_ea_before_scan(eid, self.attr.id, self.vld).next()
+ } else {
+ tx.triple_ea_scan(eid, self.attr.id).next()
+ };
+ match nxt {
None => Ok(if !eliminate_indices.is_empty() {
Some(Tuple(
tuple
@@ -862,13 +888,20 @@ impl TripleRelation {
.get_entity_id()
.with_context(|| format!("{:?}, {:?}, {}", self, tuple, left_e_idx))
.map(move |eid| {
- tx.triple_ea_before_scan(eid, self.attr.id, self.vld)
- .map_ok(move |(eid, _, val)| {
- let mut ret = tuple.0.clone();
- ret.push(eid.to_value());
- ret.push(val);
- Tuple(ret)
- })
+ let clj = move |(eid, _, val): (EntityId, AttrId, DataValue)| {
+ let mut ret = tuple.0.clone();
+ ret.push(eid.to_value());
+ ret.push(val);
+ Tuple(ret)
+ };
+ if self.attr.with_history {
+ Left(tx.triple_ea_scan(eid, self.attr.id).map_ok(clj))
+ } else {
+ Right(
+ tx.triple_ea_before_scan(eid, self.attr.id, self.vld)
+ .map_ok(clj),
+ )
+ }
})
})
.map(flatten_err)
@@ -892,10 +925,13 @@ impl TripleRelation {
.unwrap()
.get_entity_id()
.with_context(|| format!("{:?}", self))?;
- match tx
- .triple_vref_a_before_scan(v_eid, self.attr.id, self.vld)
- .next()
- {
+ let nxt = if self.attr.with_history {
+ tx.triple_vref_a_before_scan(v_eid, self.attr.id, self.vld)
+ .next()
+ } else {
+ tx.triple_vref_a_scan(v_eid, self.attr.id).next()
+ };
+ match nxt {
None => Ok(if !eliminate_indices.is_empty() {
Some(Tuple(
tuple
@@ -964,7 +1000,12 @@ impl TripleRelation {
left_iter
.map_ok(move |tuple| -> Result