rdf_fusion_encoding/plain_term/
builder.rs

1use crate::plain_term::{PlainTermArray, PlainTermEncoding};
2use datafusion::arrow::array::{Array, StringArray, StructArray};
3use std::sync::Arc;
4
5/// Provides a convenient API for building a [PlainTermArray] from its components.
6pub struct PlainTermArrayBuilder {
7    term_types: Arc<dyn Array>,
8    values: Arc<dyn Array>,
9    data_types: Option<Arc<dyn Array>>,
10    language_tags: Option<Arc<dyn Array>>,
11}
12
13impl PlainTermArrayBuilder {
14    pub fn new(term_types: Arc<dyn Array>, values: Arc<dyn Array>) -> Self {
15        Self {
16            term_types,
17            values,
18            data_types: None,
19            language_tags: None,
20        }
21    }
22
23    pub fn with_data_types(mut self, data_types: Arc<dyn Array>) -> Self {
24        self.data_types = Some(data_types);
25        self
26    }
27
28    pub fn with_language_tags(mut self, language_tags: Arc<dyn Array>) -> Self {
29        self.language_tags = Some(language_tags);
30        self
31    }
32
33    pub fn finish(self) -> PlainTermArray {
34        let len = self.term_types.len();
35        let nulls = self.term_types.nulls().cloned();
36        let struct_array = StructArray::new(
37            PlainTermEncoding::fields(),
38            vec![
39                self.term_types,
40                self.values,
41                self.data_types
42                    .unwrap_or_else(|| Arc::new(StringArray::new_null(len))),
43                self.language_tags
44                    .unwrap_or_else(|| Arc::new(StringArray::new_null(len))),
45            ],
46            nulls,
47        );
48        PlainTermArray::new_unchecked(Arc::new(struct_array))
49    }
50}