Skip to content

Commit f11b2b9

Browse files
committed
chore(query): add combinators
1 parent 4549ae9 commit f11b2b9

File tree

15 files changed

+526
-153
lines changed

15 files changed

+526
-153
lines changed

Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/common/hashtable/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ test = false
1515
common-base = { path = "../base" }
1616

1717
# Crates.io dependencies
18-
ordered-float = "3.0.0"
18+
ordered-float = { git = "https://github.com/andylokandy/rust-ordered-float.git", branch = "as", features = ["serde"] }
1919
primitive-types = "0.11.1"
2020

2121
[dev-dependencies]

src/query/expression/src/lib.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
#![feature(const_maybe_uninit_as_mut_ptr)]
2525
#![feature(const_mut_refs)]
2626
#![feature(generic_const_exprs)]
27-
2827
#![allow(incomplete_features)]
2928

3029
#[allow(dead_code)]

src/query/expression/src/types.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,10 @@ pub const ALL_INTEGER_TYPES: &[NumberDataType; 8] = &[
8484
NumberDataType::Int64,
8585
];
8686

87-
pub const ALL_FLOAT_TYPES: &[NumberDataType; 2] = &[NumberDataType::Float32, NumberDataType::Float64];
88-
pub const ALL_NUMERICS_TYPES: &[NumberDataType; 10] = &concat_array(ALL_INTEGER_TYPES, ALL_FLOAT_TYPES);
87+
pub const ALL_FLOAT_TYPES: &[NumberDataType; 2] =
88+
&[NumberDataType::Float32, NumberDataType::Float64];
89+
pub const ALL_NUMERICS_TYPES: &[NumberDataType; 10] =
90+
&concat_array(ALL_INTEGER_TYPES, ALL_FLOAT_TYPES);
8991

