rdf_fusion_encoding/plain_term/
scalar.rs

1use 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/// Represents an Arrow scalar with a [PlainTermEncoding].
16#[derive(Clone)]
17pub struct PlainTermScalar {
18    inner: ScalarValue,
19}
20
21impl PlainTermScalar {
22    /// Tries to create a new [PlainTermScalar] from a regular [ScalarValue].
23    ///
24    /// # Errors
25    ///
26    /// Returns an error if the data type of `value` is unexpected.
27    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    /// Creates a new [PlainTermScalar] from the given `graph_name`.
38    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    /// Creates a new [PlainTermScalar] without checking invariants.
49    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}