forked from apache/datafusion
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlib.rs
More file actions
198 lines (182 loc) · 6.92 KB
/
Copy pathlib.rs
File metadata and controls
198 lines (182 loc) · 6.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
#![doc(
html_logo_url = "https://raw.githubusercontent.com/apache/datafusion/19fe44cf2f30cbdd63d4a4f52c74055163c6cc38/docs/logos/standalone_logo/logo_original.svg",
html_favicon_url = "https://raw.githubusercontent.com/apache/datafusion/19fe44cf2f30cbdd63d4a4f52c74055163c6cc38/docs/logos/standalone_logo/logo_original.svg"
)]
#![cfg_attr(docsrs, feature(doc_cfg))]
// Make sure fast / cheap clones on Arc are explicit:
// https://github.com/apache/datafusion/issues/11143
#![deny(clippy::clone_on_ref_ptr)]
mod column;
mod dfschema;
mod functional_dependencies;
mod join_type;
mod param_value;
#[cfg(feature = "pyarrow")]
mod pyarrow;
mod schema_reference;
mod table_reference;
mod unnest;
pub mod alias;
pub mod cast;
pub mod config;
pub mod cse;
pub mod diagnostic;
pub mod display;
pub mod encryption;
pub mod error;
pub mod file_options;
pub mod format;
pub mod hash_utils;
pub mod instant;
pub mod nested_struct;
mod null_equality;
pub mod parsers;
pub mod pruning;
pub mod rounding;
pub mod scalar;
pub mod spans;
pub mod stats;
pub mod test_util;
pub mod tree_node;
pub mod types;
pub mod utils;
/// Reexport arrow crate
pub use arrow;
pub use column::Column;
pub use dfschema::{
qualified_name, DFSchema, DFSchemaRef, ExprSchema, SchemaExt, ToDFSchema,
};
pub use diagnostic::Diagnostic;
pub use error::{
field_not_found, unqualified_field_not_found, DataFusionError, Result, SchemaError,
SharedResult,
};
pub use file_options::file_type::{
GetExt, DEFAULT_ARROW_EXTENSION, DEFAULT_AVRO_EXTENSION, DEFAULT_CSV_EXTENSION,
DEFAULT_JSON_EXTENSION, DEFAULT_PARQUET_EXTENSION,
};
pub use functional_dependencies::{
aggregate_functional_dependencies, get_required_group_by_exprs_indices,
get_target_functional_dependencies, Constraint, Constraints, Dependency,
FunctionalDependence, FunctionalDependencies,
};
use hashbrown::hash_map::DefaultHashBuilder;
pub use join_type::{JoinConstraint, JoinSide, JoinType};
pub use null_equality::NullEquality;
pub use param_value::ParamValues;
pub use scalar::{ScalarType, ScalarValue};
pub use schema_reference::SchemaReference;
pub use spans::{Location, Span, Spans};
pub use stats::{ColumnStatistics, Statistics};
pub use table_reference::{ResolvedTableReference, TableReference};
pub use unnest::{RecursionUnnestOption, UnnestOptions};
pub use utils::project_schema;
// These are hidden from docs purely to avoid polluting the public view of what this crate exports.
// These are just re-exports of macros by the same name, which gets around the 'cannot refer to
// macro-expanded macro_export macros by their full path' error.
// The design to get around this comes from this comment:
// https://github.com/rust-lang/rust/pull/52234#issuecomment-976702997
#[doc(hidden)]
pub use error::{
_config_datafusion_err, _exec_datafusion_err, _internal_datafusion_err,
_not_impl_datafusion_err, _plan_datafusion_err, _resources_datafusion_err,
_substrait_datafusion_err,
};
// The HashMap and HashSet implementations that should be used as the uniform defaults
pub type HashMap<K, V, S = DefaultHashBuilder> = hashbrown::HashMap<K, V, S>;
pub type HashSet<T, S = DefaultHashBuilder> = hashbrown::HashSet<T, S>;
/// Downcast an Arrow Array to a concrete type, return an `DataFusionError::Internal` if the cast is
/// not possible. In normal usage of DataFusion the downcast should always succeed.
///
/// Example: `let array = downcast_value!(values, Int32Array)`
#[macro_export]
macro_rules! downcast_value {
($Value: expr, $Type: ident) => {{
use $crate::__private::DowncastArrayHelper;
$Value.downcast_array_helper::<$Type>()?
}};
($Value: expr, $Type: ident, $T: tt) => {{
use $crate::__private::DowncastArrayHelper;
$Value.downcast_array_helper::<$Type<$T>>()?
}};
}
// Not public API.
#[doc(hidden)]
pub mod __private {
use crate::error::_internal_datafusion_err;
use crate::Result;
use arrow::array::Array;
use std::any::{type_name, Any};
#[doc(hidden)]
pub trait DowncastArrayHelper {
fn downcast_array_helper<U: Any>(&self) -> Result<&U>;
}
impl<T: Array + ?Sized> DowncastArrayHelper for T {
fn downcast_array_helper<U: Any>(&self) -> Result<&U> {
self.as_any().downcast_ref().ok_or_else(|| {
let actual_type = self.data_type();
let desired_type_name = type_name::<U>();
_internal_datafusion_err!(
"could not cast array of type {} to {}",
actual_type,
desired_type_name
)
})
}
}
}
#[cfg(test)]
mod tests {
use arrow::array::{ArrayRef, Int32Array, UInt64Array};
use std::any::{type_name, type_name_of_val};
use std::sync::Arc;
#[test]
fn test_downcast_value() -> crate::Result<()> {
let boxed: ArrayRef = Arc::new(Int32Array::from(vec![1, 2, 3]));
let array = downcast_value!(&boxed, Int32Array);
assert_eq!(type_name_of_val(&array), type_name::<&Int32Array>());
let expected: Int32Array = vec![1, 2, 3].into_iter().map(Some).collect();
assert_eq!(array, &expected);
Ok(())
}
#[test]
fn test_downcast_value_err_message() {
let boxed: ArrayRef = Arc::new(Int32Array::from(vec![1, 2, 3]));
let error: crate::DataFusionError = (|| {
downcast_value!(&boxed, UInt64Array);
Ok(())
})()
.err()
.unwrap();
assert_starts_with(
error.to_string(),
"Internal error: could not cast array of type Int32 to arrow_array::array::primitive_array::PrimitiveArray<arrow_array::types::UInt64Type>"
);
}
// `err.to_string()` depends on backtrace being present (may have backtrace appended)
// `err.strip_backtrace()` also depends on backtrace being present (may have "This was likely caused by ..." stripped)
fn assert_starts_with(actual: impl AsRef<str>, expected_prefix: impl AsRef<str>) {
let actual = actual.as_ref();
let expected_prefix = expected_prefix.as_ref();
assert!(
actual.starts_with(expected_prefix),
"Expected '{actual}' to start with '{expected_prefix}'"
);
}
}