rdf_fusion_encoding/plain_term/
array.rs1use 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#[derive(Clone)]
12pub struct PlainTermArray {
13 inner: ArrayRef,
14}
15
16pub 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 pub(super) fn new_unchecked(inner: ArrayRef) -> Self {
28 Self { inner }
29 }
30
31 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}