1use std::collections::HashSet;
16use std::sync::Arc;
17
18use common_base::BitVec;
19use common_decimal::decimal128::{DECIMAL128_DEFAULT_SCALE, DECIMAL128_MAX_PRECISION};
20use common_decimal::Decimal128;
21use common_time::time::Time;
22use common_time::timestamp::TimeUnit;
23use common_time::{Date, IntervalDayTime, IntervalMonthDayNano, IntervalYearMonth, Timestamp};
24use datatypes::prelude::{ConcreteDataType, ValueRef};
25use datatypes::scalars::ScalarVector;
26use datatypes::types::{
27 Int16Type, Int8Type, IntervalType, TimeType, TimestampType, UInt16Type, UInt8Type,
28};
29use datatypes::value::{OrderedF32, OrderedF64, Value};
30use datatypes::vectors::{
31 BinaryVector, BooleanVector, DateVector, Decimal128Vector, Float32Vector, Float64Vector,
32 Int32Vector, Int64Vector, IntervalDayTimeVector, IntervalMonthDayNanoVector,
33 IntervalYearMonthVector, PrimitiveVector, StringVector, TimeMicrosecondVector,
34 TimeMillisecondVector, TimeNanosecondVector, TimeSecondVector, TimestampMicrosecondVector,
35 TimestampMillisecondVector, TimestampNanosecondVector, TimestampSecondVector, UInt32Vector,
36 UInt64Vector, VectorRef,
37};
38use greptime_proto::v1::column_data_type_extension::TypeExt;
39use greptime_proto::v1::ddl_request::Expr;
40use greptime_proto::v1::greptime_request::Request;
41use greptime_proto::v1::query_request::Query;
42use greptime_proto::v1::value::ValueData;
43use greptime_proto::v1::{
44 self, ColumnDataTypeExtension, DdlRequest, DecimalTypeExtension, JsonTypeExtension,
45 QueryRequest, Row, SemanticType, VectorTypeExtension,
46};
47use paste::paste;
48use snafu::prelude::*;
49
50use crate::error::{self, InconsistentTimeUnitSnafu, InvalidTimeUnitSnafu, Result};
51use crate::v1::column::Values;
52use crate::v1::{Column, ColumnDataType, Value as GrpcValue};
53
54#[derive(Debug, PartialEq)]
57pub struct ColumnDataTypeWrapper {
58 datatype: ColumnDataType,
59 datatype_ext: Option<ColumnDataTypeExtension>,
60}
61
62impl ColumnDataTypeWrapper {
63 pub fn try_new(datatype: i32, datatype_ext: Option<ColumnDataTypeExtension>) -> Result<Self> {
65 let datatype = ColumnDataType::try_from(datatype)
66 .context(error::UnknownColumnDataTypeSnafu { datatype })?;
67 Ok(Self {
68 datatype,
69 datatype_ext,
70 })
71 }
72
73 pub fn new(datatype: ColumnDataType, datatype_ext: Option<ColumnDataTypeExtension>) -> Self {
75 Self {
76 datatype,
77 datatype_ext,
78 }
79 }
80
81 pub fn datatype(&self) -> ColumnDataType {
83 self.datatype
84 }
85
86 pub fn to_parts(&self) -> (ColumnDataType, Option<ColumnDataTypeExtension>) {
88 (self.datatype, self.datatype_ext)
89 }
90}
91
92impl From<ColumnDataTypeWrapper> for ConcreteDataType {
93 fn from(datatype_wrapper: ColumnDataTypeWrapper) -> Self {
94 match datatype_wrapper.datatype {
95 ColumnDataType::Boolean => ConcreteDataType::boolean_datatype(),
96 ColumnDataType::Int8 => ConcreteDataType::int8_datatype(),
97 ColumnDataType::Int16 => ConcreteDataType::int16_datatype(),
98 ColumnDataType::Int32 => ConcreteDataType::int32_datatype(),
99 ColumnDataType::Int64 => ConcreteDataType::int64_datatype(),
100 ColumnDataType::Uint8 => ConcreteDataType::uint8_datatype(),
101 ColumnDataType::Uint16 => ConcreteDataType::uint16_datatype(),
102 ColumnDataType::Uint32 => ConcreteDataType::uint32_datatype(),
103 ColumnDataType::Uint64 => ConcreteDataType::uint64_datatype(),
104 ColumnDataType::Float32 => ConcreteDataType::float32_datatype(),
105 ColumnDataType::Float64 => ConcreteDataType::float64_datatype(),
106 ColumnDataType::Binary => {
107 if let Some(TypeExt::JsonType(_)) = datatype_wrapper
108 .datatype_ext
109 .as_ref()
110 .and_then(|datatype_ext| datatype_ext.type_ext.as_ref())
111 {
112 ConcreteDataType::json_datatype()
113 } else {
114 ConcreteDataType::binary_datatype()
115 }
116 }
117 ColumnDataType::Json => ConcreteDataType::json_datatype(),
118 ColumnDataType::String => ConcreteDataType::string_datatype(),
119 ColumnDataType::Date => ConcreteDataType::date_datatype(),
120 ColumnDataType::Datetime => ConcreteDataType::timestamp_microsecond_datatype(),
121 ColumnDataType::TimestampSecond => ConcreteDataType::timestamp_second_datatype(),
122 ColumnDataType::TimestampMillisecond => {
123 ConcreteDataType::timestamp_millisecond_datatype()
124 }
125 ColumnDataType::TimestampMicrosecond => {
126 ConcreteDataType::timestamp_microsecond_datatype()
127 }
128 ColumnDataType::TimestampNanosecond => {
129 ConcreteDataType::timestamp_nanosecond_datatype()
130 }
131 ColumnDataType::TimeSecond => ConcreteDataType::time_second_datatype(),
132 ColumnDataType::TimeMillisecond => ConcreteDataType::time_millisecond_datatype(),
133 ColumnDataType::TimeMicrosecond => ConcreteDataType::time_microsecond_datatype(),
134 ColumnDataType::TimeNanosecond => ConcreteDataType::time_nanosecond_datatype(),
135 ColumnDataType::IntervalYearMonth => ConcreteDataType::interval_year_month_datatype(),
136 ColumnDataType::IntervalDayTime => ConcreteDataType::interval_day_time_datatype(),
137 ColumnDataType::IntervalMonthDayNano => {
138 ConcreteDataType::interval_month_day_nano_datatype()
139 }
140 ColumnDataType::Decimal128 => {
141 if let Some(TypeExt::DecimalType(d)) = datatype_wrapper
142 .datatype_ext
143 .as_ref()
144 .and_then(|datatype_ext| datatype_ext.type_ext.as_ref())
145 {
146 ConcreteDataType::decimal128_datatype(d.precision as u8, d.scale as i8)
147 } else {
148 ConcreteDataType::decimal128_default_datatype()
149 }
150 }
151 ColumnDataType::Vector => {
152 if let Some(TypeExt::VectorType(d)) = datatype_wrapper
153 .datatype_ext
154 .as_ref()
155 .and_then(|datatype_ext| datatype_ext.type_ext.as_ref())
156 {
157 ConcreteDataType::vector_datatype(d.dim)
158 } else {
159 ConcreteDataType::vector_default_datatype()
160 }
161 }
162 }
163 }
164}
165
166macro_rules! impl_column_type_functions {
173 ($($Type: ident), +) => {
174 paste! {
175 impl ColumnDataTypeWrapper {
176 $(
177 pub fn [<$Type:lower _datatype>]() -> ColumnDataTypeWrapper {
178 ColumnDataTypeWrapper {
179 datatype: ColumnDataType::$Type,
180 datatype_ext: None,
181 }
182 }
183 )+
184 }
185 }
186 }
187}
188
189macro_rules! impl_column_type_functions_with_snake {
196 ($($TypeName: ident), +) => {
197 paste!{
198 impl ColumnDataTypeWrapper {
199 $(
200 pub fn [<$TypeName:snake _datatype>]() -> ColumnDataTypeWrapper {
201 ColumnDataTypeWrapper {
202 datatype: ColumnDataType::$TypeName,
203 datatype_ext: None,
204 }
205 }
206 )+
207 }
208 }
209 };
210}
211
212impl_column_type_functions!(
213 Boolean, Uint8, Uint16, Uint32, Uint64, Int8, Int16, Int32, Int64, Float32, Float64, Binary,
214 Date, Datetime, String
215);
216
217impl_column_type_functions_with_snake!(
218 TimestampSecond,
219 TimestampMillisecond,
220 TimestampMicrosecond,
221 TimestampNanosecond,
222 TimeSecond,
223 TimeMillisecond,
224 TimeMicrosecond,
225 TimeNanosecond,
226 IntervalYearMonth,
227 IntervalDayTime,
228 IntervalMonthDayNano
229);
230
231impl ColumnDataTypeWrapper {
232 pub fn decimal128_datatype(precision: i32, scale: i32) -> Self {
233 ColumnDataTypeWrapper {
234 datatype: ColumnDataType::Decimal128,
235 datatype_ext: Some(ColumnDataTypeExtension {
236 type_ext: Some(TypeExt::DecimalType(DecimalTypeExtension {
237 precision,
238 scale,
239 })),
240 }),
241 }
242 }
243
244 pub fn vector_datatype(dim: u32) -> Self {
245 ColumnDataTypeWrapper {
246 datatype: ColumnDataType::Vector,
247 datatype_ext: Some(ColumnDataTypeExtension {
248 type_ext: Some(TypeExt::VectorType(VectorTypeExtension { dim })),
249 }),
250 }
251 }
252}
253
254impl TryFrom<ConcreteDataType> for ColumnDataTypeWrapper {
255 type Error = error::Error;
256
257 fn try_from(datatype: ConcreteDataType) -> Result<Self> {
258 let column_datatype = match datatype {
259 ConcreteDataType::Boolean(_) => ColumnDataType::Boolean,
260 ConcreteDataType::Int8(_) => ColumnDataType::Int8,
261 ConcreteDataType::Int16(_) => ColumnDataType::Int16,
262 ConcreteDataType::Int32(_) => ColumnDataType::Int32,
263 ConcreteDataType::Int64(_) => ColumnDataType::Int64,
264 ConcreteDataType::UInt8(_) => ColumnDataType::Uint8,
265 ConcreteDataType::UInt16(_) => ColumnDataType::Uint16,
266 ConcreteDataType::UInt32(_) => ColumnDataType::Uint32,
267 ConcreteDataType::UInt64(_) => ColumnDataType::Uint64,
268 ConcreteDataType::Float32(_) => ColumnDataType::Float32,
269 ConcreteDataType::Float64(_) => ColumnDataType::Float64,
270 ConcreteDataType::Binary(_) => ColumnDataType::Binary,
271 ConcreteDataType::String(_) => ColumnDataType::String,
272 ConcreteDataType::Date(_) => ColumnDataType::Date,
273 ConcreteDataType::Timestamp(t) => match t {
274 TimestampType::Second(_) => ColumnDataType::TimestampSecond,
275 TimestampType::Millisecond(_) => ColumnDataType::TimestampMillisecond,
276 TimestampType::Microsecond(_) => ColumnDataType::TimestampMicrosecond,
277 TimestampType::Nanosecond(_) => ColumnDataType::TimestampNanosecond,
278 },
279 ConcreteDataType::Time(t) => match t {
280 TimeType::Second(_) => ColumnDataType::TimeSecond,
281 TimeType::Millisecond(_) => ColumnDataType::TimeMillisecond,
282 TimeType::Microsecond(_) => ColumnDataType::TimeMicrosecond,
283 TimeType::Nanosecond(_) => ColumnDataType::TimeNanosecond,
284 },
285 ConcreteDataType::Interval(i) => match i {
286 IntervalType::YearMonth(_) => ColumnDataType::IntervalYearMonth,
287 IntervalType::DayTime(_) => ColumnDataType::IntervalDayTime,
288 IntervalType::MonthDayNano(_) => ColumnDataType::IntervalMonthDayNano,
289 },
290 ConcreteDataType::Decimal128(_) => ColumnDataType::Decimal128,
291 ConcreteDataType::Json(_) => ColumnDataType::Json,
292 ConcreteDataType::Vector(_) => ColumnDataType::Vector,
293 ConcreteDataType::Null(_)
294 | ConcreteDataType::List(_)
295 | ConcreteDataType::Struct(_)
296 | ConcreteDataType::Dictionary(_)
297 | ConcreteDataType::Duration(_) => {
298 return error::IntoColumnDataTypeSnafu { from: datatype }.fail()
299 }
300 };
301 let datatype_extension = match column_datatype {
302 ColumnDataType::Decimal128 => {
303 datatype
304 .as_decimal128()
305 .map(|decimal_type| ColumnDataTypeExtension {
306 type_ext: Some(TypeExt::DecimalType(DecimalTypeExtension {
307 precision: decimal_type.precision() as i32,
308 scale: decimal_type.scale() as i32,
309 })),
310 })
311 }
312 ColumnDataType::Json => datatype.as_json().map(|_| ColumnDataTypeExtension {
313 type_ext: Some(TypeExt::JsonType(JsonTypeExtension::JsonBinary.into())),
314 }),
315 ColumnDataType::Vector => {
316 datatype
317 .as_vector()
318 .map(|vector_type| ColumnDataTypeExtension {
319 type_ext: Some(TypeExt::VectorType(VectorTypeExtension {
320 dim: vector_type.dim as _,
321 })),
322 })
323 }
324 _ => None,
325 };
326 Ok(Self {
327 datatype: column_datatype,
328 datatype_ext: datatype_extension,
329 })
330 }
331}
332
333pub fn values_with_capacity(datatype: ColumnDataType, capacity: usize) -> Values {
334 match datatype {
335 ColumnDataType::Boolean => Values {
336 bool_values: Vec::with_capacity(capacity),
337 ..Default::default()
338 },
339 ColumnDataType::Int8 => Values {
340 i8_values: Vec::with_capacity(capacity),
341 ..Default::default()
342 },
343 ColumnDataType::Int16 => Values {
344 i16_values: Vec::with_capacity(capacity),
345 ..Default::default()
346 },
347 ColumnDataType::Int32 => Values {
348 i32_values: Vec::with_capacity(capacity),
349 ..Default::default()
350 },
351 ColumnDataType::Int64 => Values {
352 i64_values: Vec::with_capacity(capacity),
353 ..Default::default()
354 },
355 ColumnDataType::Uint8 => Values {
356 u8_values: Vec::with_capacity(capacity),
357 ..Default::default()
358 },
359 ColumnDataType::Uint16 => Values {
360 u16_values: Vec::with_capacity(capacity),
361 ..Default::default()
362 },
363 ColumnDataType::Uint32 => Values {
364 u32_values: Vec::with_capacity(capacity),
365 ..Default::default()
366 },
367 ColumnDataType::Uint64 => Values {
368 u64_values: Vec::with_capacity(capacity),
369 ..Default::default()
370 },
371 ColumnDataType::Float32 => Values {
372 f32_values: Vec::with_capacity(capacity),
373 ..Default::default()
374 },
375 ColumnDataType::Float64 => Values {
376 f64_values: Vec::with_capacity(capacity),
377 ..Default::default()
378 },
379 ColumnDataType::Binary => Values {
380 binary_values: Vec::with_capacity(capacity),
381 ..Default::default()
382 },
383 ColumnDataType::String => Values {
384 string_values: Vec::with_capacity(capacity),
385 ..Default::default()
386 },
387 ColumnDataType::Date => Values {
388 date_values: Vec::with_capacity(capacity),
389 ..Default::default()
390 },
391 ColumnDataType::Datetime => Values {
392 datetime_values: Vec::with_capacity(capacity),
393 ..Default::default()
394 },
395 ColumnDataType::TimestampSecond => Values {
396 timestamp_second_values: Vec::with_capacity(capacity),
397 ..Default::default()
398 },
399 ColumnDataType::TimestampMillisecond => Values {
400 timestamp_millisecond_values: Vec::with_capacity(capacity),
401 ..Default::default()
402 },
403 ColumnDataType::TimestampMicrosecond => Values {
404 timestamp_microsecond_values: Vec::with_capacity(capacity),
405 ..Default::default()
406 },
407 ColumnDataType::TimestampNanosecond => Values {
408 timestamp_nanosecond_values: Vec::with_capacity(capacity),
409 ..Default::default()
410 },
411 ColumnDataType::TimeSecond => Values {
412 time_second_values: Vec::with_capacity(capacity),
413 ..Default::default()
414 },
415 ColumnDataType::TimeMillisecond => Values {
416 time_millisecond_values: Vec::with_capacity(capacity),
417 ..Default::default()
418 },
419 ColumnDataType::TimeMicrosecond => Values {
420 time_microsecond_values: Vec::with_capacity(capacity),
421 ..Default::default()
422 },
423 ColumnDataType::TimeNanosecond => Values {
424 time_nanosecond_values: Vec::with_capacity(capacity),
425 ..Default::default()
426 },
427 ColumnDataType::IntervalDayTime => Values {
428 interval_day_time_values: Vec::with_capacity(capacity),
429 ..Default::default()
430 },
431 ColumnDataType::IntervalYearMonth => Values {
432 interval_year_month_values: Vec::with_capacity(capacity),
433 ..Default::default()
434 },
435 ColumnDataType::IntervalMonthDayNano => Values {
436 interval_month_day_nano_values: Vec::with_capacity(capacity),
437 ..Default::default()
438 },
439 ColumnDataType::Decimal128 => Values {
440 decimal128_values: Vec::with_capacity(capacity),
441 ..Default::default()
442 },
443 ColumnDataType::Json => Values {
444 string_values: Vec::with_capacity(capacity),
445 ..Default::default()
446 },
447 ColumnDataType::Vector => Values {
448 binary_values: Vec::with_capacity(capacity),
449 ..Default::default()
450 },
451 }
452}
453
454pub fn push_vals(column: &mut Column, origin_count: usize, vector: VectorRef) {
456 let values = column.values.get_or_insert_with(Values::default);
457 let mut null_mask = BitVec::from_slice(&column.null_mask);
458 let len = vector.len();
459 null_mask.reserve_exact(origin_count + len);
460 null_mask.extend(BitVec::repeat(false, len));
461
462 (0..len).for_each(|idx| match vector.get(idx) {
463 Value::Null => null_mask.set(idx + origin_count, true),
464 Value::Boolean(val) => values.bool_values.push(val),
465 Value::UInt8(val) => values.u8_values.push(val.into()),
466 Value::UInt16(val) => values.u16_values.push(val.into()),
467 Value::UInt32(val) => values.u32_values.push(val),
468 Value::UInt64(val) => values.u64_values.push(val),
469 Value::Int8(val) => values.i8_values.push(val.into()),
470 Value::Int16(val) => values.i16_values.push(val.into()),
471 Value::Int32(val) => values.i32_values.push(val),
472 Value::Int64(val) => values.i64_values.push(val),
473 Value::Float32(val) => values.f32_values.push(*val),
474 Value::Float64(val) => values.f64_values.push(*val),
475 Value::String(val) => values.string_values.push(val.as_utf8().to_string()),
476 Value::Binary(val) => values.binary_values.push(val.to_vec()),
477 Value::Date(val) => values.date_values.push(val.val()),
478 Value::Timestamp(val) => match val.unit() {
479 TimeUnit::Second => values.timestamp_second_values.push(val.value()),
480 TimeUnit::Millisecond => values.timestamp_millisecond_values.push(val.value()),
481 TimeUnit::Microsecond => values.timestamp_microsecond_values.push(val.value()),
482 TimeUnit::Nanosecond => values.timestamp_nanosecond_values.push(val.value()),
483 },
484 Value::Time(val) => match val.unit() {
485 TimeUnit::Second => values.time_second_values.push(val.value()),
486 TimeUnit::Millisecond => values.time_millisecond_values.push(val.value()),
487 TimeUnit::Microsecond => values.time_microsecond_values.push(val.value()),
488 TimeUnit::Nanosecond => values.time_nanosecond_values.push(val.value()),
489 },
490 Value::IntervalYearMonth(val) => values.interval_year_month_values.push(val.to_i32()),
491 Value::IntervalDayTime(val) => values.interval_day_time_values.push(val.to_i64()),
492 Value::IntervalMonthDayNano(val) => values
493 .interval_month_day_nano_values
494 .push(convert_month_day_nano_to_pb(val)),
495 Value::Decimal128(val) => values.decimal128_values.push(convert_to_pb_decimal128(val)),
496 Value::List(_) | Value::Duration(_) => unreachable!(),
497 });
498 column.null_mask = null_mask.into_vec();
499}
500
501pub fn request_type(request: &Request) -> &'static str {
503 match request {
504 Request::Inserts(_) => "inserts",
505 Request::Query(query_req) => query_request_type(query_req),
506 Request::Ddl(ddl_req) => ddl_request_type(ddl_req),
507 Request::Deletes(_) => "deletes",
508 Request::RowInserts(_) => "row_inserts",
509 Request::RowDeletes(_) => "row_deletes",
510 }
511}
512
513fn query_request_type(request: &QueryRequest) -> &'static str {
515 match request.query {
516 Some(Query::Sql(_)) => "query.sql",
517 Some(Query::LogicalPlan(_)) => "query.logical_plan",
518 Some(Query::PromRangeQuery(_)) => "query.prom_range",
519 Some(Query::InsertIntoPlan(_)) => "query.insert_into_plan",
520 None => "query.empty",
521 }
522}
523
524fn ddl_request_type(request: &DdlRequest) -> &'static str {
526 match request.expr {
527 Some(Expr::CreateDatabase(_)) => "ddl.create_database",
528 Some(Expr::CreateTable(_)) => "ddl.create_table",
529 Some(Expr::AlterTable(_)) => "ddl.alter_table",
530 Some(Expr::DropTable(_)) => "ddl.drop_table",
531 Some(Expr::TruncateTable(_)) => "ddl.truncate_table",
532 Some(Expr::CreateFlow(_)) => "ddl.create_flow",
533 Some(Expr::DropFlow(_)) => "ddl.drop_flow",
534 Some(Expr::CreateView(_)) => "ddl.create_view",
535 Some(Expr::DropView(_)) => "ddl.drop_view",
536 Some(Expr::AlterDatabase(_)) => "ddl.alter_database",
537 None => "ddl.empty",
538 }
539}
540
541pub fn convert_month_day_nano_to_pb(v: IntervalMonthDayNano) -> v1::IntervalMonthDayNano {
543 v1::IntervalMonthDayNano {
544 months: v.months,
545 days: v.days,
546 nanoseconds: v.nanoseconds,
547 }
548}
549
550pub fn convert_to_pb_decimal128(v: Decimal128) -> v1::Decimal128 {
552 let (hi, lo) = v.split_value();
553 v1::Decimal128 { hi, lo }
554}
555
556pub fn pb_value_to_value_ref<'a>(
557 value: &'a v1::Value,
558 datatype_ext: &'a Option<ColumnDataTypeExtension>,
559) -> ValueRef<'a> {
560 let Some(value) = &value.value_data else {
561 return ValueRef::Null;
562 };
563
564 match value {
565 ValueData::I8Value(v) => ValueRef::Int8(*v as i8),
566 ValueData::I16Value(v) => ValueRef::Int16(*v as i16),
567 ValueData::I32Value(v) => ValueRef::Int32(*v),
568 ValueData::I64Value(v) => ValueRef::Int64(*v),
569 ValueData::U8Value(v) => ValueRef::UInt8(*v as u8),
570 ValueData::U16Value(v) => ValueRef::UInt16(*v as u16),
571 ValueData::U32Value(v) => ValueRef::UInt32(*v),
572 ValueData::U64Value(v) => ValueRef::UInt64(*v),
573 ValueData::F32Value(f) => ValueRef::Float32(OrderedF32::from(*f)),
574 ValueData::F64Value(f) => ValueRef::Float64(OrderedF64::from(*f)),
575 ValueData::BoolValue(b) => ValueRef::Boolean(*b),
576 ValueData::BinaryValue(bytes) => ValueRef::Binary(bytes.as_slice()),
577 ValueData::StringValue(string) => ValueRef::String(string.as_str()),
578 ValueData::DateValue(d) => ValueRef::Date(Date::from(*d)),
579 ValueData::TimestampSecondValue(t) => ValueRef::Timestamp(Timestamp::new_second(*t)),
580 ValueData::TimestampMillisecondValue(t) => {
581 ValueRef::Timestamp(Timestamp::new_millisecond(*t))
582 }
583 ValueData::DatetimeValue(t) | ValueData::TimestampMicrosecondValue(t) => {
584 ValueRef::Timestamp(Timestamp::new_microsecond(*t))
585 }
586 ValueData::TimestampNanosecondValue(t) => {
587 ValueRef::Timestamp(Timestamp::new_nanosecond(*t))
588 }
589 ValueData::TimeSecondValue(t) => ValueRef::Time(Time::new_second(*t)),
590 ValueData::TimeMillisecondValue(t) => ValueRef::Time(Time::new_millisecond(*t)),
591 ValueData::TimeMicrosecondValue(t) => ValueRef::Time(Time::new_microsecond(*t)),
592 ValueData::TimeNanosecondValue(t) => ValueRef::Time(Time::new_nanosecond(*t)),
593 ValueData::IntervalYearMonthValue(v) => {
594 ValueRef::IntervalYearMonth(IntervalYearMonth::from_i32(*v))
595 }
596 ValueData::IntervalDayTimeValue(v) => {
597 ValueRef::IntervalDayTime(IntervalDayTime::from_i64(*v))
598 }
599 ValueData::IntervalMonthDayNanoValue(v) => {
600 let interval = IntervalMonthDayNano::new(v.months, v.days, v.nanoseconds);
601 ValueRef::IntervalMonthDayNano(interval)
602 }
603 ValueData::Decimal128Value(v) => {
604 if let Some(TypeExt::DecimalType(d)) = datatype_ext
606 .as_ref()
607 .and_then(|column_ext| column_ext.type_ext.as_ref())
608 {
609 ValueRef::Decimal128(Decimal128::from_value_precision_scale(
610 v.hi,
611 v.lo,
612 d.precision as u8,
613 d.scale as i8,
614 ))
615 } else {
616 ValueRef::Decimal128(Decimal128::from_value_precision_scale(
618 v.hi,
619 v.lo,
620 DECIMAL128_MAX_PRECISION,
621 DECIMAL128_DEFAULT_SCALE,
622 ))
623 }
624 }
625 }
626}
627
628pub fn pb_values_to_vector_ref(data_type: &ConcreteDataType, values: Values) -> VectorRef {
629 match data_type {
630 ConcreteDataType::Boolean(_) => Arc::new(BooleanVector::from(values.bool_values)),
631 ConcreteDataType::Int8(_) => Arc::new(PrimitiveVector::<Int8Type>::from_iter_values(
632 values.i8_values.into_iter().map(|x| x as i8),
633 )),
634 ConcreteDataType::Int16(_) => Arc::new(PrimitiveVector::<Int16Type>::from_iter_values(
635 values.i16_values.into_iter().map(|x| x as i16),
636 )),
637 ConcreteDataType::Int32(_) => Arc::new(Int32Vector::from_vec(values.i32_values)),
638 ConcreteDataType::Int64(_) => Arc::new(Int64Vector::from_vec(values.i64_values)),
639 ConcreteDataType::UInt8(_) => Arc::new(PrimitiveVector::<UInt8Type>::from_iter_values(
640 values.u8_values.into_iter().map(|x| x as u8),
641 )),
642 ConcreteDataType::UInt16(_) => Arc::new(PrimitiveVector::<UInt16Type>::from_iter_values(
643 values.u16_values.into_iter().map(|x| x as u16),
644 )),
645 ConcreteDataType::UInt32(_) => Arc::new(UInt32Vector::from_vec(values.u32_values)),
646 ConcreteDataType::UInt64(_) => Arc::new(UInt64Vector::from_vec(values.u64_values)),
647 ConcreteDataType::Float32(_) => Arc::new(Float32Vector::from_vec(values.f32_values)),
648 ConcreteDataType::Float64(_) => Arc::new(Float64Vector::from_vec(values.f64_values)),
649 ConcreteDataType::Binary(_) => Arc::new(BinaryVector::from(values.binary_values)),
650 ConcreteDataType::String(_) => Arc::new(StringVector::from_vec(values.string_values)),
651 ConcreteDataType::Date(_) => Arc::new(DateVector::from_vec(values.date_values)),
652 ConcreteDataType::Timestamp(unit) => match unit {
653 TimestampType::Second(_) => Arc::new(TimestampSecondVector::from_vec(
654 values.timestamp_second_values,
655 )),
656 TimestampType::Millisecond(_) => Arc::new(TimestampMillisecondVector::from_vec(
657 values.timestamp_millisecond_values,
658 )),
659 TimestampType::Microsecond(_) => Arc::new(TimestampMicrosecondVector::from_vec(
660 values.timestamp_microsecond_values,
661 )),
662 TimestampType::Nanosecond(_) => Arc::new(TimestampNanosecondVector::from_vec(
663 values.timestamp_nanosecond_values,
664 )),
665 },
666 ConcreteDataType::Time(unit) => match unit {
667 TimeType::Second(_) => Arc::new(TimeSecondVector::from_iter_values(
668 values.time_second_values.iter().map(|x| *x as i32),
669 )),
670 TimeType::Millisecond(_) => Arc::new(TimeMillisecondVector::from_iter_values(
671 values.time_millisecond_values.iter().map(|x| *x as i32),
672 )),
673 TimeType::Microsecond(_) => Arc::new(TimeMicrosecondVector::from_vec(
674 values.time_microsecond_values,
675 )),
676 TimeType::Nanosecond(_) => Arc::new(TimeNanosecondVector::from_vec(
677 values.time_nanosecond_values,
678 )),
679 },
680
681 ConcreteDataType::Interval(unit) => match unit {
682 IntervalType::YearMonth(_) => Arc::new(IntervalYearMonthVector::from_vec(
683 values.interval_year_month_values,
684 )),
685 IntervalType::DayTime(_) => Arc::new(IntervalDayTimeVector::from_iter_values(
686 values
687 .interval_day_time_values
688 .iter()
689 .map(|x| IntervalDayTime::from_i64(*x).into()),
690 )),
691 IntervalType::MonthDayNano(_) => {
692 Arc::new(IntervalMonthDayNanoVector::from_iter_values(
693 values
694 .interval_month_day_nano_values
695 .iter()
696 .map(|x| IntervalMonthDayNano::new(x.months, x.days, x.nanoseconds).into()),
697 ))
698 }
699 },
700 ConcreteDataType::Decimal128(d) => Arc::new(Decimal128Vector::from_values(
701 values.decimal128_values.iter().map(|x| {
702 Decimal128::from_value_precision_scale(x.hi, x.lo, d.precision(), d.scale()).into()
703 }),
704 )),
705 ConcreteDataType::Vector(_) => Arc::new(BinaryVector::from_vec(values.binary_values)),
706 ConcreteDataType::Null(_)
707 | ConcreteDataType::List(_)
708 | ConcreteDataType::Struct(_)
709 | ConcreteDataType::Dictionary(_)
710 | ConcreteDataType::Duration(_)
711 | ConcreteDataType::Json(_) => {
712 unreachable!()
713 }
714 }
715}
716
717pub fn pb_values_to_values(data_type: &ConcreteDataType, values: Values) -> Vec<Value> {
718 match data_type {
719 ConcreteDataType::Int64(_) => values
720 .i64_values
721 .into_iter()
722 .map(|val| val.into())
723 .collect(),
724 ConcreteDataType::Float64(_) => values
725 .f64_values
726 .into_iter()
727 .map(|val| val.into())
728 .collect(),
729 ConcreteDataType::String(_) => values
730 .string_values
731 .into_iter()
732 .map(|val| val.into())
733 .collect(),
734 ConcreteDataType::Boolean(_) => values
735 .bool_values
736 .into_iter()
737 .map(|val| val.into())
738 .collect(),
739 ConcreteDataType::Int8(_) => values
740 .i8_values
741 .into_iter()
742 .map(|val| (val as i8).into())
744 .collect(),
745 ConcreteDataType::Int16(_) => values
746 .i16_values
747 .into_iter()
748 .map(|val| (val as i16).into())
750 .collect(),
751 ConcreteDataType::Int32(_) => values
752 .i32_values
753 .into_iter()
754 .map(|val| val.into())
755 .collect(),
756 ConcreteDataType::UInt8(_) => values
757 .u8_values
758 .into_iter()
759 .map(|val| (val as u8).into())
761 .collect(),
762 ConcreteDataType::UInt16(_) => values
763 .u16_values
764 .into_iter()
765 .map(|val| (val as u16).into())
767 .collect(),
768 ConcreteDataType::UInt32(_) => values
769 .u32_values
770 .into_iter()
771 .map(|val| val.into())
772 .collect(),
773 ConcreteDataType::UInt64(_) => values
774 .u64_values
775 .into_iter()
776 .map(|val| val.into())
777 .collect(),
778 ConcreteDataType::Float32(_) => values
779 .f32_values
780 .into_iter()
781 .map(|val| val.into())
782 .collect(),
783 ConcreteDataType::Binary(_) => values
784 .binary_values
785 .into_iter()
786 .map(|val| val.into())
787 .collect(),
788 ConcreteDataType::Date(_) => values
789 .date_values
790 .into_iter()
791 .map(|v| Value::Date(v.into()))
792 .collect(),
793 ConcreteDataType::Timestamp(TimestampType::Second(_)) => values
794 .timestamp_second_values
795 .into_iter()
796 .map(|v| Value::Timestamp(Timestamp::new_second(v)))
797 .collect(),
798 ConcreteDataType::Timestamp(TimestampType::Millisecond(_)) => values
799 .timestamp_millisecond_values
800 .into_iter()
801 .map(|v| Value::Timestamp(Timestamp::new_millisecond(v)))
802 .collect(),
803 ConcreteDataType::Timestamp(TimestampType::Microsecond(_)) => values
804 .timestamp_microsecond_values
805 .into_iter()
806 .map(|v| Value::Timestamp(Timestamp::new_microsecond(v)))
807 .collect(),
808 ConcreteDataType::Timestamp(TimestampType::Nanosecond(_)) => values
809 .timestamp_nanosecond_values
810 .into_iter()
811 .map(|v| Value::Timestamp(Timestamp::new_nanosecond(v)))
812 .collect(),
813 ConcreteDataType::Time(TimeType::Second(_)) => values
814 .time_second_values
815 .into_iter()
816 .map(|v| Value::Time(Time::new_second(v)))
817 .collect(),
818 ConcreteDataType::Time(TimeType::Millisecond(_)) => values
819 .time_millisecond_values
820 .into_iter()
821 .map(|v| Value::Time(Time::new_millisecond(v)))
822 .collect(),
823 ConcreteDataType::Time(TimeType::Microsecond(_)) => values
824 .time_microsecond_values
825 .into_iter()
826 .map(|v| Value::Time(Time::new_microsecond(v)))
827 .collect(),
828 ConcreteDataType::Time(TimeType::Nanosecond(_)) => values
829 .time_nanosecond_values
830 .into_iter()
831 .map(|v| Value::Time(Time::new_nanosecond(v)))
832 .collect(),
833
834 ConcreteDataType::Interval(IntervalType::YearMonth(_)) => values
835 .interval_year_month_values
836 .into_iter()
837 .map(|v| Value::IntervalYearMonth(IntervalYearMonth::from_i32(v)))
838 .collect(),
839 ConcreteDataType::Interval(IntervalType::DayTime(_)) => values
840 .interval_day_time_values
841 .into_iter()
842 .map(|v| Value::IntervalDayTime(IntervalDayTime::from_i64(v)))
843 .collect(),
844 ConcreteDataType::Interval(IntervalType::MonthDayNano(_)) => values
845 .interval_month_day_nano_values
846 .into_iter()
847 .map(|v| {
848 Value::IntervalMonthDayNano(IntervalMonthDayNano::new(
849 v.months,
850 v.days,
851 v.nanoseconds,
852 ))
853 })
854 .collect(),
855 ConcreteDataType::Decimal128(d) => values
856 .decimal128_values
857 .into_iter()
858 .map(|v| {
859 Value::Decimal128(Decimal128::from_value_precision_scale(
860 v.hi,
861 v.lo,
862 d.precision(),
863 d.scale(),
864 ))
865 })
866 .collect(),
867 ConcreteDataType::Vector(_) => values.binary_values.into_iter().map(|v| v.into()).collect(),
868 ConcreteDataType::Null(_)
869 | ConcreteDataType::List(_)
870 | ConcreteDataType::Struct(_)
871 | ConcreteDataType::Dictionary(_)
872 | ConcreteDataType::Duration(_)
873 | ConcreteDataType::Json(_) => {
874 unreachable!()
875 }
876 }
877}
878
879pub fn is_semantic_type_eq(type_value: i32, semantic_type: SemanticType) -> bool {
881 type_value == semantic_type as i32
882}
883
884pub fn is_column_type_value_eq(
886 type_value: i32,
887 type_extension: Option<ColumnDataTypeExtension>,
888 expect_type: &ConcreteDataType,
889) -> bool {
890 ColumnDataTypeWrapper::try_new(type_value, type_extension)
891 .map(|wrapper| {
892 let datatype = ConcreteDataType::from(wrapper);
893 expect_type == &datatype
894 })
895 .unwrap_or(false)
896}
897
898pub fn to_proto_value(value: Value) -> Option<v1::Value> {
900 let proto_value = match value {
901 Value::Null => v1::Value { value_data: None },
902 Value::Boolean(v) => v1::Value {
903 value_data: Some(ValueData::BoolValue(v)),
904 },
905 Value::UInt8(v) => v1::Value {
906 value_data: Some(ValueData::U8Value(v.into())),
907 },
908 Value::UInt16(v) => v1::Value {
909 value_data: Some(ValueData::U16Value(v.into())),
910 },
911 Value::UInt32(v) => v1::Value {
912 value_data: Some(ValueData::U32Value(v)),
913 },
914 Value::UInt64(v) => v1::Value {
915 value_data: Some(ValueData::U64Value(v)),
916 },
917 Value::Int8(v) => v1::Value {
918 value_data: Some(ValueData::I8Value(v.into())),
919 },
920 Value::Int16(v) => v1::Value {
921 value_data: Some(ValueData::I16Value(v.into())),
922 },
923 Value::Int32(v) => v1::Value {
924 value_data: Some(ValueData::I32Value(v)),
925 },
926 Value::Int64(v) => v1::Value {
927 value_data: Some(ValueData::I64Value(v)),
928 },
929 Value::Float32(v) => v1::Value {
930 value_data: Some(ValueData::F32Value(*v)),
931 },
932 Value::Float64(v) => v1::Value {
933 value_data: Some(ValueData::F64Value(*v)),
934 },
935 Value::String(v) => v1::Value {
936 value_data: Some(ValueData::StringValue(v.as_utf8().to_string())),
937 },
938 Value::Binary(v) => v1::Value {
939 value_data: Some(ValueData::BinaryValue(v.to_vec())),
940 },
941 Value::Date(v) => v1::Value {
942 value_data: Some(ValueData::DateValue(v.val())),
943 },
944 Value::Timestamp(v) => match v.unit() {
945 TimeUnit::Second => v1::Value {
946 value_data: Some(ValueData::TimestampSecondValue(v.value())),
947 },
948 TimeUnit::Millisecond => v1::Value {
949 value_data: Some(ValueData::TimestampMillisecondValue(v.value())),
950 },
951 TimeUnit::Microsecond => v1::Value {
952 value_data: Some(ValueData::TimestampMicrosecondValue(v.value())),
953 },
954 TimeUnit::Nanosecond => v1::Value {
955 value_data: Some(ValueData::TimestampNanosecondValue(v.value())),
956 },
957 },
958 Value::Time(v) => match v.unit() {
959 TimeUnit::Second => v1::Value {
960 value_data: Some(ValueData::TimeSecondValue(v.value())),
961 },
962 TimeUnit::Millisecond => v1::Value {
963 value_data: Some(ValueData::TimeMillisecondValue(v.value())),
964 },
965 TimeUnit::Microsecond => v1::Value {
966 value_data: Some(ValueData::TimeMicrosecondValue(v.value())),
967 },
968 TimeUnit::Nanosecond => v1::Value {
969 value_data: Some(ValueData::TimeNanosecondValue(v.value())),
970 },
971 },
972 Value::IntervalYearMonth(v) => v1::Value {
973 value_data: Some(ValueData::IntervalYearMonthValue(v.to_i32())),
974 },
975 Value::IntervalDayTime(v) => v1::Value {
976 value_data: Some(ValueData::IntervalDayTimeValue(v.to_i64())),
977 },
978 Value::IntervalMonthDayNano(v) => v1::Value {
979 value_data: Some(ValueData::IntervalMonthDayNanoValue(
980 convert_month_day_nano_to_pb(v),
981 )),
982 },
983 Value::Decimal128(v) => v1::Value {
984 value_data: Some(ValueData::Decimal128Value(convert_to_pb_decimal128(v))),
985 },
986 Value::List(_) | Value::Duration(_) => return None,
987 };
988
989 Some(proto_value)
990}
991
992pub fn proto_value_type(value: &v1::Value) -> Option<ColumnDataType> {
996 let value_type = match value.value_data.as_ref()? {
997 ValueData::I8Value(_) => ColumnDataType::Int8,
998 ValueData::I16Value(_) => ColumnDataType::Int16,
999 ValueData::I32Value(_) => ColumnDataType::Int32,
1000 ValueData::I64Value(_) => ColumnDataType::Int64,
1001 ValueData::U8Value(_) => ColumnDataType::Uint8,
1002 ValueData::U16Value(_) => ColumnDataType::Uint16,
1003 ValueData::U32Value(_) => ColumnDataType::Uint32,
1004 ValueData::U64Value(_) => ColumnDataType::Uint64,
1005 ValueData::F32Value(_) => ColumnDataType::Float32,
1006 ValueData::F64Value(_) => ColumnDataType::Float64,
1007 ValueData::BoolValue(_) => ColumnDataType::Boolean,
1008 ValueData::BinaryValue(_) => ColumnDataType::Binary,
1009 ValueData::StringValue(_) => ColumnDataType::String,
1010 ValueData::DateValue(_) => ColumnDataType::Date,
1011 ValueData::DatetimeValue(_) => ColumnDataType::Datetime,
1012 ValueData::TimestampSecondValue(_) => ColumnDataType::TimestampSecond,
1013 ValueData::TimestampMillisecondValue(_) => ColumnDataType::TimestampMillisecond,
1014 ValueData::TimestampMicrosecondValue(_) => ColumnDataType::TimestampMicrosecond,
1015 ValueData::TimestampNanosecondValue(_) => ColumnDataType::TimestampNanosecond,
1016 ValueData::TimeSecondValue(_) => ColumnDataType::TimeSecond,
1017 ValueData::TimeMillisecondValue(_) => ColumnDataType::TimeMillisecond,
1018 ValueData::TimeMicrosecondValue(_) => ColumnDataType::TimeMicrosecond,
1019 ValueData::TimeNanosecondValue(_) => ColumnDataType::TimeNanosecond,
1020 ValueData::IntervalYearMonthValue(_) => ColumnDataType::IntervalYearMonth,
1021 ValueData::IntervalDayTimeValue(_) => ColumnDataType::IntervalDayTime,
1022 ValueData::IntervalMonthDayNanoValue(_) => ColumnDataType::IntervalMonthDayNano,
1023 ValueData::Decimal128Value(_) => ColumnDataType::Decimal128,
1024 };
1025 Some(value_type)
1026}
1027
1028pub fn vectors_to_rows<'a>(
1029 columns: impl Iterator<Item = &'a VectorRef>,
1030 row_count: usize,
1031) -> Vec<Row> {
1032 let mut rows = vec![Row { values: vec![] }; row_count];
1033 for column in columns {
1034 for (row_index, row) in rows.iter_mut().enumerate() {
1035 row.values.push(value_to_grpc_value(column.get(row_index)))
1036 }
1037 }
1038
1039 rows
1040}
1041
1042pub fn value_to_grpc_value(value: Value) -> GrpcValue {
1043 GrpcValue {
1044 value_data: match value {
1045 Value::Null => None,
1046 Value::Boolean(v) => Some(ValueData::BoolValue(v)),
1047 Value::UInt8(v) => Some(ValueData::U8Value(v as _)),
1048 Value::UInt16(v) => Some(ValueData::U16Value(v as _)),
1049 Value::UInt32(v) => Some(ValueData::U32Value(v)),
1050 Value::UInt64(v) => Some(ValueData::U64Value(v)),
1051 Value::Int8(v) => Some(ValueData::I8Value(v as _)),
1052 Value::Int16(v) => Some(ValueData::I16Value(v as _)),
1053 Value::Int32(v) => Some(ValueData::I32Value(v)),
1054 Value::Int64(v) => Some(ValueData::I64Value(v)),
1055 Value::Float32(v) => Some(ValueData::F32Value(*v)),
1056 Value::Float64(v) => Some(ValueData::F64Value(*v)),
1057 Value::String(v) => Some(ValueData::StringValue(v.into_string())),
1058 Value::Binary(v) => Some(ValueData::BinaryValue(v.to_vec())),
1059 Value::Date(v) => Some(ValueData::DateValue(v.val())),
1060 Value::Timestamp(v) => Some(match v.unit() {
1061 TimeUnit::Second => ValueData::TimestampSecondValue(v.value()),
1062 TimeUnit::Millisecond => ValueData::TimestampMillisecondValue(v.value()),
1063 TimeUnit::Microsecond => ValueData::TimestampMicrosecondValue(v.value()),
1064 TimeUnit::Nanosecond => ValueData::TimestampNanosecondValue(v.value()),
1065 }),
1066 Value::Time(v) => Some(match v.unit() {
1067 TimeUnit::Second => ValueData::TimeSecondValue(v.value()),
1068 TimeUnit::Millisecond => ValueData::TimeMillisecondValue(v.value()),
1069 TimeUnit::Microsecond => ValueData::TimeMicrosecondValue(v.value()),
1070 TimeUnit::Nanosecond => ValueData::TimeNanosecondValue(v.value()),
1071 }),
1072 Value::IntervalYearMonth(v) => Some(ValueData::IntervalYearMonthValue(v.to_i32())),
1073 Value::IntervalDayTime(v) => Some(ValueData::IntervalDayTimeValue(v.to_i64())),
1074 Value::IntervalMonthDayNano(v) => Some(ValueData::IntervalMonthDayNanoValue(
1075 convert_month_day_nano_to_pb(v),
1076 )),
1077 Value::Decimal128(v) => Some(ValueData::Decimal128Value(convert_to_pb_decimal128(v))),
1078 Value::List(_) | Value::Duration(_) => unreachable!(),
1079 },
1080 }
1081}
1082
1083pub fn from_pb_time_unit(unit: v1::TimeUnit) -> TimeUnit {
1084 match unit {
1085 v1::TimeUnit::Second => TimeUnit::Second,
1086 v1::TimeUnit::Millisecond => TimeUnit::Millisecond,
1087 v1::TimeUnit::Microsecond => TimeUnit::Microsecond,
1088 v1::TimeUnit::Nanosecond => TimeUnit::Nanosecond,
1089 }
1090}
1091
1092pub fn to_pb_time_unit(unit: TimeUnit) -> v1::TimeUnit {
1093 match unit {
1094 TimeUnit::Second => v1::TimeUnit::Second,
1095 TimeUnit::Millisecond => v1::TimeUnit::Millisecond,
1096 TimeUnit::Microsecond => v1::TimeUnit::Microsecond,
1097 TimeUnit::Nanosecond => v1::TimeUnit::Nanosecond,
1098 }
1099}
1100
1101pub fn from_pb_time_ranges(time_ranges: v1::TimeRanges) -> Result<Vec<(Timestamp, Timestamp)>> {
1102 if time_ranges.time_ranges.is_empty() {
1103 return Ok(vec![]);
1104 }
1105 let proto_time_unit = v1::TimeUnit::try_from(time_ranges.time_unit).map_err(|_| {
1106 InvalidTimeUnitSnafu {
1107 time_unit: time_ranges.time_unit,
1108 }
1109 .build()
1110 })?;
1111 let time_unit = from_pb_time_unit(proto_time_unit);
1112 Ok(time_ranges
1113 .time_ranges
1114 .into_iter()
1115 .map(|r| {
1116 (
1117 Timestamp::new(r.start, time_unit),
1118 Timestamp::new(r.end, time_unit),
1119 )
1120 })
1121 .collect())
1122}
1123
1124pub fn to_pb_time_ranges(time_ranges: &[(Timestamp, Timestamp)]) -> Result<v1::TimeRanges> {
1128 let is_same_time_unit = time_ranges.windows(2).all(|x| {
1129 x[0].0.unit() == x[1].0.unit()
1130 && x[0].1.unit() == x[1].1.unit()
1131 && x[0].0.unit() == x[0].1.unit()
1132 });
1133
1134 if !is_same_time_unit {
1135 let all_time_units: Vec<_> = time_ranges
1136 .iter()
1137 .map(|(s, e)| [s.unit(), e.unit()])
1138 .clone()
1139 .flatten()
1140 .collect::<HashSet<_>>()
1141 .into_iter()
1142 .collect();
1143 InconsistentTimeUnitSnafu {
1144 units: all_time_units,
1145 }
1146 .fail()?
1147 }
1148
1149 let mut pb_time_ranges = v1::TimeRanges {
1150 time_unit: v1::TimeUnit::Millisecond as i32,
1152 time_ranges: Vec::with_capacity(time_ranges.len()),
1153 };
1154 if let Some((start, _end)) = time_ranges.first() {
1155 pb_time_ranges.time_unit = to_pb_time_unit(start.unit()) as i32;
1156 }
1157 for (start, end) in time_ranges {
1158 pb_time_ranges.time_ranges.push(v1::TimeRange {
1159 start: start.value(),
1160 end: end.value(),
1161 });
1162 }
1163 Ok(pb_time_ranges)
1164}
1165
1166#[cfg(test)]
1167mod tests {
1168 use std::sync::Arc;
1169
1170 use common_time::interval::IntervalUnit;
1171 use datatypes::types::{
1172 Int32Type, IntervalDayTimeType, IntervalMonthDayNanoType, IntervalYearMonthType,
1173 TimeMillisecondType, TimeSecondType, TimestampMillisecondType, TimestampSecondType,
1174 UInt32Type,
1175 };
1176 use datatypes::vectors::{
1177 BooleanVector, IntervalDayTimeVector, IntervalMonthDayNanoVector, IntervalYearMonthVector,
1178 TimeMicrosecondVector, TimeMillisecondVector, TimeNanosecondVector, TimeSecondVector,
1179 TimestampMicrosecondVector, TimestampMillisecondVector, TimestampNanosecondVector,
1180 TimestampSecondVector, Vector,
1181 };
1182 use paste::paste;
1183
1184 use super::*;
1185
1186 #[test]
1187 fn test_values_with_capacity() {
1188 let values = values_with_capacity(ColumnDataType::Int8, 2);
1189 let values = values.i8_values;
1190 assert_eq!(2, values.capacity());
1191
1192 let values = values_with_capacity(ColumnDataType::Int32, 2);
1193 let values = values.i32_values;
1194 assert_eq!(2, values.capacity());
1195
1196 let values = values_with_capacity(ColumnDataType::Int64, 2);
1197 let values = values.i64_values;
1198 assert_eq!(2, values.capacity());
1199
1200 let values = values_with_capacity(ColumnDataType::Uint8, 2);
1201 let values = values.u8_values;
1202 assert_eq!(2, values.capacity());
1203
1204 let values = values_with_capacity(ColumnDataType::Uint32, 2);
1205 let values = values.u32_values;
1206 assert_eq!(2, values.capacity());
1207
1208 let values = values_with_capacity(ColumnDataType::Uint64, 2);
1209 let values = values.u64_values;
1210 assert_eq!(2, values.capacity());
1211
1212 let values = values_with_capacity(ColumnDataType::Float32, 2);
1213 let values = values.f32_values;
1214 assert_eq!(2, values.capacity());
1215
1216 let values = values_with_capacity(ColumnDataType::Float64, 2);
1217 let values = values.f64_values;
1218 assert_eq!(2, values.capacity());
1219
1220 let values = values_with_capacity(ColumnDataType::Binary, 2);
1221 let values = values.binary_values;
1222 assert_eq!(2, values.capacity());
1223
1224 let values = values_with_capacity(ColumnDataType::Boolean, 2);
1225 let values = values.bool_values;
1226 assert_eq!(2, values.capacity());
1227
1228 let values = values_with_capacity(ColumnDataType::String, 2);
1229 let values = values.string_values;
1230 assert_eq!(2, values.capacity());
1231
1232 let values = values_with_capacity(ColumnDataType::Date, 2);
1233 let values = values.date_values;
1234 assert_eq!(2, values.capacity());
1235
1236 let values = values_with_capacity(ColumnDataType::Datetime, 2);
1237 let values = values.datetime_values;
1238 assert_eq!(2, values.capacity());
1239
1240 let values = values_with_capacity(ColumnDataType::TimestampMillisecond, 2);
1241 let values = values.timestamp_millisecond_values;
1242 assert_eq!(2, values.capacity());
1243
1244 let values = values_with_capacity(ColumnDataType::TimeMillisecond, 2);
1245 let values = values.time_millisecond_values;
1246 assert_eq!(2, values.capacity());
1247
1248 let values = values_with_capacity(ColumnDataType::IntervalDayTime, 2);
1249 let values = values.interval_day_time_values;
1250 assert_eq!(2, values.capacity());
1251
1252 let values = values_with_capacity(ColumnDataType::IntervalMonthDayNano, 2);
1253 let values = values.interval_month_day_nano_values;
1254 assert_eq!(2, values.capacity());
1255
1256 let values = values_with_capacity(ColumnDataType::Decimal128, 2);
1257 let values = values.decimal128_values;
1258 assert_eq!(2, values.capacity());
1259
1260 let values = values_with_capacity(ColumnDataType::Vector, 2);
1261 let values = values.binary_values;
1262 assert_eq!(2, values.capacity());
1263 }
1264
1265 #[test]
1266 fn test_concrete_datatype_from_column_datatype() {
1267 assert_eq!(
1268 ConcreteDataType::boolean_datatype(),
1269 ColumnDataTypeWrapper::boolean_datatype().into()
1270 );
1271 assert_eq!(
1272 ConcreteDataType::int8_datatype(),
1273 ColumnDataTypeWrapper::int8_datatype().into()
1274 );
1275 assert_eq!(
1276 ConcreteDataType::int16_datatype(),
1277 ColumnDataTypeWrapper::int16_datatype().into()
1278 );
1279 assert_eq!(
1280 ConcreteDataType::int32_datatype(),
1281 ColumnDataTypeWrapper::int32_datatype().into()
1282 );
1283 assert_eq!(
1284 ConcreteDataType::int64_datatype(),
1285 ColumnDataTypeWrapper::int64_datatype().into()
1286 );
1287 assert_eq!(
1288 ConcreteDataType::uint8_datatype(),
1289 ColumnDataTypeWrapper::uint8_datatype().into()
1290 );
1291 assert_eq!(
1292 ConcreteDataType::uint16_datatype(),
1293 ColumnDataTypeWrapper::uint16_datatype().into()
1294 );
1295 assert_eq!(
1296 ConcreteDataType::uint32_datatype(),
1297 ColumnDataTypeWrapper::uint32_datatype().into()
1298 );
1299 assert_eq!(
1300 ConcreteDataType::uint64_datatype(),
1301 ColumnDataTypeWrapper::uint64_datatype().into()
1302 );
1303 assert_eq!(
1304 ConcreteDataType::float32_datatype(),
1305 ColumnDataTypeWrapper::float32_datatype().into()
1306 );
1307 assert_eq!(
1308 ConcreteDataType::float64_datatype(),
1309 ColumnDataTypeWrapper::float64_datatype().into()
1310 );
1311 assert_eq!(
1312 ConcreteDataType::binary_datatype(),
1313 ColumnDataTypeWrapper::binary_datatype().into()
1314 );
1315 assert_eq!(
1316 ConcreteDataType::string_datatype(),
1317 ColumnDataTypeWrapper::string_datatype().into()
1318 );
1319 assert_eq!(
1320 ConcreteDataType::date_datatype(),
1321 ColumnDataTypeWrapper::date_datatype().into()
1322 );
1323 assert_eq!(
1324 ConcreteDataType::timestamp_microsecond_datatype(),
1325 ColumnDataTypeWrapper::datetime_datatype().into()
1326 );
1327 assert_eq!(
1328 ConcreteDataType::timestamp_millisecond_datatype(),
1329 ColumnDataTypeWrapper::timestamp_millisecond_datatype().into()
1330 );
1331 assert_eq!(
1332 ConcreteDataType::time_datatype(TimeUnit::Millisecond),
1333 ColumnDataTypeWrapper::time_millisecond_datatype().into()
1334 );
1335 assert_eq!(
1336 ConcreteDataType::interval_datatype(IntervalUnit::DayTime),
1337 ColumnDataTypeWrapper::interval_day_time_datatype().into()
1338 );
1339 assert_eq!(
1340 ConcreteDataType::interval_datatype(IntervalUnit::YearMonth),
1341 ColumnDataTypeWrapper::interval_year_month_datatype().into()
1342 );
1343 assert_eq!(
1344 ConcreteDataType::interval_datatype(IntervalUnit::MonthDayNano),
1345 ColumnDataTypeWrapper::interval_month_day_nano_datatype().into()
1346 );
1347 assert_eq!(
1348 ConcreteDataType::decimal128_datatype(10, 2),
1349 ColumnDataTypeWrapper::decimal128_datatype(10, 2).into()
1350 );
1351 assert_eq!(
1352 ConcreteDataType::vector_datatype(3),
1353 ColumnDataTypeWrapper::vector_datatype(3).into()
1354 );
1355 }
1356
1357 #[test]
1358 fn test_column_datatype_from_concrete_datatype() {
1359 assert_eq!(
1360 ColumnDataTypeWrapper::boolean_datatype(),
1361 ConcreteDataType::boolean_datatype().try_into().unwrap()
1362 );
1363 assert_eq!(
1364 ColumnDataTypeWrapper::int8_datatype(),
1365 ConcreteDataType::int8_datatype().try_into().unwrap()
1366 );
1367 assert_eq!(
1368 ColumnDataTypeWrapper::int16_datatype(),
1369 ConcreteDataType::int16_datatype().try_into().unwrap()
1370 );
1371 assert_eq!(
1372 ColumnDataTypeWrapper::int32_datatype(),
1373 ConcreteDataType::int32_datatype().try_into().unwrap()
1374 );
1375 assert_eq!(
1376 ColumnDataTypeWrapper::int64_datatype(),
1377 ConcreteDataType::int64_datatype().try_into().unwrap()
1378 );
1379 assert_eq!(
1380 ColumnDataTypeWrapper::uint8_datatype(),
1381 ConcreteDataType::uint8_datatype().try_into().unwrap()
1382 );
1383 assert_eq!(
1384 ColumnDataTypeWrapper::uint16_datatype(),
1385 ConcreteDataType::uint16_datatype().try_into().unwrap()
1386 );
1387 assert_eq!(
1388 ColumnDataTypeWrapper::uint32_datatype(),
1389 ConcreteDataType::uint32_datatype().try_into().unwrap()
1390 );
1391 assert_eq!(
1392 ColumnDataTypeWrapper::uint64_datatype(),
1393 ConcreteDataType::uint64_datatype().try_into().unwrap()
1394 );
1395 assert_eq!(
1396 ColumnDataTypeWrapper::float32_datatype(),
1397 ConcreteDataType::float32_datatype().try_into().unwrap()
1398 );
1399 assert_eq!(
1400 ColumnDataTypeWrapper::float64_datatype(),
1401 ConcreteDataType::float64_datatype().try_into().unwrap()
1402 );
1403 assert_eq!(
1404 ColumnDataTypeWrapper::binary_datatype(),
1405 ConcreteDataType::binary_datatype().try_into().unwrap()
1406 );
1407 assert_eq!(
1408 ColumnDataTypeWrapper::string_datatype(),
1409 ConcreteDataType::string_datatype().try_into().unwrap()
1410 );
1411 assert_eq!(
1412 ColumnDataTypeWrapper::date_datatype(),
1413 ConcreteDataType::date_datatype().try_into().unwrap()
1414 );
1415 assert_eq!(
1416 ColumnDataTypeWrapper::timestamp_millisecond_datatype(),
1417 ConcreteDataType::timestamp_millisecond_datatype()
1418 .try_into()
1419 .unwrap()
1420 );
1421 assert_eq!(
1422 ColumnDataTypeWrapper::interval_year_month_datatype(),
1423 ConcreteDataType::interval_datatype(IntervalUnit::YearMonth)
1424 .try_into()
1425 .unwrap()
1426 );
1427 assert_eq!(
1428 ColumnDataTypeWrapper::interval_day_time_datatype(),
1429 ConcreteDataType::interval_datatype(IntervalUnit::DayTime)
1430 .try_into()
1431 .unwrap()
1432 );
1433 assert_eq!(
1434 ColumnDataTypeWrapper::interval_month_day_nano_datatype(),
1435 ConcreteDataType::interval_datatype(IntervalUnit::MonthDayNano)
1436 .try_into()
1437 .unwrap()
1438 );
1439
1440 assert_eq!(
1441 ColumnDataTypeWrapper::decimal128_datatype(10, 2),
1442 ConcreteDataType::decimal128_datatype(10, 2)
1443 .try_into()
1444 .unwrap()
1445 );
1446 assert_eq!(
1447 ColumnDataTypeWrapper::vector_datatype(3),
1448 ConcreteDataType::vector_datatype(3).try_into().unwrap()
1449 );
1450
1451 let result: Result<ColumnDataTypeWrapper> = ConcreteDataType::null_datatype().try_into();
1452 assert!(result.is_err());
1453 assert_eq!(
1454 result.unwrap_err().to_string(),
1455 "Failed to create column datatype from Null(NullType)"
1456 );
1457
1458 let result: Result<ColumnDataTypeWrapper> =
1459 ConcreteDataType::list_datatype(ConcreteDataType::boolean_datatype()).try_into();
1460 assert!(result.is_err());
1461 assert_eq!(
1462 result.unwrap_err().to_string(),
1463 "Failed to create column datatype from List(ListType { item_type: Boolean(BooleanType) })"
1464 );
1465 }
1466
1467 #[test]
1468 fn test_column_put_timestamp_values() {
1469 let mut column = Column {
1470 column_name: "test".to_string(),
1471 semantic_type: 0,
1472 values: Some(Values {
1473 ..Default::default()
1474 }),
1475 null_mask: vec![],
1476 datatype: 0,
1477 ..Default::default()
1478 };
1479
1480 let vector = Arc::new(TimestampNanosecondVector::from_vec(vec![1, 2, 3]));
1481 push_vals(&mut column, 3, vector);
1482 assert_eq!(
1483 vec![1, 2, 3],
1484 column.values.as_ref().unwrap().timestamp_nanosecond_values
1485 );
1486
1487 let vector = Arc::new(TimestampMillisecondVector::from_vec(vec![4, 5, 6]));
1488 push_vals(&mut column, 3, vector);
1489 assert_eq!(
1490 vec![4, 5, 6],
1491 column.values.as_ref().unwrap().timestamp_millisecond_values
1492 );
1493
1494 let vector = Arc::new(TimestampMicrosecondVector::from_vec(vec![7, 8, 9]));
1495 push_vals(&mut column, 3, vector);
1496 assert_eq!(
1497 vec![7, 8, 9],
1498 column.values.as_ref().unwrap().timestamp_microsecond_values
1499 );
1500
1501 let vector = Arc::new(TimestampSecondVector::from_vec(vec![10, 11, 12]));
1502 push_vals(&mut column, 3, vector);
1503 assert_eq!(
1504 vec![10, 11, 12],
1505 column.values.as_ref().unwrap().timestamp_second_values
1506 );
1507 }
1508
1509 #[test]
1510 fn test_column_put_time_values() {
1511 let mut column = Column {
1512 column_name: "test".to_string(),
1513 semantic_type: 0,
1514 values: Some(Values {
1515 ..Default::default()
1516 }),
1517 null_mask: vec![],
1518 datatype: 0,
1519 ..Default::default()
1520 };
1521
1522 let vector = Arc::new(TimeNanosecondVector::from_vec(vec![1, 2, 3]));
1523 push_vals(&mut column, 3, vector);
1524 assert_eq!(
1525 vec![1, 2, 3],
1526 column.values.as_ref().unwrap().time_nanosecond_values
1527 );
1528
1529 let vector = Arc::new(TimeMillisecondVector::from_vec(vec![4, 5, 6]));
1530 push_vals(&mut column, 3, vector);
1531 assert_eq!(
1532 vec![4, 5, 6],
1533 column.values.as_ref().unwrap().time_millisecond_values
1534 );
1535
1536 let vector = Arc::new(TimeMicrosecondVector::from_vec(vec![7, 8, 9]));
1537 push_vals(&mut column, 3, vector);
1538 assert_eq!(
1539 vec![7, 8, 9],
1540 column.values.as_ref().unwrap().time_microsecond_values
1541 );
1542
1543 let vector = Arc::new(TimeSecondVector::from_vec(vec![10, 11, 12]));
1544 push_vals(&mut column, 3, vector);
1545 assert_eq!(
1546 vec![10, 11, 12],
1547 column.values.as_ref().unwrap().time_second_values
1548 );
1549 }
1550
1551 #[test]
1552 fn test_column_put_interval_values() {
1553 let mut column = Column {
1554 column_name: "test".to_string(),
1555 semantic_type: 0,
1556 values: Some(Values {
1557 ..Default::default()
1558 }),
1559 null_mask: vec![],
1560 datatype: 0,
1561 ..Default::default()
1562 };
1563
1564 let vector = Arc::new(IntervalYearMonthVector::from_vec(vec![1, 2, 3]));
1565 push_vals(&mut column, 3, vector);
1566 assert_eq!(
1567 vec![1, 2, 3],
1568 column.values.as_ref().unwrap().interval_year_month_values
1569 );
1570
1571 let vector = Arc::new(IntervalDayTimeVector::from_vec(vec![
1572 IntervalDayTime::new(0, 4).into(),
1573 IntervalDayTime::new(0, 5).into(),
1574 IntervalDayTime::new(0, 6).into(),
1575 ]));
1576 push_vals(&mut column, 3, vector);
1577 assert_eq!(
1578 vec![4, 5, 6],
1579 column.values.as_ref().unwrap().interval_day_time_values
1580 );
1581
1582 let vector = Arc::new(IntervalMonthDayNanoVector::from_vec(vec![
1583 IntervalMonthDayNano::new(0, 0, 7).into(),
1584 IntervalMonthDayNano::new(0, 0, 8).into(),
1585 IntervalMonthDayNano::new(0, 0, 9).into(),
1586 ]));
1587 let len = vector.len();
1588 push_vals(&mut column, 3, vector);
1589 (0..len).for_each(|i| {
1590 assert_eq!(
1591 7 + i as i64,
1592 column
1593 .values
1594 .as_ref()
1595 .unwrap()
1596 .interval_month_day_nano_values
1597 .get(i)
1598 .unwrap()
1599 .nanoseconds
1600 );
1601 });
1602 }
1603
1604 #[test]
1605 fn test_column_put_vector() {
1606 use crate::v1::SemanticType;
1607 let mut column = Column {
1609 column_name: "test".to_string(),
1610 semantic_type: SemanticType::Field as i32,
1611 values: Some(Values {
1612 bool_values: vec![false, true, true],
1613 ..Default::default()
1614 }),
1615 null_mask: vec![2],
1616 datatype: ColumnDataType::Boolean as i32,
1617 ..Default::default()
1618 };
1619 let row_count = 4;
1620
1621 let vector = Arc::new(BooleanVector::from(vec![Some(true), None, Some(false)]));
1622 push_vals(&mut column, row_count, vector);
1623 let bool_values = column.values.unwrap().bool_values;
1625 assert_eq!(vec![false, true, true, true, false], bool_values);
1626 let null_mask = column.null_mask;
1627 assert_eq!(34, null_mask[0]);
1628 }
1629
1630 #[test]
1631 fn test_convert_i128_to_interval() {
1632 let i128_val = 3;
1633 let interval = convert_month_day_nano_to_pb(IntervalMonthDayNano::from_i128(i128_val));
1634 assert_eq!(interval.months, 0);
1635 assert_eq!(interval.days, 0);
1636 assert_eq!(interval.nanoseconds, 3);
1637 }
1638
1639 #[test]
1640 fn test_convert_timestamp_values() {
1641 let actual = pb_values_to_values(
1643 &ConcreteDataType::Timestamp(TimestampType::Second(TimestampSecondType)),
1644 Values {
1645 timestamp_second_values: vec![1_i64, 2_i64, 3_i64],
1646 ..Default::default()
1647 },
1648 );
1649 let expect = vec![
1650 Value::Timestamp(Timestamp::new_second(1_i64)),
1651 Value::Timestamp(Timestamp::new_second(2_i64)),
1652 Value::Timestamp(Timestamp::new_second(3_i64)),
1653 ];
1654 assert_eq!(expect, actual);
1655
1656 let actual = pb_values_to_values(
1658 &ConcreteDataType::Timestamp(TimestampType::Millisecond(TimestampMillisecondType)),
1659 Values {
1660 timestamp_millisecond_values: vec![1_i64, 2_i64, 3_i64],
1661 ..Default::default()
1662 },
1663 );
1664 let expect = vec![
1665 Value::Timestamp(Timestamp::new_millisecond(1_i64)),
1666 Value::Timestamp(Timestamp::new_millisecond(2_i64)),
1667 Value::Timestamp(Timestamp::new_millisecond(3_i64)),
1668 ];
1669 assert_eq!(expect, actual);
1670 }
1671
1672 #[test]
1673 fn test_convert_time_values() {
1674 let actual = pb_values_to_values(
1676 &ConcreteDataType::Time(TimeType::Second(TimeSecondType)),
1677 Values {
1678 time_second_values: vec![1_i64, 2_i64, 3_i64],
1679 ..Default::default()
1680 },
1681 );
1682 let expect = vec![
1683 Value::Time(Time::new_second(1_i64)),
1684 Value::Time(Time::new_second(2_i64)),
1685 Value::Time(Time::new_second(3_i64)),
1686 ];
1687 assert_eq!(expect, actual);
1688
1689 let actual = pb_values_to_values(
1691 &ConcreteDataType::Time(TimeType::Millisecond(TimeMillisecondType)),
1692 Values {
1693 time_millisecond_values: vec![1_i64, 2_i64, 3_i64],
1694 ..Default::default()
1695 },
1696 );
1697 let expect = vec![
1698 Value::Time(Time::new_millisecond(1_i64)),
1699 Value::Time(Time::new_millisecond(2_i64)),
1700 Value::Time(Time::new_millisecond(3_i64)),
1701 ];
1702 assert_eq!(expect, actual);
1703 }
1704
1705 #[test]
1706 fn test_convert_interval_values() {
1707 let actual = pb_values_to_values(
1709 &ConcreteDataType::Interval(IntervalType::YearMonth(IntervalYearMonthType)),
1710 Values {
1711 interval_year_month_values: vec![1_i32, 2_i32, 3_i32],
1712 ..Default::default()
1713 },
1714 );
1715 let expect = vec![
1716 Value::IntervalYearMonth(IntervalYearMonth::new(1_i32)),
1717 Value::IntervalYearMonth(IntervalYearMonth::new(2_i32)),
1718 Value::IntervalYearMonth(IntervalYearMonth::new(3_i32)),
1719 ];
1720 assert_eq!(expect, actual);
1721
1722 let actual = pb_values_to_values(
1724 &ConcreteDataType::Interval(IntervalType::DayTime(IntervalDayTimeType)),
1725 Values {
1726 interval_day_time_values: vec![1_i64, 2_i64, 3_i64],
1727 ..Default::default()
1728 },
1729 );
1730 let expect = vec![
1731 Value::IntervalDayTime(IntervalDayTime::from_i64(1_i64)),
1732 Value::IntervalDayTime(IntervalDayTime::from_i64(2_i64)),
1733 Value::IntervalDayTime(IntervalDayTime::from_i64(3_i64)),
1734 ];
1735 assert_eq!(expect, actual);
1736
1737 let actual = pb_values_to_values(
1739 &ConcreteDataType::Interval(IntervalType::MonthDayNano(IntervalMonthDayNanoType)),
1740 Values {
1741 interval_month_day_nano_values: vec![
1742 v1::IntervalMonthDayNano {
1743 months: 1,
1744 days: 2,
1745 nanoseconds: 3,
1746 },
1747 v1::IntervalMonthDayNano {
1748 months: 5,
1749 days: 6,
1750 nanoseconds: 7,
1751 },
1752 v1::IntervalMonthDayNano {
1753 months: 9,
1754 days: 10,
1755 nanoseconds: 11,
1756 },
1757 ],
1758 ..Default::default()
1759 },
1760 );
1761 let expect = vec![
1762 Value::IntervalMonthDayNano(IntervalMonthDayNano::new(1, 2, 3)),
1763 Value::IntervalMonthDayNano(IntervalMonthDayNano::new(5, 6, 7)),
1764 Value::IntervalMonthDayNano(IntervalMonthDayNano::new(9, 10, 11)),
1765 ];
1766 assert_eq!(expect, actual);
1767 }
1768
1769 macro_rules! test_convert_values {
1770 ($grpc_data_type: ident, $values: expr, $concrete_data_type: ident, $expected_ret: expr) => {
1771 paste! {
1772 #[test]
1773 fn [<test_convert_ $grpc_data_type _values>]() {
1774 let values = Values {
1775 [<$grpc_data_type _values>]: $values,
1776 ..Default::default()
1777 };
1778
1779 let data_type = ConcreteDataType::[<$concrete_data_type _datatype>]();
1780 let result = pb_values_to_values(&data_type, values);
1781
1782 assert_eq!(
1783 $expected_ret,
1784 result
1785 );
1786 }
1787 }
1788 };
1789 }
1790
1791 test_convert_values!(
1792 i8,
1793 vec![1_i32, 2, 3],
1794 int8,
1795 vec![Value::Int8(1), Value::Int8(2), Value::Int8(3)]
1796 );
1797
1798 test_convert_values!(
1799 u8,
1800 vec![1_u32, 2, 3],
1801 uint8,
1802 vec![Value::UInt8(1), Value::UInt8(2), Value::UInt8(3)]
1803 );
1804
1805 test_convert_values!(
1806 i16,
1807 vec![1_i32, 2, 3],
1808 int16,
1809 vec![Value::Int16(1), Value::Int16(2), Value::Int16(3)]
1810 );
1811
1812 test_convert_values!(
1813 u16,
1814 vec![1_u32, 2, 3],
1815 uint16,
1816 vec![Value::UInt16(1), Value::UInt16(2), Value::UInt16(3)]
1817 );
1818
1819 test_convert_values!(
1820 i32,
1821 vec![1, 2, 3],
1822 int32,
1823 vec![Value::Int32(1), Value::Int32(2), Value::Int32(3)]
1824 );
1825
1826 test_convert_values!(
1827 u32,
1828 vec![1, 2, 3],
1829 uint32,
1830 vec![Value::UInt32(1), Value::UInt32(2), Value::UInt32(3)]
1831 );
1832
1833 test_convert_values!(
1834 i64,
1835 vec![1, 2, 3],
1836 int64,
1837 vec![Value::Int64(1), Value::Int64(2), Value::Int64(3)]
1838 );
1839
1840 test_convert_values!(
1841 u64,
1842 vec![1, 2, 3],
1843 uint64,
1844 vec![Value::UInt64(1), Value::UInt64(2), Value::UInt64(3)]
1845 );
1846
1847 test_convert_values!(
1848 f32,
1849 vec![1.0, 2.0, 3.0],
1850 float32,
1851 vec![
1852 Value::Float32(1.0.into()),
1853 Value::Float32(2.0.into()),
1854 Value::Float32(3.0.into())
1855 ]
1856 );
1857
1858 test_convert_values!(
1859 f64,
1860 vec![1.0, 2.0, 3.0],
1861 float64,
1862 vec![
1863 Value::Float64(1.0.into()),
1864 Value::Float64(2.0.into()),
1865 Value::Float64(3.0.into())
1866 ]
1867 );
1868
1869 test_convert_values!(
1870 string,
1871 vec!["1".to_string(), "2".to_string(), "3".to_string()],
1872 string,
1873 vec![
1874 Value::String("1".into()),
1875 Value::String("2".into()),
1876 Value::String("3".into())
1877 ]
1878 );
1879
1880 test_convert_values!(
1881 binary,
1882 vec!["1".into(), "2".into(), "3".into()],
1883 binary,
1884 vec![
1885 Value::Binary(b"1".to_vec().into()),
1886 Value::Binary(b"2".to_vec().into()),
1887 Value::Binary(b"3".to_vec().into())
1888 ]
1889 );
1890
1891 test_convert_values!(
1892 date,
1893 vec![1, 2, 3],
1894 date,
1895 vec![
1896 Value::Date(1.into()),
1897 Value::Date(2.into()),
1898 Value::Date(3.into())
1899 ]
1900 );
1901
1902 #[test]
1903 fn test_vectors_to_rows_for_different_types() {
1904 let boolean_vec = BooleanVector::from_vec(vec![true, false, true]);
1905 let int8_vec = PrimitiveVector::<Int8Type>::from_iter_values(vec![1, 2, 3]);
1906 let int32_vec = PrimitiveVector::<Int32Type>::from_iter_values(vec![100, 200, 300]);
1907 let uint8_vec = PrimitiveVector::<UInt8Type>::from_iter_values(vec![10, 20, 30]);
1908 let uint32_vec = PrimitiveVector::<UInt32Type>::from_iter_values(vec![1000, 2000, 3000]);
1909 let float32_vec = Float32Vector::from_vec(vec![1.1, 2.2, 3.3]);
1910 let date_vec = DateVector::from_vec(vec![10, 20, 30]);
1911 let string_vec = StringVector::from_vec(vec!["a", "b", "c"]);
1912
1913 let vector_refs: Vec<VectorRef> = vec![
1914 Arc::new(boolean_vec),
1915 Arc::new(int8_vec),
1916 Arc::new(int32_vec),
1917 Arc::new(uint8_vec),
1918 Arc::new(uint32_vec),
1919 Arc::new(float32_vec),
1920 Arc::new(date_vec),
1921 Arc::new(string_vec),
1922 ];
1923
1924 let result = vectors_to_rows(vector_refs.iter(), 3);
1925
1926 assert_eq!(result.len(), 3);
1927
1928 assert_eq!(result[0].values.len(), 8);
1929 let values = result[0]
1930 .values
1931 .iter()
1932 .map(|v| v.value_data.clone().unwrap())
1933 .collect::<Vec<_>>();
1934 assert_eq!(values[0], ValueData::BoolValue(true));
1935 assert_eq!(values[1], ValueData::I8Value(1));
1936 assert_eq!(values[2], ValueData::I32Value(100));
1937 assert_eq!(values[3], ValueData::U8Value(10));
1938 assert_eq!(values[4], ValueData::U32Value(1000));
1939 assert_eq!(values[5], ValueData::F32Value(1.1));
1940 assert_eq!(values[6], ValueData::DateValue(10));
1941 assert_eq!(values[7], ValueData::StringValue("a".to_string()));
1942
1943 assert_eq!(result[1].values.len(), 8);
1944 let values = result[1]
1945 .values
1946 .iter()
1947 .map(|v| v.value_data.clone().unwrap())
1948 .collect::<Vec<_>>();
1949 assert_eq!(values[0], ValueData::BoolValue(false));
1950 assert_eq!(values[1], ValueData::I8Value(2));
1951 assert_eq!(values[2], ValueData::I32Value(200));
1952 assert_eq!(values[3], ValueData::U8Value(20));
1953 assert_eq!(values[4], ValueData::U32Value(2000));
1954 assert_eq!(values[5], ValueData::F32Value(2.2));
1955 assert_eq!(values[6], ValueData::DateValue(20));
1956 assert_eq!(values[7], ValueData::StringValue("b".to_string()));
1957
1958 assert_eq!(result[2].values.len(), 8);
1959 let values = result[2]
1960 .values
1961 .iter()
1962 .map(|v| v.value_data.clone().unwrap())
1963 .collect::<Vec<_>>();
1964 assert_eq!(values[0], ValueData::BoolValue(true));
1965 assert_eq!(values[1], ValueData::I8Value(3));
1966 assert_eq!(values[2], ValueData::I32Value(300));
1967 assert_eq!(values[3], ValueData::U8Value(30));
1968 assert_eq!(values[4], ValueData::U32Value(3000));
1969 assert_eq!(values[5], ValueData::F32Value(3.3));
1970 assert_eq!(values[6], ValueData::DateValue(30));
1971 assert_eq!(values[7], ValueData::StringValue("c".to_string()));
1972 }
1973
1974 #[test]
1975 fn test_is_column_type_value_eq() {
1976 let column1 = Column {
1978 column_name: "test".to_string(),
1979 semantic_type: 0,
1980 values: Some(Values {
1981 bool_values: vec![false, true, true],
1982 ..Default::default()
1983 }),
1984 null_mask: vec![2],
1985 datatype: ColumnDataType::Boolean as i32,
1986 datatype_extension: None,
1987 options: None,
1988 };
1989 assert!(is_column_type_value_eq(
1990 column1.datatype,
1991 column1.datatype_extension,
1992 &ConcreteDataType::boolean_datatype(),
1993 ));
1994 }
1995
1996 #[test]
1997 fn test_convert_to_pb_decimal128() {
1998 let decimal = Decimal128::new(123, 3, 1);
1999 let pb_decimal = convert_to_pb_decimal128(decimal);
2000 assert_eq!(pb_decimal.lo, 123);
2001 assert_eq!(pb_decimal.hi, 0);
2002 }
2003}