-
Notifications
You must be signed in to change notification settings - Fork 1.8k
feat(logical-types): add NativeType and LogicalType #12853
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
3827974
17a70d8
3dba963
4217970
01f0089
5b5f4c1
88e1b3c
ab16a2d
0b2ed2d
6150ea9
7ed7891
bdd0155
056a8f1
117f23b
e0923e2
f1ff963
7942f91
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -15,11 +15,12 @@ | |
| // specific language governing permissions and limitations | ||
| // under the License. | ||
|
|
||
| use super::NativeType; | ||
| use crate::error::Result; | ||
| use arrow_schema::DataType; | ||
| use core::fmt; | ||
| use std::{cmp::Ordering, hash::Hash, sync::Arc}; | ||
|
|
||
| use super::NativeType; | ||
|
|
||
| /// Signature that uniquely identifies a type among other types. | ||
| #[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)] | ||
| pub enum TypeSignature<'a> { | ||
|
|
@@ -75,8 +76,17 @@ pub type LogicalTypeRef = Arc<dyn LogicalType>; | |
| /// } | ||
| /// ``` | ||
| pub trait LogicalType: Sync + Send { | ||
| /// Get the native backing type of this logical type. | ||
| fn native(&self) -> &NativeType; | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I previously propose How can we do the equivalent check by the current design?
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Given say arrow Int64 data, i want to know whether these is numbers, timestamp, time, date or something else (eg user-defined enum). The fact that any of these hypothetical logical types could be stored as Int64 doesn't help me know. Asking logical type "could you please decode this arrow type?" doesn't help me know.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think the idea is that we have LogicalType already. In logical level, they are either LogicalNumber, LogicalTimestamp or LogicalDate, and we can differ them in logical level. They can also decode as i64, i32 in physical level. So asking logical type "could you please decode this arrow type?" is to tell the relationship between logical type and physical type. We don't need to know whether the arrow i64 is number or timestamp, because we already know that.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm not sure I can follow. @jayzhan211 -- can you write a small practical example? I want to make sure I understand the use case. Thanks :)
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
We can figure this out if we meet any practical usage.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. For any user defined logical type you still know the backing |
||
| /// Get the unique type signature for this logical type. Logical types with identical | ||
| /// signatures are considered equal. | ||
| fn signature(&self) -> TypeSignature<'_>; | ||
|
|
||
| /// Get the default physical type to cast `origin` to in order to obtain a physical type | ||
| /// that is logically compatible with this logical type. | ||
| fn default_cast_for(&self, origin: &DataType) -> Result<DataType> { | ||
| self.native().default_cast_for(origin) | ||
| } | ||
| } | ||
|
|
||
| impl fmt::Debug for dyn LogicalType { | ||
|
|
@@ -90,7 +100,7 @@ impl fmt::Debug for dyn LogicalType { | |
|
|
||
| impl PartialEq for dyn LogicalType { | ||
| fn eq(&self, other: &Self) -> bool { | ||
| self.native().eq(other.native()) && self.signature().eq(&other.signature()) | ||
| self.signature().eq(&other.signature()) | ||
| } | ||
| } | ||
|
|
||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.