///|
/// 物化 Quad(批量优化)
pub fn materialize_quad(
quad : QuadSpan,
// data : ArrayView[Byte],
) -> Result[QuadEmit, ParseError] {
// 物化
let subject = match materialize_subject(quad.subj, quad.subj_type) {
Ok(s) => s
Err(e) => return Err(e)
}
let predicate = match materialize_predicate(quad.pred) {
Ok(p) => p
Err(e) => return Err(e)
}
let object = match materialize_object(quad.obj, quad.obj_type) {
Ok(o) => o
Err(e) => return Err(e)
}
// 图名(可选)
let graph = match materialize_graph_name(quad.graph) {
Ok(g) => g
Err(e) => return Err(e)
}
Ok({ subject, predicate, object, graph })
}
///|
/// 批量物化(优化:减少函数调用开销)
pub fn materialize_all(
quads : Array[QuadSpan],
// data : ArrayView[Byte],
) -> (Array[QuadEmit], Array[ParseError]) {
let results = []
let errors = []
for quad in quads {
match materialize_quad(quad) {
Ok(q) => results.push(q)
Err(e) => errors.push(e)
}
}
(results, errors)
}
///|
fn materialize_subject(
subject : ArrayView[Byte],
t : TermType,
) -> Result[Subject, ParseError] {
match t {
TermType::Iri => Ok(Subject::Iri(subject))
TermType::BNode => Ok(Subject::BNode(subject))
TermType::PrefName =>
Err(ParseError::ValidationErr("N-Quads does not support prefixed names"))
TermType::Literal =>
Err(ParseError::ValidationErr("Subject cannot be literal"))
TermType::Unknown => Err(ParseError::ValidationErr("Invalid subject"))
}
}
///|
fn materialize_object(
object : ArrayView[Byte],
t : TermType,
) -> Result[Object, ParseError] {
match t {
TermType::Iri => Ok(Object::Iri(object))
TermType::BNode => Ok(Object::BNode(object))
TermType::Literal => Ok(Object::Literal(object))
TermType::PrefName =>
Err(ParseError::ValidationErr("N-Quads does not support prefixed names"))
TermType::Unknown => Err(ParseError::ValidationErr("Invalid object"))
}
}
///|
fn materialize_predicate(
predicate : ArrayView[Byte],
) -> Result[Predicate, ParseError] {
// 谓语必须是 IRI,这里只做基本验证
Ok(predicate)
}
///|
fn materialize_graph_name(
graph : ArrayView[Byte]?,
) -> Result[GraphName, ParseError] {
match graph {
Some(g) => Ok(GraphName::Iri(g))
None => Ok(GraphName::None)
}
}