diff --git a/query-algebrizer/src/clauses/resolve.rs b/query-algebrizer/src/clauses/resolve.rs index 9cf27807..b64ce9cd 100644 --- a/query-algebrizer/src/clauses/resolve.rs +++ b/query-algebrizer/src/clauses/resolve.rs @@ -50,7 +50,7 @@ impl ConjoiningClauses { }, // Can't be an entid. EntidOrInteger(i) => Ok(QueryValue::TypedValue(TypedValue::Long(i))), - Ident(_) | + IdentOrKeyword(_) | SrcVar(_) | Constant(NonIntegerConstant::Boolean(_)) | Constant(NonIntegerConstant::Text(_)) | @@ -78,7 +78,7 @@ impl ConjoiningClauses { .ok_or_else(|| Error::from_kind(ErrorKind::UnboundVariable(var.name()))) }, EntidOrInteger(i) => Ok(QueryValue::PrimitiveLong(i)), - Ident(_) => unimplemented!(), // TODO + IdentOrKeyword(_) => unimplemented!(), // TODO Constant(NonIntegerConstant::Boolean(val)) => Ok(QueryValue::TypedValue(TypedValue::Boolean(val))), Constant(NonIntegerConstant::Float(f)) => Ok(QueryValue::TypedValue(TypedValue::Double(f))), Constant(NonIntegerConstant::Text(s)) => Ok(QueryValue::TypedValue(TypedValue::typed_string(s.as_str()))), diff --git a/query/src/lib.rs b/query/src/lib.rs index f12144bb..bc4134a6 100644 --- a/query/src/lib.rs +++ b/query/src/lib.rs @@ -174,7 +174,11 @@ impl FromValue for SrcVar { impl SrcVar { pub fn from_symbol(sym: &PlainSymbol) -> Option { if sym.is_src_symbol() { - Some(SrcVar::NamedSrc(sym.plain_name().to_string())) + if sym.0 == "$" { + Some(SrcVar::DefaultSrc) + } else { + Some(SrcVar::NamedSrc(sym.plain_name().to_string())) + } } else { None } @@ -210,22 +214,44 @@ pub enum FnArg { Variable(Variable), SrcVar(SrcVar), EntidOrInteger(i64), - Ident(NamespacedKeyword), + IdentOrKeyword(NamespacedKeyword), Constant(NonIntegerConstant), } impl FromValue for FnArg { fn from_value(v: &edn::ValueAndSpan) -> Option { - // TODO: support SrcVars. - Variable::from_value(v) - .and_then(|v| Some(FnArg::Variable(v))) - .or_else(|| { - println!("from_value {}", v.inner); - match v.inner { - edn::SpannedValue::Integer(i) => Some(FnArg::EntidOrInteger(i)), - edn::SpannedValue::Float(f) => Some(FnArg::Constant(NonIntegerConstant::Float(f))), - _ => unimplemented!(), - }}) + use edn::SpannedValue::*; + match v.inner { + Integer(x) => + Some(FnArg::EntidOrInteger(x)), + PlainSymbol(ref x) if x.is_src_symbol() => + SrcVar::from_symbol(x).map(FnArg::SrcVar), + PlainSymbol(ref x) if x.is_var_symbol() => + Variable::from_symbol(x).map(FnArg::Variable), + PlainSymbol(_) => None, + NamespacedKeyword(ref x) => + Some(FnArg::IdentOrKeyword(x.clone())), + Instant(x) => + Some(FnArg::Constant(NonIntegerConstant::Instant(x))), + Uuid(x) => + Some(FnArg::Constant(NonIntegerConstant::Uuid(x))), + Boolean(x) => + Some(FnArg::Constant(NonIntegerConstant::Boolean(x))), + Float(x) => + Some(FnArg::Constant(NonIntegerConstant::Float(x))), + BigInteger(ref x) => + Some(FnArg::Constant(NonIntegerConstant::BigInteger(x.clone()))), + Text(ref x) => + // TODO: intern strings. #398. + Some(FnArg::Constant(NonIntegerConstant::Text(Rc::new(x.clone())))), + Nil | + NamespacedSymbol(_) | + Keyword(_) | + Vector(_) | + List(_) | + Set(_) | + Map(_) => None, + } } }