rdf_fusion_encoding/plain_term/
scalar.rs1use crate::encoding::EncodingScalar;
2use crate::plain_term::decoders::{
3 DefaultPlainTermDecoder, GraphNameRefPlainTermDecoder,
4};
5use crate::plain_term::encoders::DefaultPlainTermEncoder;
6use crate::plain_term::{PLAIN_TERM_ENCODING, PlainTermEncoding};
7use crate::{TermDecoder, TermEncoder};
8use datafusion::common::{DataFusionError, ScalarValue, exec_err};
9use rdf_fusion_model::DFResult;
10use rdf_fusion_model::{
11 BlankNodeRef, GraphNameRef, LiteralRef, NamedNodeRef, NamedOrBlankNodeRef, Term,
12 TermRef, ThinError, ThinResult,
13};
14
15#[derive(Clone)]
17pub struct PlainTermScalar {
18 inner: ScalarValue,
19}
20
21impl PlainTermScalar {
22 pub fn try_new(value: ScalarValue) -> DFResult<Self> {
28 if value.data_type() != PlainTermEncoding::data_type() {
29 return exec_err!(
30 "Expected scalar value with PlainTermEncoding, got {:?}",
31 value
32 );
33 }
34 Ok(Self::new_unchecked(value))
35 }
36
37 pub fn from_graph_name(graph_name: GraphNameRef<'_>) -> DFResult<Self> {
39 match graph_name {
40 GraphNameRef::NamedNode(nn) => Ok(Self::from(nn)),
41 GraphNameRef::BlankNode(bnode) => Ok(Self::from(bnode)),
42 GraphNameRef::DefaultGraph => {
43 DefaultPlainTermEncoder::encode_term(ThinError::expected())
44 }
45 }
46 }
47
48 pub fn new_unchecked(inner: ScalarValue) -> Self {
50 Self { inner }
51 }
52}
53
54impl EncodingScalar for PlainTermScalar {
55 type Encoding = PlainTermEncoding;
56
57 fn encoding(&self) -> &Self::Encoding {
58 &PLAIN_TERM_ENCODING
59 }
60
61 fn scalar_value(&self) -> &ScalarValue {
62 &self.inner
63 }
64
65 fn into_scalar_value(self) -> ScalarValue {
66 self.inner
67 }
68}
69
70impl TryFrom<ScalarValue> for PlainTermScalar {
71 type Error = DataFusionError;
72
73 fn try_from(value: ScalarValue) -> Result<Self, Self::Error> {
74 Self::try_new(value)
75 }
76}
77
78impl From<TermRef<'_>> for PlainTermScalar {
79 fn from(term: TermRef<'_>) -> Self {
80 DefaultPlainTermEncoder::encode_term(Ok(term)).expect("Always Ok given")
81 }
82}
83
84impl From<NamedNodeRef<'_>> for PlainTermScalar {
85 fn from(term: NamedNodeRef<'_>) -> Self {
86 Self::from(TermRef::NamedNode(term))
87 }
88}
89
90impl From<BlankNodeRef<'_>> for PlainTermScalar {
91 fn from(term: BlankNodeRef<'_>) -> Self {
92 Self::from(TermRef::BlankNode(term))
93 }
94}
95
96impl From<NamedOrBlankNodeRef<'_>> for PlainTermScalar {
97 fn from(term: NamedOrBlankNodeRef<'_>) -> Self {
98 Self::from(TermRef::from(term))
99 }
100}
101
102impl From<LiteralRef<'_>> for PlainTermScalar {
103 fn from(term: LiteralRef<'_>) -> Self {
104 Self::from(TermRef::Literal(term))
105 }
106}
107
108impl From<Term> for PlainTermScalar {
109 fn from(term: Term) -> Self {
110 Self::from(term.as_ref())
111 }
112}
113
114impl<'a> From<&'a PlainTermScalar> for GraphNameRef<'a> {
115 fn from(value: &'a PlainTermScalar) -> Self {
116 GraphNameRefPlainTermDecoder::decode_term(value)
117 .expect("GraphName is always some")
118 }
119}
120
121impl<'a> From<&'a PlainTermScalar> for ThinResult<TermRef<'a>> {
122 fn from(value: &'a PlainTermScalar) -> Self {
123 DefaultPlainTermDecoder::decode_term(value)
124 }
125}