diff --git a/Cargo.toml b/Cargo.toml index 6a2e9ab2..40db3ae6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,4 +18,5 @@ thiserror = "1.0.30" log = "0.4.16" env_logger = "0.9.0" actix-web = "4.0.1" +extsort = "0.4.2" cozorocks = { path = "cozorocks" } \ No newline at end of file diff --git a/src/algebra/op/from.rs b/src/algebra/op/from.rs index 7007ec1b..943eaec9 100644 --- a/src/algebra/op/from.rs +++ b/src/algebra/op/from.rs @@ -157,6 +157,7 @@ pub(crate) enum ChainPartEdgeDir { pub(crate) enum JoinType { Inner, Left, + #[allow(dead_code)] Right, // FullOuter, } @@ -180,8 +181,6 @@ pub(crate) struct ChainEl { #[derive(thiserror::Error, Debug)] pub(crate) enum JoinError { - #[error("Cannot have both left and right join marker in a chain segment")] - NoFullOuterInChain, #[error("Must specify edge direction")] BidiEdge, } diff --git a/src/algebra/op/group.rs b/src/algebra/op/group.rs index a6811515..8300c458 100644 --- a/src/algebra/op/group.rs +++ b/src/algebra/op/group.rs @@ -203,7 +203,7 @@ impl<'b> RelationalAlgebra for GroupOp<'b> { ) }) .collect::>(), - ex => return Err(SelectOpError::NeedsDict.into()), + _ex => return Err(SelectOpError::NeedsDict.into()), }; for (i, (k, _)) in extract_map.iter().enumerate() { @@ -255,7 +255,7 @@ impl<'b> RelationalAlgebra for GroupOp<'b> { .values() .map(|v| Expr::Const(v.clone())) .collect::>(), - ex => return Err(SelectOpError::NeedsDict.into()), + _ex => return Err(SelectOpError::NeedsDict.into()), }; for ex in extraction_vec { diff --git a/src/algebra/op/merge.rs b/src/algebra/op/merge.rs index 68fd5589..d645dd7d 100644 --- a/src/algebra/op/merge.rs +++ b/src/algebra/op/merge.rs @@ -100,7 +100,7 @@ impl<'a> MergeJoin<'a> { } join_keys.push((left_condition, right_condition)) } - ex => return Err(JoinError::JoinCondition.into()), + _ex => return Err(JoinError::JoinCondition.into()), } } diff --git a/src/algebra/op/nested_loop.rs b/src/algebra/op/nested_loop.rs index 261a3f0c..eb6bf0d0 100644 --- a/src/algebra/op/nested_loop.rs +++ b/src/algebra/op/nested_loop.rs @@ -80,7 +80,7 @@ impl<'b> RelationalAlgebra for NestedLoopLeft<'b> { }) .collect::>>()?; let table_id = self.right.table_id(); - let mut key_tuple = OwnTuple::with_prefix(table_id.id); + let key_tuple = OwnTuple::with_prefix(table_id.id); let txn = self.ctx.txn.clone(); let temp_db = self.ctx.sess.temp.clone(); let w_opts = default_write_options(); diff --git a/src/algebra/op/select.rs b/src/algebra/op/select.rs index f90b7c48..217f110e 100644 --- a/src/algebra/op/select.rs +++ b/src/algebra/op/select.rs @@ -116,7 +116,7 @@ impl<'b> RelationalAlgebra for SelectOp<'b> { ) }) .collect::>(), - ex => return Err(SelectOpError::NeedsDict.into()), + _ex => return Err(SelectOpError::NeedsDict.into()), }; Ok(BindingMap { inner_map: BTreeMap::from([(self.binding.clone(), extract_map)]), @@ -137,7 +137,7 @@ impl<'b> RelationalAlgebra for SelectOp<'b> { .values() .map(|v| Expr::Const(v.clone())) .collect::>(), - ex => return Err(SelectOpError::NeedsDict.into()), + _ex => return Err(SelectOpError::NeedsDict.into()), }; extraction_vec.iter().for_each(|ex| ex.aggr_reset()); diff --git a/src/algebra/op/walk.rs b/src/algebra/op/walk.rs index 09e5d70e..92c6050a 100644 --- a/src/algebra/op/walk.rs +++ b/src/algebra/op/walk.rs @@ -18,8 +18,10 @@ use crate::parser::{Pair, Pairs, Rule}; use crate::runtime::options::{default_read_options, default_write_options}; use anyhow::Result; use cozorocks::RowIterator; +use extsort::Sortable; use std::cmp::{Ordering, Reverse}; use std::collections::{BTreeMap, BTreeSet}; +use std::io::{Read, Write}; use std::mem; pub(crate) const NAME_WALK: &str = "Walk"; @@ -112,7 +114,7 @@ impl<'a> WalkOp<'a> { }, ) .collect::>>()?; - it = Box::new(in_mem_sort(it, sort_exprs)?) + it = Box::new(maybe_in_mem_sort(it, sort_exprs)?) } WalkElOp::Filter(expr) => { let expr = expr.clone().partial_eval(&first_binding_ctx)?; @@ -400,6 +402,7 @@ impl<'a> WalkOp<'a> { #[derive(Debug)] pub(crate) struct StartingEl { node_info: NodeInfo, + #[allow(dead_code)] assocs: Vec, binding: String, pivot: bool, @@ -409,9 +412,11 @@ pub(crate) struct StartingEl { #[derive(Debug)] pub(crate) struct HoppingEls { node_info: NodeInfo, + #[allow(dead_code)] node_assocs: Vec, node_binding: String, edge_info: EdgeInfo, + #[allow(dead_code)] edge_assocs: Vec, edge_binding: String, direction: ChainPartEdgeDir, @@ -435,8 +440,6 @@ pub(crate) enum WalkError { UnboundFilter, #[error("No/multiple collectors")] CollectorNumberMismatch, - #[error("Starting el cannot have sorters")] - SorterOnStart, #[error("Unsupported operation {0} on walk element")] UnsupportedWalkOp(String), #[error("Wrong argument to walk op")] @@ -909,7 +912,7 @@ fn clustered_in_mem_sort( Ok(it) } -fn in_mem_sort( +fn maybe_in_mem_sort( it: Box>>, sort_exprs: Vec<(Expr, SortDirection)>, ) -> Result>> { @@ -919,30 +922,138 @@ fn in_mem_sort( } } - let mut collected: Vec<(Vec, TupleSet)> = it - .map(|v| match v { - Err(e) => Err(e), - Ok(v) => { - match sort_exprs - .iter() - .map(|(ex, dir)| -> Result { - let mut res = ex.row_eval(&v)?.into_static(); - if *dir == SortDirection::Dsc { - res = Value::DescVal(Reverse(res.into())) - } - Ok(res) - }) - .collect::>>() - { - Err(e) => Err(e), - Ok(sort_vals) => Ok((sort_vals, v.into_owned())), - } + let collected_iter = it.map(move |v| match v { + Err(err) => { + dbg!(err); + TupleSetSortEl { + is_ok: false, + keys: vec![], + tset: Default::default(), } - }) - .collect::>>()?; + } + Ok(v) => { + match sort_exprs + .iter() + .map(|(ex, dir)| -> Result { + let mut res = ex.row_eval(&v)?.into_static(); + if *dir == SortDirection::Dsc { + res = Value::DescVal(Reverse(res.into())) + } + Ok(res) + }) + .collect::>>() + { + Err(_) => TupleSetSortEl { + is_ok: false, + keys: vec![], + tset: Default::default(), + }, + Ok(sort_vals) => TupleSetSortEl { + is_ok: true, + keys: sort_vals, + tset: v.into_owned(), + }, + } + } + }); + let sorter = extsort::ExternalSorter::new(); + let ret = sorter.sort(collected_iter).unwrap(); + Ok(ret.map(|st| { + if st.is_ok { + Ok(st.tset) + } else { + Err(AlgebraParseError::Sorting.into()) + } + })) +} + +#[derive(Eq, PartialEq)] +struct TupleSetSortEl<'a> { + is_ok: bool, + keys: Vec>, + tset: TupleSet, +} + +impl<'a> PartialOrd for TupleSetSortEl<'a> { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} - collected.sort_by(sort_value_comparator); - Ok(collected.into_iter().map(|(_, v)| Ok(v))) +impl<'a> Ord for TupleSetSortEl<'a> { + fn cmp(&self, other: &Self) -> Ordering { + match self.is_ok.cmp(&other.is_ok) { + Ordering::Equal => self.keys.cmp(&other.keys), + v => v, + } + } +} + +impl<'a> Sortable for TupleSetSortEl<'a> { + fn encode(&self, writer: &mut W) { + let mut out = OwnTuple::with_null_prefix(); + if !self.is_ok { + out.push_null(); + writer.write_all(out.as_ref()).unwrap(); + } + + out.push_int(self.keys.len() as i64); + for val in &self.keys { + out.push_value(val); + } + + out.push_int(self.tset.keys.len() as i64); + out.push_int(self.tset.vals.len() as i64); + for k in &self.tset.keys { + out.push_bytes(k.as_ref()); + } + for v in &self.tset.vals { + out.push_bytes(v.as_ref()); + } + writer.write_all(out.as_ref()).unwrap() + } + + fn decode(reader: &mut R) -> Option { + let mut buf = vec![]; + reader.read_to_end(&mut buf).ok()?; + let source = OwnTuple::new(buf); + let key_len = match source.get_int(0) { + Ok(len) => len as usize, + Err(err) => { + dbg!(err); + return Some(Self { + is_ok: false, + keys: vec![], + tset: Default::default(), + }); + } + }; + let mut keys = Vec::with_capacity(key_len); + for i in 1..(key_len + 1) { + keys.push(source.get(i).ok()?.into_static()); + } + let k_len = source.get_int(key_len + 1).ok()? as usize; + let v_len = source.get_int(key_len + 2).ok()? as usize; + let mut tset = TupleSet { + keys: Vec::with_capacity(k_len), + vals: Vec::with_capacity(v_len), + }; + for i in 3 + key_len..3 + key_len + k_len { + let d = source.get(i).ok()?; + let d = d.get_bytes()?; + tset.keys.push(OwnTuple::new(d.to_vec()).into()); + } + for i in 3 + key_len + k_len..3 + key_len + k_len + v_len { + let d = source.get(i).ok()?; + let d = d.get_bytes()?; + tset.vals.push(OwnTuple::new(d.to_vec()).into()); + } + Some(Self { + is_ok: true, + keys, + tset, + }) + } } fn sort_value_comparator(a: &(Vec, TupleSet), b: &(Vec, TupleSet)) -> Ordering { @@ -1064,7 +1175,7 @@ pub(crate) fn parse_walk_conditions_and_collectors( ctx: &TempDbContext, args: Pairs, starting_el: &mut StartingEl, - hops: &mut Vec, + hops: &mut [HoppingEls], binding_map: &BindingMap, ) -> Result<(String, BTreeMap)> { let mut collectors = vec![]; @@ -1139,13 +1250,13 @@ pub(crate) fn parse_walk_conditions_and_collectors( map: binding_map, parent: ctx, }; - let extraction_map = match collector.clone().partial_eval(&binding_ctx)? { + let extraction_map = match collector.partial_eval(&binding_ctx)? { Expr::Dict(d) => d, Expr::Const(Value::Dict(d)) => d .into_iter() .map(|(k, v)| (k.to_string(), Expr::Const(v.clone()))) .collect(), - ex => return Err(SelectOpError::NeedsDict.into()), + _ex => return Err(SelectOpError::NeedsDict.into()), }; Ok((bindings.pop().unwrap(), extraction_map)) } diff --git a/src/algebra/parser.rs b/src/algebra/parser.rs index cff81b7e..113307e5 100644 --- a/src/algebra/parser.rs +++ b/src/algebra/parser.rs @@ -52,6 +52,9 @@ pub(crate) enum AlgebraParseError { #[error("Scalar function in forbidden place")] ScalarFnNotAllowed, + + #[error("sorting failed")] + Sorting, } pub(crate) fn assert_rule(pair: &Pair, rule: Rule, name: &str, u: usize) -> Result<()> { @@ -648,7 +651,7 @@ pub(crate) mod tests { let s = r#" Walk(j:Job<-[:HasJob]-e:Employee-[:InDepartment]->d:Department, j => Sort(j.id => desc), - // e => Sort(e.id => desc).Skip(1).Where(e.id > 110), + e => Sort(e.id => desc).Skip(1).Where(e.id > 110), j: { id_1_job: j.id, id_2_emp: count_non_null[e.id], diff --git a/src/bin/cozo_rest/main.rs b/src/bin/cozo_rest/main.rs index c5789a1c..62065f84 100644 --- a/src/bin/cozo_rest/main.rs +++ b/src/bin/cozo_rest/main.rs @@ -1,4 +1,4 @@ -use actix_web::{get, post, web, App, HttpResponse, HttpServer, Responder}; +use actix_web::{post, web, App, HttpResponse, HttpServer, Responder}; use cozo::DbInstance; struct AppStateWithDb { @@ -9,8 +9,10 @@ struct AppStateWithDb { async fn query(body: web::Bytes, data: web::Data) -> impl Responder { let text = String::from_utf8_lossy(body.as_ref()); let mut sess = data.db.session().unwrap().start().unwrap(); - let res = sess.run_script(text, true); - HttpResponse::Ok().body(format!("{:?}", res)) + match sess.run_script(text, true) { + Ok(res) => HttpResponse::Ok().body(res.to_string()), + Err(e) => HttpResponse::BadRequest().body(format!("{:?}", e)), + } } #[actix_web::main] diff --git a/src/context.rs b/src/context.rs index 0ac6b211..a5c0ea3c 100644 --- a/src/context.rs +++ b/src/context.rs @@ -8,6 +8,7 @@ pub(crate) struct MainDbContext<'a> { pub(crate) txn: TransactionPtr, } +#[allow(dead_code)] pub(crate) struct TempDbContext<'a> { pub(crate) sess: &'a mut Session, pub(crate) txn: TransactionPtr, diff --git a/src/data/eval.rs b/src/data/eval.rs index 2d020dc3..8139e42d 100644 --- a/src/data/eval.rs +++ b/src/data/eval.rs @@ -350,7 +350,7 @@ impl Expr { | Expr::OpMerge(_) | Expr::OpCoalesce(_)) => Expr::FieldAcc(f, v.into()), Expr::Dict(mut d) => d.remove(&f as &str).unwrap_or(Expr::Const(Value::Null)), - v => return Err(EvalError::FieldAccess(f).into()), + _v => return Err(EvalError::FieldAccess(f).into()), }, }, Expr::IdxAcc(i, arg) => { @@ -383,7 +383,7 @@ impl Expr { | Expr::FieldAcc(_, _) | Expr::BuiltinFn(_, _) | Expr::ApplyAgg(_, _, _)) => Expr::IdxAcc(i, v.into()), - v => return Err(EvalError::IndexAccess(i).into()), + _v => return Err(EvalError::IndexAccess(i).into()), }, } } @@ -509,7 +509,7 @@ impl Expr { Expr::FieldAcc(f, arg) => match arg.row_eval(ctx)? { Value::Null => Value::Null, Value::Dict(mut d) => d.remove(f as &str).unwrap_or(Value::Null), - v => { + _v => { return Err( EvalError::FieldAccess(f.clone()).into(), ); @@ -524,7 +524,7 @@ impl Expr { d.swap_remove(*idx) } } - v => return Err(EvalError::IndexAccess(*idx).into()), + _v => return Err(EvalError::IndexAccess(*idx).into()), }, Expr::IfExpr(args) => { let (cond, if_part, else_part) = args.as_ref(); diff --git a/src/data/expr.rs b/src/data/expr.rs index 088db98a..d73e560d 100644 --- a/src/data/expr.rs +++ b/src/data/expr.rs @@ -275,34 +275,34 @@ impl TryFrom for Expr { })) } EXPR_TAG_APPLY => { - let mut ll = extract_list_from_value(v, 2)?.into_iter(); - let name = match ll.next().unwrap() { - Value::Text(t) => t, - v => return Err(ExprError::ConversionFailure(v.into_static()).into()), - }; - let l = extract_list_from_value(ll.next().unwrap(), 0)?; - let _args = l - .into_iter() - .map(Expr::try_from) - .collect::>>()?; + // let mut ll = extract_list_from_value(v, 2)?.into_iter(); + // let name = match ll.next().unwrap() { + // Value::Text(t) => t, + // v => return Err(ExprError::ConversionFailure(v.into_static()).into()), + // }; + // let l = extract_list_from_value(ll.next().unwrap(), 0)?; + // let _args = l + // .into_iter() + // .map(Expr::try_from) + // .collect::>>()?; todo!() } EXPR_TAG_APPLY_AGG => { - let mut ll = extract_list_from_value(v, 3)?.into_iter(); - let name = match ll.next().unwrap() { - Value::Text(t) => t, - v => return Err(ExprError::ConversionFailure(v.into_static()).into()), - }; - let l = extract_list_from_value(ll.next().unwrap(), 0)?; - let a_args = l - .into_iter() - .map(Expr::try_from) - .collect::>>()?; - let l = extract_list_from_value(ll.next().unwrap(), 0)?; - let _args = l - .into_iter() - .map(Expr::try_from) - .collect::>>()?; + // let mut ll = extract_list_from_value(v, 3)?.into_iter(); + // let name = match ll.next().unwrap() { + // Value::Text(t) => t, + // v => return Err(ExprError::ConversionFailure(v.into_static()).into()), + // }; + // let l = extract_list_from_value(ll.next().unwrap(), 0)?; + // let a_args = l + // .into_iter() + // .map(Expr::try_from) + // .collect::>>()?; + // let l = extract_list_from_value(ll.next().unwrap(), 0)?; + // let _args = l + // .into_iter() + // .map(Expr::try_from) + // .collect::>>()?; todo!() } EXPR_TAG_FIELD_ACC => { @@ -420,19 +420,23 @@ impl<'a> From for Value<'a> { Expr::SwitchExpr(_) => { todo!() } - Expr::ApplyAgg(op, a_args, args) => build_tagged_value( - EXPR_TAG_APPLY_AGG, - vec![ - Value::from(todo!()), - a_args - .into_iter() - .map(Value::from) - .collect::>() - .into(), - args.into_iter().map(Value::from).collect::>().into(), - ] - .into(), - ), + Expr::ApplyAgg(_op, _a_args, _args) => { + todo!() + // build_tagged_value( + // // EXPR_TAG_APPLY_AGG, + // // vec![ + // // Value::from(todo!()), + // // a_args + // // .into_iter() + // // .map(Value::from) + // // .collect::>() + // // .into(), + // // args.into_iter().map(Value::from).collect::>().into(), + // // ] + // // .into(), + // todo!() + // ) + }, Expr::FieldAcc(f, v) => { build_tagged_value(EXPR_TAG_FIELD_ACC, vec![f.into(), Value::from(*v)].into()) } diff --git a/src/data/op_agg/collect.rs b/src/data/op_agg/collect.rs index 00d1714e..6e720b58 100644 --- a/src/data/op_agg/collect.rs +++ b/src/data/op_agg/collect.rs @@ -39,7 +39,7 @@ impl OpAggT for OpCollectIf { self.buffer.borrow_mut().clear(); } - fn initialize(&self, a_args: Vec) -> Result<()> { + fn initialize(&self, _a_args: Vec) -> Result<()> { Ok(()) } diff --git a/src/data/parser.rs b/src/data/parser.rs index 7626d3cd..5f0fc682 100644 --- a/src/data/parser.rs +++ b/src/data/parser.rs @@ -348,7 +348,7 @@ fn build_aggr_call(name: &str, a_args: Vec, args: Vec) -> Result(lhs: Result, op: Pair, rhs: Result) -> Result { +fn build_expr_infix(lhs: Result, op: Pair, rhs: Result) -> Result { let args = vec![lhs?, rhs?]; Ok(match op.as_rule() { Rule::op_add => Expr::BuiltinFn(OP_ADD, args), diff --git a/src/data/tuple.rs b/src/data/tuple.rs index 7275ab05..32ce52cb 100644 --- a/src/data/tuple.rs +++ b/src/data/tuple.rs @@ -190,6 +190,7 @@ impl> Tuple { } } + #[allow(dead_code)] #[inline] pub(crate) fn starts_with>(&self, other: &Tuple) -> bool { self.data.as_ref().starts_with(other.data.as_ref()) @@ -329,6 +330,7 @@ impl> Tuple { } } + #[allow(dead_code)] #[inline] pub(crate) fn get_null(&self, idx: usize) -> Result<()> { match self.get(idx)? { @@ -345,6 +347,7 @@ impl> Tuple { } } + #[allow(dead_code)] #[inline] pub(crate) fn get_text(&self, idx: usize) -> Result> { match self.get(idx)? { @@ -353,6 +356,7 @@ impl> Tuple { } } + #[allow(dead_code)] #[inline] pub(crate) fn get_bool(&self, idx: usize) -> Result { match self.get(idx)? { @@ -361,6 +365,7 @@ impl> Tuple { } } + #[allow(dead_code)] #[inline] pub(crate) fn get_float(&self, idx: usize) -> Result { match self.get(idx)? { @@ -369,6 +374,7 @@ impl> Tuple { } } + #[allow(dead_code)] #[inline] pub(crate) fn get_uuid(&self, idx: usize) -> Result { match self.get(idx)? { @@ -377,6 +383,7 @@ impl> Tuple { } } + #[allow(dead_code)] #[inline] pub(crate) fn get_list(&self, idx: usize) -> Result> { match self.get(idx)? { @@ -385,6 +392,7 @@ impl> Tuple { } } + #[allow(dead_code)] #[inline] pub(crate) fn get_dict(&self, idx: usize) -> Result, Value>> { match self.get(idx)? { @@ -723,12 +731,14 @@ impl OwnTuple { self.push_varint(u); } + #[allow(dead_code)] #[inline] pub(crate) fn concat_data>(&mut self, other: &Tuple) { let other_data_part = &other.as_ref()[4..]; self.data.extend_from_slice(other_data_part); } + #[allow(dead_code)] #[inline] pub(crate) fn insert_values_at<'a, T: AsRef<[Value<'a>]>>( &self, diff --git a/src/data/tuple_set.rs b/src/data/tuple_set.rs index 2e6675fb..bdf9eb14 100644 --- a/src/data/tuple_set.rs +++ b/src/data/tuple_set.rs @@ -68,6 +68,7 @@ impl Debug for TableId { } impl TableId { + #[allow(dead_code)] pub(crate) fn new(in_root: bool, id: u32) -> Result { if id <= MIN_TABLE_ID_BOUND { Err(TupleSetError::InvalidTableId(id).into()) @@ -75,6 +76,7 @@ impl TableId { Ok(TableId { in_root, id }) } } + #[allow(dead_code)] pub(crate) fn is_valid(&self) -> bool { self.id > MIN_TABLE_ID_BOUND } @@ -177,8 +179,8 @@ impl TupleSet { pub(crate) fn decode_from_tuple>(source: &Tuple) -> Result { let gen_err = || DecodeFailure(source.to_owned()); - let k_len = source.get(0)?.get_int().ok_or_else(gen_err)? as usize; - let v_len = source.get(1)?.get_int().ok_or_else(gen_err)? as usize; + let k_len = source.get_int(0)? as usize; + let v_len = source.get_int(1)? as usize; let mut ret = TupleSet { keys: Vec::with_capacity(k_len), vals: Vec::with_capacity(v_len), @@ -198,6 +200,7 @@ impl TupleSet { } impl TupleSet { + #[allow(dead_code)] pub(crate) fn last_key_is_empty(&self) -> bool { match self.keys.last() { None => false, @@ -216,6 +219,7 @@ impl TupleSet { self.keys.extend(o.keys); self.vals.extend(o.vals); } + #[allow(dead_code)] pub(crate) fn extend_keys(&mut self, keys: I) where I: IntoIterator, @@ -223,6 +227,7 @@ impl TupleSet { { self.keys.extend(keys.into_iter().map(ReifiedTuple::from)); } + #[allow(dead_code)] pub(crate) fn extend_vals(&mut self, keys: I) where I: IntoIterator, @@ -231,6 +236,7 @@ impl TupleSet { self.vals.extend(keys.into_iter().map(ReifiedTuple::from)); } + #[allow(dead_code)] pub(crate) fn all_keys_eq(&self, other: &Self) -> bool { if self.keys.len() != other.keys.len() { return false; @@ -253,6 +259,7 @@ impl TupleSet { } true } + #[allow(dead_code)] pub(crate) fn all_keys_cmp(&self, other: &Self) -> Ordering { for (l, r) in self.keys.iter().zip(&other.keys) { match l.key_part_cmp(r) { diff --git a/src/data/typing.rs b/src/data/typing.rs index 5776dc00..eca1d3dd 100644 --- a/src/data/typing.rs +++ b/src/data/typing.rs @@ -20,6 +20,7 @@ pub enum TypingError { UndefinedType(String), } +#[allow(dead_code)] #[derive(Ord, PartialOrd, Eq, PartialEq, Clone)] pub enum Typing { Any, @@ -73,6 +74,7 @@ impl Debug for Typing { } impl Typing { + #[allow(dead_code)] pub(crate) fn representative_value(&self) -> StaticValue { match self { Typing::Any => Value::Bottom, @@ -257,6 +259,7 @@ impl Typing { } impl<'a> Value<'a> { + #[allow(dead_code)] pub(crate) fn deduce_typing(&self) -> Typing { match self { Value::Null => Typing::Any, diff --git a/src/data/value.rs b/src/data/value.rs index fd94b1a0..cae3e85c 100644 --- a/src/data/value.rs +++ b/src/data/value.rs @@ -24,9 +24,11 @@ pub enum Value<'a> { } impl<'a> Value<'a> { + #[allow(dead_code)] pub(crate) fn is_null(&self) -> bool { *self == Value::Null } + #[allow(dead_code)] pub(crate) fn get_bool(&self) -> Option { match self { Value::Bool(b) => Some(*b), @@ -39,6 +41,7 @@ impl<'a> Value<'a> { _ => None, } } + #[allow(dead_code)] pub(crate) fn get_float(&self) -> Option { match self { Value::Float(b) => Some(b.into_inner()), @@ -75,6 +78,7 @@ impl<'a> Value<'a> { _ => None, } } + #[allow(dead_code)] pub(crate) fn into_map(self) -> Result, Value<'a>>, Value<'a>> { match self { Value::Dict(m) => Ok(m), diff --git a/src/ddl/reify.rs b/src/ddl/reify.rs index fd278723..cb3d5a8c 100644 --- a/src/ddl/reify.rs +++ b/src/ddl/reify.rs @@ -84,6 +84,7 @@ impl TableInfo { _ => Err(DdlReifyError::WrongDataKind(self.table_id()).into()), } } + #[allow(dead_code)] pub(crate) fn as_index(&self) -> Result<&IndexInfo> { match self { TableInfo::Index(n) => Ok(n), @@ -96,12 +97,14 @@ impl TableInfo { _ => Err(DdlReifyError::WrongDataKind(self.table_id()).into()), } } + #[allow(dead_code)] pub(crate) fn as_sequence(&self) -> Result<&SequenceInfo> { match self { TableInfo::Sequence(n) => Ok(n), _ => Err(DdlReifyError::WrongDataKind(self.table_id()).into()), } } + #[allow(dead_code)] pub(crate) fn into_sequence(self) -> Result { match self { TableInfo::Sequence(n) => Ok(n), diff --git a/src/runtime/session.rs b/src/runtime/session.rs index 58878205..ae8e8037 100644 --- a/src/runtime/session.rs +++ b/src/runtime/session.rs @@ -18,6 +18,7 @@ use std::collections::{BTreeMap, BTreeSet}; use std::sync::atomic::{AtomicU32, Ordering}; use std::sync::{Mutex, Arc}; +#[allow(dead_code)] pub(crate) enum Definable { Value(StaticValue), Expr(Expr), @@ -32,6 +33,7 @@ pub struct Session { pub(crate) temp: DbPtr, pub(crate) r_opts_main: ReadOptionsPtr, pub(crate) r_opts_temp: ReadOptionsPtr, + #[allow(dead_code)] pub(crate) w_opts_main: WriteOptionsPtr, pub(crate) w_opts_temp: WriteOptionsPtr, pub(crate) optimistic: bool, @@ -59,6 +61,7 @@ impl Session { pub(crate) fn push_env(&mut self) { self.stack.push(BTreeMap::new()); } + #[allow(dead_code)] pub(crate) fn pop_env(&mut self) { if !self.stack.is_empty() { let popped_frame = self.stack.pop().unwrap(); @@ -72,6 +75,7 @@ impl Session { self.push_env() } } + #[allow(dead_code)] fn undefine_temp_table(&mut self, id: u32) { // remove table self.tables.remove(&id);