From c55841988e15998df606f8490b4006e6ea16c514 Mon Sep 17 00:00:00 2001 From: discord9 <55937128+discord9@users.noreply.github.com> Date: Wed, 2 Aug 2023 21:08:43 +0800 Subject: [PATCH] feat: necessary `Hash` derive for types (#2075) * feat: necessary derive for types * impl (Partial)Ord for ConcreteDataType --- src/common/base/src/bytes.rs | 4 ++-- src/datatypes/src/data_type.rs | 2 +- src/datatypes/src/types/binary_type.rs | 2 +- src/datatypes/src/types/boolean_type.rs | 2 +- src/datatypes/src/types/date_type.rs | 2 +- src/datatypes/src/types/datetime_type.rs | 2 +- src/datatypes/src/types/dictionary_type.rs | 2 +- src/datatypes/src/types/interval_type.rs | 4 ++-- src/datatypes/src/types/list_type.rs | 2 +- src/datatypes/src/types/null_type.rs | 2 +- src/datatypes/src/types/primitive_type.rs | 4 +++- src/datatypes/src/types/string_type.rs | 2 +- src/datatypes/src/types/time_type.rs | 4 ++-- src/datatypes/src/types/timestamp_type.rs | 4 ++-- src/datatypes/src/value.rs | 4 ++-- 15 files changed, 22 insertions(+), 20 deletions(-) diff --git a/src/common/base/src/bytes.rs b/src/common/base/src/bytes.rs index 1bbf5b296e..7dff0a54b4 100644 --- a/src/common/base/src/bytes.rs +++ b/src/common/base/src/bytes.rs @@ -17,7 +17,7 @@ use std::ops::Deref; use serde::{Deserialize, Deserializer, Serialize, Serializer}; /// Bytes buffer. -#[derive(Debug, Default, Clone, PartialEq, Eq, PartialOrd, Ord, Deserialize, Serialize)] +#[derive(Debug, Default, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Deserialize, Serialize)] pub struct Bytes(bytes::Bytes); impl From for bytes::Bytes { @@ -80,7 +80,7 @@ impl PartialEq for [u8] { /// /// Now this buffer is restricted to only hold valid UTF-8 string (only allow constructing `StringBytes` /// from String or str). We may support other encoding in the future. -#[derive(Debug, Default, Clone, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Debug, Default, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)] pub struct StringBytes(bytes::Bytes); impl StringBytes { diff --git a/src/datatypes/src/data_type.rs b/src/datatypes/src/data_type.rs index 4d87c76412..c7cb67a7fa 100644 --- a/src/datatypes/src/data_type.rs +++ b/src/datatypes/src/data_type.rs @@ -35,7 +35,7 @@ use crate::types::{ use crate::value::Value; use crate::vectors::MutableVector; -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)] #[enum_dispatch::enum_dispatch(DataType)] pub enum ConcreteDataType { Null(NullType), diff --git a/src/datatypes/src/types/binary_type.rs b/src/datatypes/src/types/binary_type.rs index 1cd519ec82..27a9fa923f 100644 --- a/src/datatypes/src/types/binary_type.rs +++ b/src/datatypes/src/types/binary_type.rs @@ -24,7 +24,7 @@ use crate::type_id::LogicalTypeId; use crate::value::Value; use crate::vectors::{BinaryVectorBuilder, MutableVector}; -#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Default, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)] pub struct BinaryType; impl BinaryType { diff --git a/src/datatypes/src/types/boolean_type.rs b/src/datatypes/src/types/boolean_type.rs index 23896994f0..de1a06b611 100644 --- a/src/datatypes/src/types/boolean_type.rs +++ b/src/datatypes/src/types/boolean_type.rs @@ -23,7 +23,7 @@ use crate::type_id::LogicalTypeId; use crate::value::Value; use crate::vectors::{BooleanVectorBuilder, MutableVector}; -#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Default, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)] pub struct BooleanType; impl BooleanType { diff --git a/src/datatypes/src/types/date_type.rs b/src/datatypes/src/types/date_type.rs index 9be87096ba..01181e0c11 100644 --- a/src/datatypes/src/types/date_type.rs +++ b/src/datatypes/src/types/date_type.rs @@ -26,7 +26,7 @@ use crate::value::{Value, ValueRef}; use crate::vectors::{DateVector, DateVectorBuilder, MutableVector, Vector}; /// Data type for Date (YYYY-MM-DD). -#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Default, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)] pub struct DateType; impl DataType for DateType { diff --git a/src/datatypes/src/types/datetime_type.rs b/src/datatypes/src/types/datetime_type.rs index 8af826ab79..cf55de0ac8 100644 --- a/src/datatypes/src/types/datetime_type.rs +++ b/src/datatypes/src/types/datetime_type.rs @@ -24,7 +24,7 @@ use crate::types::LogicalPrimitiveType; use crate::vectors::{DateTimeVector, DateTimeVectorBuilder, PrimitiveVector}; /// Data type for [`DateTime`]. -#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Default, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)] pub struct DateTimeType; impl DataType for DateTimeType { diff --git a/src/datatypes/src/types/dictionary_type.rs b/src/datatypes/src/types/dictionary_type.rs index 89aed5e051..b8645c9d1e 100644 --- a/src/datatypes/src/types/dictionary_type.rs +++ b/src/datatypes/src/types/dictionary_type.rs @@ -21,7 +21,7 @@ use crate::value::Value; use crate::vectors::MutableVector; /// Used to represent the Dictionary datatype. -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)] pub struct DictionaryType { // Use Box to avoid recursive dependency, as enum ConcreteDataType depends on DictionaryType. /// The type of Dictionary key. diff --git a/src/datatypes/src/types/interval_type.rs b/src/datatypes/src/types/interval_type.rs index d9f105673b..584001d7f5 100644 --- a/src/datatypes/src/types/interval_type.rs +++ b/src/datatypes/src/types/interval_type.rs @@ -40,7 +40,7 @@ use crate::vectors::{ /// The "calendar" interval is a type of time interval that does not /// have a precise duration without taking into account a specific /// base timestamp. -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)] #[enum_dispatch(DataType)] pub enum IntervalType { YearMonth(IntervalYearMonthType), @@ -62,7 +62,7 @@ impl IntervalType { macro_rules! impl_data_type_for_interval { ($unit: ident, $type: ty) => { paste! { - #[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] + #[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)] pub struct []; impl DataType for [] { diff --git a/src/datatypes/src/types/list_type.rs b/src/datatypes/src/types/list_type.rs index eca3ff6c64..10806b9a8e 100644 --- a/src/datatypes/src/types/list_type.rs +++ b/src/datatypes/src/types/list_type.rs @@ -23,7 +23,7 @@ use crate::value::{ListValue, Value}; use crate::vectors::{ListVectorBuilder, MutableVector}; /// Used to represent the List datatype. -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)] pub struct ListType { /// The type of List's item. // Use Box to avoid recursive dependency, as enum ConcreteDataType depends on ListType. diff --git a/src/datatypes/src/types/null_type.rs b/src/datatypes/src/types/null_type.rs index f4bed2603c..7e7e29a1c3 100644 --- a/src/datatypes/src/types/null_type.rs +++ b/src/datatypes/src/types/null_type.rs @@ -22,7 +22,7 @@ use crate::type_id::LogicalTypeId; use crate::value::Value; use crate::vectors::{MutableVector, NullVectorBuilder}; -#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Default, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)] pub struct NullType; impl NullType { diff --git a/src/datatypes/src/types/primitive_type.rs b/src/datatypes/src/types/primitive_type.rs index d8526d8a13..0221f9a28f 100644 --- a/src/datatypes/src/types/primitive_type.rs +++ b/src/datatypes/src/types/primitive_type.rs @@ -194,7 +194,9 @@ macro_rules! define_logical_primitive_type { // We need to define it as an empty struct `struct DataType {}` instead of a struct-unit // `struct DataType;` to ensure the serialized JSON string is compatible with previous // implementation. - #[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] + #[derive( + Debug, Clone, Default, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize, + )] pub struct $DataType {} impl LogicalPrimitiveType for $DataType { diff --git a/src/datatypes/src/types/string_type.rs b/src/datatypes/src/types/string_type.rs index 4252d5f55f..9af4bf0af4 100644 --- a/src/datatypes/src/types/string_type.rs +++ b/src/datatypes/src/types/string_type.rs @@ -24,7 +24,7 @@ use crate::type_id::LogicalTypeId; use crate::value::Value; use crate::vectors::{MutableVector, StringVectorBuilder}; -#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Default, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)] pub struct StringType; impl StringType { diff --git a/src/datatypes/src/types/time_type.rs b/src/datatypes/src/types/time_type.rs index e190067ff2..30548b73bd 100644 --- a/src/datatypes/src/types/time_type.rs +++ b/src/datatypes/src/types/time_type.rs @@ -44,7 +44,7 @@ const MILLISECOND_VARIATION: u64 = 3; const MICROSECOND_VARIATION: u64 = 6; const NANOSECOND_VARIATION: u64 = 9; -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)] #[enum_dispatch(DataType)] pub enum TimeType { Second(TimeSecondType), @@ -88,7 +88,7 @@ impl TimeType { macro_rules! impl_data_type_for_time { ($unit: ident,$arrow_type: ident, $type: ty) => { paste! { - #[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] + #[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)] pub struct [