use crate::{RuleAtom, Term};
use super::retenetwork_type::ReteNetwork;
impl ReteNetwork {
pub(super) fn pattern_key(&self, pattern: &RuleAtom) -> String {
match pattern {
RuleAtom::Triple {
subject,
predicate,
object,
} => {
format!(
"triple:{}:{}:{}",
self.term_key(subject),
self.term_key(predicate),
self.term_key(object)
)
}
RuleAtom::Builtin { name, args } => {
let arg_keys: Vec<String> = args.iter().map(|arg| self.term_key(arg)).collect();
format!("builtin:{}:{}", name, arg_keys.join(","))
}
RuleAtom::NotEqual { left, right } => {
format!("notequal:{}:{}", self.term_key(left), self.term_key(right))
}
RuleAtom::GreaterThan { left, right } => {
format!(
"greaterthan:{}:{}",
self.term_key(left),
self.term_key(right)
)
}
RuleAtom::LessThan { left, right } => {
format!("lessthan:{}:{}", self.term_key(left), self.term_key(right))
}
}
}
#[allow(clippy::only_used_in_recursion)]
pub(super) fn term_key(&self, term: &Term) -> String {
match term {
Term::Variable(v) => format!("?{v}"),
Term::Constant(c) => format!("c:{c}"),
Term::Literal(l) => format!("l:{l}"),
Term::Function { name, args } => {
let arg_keys: Vec<String> = args.iter().map(|arg| self.term_key(arg)).collect();
format!("f:{name}({})", arg_keys.join(","))
}
}
}
}