diff --git a/src/common/src/bytes.rs b/src/common/src/bytes.rs new file mode 100644 index 0000000000..ae09dd0f2c --- /dev/null +++ b/src/common/src/bytes.rs @@ -0,0 +1,7 @@ +/// Bytes buffer. +#[derive(Debug, Default, Clone)] +pub struct Bytes(Vec); + +/// String buffer with arbitrary encoding. +#[derive(Debug, Default, Clone)] +pub struct StringBytes(Vec); diff --git a/src/common/src/lib.rs b/src/common/src/lib.rs index ae09dd0f2c..ad0049c4c2 100644 --- a/src/common/src/lib.rs +++ b/src/common/src/lib.rs @@ -1,7 +1 @@ -/// Bytes buffer. -#[derive(Debug, Default, Clone)] -pub struct Bytes(Vec); - -/// String buffer with arbitrary encoding. -#[derive(Debug, Default, Clone)] -pub struct StringBytes(Vec); +pub mod bytes; diff --git a/src/datatypes/src/data_type.rs b/src/datatypes/src/data_type.rs index 122a2c173a..4cd9f6fd15 100644 --- a/src/datatypes/src/data_type.rs +++ b/src/datatypes/src/data_type.rs @@ -4,7 +4,7 @@ use crate::type_id::LogicalTypeId; use crate::value::Value; /// Data type abstraction. -pub trait DataType: std::fmt::Debug { +pub trait DataType: std::fmt::Debug + Send + Sync { /// Name of this data type. fn name(&self) -> &str; diff --git a/src/datatypes/src/lib.rs b/src/datatypes/src/lib.rs index 3b22def878..5c7b8b66d9 100644 --- a/src/datatypes/src/lib.rs +++ b/src/datatypes/src/lib.rs @@ -1,6 +1,11 @@ mod data_type; +pub mod prelude; mod schema; pub mod type_id; mod types; pub mod value; pub mod vectors; + +use arrow2::array::BinaryArray; + +pub type LargeBinaryArray = BinaryArray; diff --git a/src/datatypes/src/prelude.rs b/src/datatypes/src/prelude.rs new file mode 100644 index 0000000000..1aa4775354 --- /dev/null +++ b/src/datatypes/src/prelude.rs @@ -0,0 +1,3 @@ +pub use crate::data_type::{DataType, DataTypeRef}; +pub use crate::type_id::LogicalTypeId; +pub use crate::value::Value; diff --git a/src/datatypes/src/types.rs b/src/datatypes/src/types.rs index fd30e143a9..02fa6bc718 100644 --- a/src/datatypes/src/types.rs +++ b/src/datatypes/src/types.rs @@ -1,2 +1,3 @@ +pub mod binary_type; pub mod primitive_traits; pub mod primitive_type; diff --git a/src/datatypes/src/types/binary_type.rs b/src/datatypes/src/types/binary_type.rs new file mode 100644 index 0000000000..c5d5a3ed18 --- /dev/null +++ b/src/datatypes/src/types/binary_type.rs @@ -0,0 +1,30 @@ +use std::sync::Arc; + +use common::bytes::StringBytes; + +use crate::data_type::{DataType, DataTypeRef}; +use crate::type_id::LogicalTypeId; +use crate::value::Value; + +#[derive(Debug, Default)] +pub struct BinaryType; + +impl BinaryType { + pub fn arc() -> DataTypeRef { + Arc::new(Self) + } +} + +impl DataType for BinaryType { + fn name(&self) -> &str { + "Binary" + } + + fn logical_type_id(&self) -> LogicalTypeId { + LogicalTypeId::String + } + + fn default_value(&self) -> Value { + StringBytes::default().into() + } +} diff --git a/src/datatypes/src/value.rs b/src/datatypes/src/value.rs index 063ec321f5..3a7f597eaf 100644 --- a/src/datatypes/src/value.rs +++ b/src/datatypes/src/value.rs @@ -1,4 +1,4 @@ -use common::{Bytes, StringBytes}; +use common::bytes::{Bytes, StringBytes}; /// Value holds a single arbitrary value of any [DataType](crate::data_type::DataType). #[derive(Debug)] @@ -57,3 +57,5 @@ impl_from!(Int32, i32); impl_from!(Int64, i64); impl_from!(Float32, f32); impl_from!(Float64, f64); +impl_from!(String, StringBytes); +impl_from!(Binary, Bytes); diff --git a/src/datatypes/src/vectors.rs b/src/datatypes/src/vectors.rs index cbb95f5c33..9adac163b6 100644 --- a/src/datatypes/src/vectors.rs +++ b/src/datatypes/src/vectors.rs @@ -1,3 +1,4 @@ +pub mod binary; pub mod primitive; use std::any::Any; @@ -8,6 +9,8 @@ use crate::data_type::DataTypeRef; /// Vector of data values. pub trait Vector: Send + Sync { /// Returns the data type of the vector. + /// + /// This may require heap allocation. fn data_type(&self) -> DataTypeRef; /// Returns the vector as [Any](std::any::Any) so that it can be diff --git a/src/datatypes/src/vectors/binary.rs b/src/datatypes/src/vectors/binary.rs new file mode 100644 index 0000000000..230a0ce611 --- /dev/null +++ b/src/datatypes/src/vectors/binary.rs @@ -0,0 +1,26 @@ +use std::any::Any; + +use crate::data_type::DataTypeRef; +use crate::types::binary_type::BinaryType; +use crate::vectors::Vector; +use crate::LargeBinaryArray; + +/// Vector of binary strings. +#[derive(Debug)] +pub struct BinaryVector { + array: LargeBinaryArray, +} + +impl Vector for BinaryVector { + fn data_type(&self) -> DataTypeRef { + BinaryType::arc() + } + + fn as_any(&self) -> &dyn Any { + self + } + + fn len(&self) -> usize { + self.array.len() + } +}