Skip to main content

arrow_flight/sql/metadata/
mod.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: See the NOTICE file distributed with this work for additional information regarding copyright ownership
3// SPDX-FileContributor: Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements
4
5//! Builders and function for building responses to FlightSQL metadata
6//! / information schema requests.
7//!
8//! - [`GetCatalogsBuilder`] for building responses to [`CommandGetCatalogs`] queries.
9//! - [`GetDbSchemasBuilder`] for building responses to [`CommandGetDbSchemas`] queries.
10//! - [`GetTablesBuilder`] for building responses to [`CommandGetTables`] queries.
11//! - [`GetTableTypesBuilder`] for building responses to [`CommandGetTableTypes`] queries.
12//! - [`SqlInfoDataBuilder`] for building responses to [`CommandGetSqlInfo`] queries.
13//! - [`XdbcTypeInfoDataBuilder`] for building responses to [`CommandGetXdbcTypeInfo`] queries.
14//!
15//! [`CommandGetCatalogs`]: crate::sql::CommandGetCatalogs
16//! [`CommandGetDbSchemas`]: crate::sql::CommandGetDbSchemas
17//! [`CommandGetTables`]: crate::sql::CommandGetTables
18//! [`CommandGetTableTypes`]: crate::sql::CommandGetTableTypes
19//! [`CommandGetSqlInfo`]: crate::sql::CommandGetSqlInfo
20//! [`CommandGetXdbcTypeInfo`]: crate::sql::CommandGetXdbcTypeInfo
21
22mod catalogs;
23mod db_schemas;
24mod sql_info;
25mod table_types;
26mod tables;
27mod xdbc_info;
28
29pub use catalogs::GetCatalogsBuilder;
30pub use db_schemas::GetDbSchemasBuilder;
31pub use sql_info::{GetSqlInfoBuilder, SqlInfoData, SqlInfoDataBuilder};
32pub use table_types::GetTableTypesBuilder;
33pub use tables::GetTablesBuilder;
34pub use xdbc_info::{
35    GetXdbcTypeInfoBuilder, XdbcTypeInfo, XdbcTypeInfoData, XdbcTypeInfoDataBuilder,
36};
37
38use arrow_array::ArrayRef;
39use arrow_array::UInt32Array;
40use arrow_row::RowConverter;
41use arrow_row::SortField;
42
43/// Helper function to sort all the columns in an array
44fn lexsort_to_indices(arrays: &[ArrayRef]) -> UInt32Array {
45    let fields = arrays
46        .iter()
47        .map(|a| SortField::new(a.data_type().clone()))
48        .collect();
49    let converter = RowConverter::new(fields).unwrap();
50    let rows = converter.convert_columns(arrays).unwrap();
51    let mut sort: Vec<_> = rows.iter().enumerate().collect();
52    sort.sort_unstable_by_key(|(_, a)| *a);
53    UInt32Array::from_iter_values(sort.iter().map(|(i, _)| *i as u32))
54}
55
56#[cfg(test)]
57mod tests {
58    use arrow_array::RecordBatch;
59    use arrow_cast::pretty::pretty_format_batches;
60    pub fn assert_batches_eq(batches: &[RecordBatch], expected_lines: &[&str]) {
61        let formatted = pretty_format_batches(batches).unwrap().to_string();
62        let actual_lines: Vec<_> = formatted.trim().lines().collect();
63        assert_eq!(
64            &actual_lines, expected_lines,
65            "\n\nexpected:\n\n{expected_lines:#?}\nactual:\n\n{actual_lines:#?}\n\n",
66        );
67    }
68}