hdbconnect_arrow/schema/
mapping.rs

1//! HANA to Arrow schema mapping.
2//!
3//! Converts HANA `ResultSet` metadata to Arrow Schema.
4
5use std::sync::Arc;
6
7use arrow_schema::{Field, Schema, SchemaRef};
8
9/// Schema mapper for converting HANA metadata to Arrow schema.
10///
11/// Provides utilities for building Arrow schemas from HANA `ResultSet` metadata.
12///
13/// # Example
14///
15/// ```rust,ignore
16/// use hdbconnect_arrow::schema::SchemaMapper;
17///
18/// let schema = SchemaMapper::from_result_set(&result_set);
19/// let fields = schema.fields();
20/// ```
21#[derive(Debug, Clone, Default)]
22pub struct SchemaMapper;
23
24impl SchemaMapper {
25    /// Create a new schema mapper.
26    #[must_use]
27    pub const fn new() -> Self {
28        Self
29    }
30
31    /// Build an Arrow schema from HANA `ResultSet` metadata.
32    ///
33    /// # Arguments
34    ///
35    /// * `result_set` - The HANA `ResultSet` to extract metadata from
36    #[must_use]
37    pub fn from_result_set(result_set: &hdbconnect::ResultSet) -> Schema {
38        // ResultSetMetadata derefs to Vec<FieldMetadata>
39        let metadata = result_set.metadata();
40        let fields: Vec<Field> = metadata
41            .iter()
42            .map(super::super::types::arrow::FieldMetadataExt::to_arrow_field)
43            .collect();
44
45        Schema::new(fields)
46    }
47
48    /// Build an Arrow schema from a slice of HANA `FieldMetadata`.
49    ///
50    /// # Arguments
51    ///
52    /// * `metadata` - Slice of HANA field metadata
53    #[must_use]
54    pub fn from_field_metadata(metadata: &[hdbconnect::FieldMetadata]) -> Schema {
55        let fields: Vec<Field> = metadata
56            .iter()
57            .map(super::super::types::arrow::FieldMetadataExt::to_arrow_field)
58            .collect();
59
60        Schema::new(fields)
61    }
62
63    /// Build an Arrow `SchemaRef` from HANA `ResultSet` metadata.
64    ///
65    /// Returns an `Arc<Schema>` for efficient sharing.
66    #[must_use]
67    pub fn schema_ref_from_result_set(result_set: &hdbconnect::ResultSet) -> SchemaRef {
68        Arc::new(Self::from_result_set(result_set))
69    }
70
71    /// Build an Arrow `SchemaRef` from HANA field metadata.
72    ///
73    /// Returns an `Arc<Schema>` for efficient sharing.
74    #[must_use]
75    pub fn schema_ref_from_field_metadata(metadata: &[hdbconnect::FieldMetadata]) -> SchemaRef {
76        Arc::new(Self::from_field_metadata(metadata))
77    }
78}
79
80/// Extension trait for building Arrow Schema from HANA metadata.
81pub trait SchemaFromHana {
82    /// Build an Arrow schema from HANA field metadata.
83    fn from_hana_metadata(metadata: &[hdbconnect::FieldMetadata]) -> Schema;
84}
85
86impl SchemaFromHana for Schema {
87    fn from_hana_metadata(metadata: &[hdbconnect::FieldMetadata]) -> Schema {
88        SchemaMapper::from_field_metadata(metadata)
89    }
90}
91
92#[cfg(test)]
93mod tests {
94    use std::mem::size_of_val;
95
96    use super::*;
97
98    #[test]
99    fn test_schema_mapper_new() {
100        let mapper = SchemaMapper::new();
101        // Just verify it can be created
102        assert!(size_of_val(&mapper) == 0); // Zero-sized type
103    }
104
105    #[test]
106    fn test_schema_mapper_default() {
107        let mapper = SchemaMapper::default();
108        assert!(size_of_val(&mapper) == 0);
109    }
110}