Following the schema change, Value -> Term

This commit is contained in:
Cyber MacGeddon 2026-01-26 22:50:20 +00:00
parent 1c408a882f
commit b298bda2ce

View file

@ -1,37 +1,133 @@
from typing import Dict, Any, List from typing import Dict, Any, List
from ...schema import Value, Triple, RowSchema, Field from ...schema import Term, Triple, RowSchema, Field, IRI, BLANK, LITERAL, TRIPLE
from .base import Translator from .base import Translator
class ValueTranslator(Translator): class TermTranslator(Translator):
"""Translator for Value schema objects""" """
Translator for Term schema objects.
def to_pulsar(self, data: Dict[str, Any]) -> Value: Wire format (compact keys):
return Value(value=data["v"], is_uri=data["e"]) - "t": type (i/b/l/t)
- "i": iri (for IRI type)
- "d": id (for BLANK type)
- "v": value (for LITERAL type)
- "dt": datatype (for LITERAL type)
- "ln": language (for LITERAL type)
- "tr": triple (for TRIPLE type, nested)
"""
def from_pulsar(self, obj: Value) -> Dict[str, Any]: def to_pulsar(self, data: Dict[str, Any]) -> Term:
return {"v": obj.value, "e": obj.is_uri} term_type = data.get("t", "")
if term_type == IRI:
return Term(type=IRI, iri=data.get("i", ""))
elif term_type == BLANK:
return Term(type=BLANK, id=data.get("d", ""))
elif term_type == LITERAL:
return Term(
type=LITERAL,
value=data.get("v", ""),
datatype=data.get("dt", ""),
language=data.get("ln", ""),
)
elif term_type == TRIPLE:
# Nested triple - use TripleTranslator
triple_data = data.get("tr")
if triple_data:
triple = _triple_translator_to_pulsar(triple_data)
else:
triple = None
return Term(type=TRIPLE, triple=triple)
else:
# Unknown or empty type
return Term(type=term_type)
def from_pulsar(self, obj: Term) -> Dict[str, Any]:
result: Dict[str, Any] = {"t": obj.type}
if obj.type == IRI:
result["i"] = obj.iri
elif obj.type == BLANK:
result["d"] = obj.id
elif obj.type == LITERAL:
result["v"] = obj.value
if obj.datatype:
result["dt"] = obj.datatype
if obj.language:
result["ln"] = obj.language
elif obj.type == TRIPLE:
if obj.triple:
result["tr"] = _triple_translator_from_pulsar(obj.triple)
return result
# Module-level helper functions to avoid circular instantiation
def _triple_translator_to_pulsar(data: Dict[str, Any]) -> Triple:
term_translator = TermTranslator()
return Triple(
s=term_translator.to_pulsar(data["s"]) if data.get("s") else None,
p=term_translator.to_pulsar(data["p"]) if data.get("p") else None,
o=term_translator.to_pulsar(data["o"]) if data.get("o") else None,
g=data.get("g"),
)
def _triple_translator_from_pulsar(obj: Triple) -> Dict[str, Any]:
term_translator = TermTranslator()
result: Dict[str, Any] = {}
if obj.s:
result["s"] = term_translator.from_pulsar(obj.s)
if obj.p:
result["p"] = term_translator.from_pulsar(obj.p)
if obj.o:
result["o"] = term_translator.from_pulsar(obj.o)
if obj.g:
result["g"] = obj.g
return result
class TripleTranslator(Translator): class TripleTranslator(Translator):
"""Translator for Triple schema objects""" """Translator for Triple schema objects (quads with optional graph)"""
def __init__(self): def __init__(self):
self.value_translator = ValueTranslator() self.term_translator = TermTranslator()
def to_pulsar(self, data: Dict[str, Any]) -> Triple: def to_pulsar(self, data: Dict[str, Any]) -> Triple:
return Triple( return Triple(
s=self.value_translator.to_pulsar(data["s"]), s=self.term_translator.to_pulsar(data["s"]) if data.get("s") else None,
p=self.value_translator.to_pulsar(data["p"]), p=self.term_translator.to_pulsar(data["p"]) if data.get("p") else None,
o=self.value_translator.to_pulsar(data["o"]) o=self.term_translator.to_pulsar(data["o"]) if data.get("o") else None,
g=data.get("g"),
) )
def from_pulsar(self, obj: Triple) -> Dict[str, Any]: def from_pulsar(self, obj: Triple) -> Dict[str, Any]:
return { result: Dict[str, Any] = {}
"s": self.value_translator.from_pulsar(obj.s),
"p": self.value_translator.from_pulsar(obj.p), if obj.s:
"o": self.value_translator.from_pulsar(obj.o) result["s"] = self.term_translator.from_pulsar(obj.s)
} if obj.p:
result["p"] = self.term_translator.from_pulsar(obj.p)
if obj.o:
result["o"] = self.term_translator.from_pulsar(obj.o)
if obj.g:
result["g"] = obj.g
return result
# Backward compatibility alias
ValueTranslator = TermTranslator
class SubgraphTranslator(Translator): class SubgraphTranslator(Translator):