1use std::sync::Arc;
16
17use bytes::Buf;
18use common_base::bytes::Bytes;
19use common_decimal::Decimal128;
20use common_recordbatch::filter::SimpleFilterEvaluator;
21use common_time::time::Time;
22use common_time::{Date, Duration, IntervalDayTime, IntervalMonthDayNano, IntervalYearMonth};
23use datatypes::data_type::ConcreteDataType;
24use datatypes::prelude::Value;
25use datatypes::types::IntervalType;
26use datatypes::value::ValueRef;
27use memcomparable::{Deserializer, Serializer};
28use paste::paste;
29use serde::{Deserialize, Serialize};
30use snafu::{ResultExt, ensure};
31use store_api::codec::PrimaryKeyEncoding;
32use store_api::metadata::{RegionMetadata, RegionMetadataRef};
33use store_api::storage::ColumnId;
34
35use crate::error::{
36 self, FieldTypeMismatchSnafu, NotSupportedFieldSnafu, Result, SerializeFieldSnafu,
37};
38use crate::key_values::KeyValue;
39use crate::primary_key_filter::DensePrimaryKeyFilter;
40use crate::row_converter::{
41 CompositeValues, PrimaryKeyCodec, PrimaryKeyCodecExt, PrimaryKeyFilter, encoded_string_len,
42};
43
44#[derive(Debug, Clone, PartialEq, Eq)]
46pub struct SortField {
47 data_type: ConcreteDataType,
48}
49
50impl SortField {
51 pub fn new(data_type: ConcreteDataType) -> Self {
52 Self { data_type }
53 }
54
55 pub fn data_type(&self) -> &ConcreteDataType {
57 &self.data_type
58 }
59
60 pub fn encode_data_type(&self) -> &ConcreteDataType {
64 match &self.data_type {
65 ConcreteDataType::Dictionary(dict_type) => dict_type.value_type(),
66 _ => &self.data_type,
67 }
68 }
69
70 pub fn estimated_size(&self) -> usize {
71 Self::estimated_size_by_type(self.encode_data_type())
72 }
73
74 fn estimated_size_by_type(data_type: &ConcreteDataType) -> usize {
75 match data_type {
76 ConcreteDataType::Boolean(_) => 2,
77 ConcreteDataType::Int8(_) | ConcreteDataType::UInt8(_) => 2,
78 ConcreteDataType::Int16(_) | ConcreteDataType::UInt16(_) => 3,
79 ConcreteDataType::Int32(_) | ConcreteDataType::UInt32(_) => 5,
80 ConcreteDataType::Int64(_) | ConcreteDataType::UInt64(_) => 9,
81 ConcreteDataType::Float32(_) => 5,
82 ConcreteDataType::Float64(_) => 9,
83 ConcreteDataType::Binary(_)
84 | ConcreteDataType::Json(_)
85 | ConcreteDataType::Vector(_) => 11,
86 ConcreteDataType::String(_) => 11, ConcreteDataType::Date(_) => 5,
88 ConcreteDataType::Timestamp(_) => 10,
89 ConcreteDataType::Time(_) => 10,
90 ConcreteDataType::Duration(_) => 10,
91 ConcreteDataType::Interval(_) => 18,
92 ConcreteDataType::Decimal128(_) => 19,
93 ConcreteDataType::Null(_)
94 | ConcreteDataType::List(_)
95 | ConcreteDataType::Struct(_)
96 | ConcreteDataType::Dictionary(_) => 0,
97 }
98 }
99
100 pub fn serialize(
102 &self,
103 serializer: &mut Serializer<&mut Vec<u8>>,
104 value: &ValueRef,
105 ) -> Result<()> {
106 Self::serialize_by_type(self.encode_data_type(), serializer, value)
107 }
108
109 fn serialize_by_type(
110 data_type: &ConcreteDataType,
111 serializer: &mut Serializer<&mut Vec<u8>>,
112 value: &ValueRef,
113 ) -> Result<()> {
114 macro_rules! cast_value_and_serialize {
115 (
116 $data_type: ident;
117 $serializer: ident;
118 $(
119 $ty: ident, $f: ident
120 ),*
121 ) => {
122 match $data_type {
123 $(
124 ConcreteDataType::$ty(_) => {
125 paste!{
126 value
127 .[<try_into_ $f>]()
128 .context(FieldTypeMismatchSnafu)?
129 .serialize($serializer)
130 .context(SerializeFieldSnafu)?;
131 }
132 }
133 )*
134 ConcreteDataType::Timestamp(_) => {
135 let timestamp = value.try_into_timestamp().context(FieldTypeMismatchSnafu)?;
136 timestamp
137 .map(|t|t.value())
138 .serialize($serializer)
139 .context(SerializeFieldSnafu)?;
140 }
141 ConcreteDataType::Interval(IntervalType::YearMonth(_)) => {
142 let interval = value.try_into_interval_year_month().context(FieldTypeMismatchSnafu)?;
143 interval.map(|i| i.to_i32())
144 .serialize($serializer)
145 .context(SerializeFieldSnafu)?;
146 }
147 ConcreteDataType::Interval(IntervalType::DayTime(_)) => {
148 let interval = value.try_into_interval_day_time().context(FieldTypeMismatchSnafu)?;
149 interval.map(|i| i.to_i64())
150 .serialize($serializer)
151 .context(SerializeFieldSnafu)?;
152 }
153 ConcreteDataType::Interval(IntervalType::MonthDayNano(_)) => {
154 let interval = value.try_into_interval_month_day_nano().context(FieldTypeMismatchSnafu)?;
155 interval.map(|i| i.to_i128())
156 .serialize($serializer)
157 .context(SerializeFieldSnafu)?;
158 }
159 ConcreteDataType::List(_) |
160 ConcreteDataType::Struct(_) |
161 ConcreteDataType::Dictionary(_) |
162 ConcreteDataType::Null(_) => {
163 return error::NotSupportedFieldSnafu {
164 data_type: $data_type.clone()
165 }.fail()
166 }
167 }
168 };
169 }
170 cast_value_and_serialize!(data_type; serializer;
171 Boolean, boolean,
172 Binary, binary,
173 Int8, i8,
174 UInt8, u8,
175 Int16, i16,
176 UInt16, u16,
177 Int32, i32,
178 UInt32, u32,
179 Int64, i64,
180 UInt64, u64,
181 Float32, f32,
182 Float64, f64,
183 String, string,
184 Date, date,
185 Time, time,
186 Duration, duration,
187 Decimal128, decimal128,
188 Json, binary,
189 Vector, binary
190 );
191
192 Ok(())
193 }
194
195 pub fn deserialize<B: Buf>(&self, deserializer: &mut Deserializer<B>) -> Result<Value> {
197 Self::deserialize_by_type(self.encode_data_type(), deserializer)
198 }
199
200 fn deserialize_by_type<B: Buf>(
201 data_type: &ConcreteDataType,
202 deserializer: &mut Deserializer<B>,
203 ) -> Result<Value> {
204 macro_rules! deserialize_and_build_value {
205 (
206 $data_type: ident;
207 $serializer: ident;
208 $(
209 $ty: ident, $f: ident
210 ),*
211 ) => {
212
213 match $data_type {
214 $(
215 ConcreteDataType::$ty(_) => {
216 Ok(Value::from(Option::<$f>::deserialize(deserializer).context(error::DeserializeFieldSnafu)?))
217 }
218 )*
219 ConcreteDataType::Binary(_) | ConcreteDataType::Json(_) | ConcreteDataType::Vector(_) => Ok(Value::from(
220 Option::<Vec<u8>>::deserialize(deserializer)
221 .context(error::DeserializeFieldSnafu)?
222 .map(Bytes::from),
223 )),
224 ConcreteDataType::Timestamp(ty) => {
225 let timestamp = Option::<i64>::deserialize(deserializer)
226 .context(error::DeserializeFieldSnafu)?
227 .map(|t|ty.create_timestamp(t));
228 Ok(Value::from(timestamp))
229 }
230 ConcreteDataType::Interval(IntervalType::YearMonth(_)) => {
231 let interval = Option::<i32>::deserialize(deserializer)
232 .context(error::DeserializeFieldSnafu)?
233 .map(IntervalYearMonth::from_i32);
234 Ok(Value::from(interval))
235 }
236 ConcreteDataType::Interval(IntervalType::DayTime(_)) => {
237 let interval = Option::<i64>::deserialize(deserializer)
238 .context(error::DeserializeFieldSnafu)?
239 .map(IntervalDayTime::from_i64);
240 Ok(Value::from(interval))
241 }
242 ConcreteDataType::Interval(IntervalType::MonthDayNano(_)) => {
243 let interval = Option::<i128>::deserialize(deserializer)
244 .context(error::DeserializeFieldSnafu)?
245 .map(IntervalMonthDayNano::from_i128);
246 Ok(Value::from(interval))
247 }
248 ConcreteDataType::List(l) => NotSupportedFieldSnafu {
249 data_type: ConcreteDataType::List(l.clone()),
250 }
251 .fail(),
252 ConcreteDataType::Struct(f) => NotSupportedFieldSnafu {
253 data_type: ConcreteDataType::Struct(f.clone()),
254 }
255 .fail(),
256 ConcreteDataType::Dictionary(d) => NotSupportedFieldSnafu {
257 data_type: ConcreteDataType::Dictionary(d.clone()),
258 }
259 .fail(),
260 ConcreteDataType::Null(n) => NotSupportedFieldSnafu {
261 data_type: ConcreteDataType::Null(n.clone()),
262 }
263 .fail(),
264 }
265 };
266 }
267 deserialize_and_build_value!(data_type; deserializer;
268 Boolean, bool,
269 Int8, i8,
270 Int16, i16,
271 Int32, i32,
272 Int64, i64,
273 UInt8, u8,
274 UInt16, u16,
275 UInt32, u32,
276 UInt64, u64,
277 Float32, f32,
278 Float64, f64,
279 String, String,
280 Date, Date,
281 Time, Time,
282 Duration, Duration,
283 Decimal128, Decimal128
284 )
285 }
286
287 pub(crate) fn skip_deserialize(
289 &self,
290 bytes: &[u8],
291 deserializer: &mut Deserializer<&[u8]>,
292 ) -> Result<usize> {
293 let pos = deserializer.position();
294 let remaining = bytes
295 .get(pos..)
296 .ok_or(memcomparable::Error::Eof)
297 .context(error::DeserializeFieldSnafu)?;
298 let len = Self::encoded_len(self.encode_data_type(), remaining)?;
299 if len > 1 && self.encode_data_type().is_boolean() && remaining[1] > 1 {
300 return Err(memcomparable::Error::InvalidBoolEncoding(remaining[1]))
301 .context(error::DeserializeFieldSnafu);
302 }
303 deserializer.advance(len);
304 Ok(len)
305 }
306
307 fn encoded_len(data_type: &ConcreteDataType, bytes: &[u8]) -> Result<usize> {
309 let marker = bytes
310 .first()
311 .copied()
312 .ok_or(memcomparable::Error::Eof)
313 .context(error::DeserializeFieldSnafu)?;
314 match marker {
315 0 => return Ok(1),
316 1 => {}
317 value => {
318 return Err(memcomparable::Error::InvalidTagEncoding(value as usize))
319 .context(error::DeserializeFieldSnafu);
320 }
321 }
322 let to_skip = match data_type {
323 ConcreteDataType::Boolean(_) => 2,
324 ConcreteDataType::Int8(_) | ConcreteDataType::UInt8(_) => 2,
325 ConcreteDataType::Int16(_) | ConcreteDataType::UInt16(_) => 3,
326 ConcreteDataType::Int32(_) | ConcreteDataType::UInt32(_) => 5,
327 ConcreteDataType::Int64(_) | ConcreteDataType::UInt64(_) => 9,
328 ConcreteDataType::Float32(_) => 5,
329 ConcreteDataType::Float64(_) => 9,
330 ConcreteDataType::Binary(_)
331 | ConcreteDataType::Json(_)
332 | ConcreteDataType::Vector(_) => {
333 return encoded_binary_len(bytes).context(error::DeserializeFieldSnafu);
335 }
336 ConcreteDataType::String(_) => {
337 return encoded_string_len(bytes).context(error::DeserializeFieldSnafu);
338 }
339 ConcreteDataType::Date(_) => 5,
340 ConcreteDataType::Timestamp(_) => 9, ConcreteDataType::Time(_) => 10, ConcreteDataType::Duration(_) => 10,
343 ConcreteDataType::Interval(IntervalType::YearMonth(_)) => 5,
344 ConcreteDataType::Interval(IntervalType::DayTime(_)) => 9,
345 ConcreteDataType::Interval(IntervalType::MonthDayNano(_)) => 17,
346 ConcreteDataType::Decimal128(_) => 19,
347 ConcreteDataType::Null(_)
348 | ConcreteDataType::List(_)
349 | ConcreteDataType::Struct(_)
350 | ConcreteDataType::Dictionary(_) => {
351 return NotSupportedFieldSnafu {
352 data_type: data_type.clone(),
353 }
354 .fail();
355 }
356 };
357 if bytes.len() < to_skip {
358 return Err(memcomparable::Error::Eof).context(error::DeserializeFieldSnafu);
359 }
360 Ok(to_skip)
361 }
362
363 fn deserialize_primitive_ref<B: Buf>(
367 data_type: &ConcreteDataType,
368 deserializer: &mut Deserializer<B>,
369 ) -> Option<Result<ValueRef<'static>>> {
370 macro_rules! decode_primitive {
371 ($($variant:ident, $native:ty),* $(,)?) => {
372 match data_type {
373 $(ConcreteDataType::$variant(_) => Some(
374 Option::<$native>::deserialize(deserializer)
375 .map(ValueRef::from)
376 .context(error::DeserializeFieldSnafu)
377 ),)*
378 _ => None,
379 }
380 };
381 }
382 decode_primitive!(
383 Boolean, bool, Int8, i8, Int16, i16, Int32, i32, Int64, i64, UInt8, u8, UInt16, u16,
384 UInt32, u32, UInt64, u64, Float32, f32, Float64, f64,
385 )
386 }
387}
388
389fn encoded_binary_len(bytes: &[u8]) -> memcomparable::Result<usize> {
391 let mut current = 1;
392 loop {
393 match bytes.get(current).copied() {
394 Some(0) => return Ok(current + 1),
395 Some(1) if bytes.get(current + 1).is_some() => current += 2,
396 Some(1) | None => return Err(memcomparable::Error::Eof),
397 Some(marker) => return Err(memcomparable::Error::InvalidSeqEncoding(marker)),
398 }
399 }
400}
401
402impl PrimaryKeyCodecExt for DensePrimaryKeyCodec {
403 fn encode_to_vec<'a, I>(&self, row: I, buffer: &mut Vec<u8>) -> Result<()>
404 where
405 I: Iterator<Item = ValueRef<'a>>,
406 {
407 self.encode_dense(row, buffer)
408 }
409}
410
411#[derive(Clone, Debug)]
413pub struct DensePrimaryKeyCodec {
414 ordered_primary_key_columns: Arc<Vec<(ColumnId, SortField)>>,
416}
417
418impl DensePrimaryKeyCodec {
419 pub fn new(metadata: &RegionMetadata) -> Self {
420 let ordered_primary_key_columns = metadata
421 .primary_key_columns()
422 .map(|c| {
423 (
424 c.column_id,
425 SortField::new(c.column_schema.data_type.clone()),
426 )
427 })
428 .collect::<Vec<_>>();
429
430 Self::with_fields(ordered_primary_key_columns)
431 }
432
433 pub fn with_fields(fields: Vec<(ColumnId, SortField)>) -> Self {
434 Self {
435 ordered_primary_key_columns: Arc::new(fields),
436 }
437 }
438
439 fn encode_dense<'a, I>(&self, row: I, buffer: &mut Vec<u8>) -> Result<()>
440 where
441 I: Iterator<Item = ValueRef<'a>>,
442 {
443 let mut serializer = Serializer::new(buffer);
444 for (idx, value) in row.enumerate() {
445 self.field_at(idx).serialize(&mut serializer, &value)?;
446 }
447 Ok(())
448 }
449
450 pub fn decode_dense(&self, bytes: &[u8]) -> Result<Vec<(ColumnId, Value)>> {
452 let mut deserializer = Deserializer::new(bytes);
453 let mut values = Vec::with_capacity(self.ordered_primary_key_columns.len());
454 for (column_id, field) in self.ordered_primary_key_columns.iter() {
455 let value = field.deserialize(&mut deserializer)?;
456 values.push((*column_id, value));
457 }
458 Ok(values)
459 }
460
461 pub fn decode_prefix_len(&self, bytes: &[u8]) -> Result<usize> {
469 let mut deserializer = Deserializer::new(bytes);
470 for (index, (_, field)) in self.ordered_primary_key_columns.iter().enumerate() {
471 if !deserializer.has_remaining() {
472 return Ok(index);
473 }
474 let start = deserializer.position();
475 let len = SortField::encoded_len(field.encode_data_type(), &bytes[start..]).map_err(
477 |source| match source {
478 error::Error::DeserializeField { .. } => error::InvalidDensePrimaryKeySnafu {
479 reason: "truncated field or invalid encoding",
480 }
481 .build(),
482 source => source,
483 },
484 )?;
485 #[cfg(any(debug_assertions, test))]
487 field.deserialize(&mut Deserializer::new(&bytes[start..start + len]))?;
488 deserializer.advance(len);
489 }
490 snafu::ensure!(
491 !deserializer.has_remaining(),
492 error::InvalidDensePrimaryKeySnafu {
493 reason: "key contains bytes beyond the primary key schema",
494 }
495 );
496 Ok(self.num_fields())
497 }
498
499 pub fn decode_dense_without_column_id(&self, bytes: &[u8]) -> Result<Vec<Value>> {
501 let mut deserializer = Deserializer::new(bytes);
502 let mut values = Vec::with_capacity(self.ordered_primary_key_columns.len());
503 for (_, field) in self.ordered_primary_key_columns.iter() {
504 let value = field.deserialize(&mut deserializer)?;
505 values.push(value);
506 }
507 Ok(values)
508 }
509
510 pub fn decode_dense_iter<'a>(
516 &'a self,
517 bytes: &'a [u8],
518 ) -> impl Iterator<Item = Result<(ColumnId, Value)>> + 'a {
519 self.ordered_primary_key_columns.iter().scan(
520 Some(Deserializer::new(bytes)),
521 move |state, (id, field)| {
522 let deserializer = state.as_mut()?;
523 let remaining = &bytes[deserializer.position()..];
524 let decoded = SortField::encoded_len(field.encode_data_type(), remaining)
525 .and_then(|_| field.deserialize(deserializer).map(|value| (*id, value)));
526 if decoded.is_err() {
527 *state = None;
528 }
529 Some(decoded)
530 },
531 )
532 }
533
534 pub fn fields(&self) -> &[(ColumnId, SortField)] {
536 &self.ordered_primary_key_columns
537 }
538
539 pub fn decode_dense_with(
543 &self,
544 bytes: &[u8],
545 value_buf: &mut Vec<u8>,
546 mut consume: impl FnMut(usize, ValueRef<'_>),
547 ) -> Result<()> {
548 let mut deserializer = Deserializer::new(bytes);
549 for (pos, (_, field)) in self.ordered_primary_key_columns.iter().enumerate() {
550 let data_type = field.encode_data_type();
551 let remaining = &bytes[deserializer.position()..];
552 SortField::encoded_len(data_type, remaining)?;
553 if data_type.is_string() && remaining[0] != 0 {
554 deserializer.advance(1);
555 deserializer
556 .read_bytes_into(value_buf)
557 .context(error::DeserializeFieldSnafu)?;
558 let value = std::str::from_utf8(value_buf).map_err(|err| {
559 error::InvalidDensePrimaryKeySnafu {
560 reason: format!("string is not valid UTF-8: {err}"),
561 }
562 .build()
563 })?;
564 consume(pos, ValueRef::String(value));
565 } else if let Some(value) =
566 SortField::deserialize_primitive_ref(data_type, &mut deserializer)
567 {
568 consume(pos, value?);
569 } else {
570 let value = field.deserialize(&mut deserializer)?;
571 consume(pos, value.as_value_ref());
572 }
573 }
574 Ok(())
575 }
576
577 fn field_at(&self, pos: usize) -> &SortField {
582 &self.ordered_primary_key_columns[pos].1
583 }
584
585 fn advance_to_value_at(
589 &self,
590 bytes: &[u8],
591 pos: usize,
592 offsets_buf: &mut Vec<usize>,
593 deserializer: &mut Deserializer<&[u8]>,
594 ) -> Result<usize> {
595 ensure!(
596 pos < self.num_fields(),
597 error::InvalidDensePrimaryKeySnafu {
598 reason: format!(
599 "field position {pos} exceeds field count {}",
600 self.num_fields()
601 ),
602 }
603 );
604 if offsets_buf.is_empty() {
605 offsets_buf.reserve_exact(self.num_fields());
608 offsets_buf.push(0);
609 }
610 let value_start = pos.min(offsets_buf.len() - 1);
613 let mut offset = offsets_buf[value_start];
614 ensure!(
615 offset <= bytes.len(),
616 error::InvalidDensePrimaryKeySnafu {
617 reason: "cached offset exceeds key length",
618 }
619 );
620 deserializer.advance(offset);
621 for i in value_start..pos {
622 offset += self.field_at(i).skip_deserialize(bytes, deserializer)?;
623 offsets_buf.push(offset);
624 }
625 Ok(offset)
626 }
627
628 #[inline]
633 pub fn decode_value_at(
634 &self,
635 bytes: &[u8],
636 pos: usize,
637 offsets_buf: &mut Vec<usize>,
638 ) -> Result<Value> {
639 let encoded = self.encoded_value_at(bytes, pos, offsets_buf)?;
640 self.field_at(pos)
641 .deserialize(&mut Deserializer::new(encoded))
642 }
643
644 #[inline]
650 pub fn encoded_value_at<'a>(
651 &self,
652 bytes: &'a [u8],
653 pos: usize,
654 offsets_buf: &mut Vec<usize>,
655 ) -> Result<&'a [u8]> {
656 let mut deserializer = Deserializer::new(bytes);
657 let offset = self.advance_to_value_at(bytes, pos, offsets_buf, &mut deserializer)?;
658
659 let len = self
660 .field_at(pos)
661 .skip_deserialize(bytes, &mut deserializer)?;
662 if offsets_buf.len() == pos + 1 && pos + 1 < self.num_fields() {
665 offsets_buf.push(offset + len);
666 }
667 Ok(&bytes[offset..offset + len])
668 }
669
670 pub fn estimated_size(&self) -> usize {
671 self.ordered_primary_key_columns
672 .iter()
673 .map(|(_, f)| f.estimated_size())
674 .sum()
675 }
676
677 pub fn num_fields(&self) -> usize {
678 self.ordered_primary_key_columns.len()
679 }
680}
681
682impl PrimaryKeyCodec for DensePrimaryKeyCodec {
683 fn encode_key_value(&self, key_value: &KeyValue, buffer: &mut Vec<u8>) -> Result<()> {
684 self.encode_dense(key_value.primary_keys(), buffer)
685 }
686
687 fn encode_values(&self, values: &[(ColumnId, Value)], buffer: &mut Vec<u8>) -> Result<()> {
688 self.encode_dense(values.iter().map(|(_, v)| v.as_value_ref()), buffer)
689 }
690
691 fn encode_value_refs(
692 &self,
693 values: &[(ColumnId, ValueRef)],
694 buffer: &mut Vec<u8>,
695 ) -> Result<()> {
696 let iter = values.iter().map(|(_, v)| v.clone());
697 self.encode_dense(iter, buffer)
698 }
699
700 fn estimated_size(&self) -> Option<usize> {
701 Some(self.estimated_size())
702 }
703
704 fn num_fields(&self) -> Option<usize> {
705 Some(self.num_fields())
706 }
707
708 fn encoding(&self) -> PrimaryKeyEncoding {
709 PrimaryKeyEncoding::Dense
710 }
711
712 fn as_dense(&self) -> Option<&DensePrimaryKeyCodec> {
713 Some(self)
714 }
715
716 fn primary_key_filter(
717 &self,
718 metadata: &RegionMetadataRef,
719 filters: Arc<Vec<SimpleFilterEvaluator>>,
720 ) -> Box<dyn PrimaryKeyFilter> {
721 Box::new(DensePrimaryKeyFilter::new(
722 metadata.clone(),
723 filters,
724 self.clone(),
725 ))
726 }
727
728 fn decode(&self, bytes: &[u8]) -> Result<CompositeValues> {
729 Ok(CompositeValues::Dense(self.decode_dense(bytes)?))
730 }
731
732 fn decode_leftmost(&self, bytes: &[u8]) -> Result<Option<Value>> {
733 let mut values = self.decode_dense(bytes)?;
735 Ok(values.pop().map(|(_, v)| v))
736 }
737}
738
739#[cfg(test)]
740mod tests {
741 use common_base::bytes::StringBytes;
742 use common_time::{IntervalDayTime, IntervalMonthDayNano, IntervalYearMonth, Timestamp};
743 use datatypes::value::Value;
744
745 use super::*;
746
747 fn check_encode_and_decode(data_types: &[ConcreteDataType], row: Vec<Value>) {
748 let encoder = DensePrimaryKeyCodec::with_fields(
749 data_types
750 .iter()
751 .map(|t| (0, SortField::new(t.clone())))
752 .collect::<Vec<_>>(),
753 );
754
755 let value_ref = row.iter().map(|v| v.as_value_ref()).collect::<Vec<_>>();
756
757 let result = encoder.encode(value_ref.iter().cloned()).unwrap();
758 let boundaries: Vec<_> = (0..=row.len())
759 .map(|count| {
760 encoder
761 .encode(value_ref[..count].iter().cloned())
762 .unwrap()
763 .len()
764 })
765 .collect();
766 for end in 0..=result.len() {
767 match boundaries.iter().position(|boundary| *boundary == end) {
768 Some(count) => {
769 assert_eq!(count, encoder.decode_prefix_len(&result[..end]).unwrap())
770 }
771 None => assert!(
772 encoder.decode_prefix_len(&result[..end]).is_err(),
773 "truncated {data_types:?} at {end}"
774 ),
775 }
776 }
777 let decoded = encoder.decode(&result).unwrap().into_dense();
778 assert_eq!(decoded, row);
779 let mut value_buf = Vec::new();
780 let mut borrowed = Vec::new();
781 encoder
782 .decode_dense_with(&result, &mut value_buf, |_, value| {
783 borrowed.push(Value::from(value))
784 })
785 .unwrap();
786 assert_eq!(borrowed, row);
787 let sequential = encoder
788 .decode_dense_iter(&result)
789 .collect::<Result<Vec<_>>>()
790 .unwrap();
791 assert_eq!(
792 sequential
793 .iter()
794 .map(|(_, value)| value)
795 .collect::<Vec<_>>(),
796 row.iter().collect::<Vec<_>>()
797 );
798 for end in 0..result.len() {
799 assert!(
800 encoder
801 .decode_dense_with(&result[..end], &mut value_buf, |_, _| {})
802 .is_err()
803 );
804 assert!(
805 encoder
806 .decode_dense_iter(&result[..end])
807 .collect::<Result<Vec<_>>>()
808 .is_err(),
809 "truncated at {end}"
810 );
811 }
812 let mut offsets = Vec::new();
816 let mut end = 0;
817 for (pos, value) in row.iter().enumerate() {
818 let encoded = encoder
819 .encoded_value_at(&result, pos, &mut offsets)
820 .unwrap();
821 assert_eq!(
822 encoder
823 .field_at(pos)
824 .deserialize(&mut Deserializer::new(encoded))
825 .unwrap(),
826 *value
827 );
828 let start = end;
829 end += encoded.len();
830 for len in start..end {
831 assert!(
832 encoder
833 .encoded_value_at(&result[..len], pos, &mut Vec::new())
834 .is_err()
835 );
836 assert!(
837 encoder
838 .decode_value_at(&result[..len], pos, &mut Vec::new())
839 .is_err()
840 );
841 if pos + 1 < row.len() {
842 assert!(
843 encoder
844 .encoded_value_at(&result[..len], pos + 1, &mut Vec::new())
845 .is_err()
846 );
847 }
848 }
849 }
850 assert_eq!(end, result.len());
851 let mut decoded = Vec::new();
852 let mut offsets = Vec::new();
853 for _ in 0..2 {
855 decoded.clear();
856 for i in 0..data_types.len() {
857 let value = encoder.decode_value_at(&result, i, &mut offsets).unwrap();
858 decoded.push(value);
859 }
860 assert_eq!(data_types.len(), offsets.len(), "offsets: {offsets:?}");
861 assert_eq!(decoded, row);
862 }
863 }
864
865 #[test]
866 fn test_decode_prefix_len_accepts_only_complete_fields() {
867 let codec = DensePrimaryKeyCodec::with_fields(vec![
868 (0, SortField::new(ConcreteDataType::string_datatype())),
869 (1, SortField::new(ConcreteDataType::int64_datatype())),
870 (2, SortField::new(ConcreteDataType::binary_datatype())),
871 (3, SortField::new(ConcreteDataType::string_datatype())),
872 ]);
873 let values = [
874 Value::from("abcdefghijk"),
875 Value::Int64(42),
876 Value::Binary(vec![0, 255, 1].into()),
877 Value::Null,
878 ];
879 let mut boundaries = vec![0];
880 let mut encoded = Vec::new();
881 for count in 1..=values.len() {
882 encoded.clear();
883 codec
884 .encode_dense(
885 values[..count].iter().map(Value::as_value_ref),
886 &mut encoded,
887 )
888 .unwrap();
889 boundaries.push(encoded.len());
890 assert_eq!(count, codec.decode_prefix_len(&encoded).unwrap());
891 }
892 for end in 0..=encoded.len() {
893 match boundaries.iter().position(|boundary| *boundary == end) {
894 Some(count) => assert_eq!(count, codec.decode_prefix_len(&encoded[..end]).unwrap()),
895 None => assert!(
896 codec.decode_prefix_len(&encoded[..end]).is_err(),
897 "truncated at {end}"
898 ),
899 }
900 }
901 encoded.push(0);
902 assert!(codec.decode_prefix_len(&encoded).is_err());
903 assert!(codec.decode_prefix_len(&[2]).is_err());
904 let empty = DensePrimaryKeyCodec::with_fields(vec![]);
905 assert_eq!(0, empty.decode_prefix_len(&[]).unwrap());
906 assert!(empty.decode_prefix_len(&[0]).is_err());
907 }
908
909 #[test]
910 fn test_prefix_len_validates_values_in_unit_tests() {
911 let codec = DensePrimaryKeyCodec::with_fields(vec![(
912 0,
913 SortField::new(ConcreteDataType::boolean_datatype()),
914 )]);
915 assert!(codec.decode_prefix_len(&[1, 2]).is_err());
918 }
919
920 #[test]
921 fn test_memcmp() {
922 let encoder = DensePrimaryKeyCodec::with_fields(vec![
923 (0, SortField::new(ConcreteDataType::string_datatype())),
924 (1, SortField::new(ConcreteDataType::int64_datatype())),
925 ]);
926 let values = [Value::String("abcdefgh".into()), Value::Int64(128)];
927 let value_ref = values.iter().map(|v| v.as_value_ref()).collect::<Vec<_>>();
928 let result = encoder.encode(value_ref.iter().cloned()).unwrap();
929
930 let decoded = encoder.decode(&result).unwrap().into_dense();
931 assert_eq!(&values, &decoded as &[Value]);
932 }
933
934 #[test]
935 fn test_memcmp_timestamp() {
936 check_encode_and_decode(
937 &[
938 ConcreteDataType::timestamp_millisecond_datatype(),
939 ConcreteDataType::int64_datatype(),
940 ],
941 vec![
942 Value::Timestamp(Timestamp::new_millisecond(42)),
943 Value::Int64(43),
944 ],
945 );
946 }
947
948 #[test]
949 fn test_memcmp_duration() {
950 check_encode_and_decode(
951 &[
952 ConcreteDataType::duration_millisecond_datatype(),
953 ConcreteDataType::int64_datatype(),
954 ],
955 vec![
956 Value::Duration(Duration::new_millisecond(44)),
957 Value::Int64(45),
958 ],
959 )
960 }
961
962 #[test]
963 fn test_memcmp_binary() {
964 check_encode_and_decode(
965 &[
966 ConcreteDataType::binary_datatype(),
967 ConcreteDataType::int64_datatype(),
968 ],
969 vec![
970 Value::Binary(Bytes::from("hello".as_bytes())),
971 Value::Int64(43),
972 ],
973 );
974 }
975
976 #[test]
977 fn test_memcmp_string() {
978 check_encode_and_decode(
979 &[ConcreteDataType::string_datatype()],
980 vec![Value::String(StringBytes::from("hello"))],
981 );
982
983 check_encode_and_decode(&[ConcreteDataType::string_datatype()], vec![Value::Null]);
984
985 check_encode_and_decode(
986 &[ConcreteDataType::string_datatype()],
987 vec![Value::String("".into())],
988 );
989 check_encode_and_decode(
990 &[ConcreteDataType::string_datatype()],
991 vec![Value::String("world".into())],
992 );
993 }
994
995 #[test]
996 fn test_encode_null() {
997 check_encode_and_decode(
998 &[
999 ConcreteDataType::string_datatype(),
1000 ConcreteDataType::int32_datatype(),
1001 ],
1002 vec![Value::String(StringBytes::from("abcd")), Value::Null],
1003 )
1004 }
1005
1006 #[test]
1007 fn test_encoded_value_at() {
1008 let data_types = [
1009 ConcreteDataType::string_datatype(),
1010 ConcreteDataType::int32_datatype(),
1011 ConcreteDataType::string_datatype(),
1012 ];
1013 let encoder = DensePrimaryKeyCodec::with_fields(
1014 data_types
1015 .iter()
1016 .enumerate()
1017 .map(|(idx, t)| (idx as ColumnId, SortField::new(t.clone())))
1018 .collect::<Vec<_>>(),
1019 );
1020 let row = [Value::String("hello".into()), Value::Int32(42), Value::Null];
1021 let value_ref = row.iter().map(|v| v.as_value_ref()).collect::<Vec<_>>();
1022 let encoded_pk = encoder.encode(value_ref.iter().cloned()).unwrap();
1023
1024 let mut offsets = Vec::new();
1025 let mut combined = Vec::new();
1026 for (pos, value) in row.iter().enumerate() {
1027 let encoded_value = encoder
1028 .encoded_value_at(&encoded_pk, pos, &mut offsets)
1029 .unwrap();
1030 combined.extend_from_slice(encoded_value);
1031
1032 let field = SortField::new(data_types[pos].clone());
1033 let mut expected = Vec::new();
1034 let mut serializer = Serializer::new(&mut expected);
1035 field
1036 .serialize(&mut serializer, &value.as_value_ref())
1037 .unwrap();
1038 assert_eq!(encoded_value, expected.as_slice());
1039 }
1040 assert_eq!(combined, encoded_pk);
1041 assert_eq!(offsets.len(), row.len());
1042
1043 for (pos, value) in row.iter().enumerate().rev() {
1045 let encoded_value = encoder
1046 .encoded_value_at(&encoded_pk, pos, &mut offsets)
1047 .unwrap();
1048
1049 let field = SortField::new(data_types[pos].clone());
1050 let mut expected = Vec::new();
1051 let mut serializer = Serializer::new(&mut expected);
1052 field
1053 .serialize(&mut serializer, &value.as_value_ref())
1054 .unwrap();
1055 assert_eq!(encoded_value, expected.as_slice());
1056 }
1057 }
1058
1059 #[test]
1060 fn test_positional_decode_invalid_encoding() {
1061 for (ty, bytes) in [
1062 (ConcreteDataType::int64_datatype(), vec![2]),
1063 (ConcreteDataType::boolean_datatype(), vec![1, 2]),
1064 (ConcreteDataType::binary_datatype(), vec![1, 2]),
1065 (ConcreteDataType::binary_datatype(), vec![1, 1, 42, 2]),
1066 (ConcreteDataType::string_datatype(), vec![1, 2]),
1067 (
1068 ConcreteDataType::string_datatype(),
1069 vec![1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
1070 ),
1071 (
1072 ConcreteDataType::string_datatype(),
1073 vec![1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 10],
1074 ),
1075 ] {
1076 let codec = DensePrimaryKeyCodec::with_fields(vec![
1077 (0, SortField::new(ty)),
1078 (1, SortField::new(ConcreteDataType::int64_datatype())),
1079 ]);
1080 for pos in [0, 1, 2, usize::MAX] {
1081 assert!(
1082 codec
1083 .encoded_value_at(&bytes, pos, &mut Vec::new())
1084 .is_err()
1085 );
1086 assert!(codec.decode_value_at(&bytes, pos, &mut Vec::new()).is_err());
1087 }
1088 assert!(
1089 codec
1090 .decode_dense_iter(&bytes)
1091 .collect::<Result<Vec<_>>>()
1092 .is_err()
1093 );
1094 assert!(
1095 codec
1096 .decode_dense_with(&bytes, &mut Vec::new(), |_, _| {})
1097 .is_err()
1098 );
1099 }
1100 let codec = DensePrimaryKeyCodec::with_fields(vec![
1101 (0, SortField::new(ConcreteDataType::string_datatype())),
1102 (1, SortField::new(ConcreteDataType::int64_datatype())),
1103 ]);
1104 let bytes = codec
1105 .encode([ValueRef::String("abcdefghijk"), ValueRef::Int64(42)].into_iter())
1106 .unwrap();
1107 for pos in [2, usize::MAX] {
1108 assert!(
1109 codec
1110 .encoded_value_at(&bytes, pos, &mut Vec::new())
1111 .is_err()
1112 );
1113 assert!(codec.decode_value_at(&bytes, pos, &mut Vec::new()).is_err());
1114 }
1115 for offset in [bytes.len(), bytes.len() + 1, usize::MAX] {
1116 for pos in [0, 1] {
1117 assert!(
1118 codec
1119 .encoded_value_at(&bytes, pos, &mut vec![offset])
1120 .is_err()
1121 );
1122 assert!(
1123 codec
1124 .decode_value_at(&bytes, pos, &mut vec![offset])
1125 .is_err()
1126 );
1127 }
1128 }
1129 let mut invalid_utf8 = bytes;
1130 invalid_utf8[2] = 0xff;
1131 assert!(
1132 codec
1133 .decode_dense_with(&invalid_utf8, &mut Vec::new(), |_, _| {})
1134 .is_err()
1135 );
1136 assert!(
1137 codec
1138 .decode_dense_iter(&invalid_utf8)
1139 .collect::<Result<Vec<_>>>()
1140 .is_err()
1141 );
1142 assert!(
1143 codec
1144 .decode_value_at(&invalid_utf8, 0, &mut Vec::new())
1145 .is_err()
1146 );
1147 }
1148
1149 #[test]
1150 fn test_memcmp_dictionary() {
1151 check_encode_and_decode(
1153 &[ConcreteDataType::dictionary_datatype(
1154 ConcreteDataType::int32_datatype(),
1155 ConcreteDataType::string_datatype(),
1156 )],
1157 vec![Value::String("hello".into())],
1158 );
1159
1160 check_encode_and_decode(
1162 &[ConcreteDataType::dictionary_datatype(
1163 ConcreteDataType::int32_datatype(),
1164 ConcreteDataType::int64_datatype(),
1165 )],
1166 vec![Value::Int64(42)],
1167 );
1168
1169 check_encode_and_decode(
1171 &[ConcreteDataType::dictionary_datatype(
1172 ConcreteDataType::int32_datatype(),
1173 ConcreteDataType::string_datatype(),
1174 )],
1175 vec![Value::Null],
1176 );
1177
1178 check_encode_and_decode(
1180 &[
1181 ConcreteDataType::dictionary_datatype(
1182 ConcreteDataType::int32_datatype(),
1183 ConcreteDataType::string_datatype(),
1184 ),
1185 ConcreteDataType::dictionary_datatype(
1186 ConcreteDataType::int16_datatype(),
1187 ConcreteDataType::int64_datatype(),
1188 ),
1189 ],
1190 vec![Value::String("world".into()), Value::Int64(123)],
1191 );
1192 }
1193
1194 #[test]
1195 fn test_encode_multiple_rows() {
1196 check_encode_and_decode(
1197 &[
1198 ConcreteDataType::string_datatype(),
1199 ConcreteDataType::int64_datatype(),
1200 ConcreteDataType::boolean_datatype(),
1201 ],
1202 vec![
1203 Value::String("hello".into()),
1204 Value::Int64(42),
1205 Value::Boolean(false),
1206 ],
1207 );
1208
1209 check_encode_and_decode(
1210 &[
1211 ConcreteDataType::string_datatype(),
1212 ConcreteDataType::int64_datatype(),
1213 ConcreteDataType::boolean_datatype(),
1214 ],
1215 vec![
1216 Value::String("world".into()),
1217 Value::Int64(43),
1218 Value::Boolean(true),
1219 ],
1220 );
1221
1222 check_encode_and_decode(
1223 &[
1224 ConcreteDataType::string_datatype(),
1225 ConcreteDataType::int64_datatype(),
1226 ConcreteDataType::boolean_datatype(),
1227 ],
1228 vec![Value::Null, Value::Int64(43), Value::Boolean(true)],
1229 );
1230
1231 check_encode_and_decode(
1233 &[
1234 ConcreteDataType::boolean_datatype(),
1235 ConcreteDataType::int8_datatype(),
1236 ConcreteDataType::uint8_datatype(),
1237 ConcreteDataType::int16_datatype(),
1238 ConcreteDataType::uint16_datatype(),
1239 ConcreteDataType::int32_datatype(),
1240 ConcreteDataType::uint32_datatype(),
1241 ConcreteDataType::int64_datatype(),
1242 ConcreteDataType::uint64_datatype(),
1243 ConcreteDataType::float32_datatype(),
1244 ConcreteDataType::float64_datatype(),
1245 ConcreteDataType::binary_datatype(),
1246 ConcreteDataType::string_datatype(),
1247 ConcreteDataType::date_datatype(),
1248 ConcreteDataType::timestamp_millisecond_datatype(),
1249 ConcreteDataType::time_millisecond_datatype(),
1250 ConcreteDataType::duration_millisecond_datatype(),
1251 ConcreteDataType::interval_year_month_datatype(),
1252 ConcreteDataType::interval_day_time_datatype(),
1253 ConcreteDataType::interval_month_day_nano_datatype(),
1254 ConcreteDataType::decimal128_default_datatype(),
1255 ConcreteDataType::vector_datatype(3),
1256 ConcreteDataType::dictionary_datatype(
1257 ConcreteDataType::int32_datatype(),
1258 ConcreteDataType::string_datatype(),
1259 ),
1260 ],
1261 vec![
1262 Value::Boolean(true),
1263 Value::Int8(8),
1264 Value::UInt8(8),
1265 Value::Int16(16),
1266 Value::UInt16(16),
1267 Value::Int32(32),
1268 Value::UInt32(32),
1269 Value::Int64(64),
1270 Value::UInt64(64),
1271 Value::Float32(1.0.into()),
1272 Value::Float64(1.0.into()),
1273 Value::Binary(b"hello"[..].into()),
1274 Value::String("world".into()),
1275 Value::Date(Date::new(10)),
1276 Value::Timestamp(Timestamp::new_millisecond(12)),
1277 Value::Time(Time::new_millisecond(13)),
1278 Value::Duration(Duration::new_millisecond(14)),
1279 Value::IntervalYearMonth(IntervalYearMonth::new(1)),
1280 Value::IntervalDayTime(IntervalDayTime::new(1, 15)),
1281 Value::IntervalMonthDayNano(IntervalMonthDayNano::new(1, 1, 15)),
1282 Value::Decimal128(Decimal128::from(16)),
1283 Value::Binary(Bytes::from(vec![0; 12])),
1284 Value::String("dict_value".into()),
1285 ],
1286 );
1287 }
1288}