rdf_fusion_encoding/plain_term/
array.rs

1use crate::TermEncoding;
2use crate::encoding::EncodingArray;
3use crate::plain_term::{PLAIN_TERM_ENCODING, PlainTermEncoding, PlainTermEncodingField};
4use datafusion::arrow::array::{
5    Array, ArrayRef, AsArray, StringArray, StructArray, UInt8Array,
6};
7use datafusion::common::exec_err;
8use datafusion::error::DataFusionError;
9
10/// Represents an Arrow array with a [PlainTermEncoding].
11#[derive(Clone)]
12pub struct PlainTermArray {
13    inner: ArrayRef,
14}
15
16/// Holds the parts of a [PlainTermArray].
17pub struct PlainTermArrayParts<'array> {
18    pub struct_array: &'array StructArray,
19    pub term_type: &'array UInt8Array,
20    pub value: &'array StringArray,
21    pub data_type: &'array StringArray,
22    pub language_tag: &'array StringArray,
23}
24
25impl PlainTermArray {
26    /// Creates a new [PlainTermArray] without validating the schema.
27    pub(super) fn new_unchecked(inner: ArrayRef) -> Self {
28        Self { inner }
29    }
30
31    /// Returns a [PlainTermArrayParts] that holds references to the inner arrays.
32    pub fn as_parts(&self) -> PlainTermArrayParts<'_> {
33        let struct_array = self.inner.as_struct();
34        PlainTermArrayParts {
35            struct_array,
36            term_type: struct_array
37                .column(PlainTermEncodingField::TermType.index())
38                .as_primitive(),
39            value: struct_array
40                .column(PlainTermEncodingField::Value.index())
41                .as_string(),
42            data_type: struct_array
43                .column(PlainTermEncodingField::DataType.index())
44                .as_string(),
45            language_tag: struct_array
46                .column(PlainTermEncodingField::LanguageTag.index())
47                .as_string(),
48        }
49    }
50}
51
52impl EncodingArray for PlainTermArray {
53    type Encoding = PlainTermEncoding;
54
55    fn encoding(&self) -> &Self::Encoding {
56        &PLAIN_TERM_ENCODING
57    }
58
59    fn array(&self) -> &ArrayRef {
60        &self.inner
61    }
62
63    fn into_array(self) -> ArrayRef {
64        self.inner
65    }
66}
67
68impl TryFrom<ArrayRef> for PlainTermArray {
69    type Error = DataFusionError;
70
71    fn try_from(value: ArrayRef) -> Result<Self, Self::Error> {
72        if value.data_type() != &PLAIN_TERM_ENCODING.data_type() {
73            return exec_err!(
74                "Expected array with PlainTermEncoding, got: {}",
75                value.data_type()
76            );
77        }
78        Ok(Self { inner: value })
79    }
80}