|
|
|
@ -1,17 +1,17 @@
|
|
|
|
|
use crate::data::eval::{EvalError, PartialEvalContext};
|
|
|
|
|
use crate::data::expr::{Expr, StaticExpr};
|
|
|
|
|
use crate::data::parser::{ExprParseError, parse_scoped_dict};
|
|
|
|
|
use crate::data::parser::{parse_scoped_dict, ExprParseError};
|
|
|
|
|
use crate::data::tuple::{DataKind, OwnTuple};
|
|
|
|
|
use crate::data::tuple_set::{BindingMap, BindingMapEvalContext, TableId, TupleSet, TupleSetIdx};
|
|
|
|
|
use crate::data::value::{StaticValue, Value};
|
|
|
|
|
use crate::ddl::reify::{AssocInfo, EdgeInfo, IndexInfo, TableInfo};
|
|
|
|
|
use crate::parser::{CozoParser, Pair, Pairs, Rule};
|
|
|
|
|
use crate::runtime::session::Definable;
|
|
|
|
|
use pest::error::Error;
|
|
|
|
|
use pest::Parser;
|
|
|
|
|
use std::collections::BTreeMap;
|
|
|
|
|
use std::result;
|
|
|
|
|
use std::sync::Arc;
|
|
|
|
|
use pest::error::Error;
|
|
|
|
|
use pest::Parser;
|
|
|
|
|
|
|
|
|
|
#[derive(thiserror::Error, Debug)]
|
|
|
|
|
pub(crate) enum AlgebraParseError {
|
|
|
|
@ -43,7 +43,7 @@ pub(crate) enum AlgebraParseError {
|
|
|
|
|
ValueError(StaticValue),
|
|
|
|
|
|
|
|
|
|
#[error("Parse error {0}")]
|
|
|
|
|
Parse(String)
|
|
|
|
|
Parse(String),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl From<pest::error::Error<Rule>> for AlgebraParseError {
|
|
|
|
@ -92,7 +92,7 @@ impl InterpretContext for () {
|
|
|
|
|
pub(crate) trait RelationalAlgebra {
|
|
|
|
|
fn name(&self) -> &str;
|
|
|
|
|
fn binding_map(&self) -> &BindingMap;
|
|
|
|
|
fn iter<'a>(&'a self) -> Box<dyn Iterator<Item=TupleSet> + 'a>;
|
|
|
|
|
fn iter<'a>(&'a self) -> Box<dyn Iterator<Item = TupleSet> + 'a>;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const NAME_RA_FROM_VALUES: &str = "Values";
|
|
|
|
@ -192,7 +192,7 @@ impl RelationalAlgebra for RaFromValues {
|
|
|
|
|
&self.binding
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn iter<'a>(&'a self) -> Box<dyn Iterator<Item=TupleSet> + 'a> {
|
|
|
|
|
fn iter<'a>(&'a self) -> Box<dyn Iterator<Item = TupleSet> + 'a> {
|
|
|
|
|
let it = self.values.iter().map(|vs| {
|
|
|
|
|
let mut tuple = OwnTuple::with_data_prefix(DataKind::Data);
|
|
|
|
|
for v in vs {
|
|
|
|
@ -212,7 +212,7 @@ struct RaInsert {
|
|
|
|
|
source: Box<dyn RelationalAlgebra>,
|
|
|
|
|
target: TableInfo,
|
|
|
|
|
binding_map: BindingMap,
|
|
|
|
|
conversion_map: BTreeMap<String, StaticExpr>
|
|
|
|
|
conversion_map: BTreeMap<String, StaticExpr>,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl RaInsert {
|
|
|
|
@ -221,23 +221,36 @@ impl RaInsert {
|
|
|
|
|
prev: Option<Arc<dyn RelationalAlgebra>>,
|
|
|
|
|
mut args: Pairs,
|
|
|
|
|
) -> Result<Self> {
|
|
|
|
|
let not_enough_args =
|
|
|
|
|
|| AlgebraParseError::NotEnoughArguments(NAME_RA_INSERT.to_string());
|
|
|
|
|
let not_enough_args = || AlgebraParseError::NotEnoughArguments(NAME_RA_INSERT.to_string());
|
|
|
|
|
let source = match prev {
|
|
|
|
|
Some(v) => v,
|
|
|
|
|
None => build_ra_expr(ctx, args.next().ok_or_else(not_enough_args)?)?
|
|
|
|
|
None => build_ra_expr(ctx, args.next().ok_or_else(not_enough_args)?)?,
|
|
|
|
|
};
|
|
|
|
|
let table_name = args.next().ok_or_else(not_enough_args)?;
|
|
|
|
|
let table_name = CozoParser::parse(Rule::ident_all, table_name.as_str())?.next().unwrap().as_str();
|
|
|
|
|
let pair = args.next().ok_or_else(not_enough_args)?.into_inner().next().unwrap();
|
|
|
|
|
let table_name = CozoParser::parse(Rule::ident_all, table_name.as_str())?
|
|
|
|
|
.next()
|
|
|
|
|
.unwrap()
|
|
|
|
|
.as_str();
|
|
|
|
|
let pair = args
|
|
|
|
|
.next()
|
|
|
|
|
.ok_or_else(not_enough_args)?
|
|
|
|
|
.into_inner()
|
|
|
|
|
.next()
|
|
|
|
|
.unwrap();
|
|
|
|
|
assert_rule(&pair, Rule::scoped_dict, NAME_RA_INSERT, 2)?;
|
|
|
|
|
let (binding, keys, vals) = parse_scoped_dict(pair)?;
|
|
|
|
|
let source_map = source.binding_map();
|
|
|
|
|
let binding_ctx = BindingMapEvalContext { map: source_map, parent: ctx };
|
|
|
|
|
let keys = keys.into_iter().map(|(k, v)| -> Result<(String, Expr)> {
|
|
|
|
|
let v = v.partial_eval(&binding_ctx)?;
|
|
|
|
|
Ok((k, v))
|
|
|
|
|
}).collect::<Result<BTreeMap<_, _>>>()?;
|
|
|
|
|
let binding_ctx = BindingMapEvalContext {
|
|
|
|
|
map: source_map,
|
|
|
|
|
parent: ctx,
|
|
|
|
|
};
|
|
|
|
|
let keys = keys
|
|
|
|
|
.into_iter()
|
|
|
|
|
.map(|(k, v)| -> Result<(String, Expr)> {
|
|
|
|
|
let v = v.partial_eval(&binding_ctx)?;
|
|
|
|
|
Ok((k, v))
|
|
|
|
|
})
|
|
|
|
|
.collect::<Result<BTreeMap<_, _>>>()?;
|
|
|
|
|
dbg!(&vals);
|
|
|
|
|
let vals = vals.partial_eval(&binding_ctx)?;
|
|
|
|
|
dbg!(&vals, &binding, &keys, &table_name);
|
|
|
|
@ -254,7 +267,7 @@ impl RelationalAlgebra for RaInsert {
|
|
|
|
|
&self.binding_map
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn iter<'a>(&'a self) -> Box<dyn Iterator<Item=TupleSet> + 'a> {
|
|
|
|
|
fn iter<'a>(&'a self) -> Box<dyn Iterator<Item = TupleSet> + 'a> {
|
|
|
|
|
self.source.iter()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -267,9 +280,7 @@ pub(crate) fn build_ra_expr(
|
|
|
|
|
for pair in pair.into_inner() {
|
|
|
|
|
let mut pairs = pair.into_inner();
|
|
|
|
|
match pairs.next().unwrap().as_str() {
|
|
|
|
|
NAME_RA_INSERT => {
|
|
|
|
|
built = Some(Arc::new(RaInsert::build(ctx, built, pairs)?))
|
|
|
|
|
},
|
|
|
|
|
NAME_RA_INSERT => built = Some(Arc::new(RaInsert::build(ctx, built, pairs)?)),
|
|
|
|
|
NAME_RA_FROM_VALUES => {
|
|
|
|
|
built = Some(Arc::new(RaFromValues::build(ctx, built, pairs)?));
|
|
|
|
|
}
|
|
|
|
|