9092
impl DataType {
9193
pub fn wrap_nullable(&self) -> Self {

src/query/expression/src/types/number.rs

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ use ordered_float::OrderedFloat;
2424
use serde::Deserialize;
2525
use serde::Serialize;
2626

27-
use crate::ColumnBuilder;
2827
use crate::property::Domain;
2928
use crate::types::ArgType;
3029
use crate::types::DataType;
@@ -33,6 +32,7 @@ use crate::types::ValueType;
3332
use crate::util::buffer_into_mut;
3433
use crate::values::Column;
3534
use crate::values::Scalar;
35+
use crate::ColumnBuilder;
3636
use crate::ScalarRef;
3737

3838
pub type F32 = OrderedFloat<f32>;
@@ -52,11 +52,10 @@ pub type UInt64Type = NumberType<u64>;
5252
pub type Float32Type = NumberType<F32>;
5353
pub type Float64Type = NumberType<F64>;
5454

55-
56-
impl <Num: Number> NumberType<Num> {
57-
pub fn try_downcast_builder<'a>(builder: &'a mut ColumnBuilder) -> Option<&'a mut Vec<Num>> {
55+
impl<Num: Number> NumberType<Num> {
56+
pub fn try_downcast_builder<'a>(builder: &'a mut ColumnBuilder) -> Option<&'a mut Vec<Num>> {
5857
match builder {
59-
ColumnBuilder::Number(num) => Num::try_downcast_builder(num) ,
58+
ColumnBuilder::Number(num) => Num::try_downcast_builder(num),
6059
_ => None,
6160
}
6261
}
@@ -831,8 +830,6 @@ fn overflow_cast<T: Number, U: Number>(src: T) -> (U, bool) {
831830
(dest, overflowing)
832831
}
833832

834-
835-
836833
#[macro_export]
837834
macro_rules! with_number_type {
838835
( | $t:tt | $($tail:tt)* ) => {
@@ -858,15 +855,27 @@ macro_rules! with_number_mapped_type {
858855
}
859856

860857
pub trait Number:
861-
Copy + Debug + NumCast + Default + Clone + Copy + PartialEq + Eq + PartialOrd + Ord + Sync + Send + 'static
858+
Copy
859+
+ Debug
860+
+ NumCast
861+
+ Default
862+
+ Clone
863+
+ Copy
864+
+ PartialEq
865+
+ Eq
866+
+ PartialOrd
867+
+ Ord
868+
+ Sync
869+
+ Send
870+
+ 'static
862871
{
863872
const MIN: Self;
864873
const MAX: Self;
865874

866875
fn data_type() -> NumberDataType;
867876
fn try_downcast_scalar(scalar: &NumberScalar) -> Option<Self>;
868877
fn try_downcast_column(col: &NumberColumn) -> Option<Buffer<Self>>;
869-
//TODO
878+
// TODO
870879
fn try_downcast_builder(col: &mut NumberColumnBuilder) -> Option<&mut Vec<Self>>;
871880
fn try_downcast_domain(domain: &NumberDomain) -> Option<SimpleDomain<Self>>;
872881
fn upcast_scalar(scalar: Self) -> NumberScalar;
@@ -927,7 +936,7 @@ impl Number for u16 {
927936
col.as_u_int16().cloned()
928937
}
929938

930-
fn try_downcast_builder(builder: &mut NumberColumnBuilder) -> Option<&mut Vec<Self>> {
939+
fn try_downcast_builder(builder: &mut NumberColumnBuilder) -> Option<&mut Vec<Self>> {
931940
builder.as_u_int16_mut()
932941
}
933942

@@ -964,7 +973,7 @@ impl Number for u32 {
964973
col.as_u_int32().cloned()
965974
}
966975

967-
fn try_downcast_builder(builder: &mut NumberColumnBuilder) -> Option<&mut Vec<Self>> {
976+
fn try_downcast_builder(builder: &mut NumberColumnBuilder) -> Option<&mut Vec<Self>> {
968977
builder.as_u_int32_mut()
969978
}
970979

@@ -1001,7 +1010,7 @@ impl Number for u64 {
10011010
col.as_u_int64().cloned()
10021011
}
10031012

1004-
fn try_downcast_builder(builder: &mut NumberColumnBuilder) -> Option<&mut Vec<Self>> {
1013+
fn try_downcast_builder(builder: &mut NumberColumnBuilder) -> Option<&mut Vec<Self>> {
10051014
builder.as_u_int64_mut()
10061015
}
10071016

@@ -1038,7 +1047,7 @@ impl Number for i8 {
10381047
col.as_int8().cloned()
10391048
}
10401049

1041-
fn try_downcast_builder(builder: &mut NumberColumnBuilder) -> Option<&mut Vec<Self>> {
1050+
fn try_downcast_builder(builder: &mut NumberColumnBuilder) -> Option<&mut Vec<Self>> {
10421051
builder.as_int8_mut()
10431052
}
10441053

@@ -1075,7 +1084,7 @@ impl Number for i16 {
10751084
col.as_int16().cloned()
10761085
}
10771086

1078-
fn try_downcast_builder(builder: &mut NumberColumnBuilder) -> Option<&mut Vec<Self>> {
1087+
fn try_downcast_builder(builder: &mut NumberColumnBuilder) -> Option<&mut Vec<Self>> {
10791088
builder.as_int16_mut()
10801089
}
10811090

@@ -1112,7 +1121,7 @@ impl Number for i32 {
11121121
col.as_int32().cloned()
11131122
}
11141123

1115-
fn try_downcast_builder(builder: &mut NumberColumnBuilder) -> Option<&mut Vec<Self>> {
1124+
fn try_downcast_builder(builder: &mut NumberColumnBuilder) -> Option<&mut Vec<Self>> {
11161125
builder.as_int32_mut()
11171126
}
11181127

@@ -1149,15 +1158,14 @@ impl Number for i64 {
11491158
col.as_int64().cloned()
11501159
}
11511160

1152-
fn try_downcast_builder(builder: &mut NumberColumnBuilder) -> Option<&mut Vec<Self>> {
1161+
fn try_downcast_builder(builder: &mut NumberColumnBuilder) -> Option<&mut Vec<Self>> {
11531162
builder.as_int64_mut()
11541163
}
11551164

11561165
fn try_downcast_domain(domain: &NumberDomain) -> Option<SimpleDomain<Self>> {
11571166
domain.as_int64().cloned()
11581167
}
11591168

1160-
11611169
fn upcast_scalar(scalar: Self) -> NumberScalar {
11621170
NumberScalar::Int64(scalar)
11631171
}
@@ -1187,7 +1195,7 @@ impl Number for F32 {
11871195
col.as_float32().cloned()
11881196
}
11891197

1190-
fn try_downcast_builder(builder: &mut NumberColumnBuilder) -> Option<&mut Vec<Self>> {
1198+
fn try_downcast_builder(builder: &mut NumberColumnBuilder) -> Option<&mut Vec<Self>> {
11911199
builder.as_float32_mut()
11921200
}
11931201

@@ -1224,7 +1232,7 @@ impl Number for F64 {
12241232
col.as_float64().cloned()
12251233
}
12261234

1227-
fn try_downcast_builder(builder: &mut NumberColumnBuilder) -> Option<&mut Vec<Self>> {
1235+
fn try_downcast_builder(builder: &mut NumberColumnBuilder) -> Option<&mut Vec<Self>> {
12281236
builder.as_float64_mut()
12291237
}
12301238

src/query/expression/src/types/string.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ use std::ops::Range;
1717

1818
use common_arrow::arrow::buffer::Buffer;
1919
use common_arrow::arrow::trusted_len::TrustedLen;
20+
use serde::Deserialize;
21+
use serde::Serialize;
2022

2123
use crate::property::Domain;
2224
use crate::types::ArgType;
@@ -200,7 +202,7 @@ impl<'a> Iterator for StringIterator<'a> {
200202

201203
unsafe impl<'a> TrustedLen for StringIterator<'a> {}
202204

203-
#[derive(Debug, Clone, PartialEq, Eq)]
205+
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
204206
pub struct StringColumnBuilder {
205207
pub data: Vec<u8>,
206208
pub offsets: Vec<u64>,
@@ -284,6 +286,14 @@ impl StringColumnBuilder {
284286
assert_eq!(self.offsets.len(), 2);
285287
self.data[(self.offsets[0] as usize)..(self.offsets[1] as usize)].to_vec()
286288
}
289+
290+
/// # Safety
291+
pub unsafe fn index_unchecked(&self, row: usize) -> &[u8] {
292+
let start = *self.offsets.get_unchecked(row) as usize;
293+
let end = *self.offsets.get_unchecked(row + 1) as usize;
294+
// soundness: the invariant of the struct
295+
self.data.get_unchecked(start..end)
296+
}
287297
}
288298

289299
#[derive(Debug, Clone, PartialEq, Eq)]

src/query/expression/src/util.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,6 @@ pub fn deserialize_arrow_array(bytes: &[u8]) -> Option<Box<dyn Array>> {
9292
Some(col)
9393
}
9494

95-
9695
pub const fn concat_array<T, const A: usize, const B: usize>(a: &[T; A], b: &[T; B]) -> [T; A + B] {
9796
let mut result = std::mem::MaybeUninit::uninit();
9897
let dest = result.as_mut_ptr() as *mut T;

0 commit comments

Comments
 (0)