1use std::ops::Deref;
16
17use bytes::{Buf, BufMut};
18use itertools::Itertools;
19use risingwave_common_estimate_size::EstimateSize;
20use serde::{Deserialize, Serialize};
21
22use super::iter_util::{ZipEqDebug, ZipEqFast};
23use crate::array::{ArrayImpl, DataChunk, VectorItemType};
24use crate::row::{OwnedRow, Row};
25use crate::types::{
26 DataType, Date, Datum, F32, F64, Int256, ScalarImpl, Serial, Time, Timestamp, Timestamptz,
27 ToDatumRef,
28};
29use crate::util::sort_util::{ColumnOrder, OrderType};
30
31const DEFAULT_NULL_TAG_NONE: u8 = 1;
33const DEFAULT_NULL_TAG_SOME: u8 = 0;
34
35pub(crate) fn serialize_datum(
36 datum: impl ToDatumRef,
37 order: OrderType,
38 serializer: &mut memcomparable::Serializer<impl BufMut>,
39) -> memcomparable::Result<()> {
40 serializer.set_reverse(order.is_descending());
41 let (null_tag_none, null_tag_some) = if order.nulls_are_largest() {
42 (1u8, 0u8) } else {
44 (0u8, 1u8) };
46 if let Some(scalar) = datum.to_datum_ref() {
47 null_tag_some.serialize(&mut *serializer)?;
48 scalar.serialize(serializer)?;
49 } else {
50 null_tag_none.serialize(serializer)?;
51 }
52 Ok(())
53}
54
55pub(crate) fn serialize_datum_in_composite(
56 datum: impl ToDatumRef,
57 serializer: &mut memcomparable::Serializer<impl BufMut>,
58) -> memcomparable::Result<()> {
59 if let Some(scalar) = datum.to_datum_ref() {
62 DEFAULT_NULL_TAG_SOME.serialize(&mut *serializer)?;
63 scalar.serialize(serializer)?;
64 } else {
65 DEFAULT_NULL_TAG_NONE.serialize(serializer)?;
66 }
67 Ok(())
68}
69
70pub(crate) fn deserialize_datum(
71 ty: &DataType,
72 order: OrderType,
73 deserializer: &mut memcomparable::Deserializer<impl Buf>,
74) -> memcomparable::Result<Datum> {
75 deserializer.set_reverse(order.is_descending());
76 let null_tag = u8::deserialize(&mut *deserializer)?;
77 let (null_tag_none, null_tag_some) = if order.nulls_are_largest() {
78 (1u8, 0u8) } else {
80 (0u8, 1u8) };
82 if null_tag == null_tag_none {
83 Ok(None)
84 } else if null_tag == null_tag_some {
85 Ok(Some(ScalarImpl::deserialize(ty, deserializer)?))
86 } else {
87 Err(memcomparable::Error::InvalidTagEncoding(null_tag as _))
88 }
89}
90
91pub(crate) fn deserialize_datum_in_composite(
92 ty: &DataType,
93 deserializer: &mut memcomparable::Deserializer<impl Buf>,
94) -> memcomparable::Result<Datum> {
95 let null_tag = u8::deserialize(&mut *deserializer)?;
97 if null_tag == DEFAULT_NULL_TAG_NONE {
98 Ok(None)
99 } else if null_tag == DEFAULT_NULL_TAG_SOME {
100 Ok(Some(ScalarImpl::deserialize(ty, deserializer)?))
101 } else {
102 Err(memcomparable::Error::InvalidTagEncoding(null_tag as _))
103 }
104}
105
106pub(crate) fn calculate_encoded_size(
110 ty: &DataType,
111 order: OrderType,
112 encoded_data: &[u8],
113) -> memcomparable::Result<usize> {
114 let mut deserializer = memcomparable::Deserializer::new(encoded_data);
115 let (null_tag_none, null_tag_some) = if order.nulls_are_largest() {
116 (1u8, 0u8) } else {
118 (0u8, 1u8) };
120 deserializer.set_reverse(order.is_descending());
121 calculate_encoded_size_inner(ty, null_tag_none, null_tag_some, &mut deserializer)
122}
123
124fn calculate_encoded_size_inner(
125 ty: &DataType,
126 null_tag_none: u8,
127 null_tag_some: u8,
128 deserializer: &mut memcomparable::Deserializer<impl Buf>,
129) -> memcomparable::Result<usize> {
130 let base_position = deserializer.position();
131 let null_tag = u8::deserialize(&mut *deserializer)?;
132 if null_tag == null_tag_none {
133 } else if null_tag == null_tag_some {
135 use std::mem::size_of;
136 let len = match ty {
137 DataType::Int16 => size_of::<i16>(),
138 DataType::Int32 => size_of::<i32>(),
139 DataType::Int64 => size_of::<i64>(),
140 DataType::Serial => size_of::<Serial>(),
141 DataType::Float32 => size_of::<F32>(),
142 DataType::Float64 => size_of::<F64>(),
143 DataType::Date => size_of::<Date>(),
144 DataType::Time => size_of::<Time>(),
145 DataType::Timestamp => size_of::<Timestamp>(),
146 DataType::Timestamptz => size_of::<Timestamptz>(),
147 DataType::Boolean => size_of::<u8>(),
148 DataType::Interval => size_of::<(i32, i32, i64)>(),
150 DataType::Decimal => {
151 deserializer.deserialize_decimal()?;
152 0 }
154 DataType::List { .. } | DataType::Map(_) => deserializer.skip_bytes()?,
157 DataType::Vector(d) => d * size_of::<VectorItemType>(),
158 DataType::Struct(t) => t
159 .types()
160 .map(|field| {
161 calculate_encoded_size_inner(
163 field,
164 DEFAULT_NULL_TAG_NONE,
165 DEFAULT_NULL_TAG_SOME,
166 deserializer,
167 )
168 })
169 .try_fold(0, |a, b| b.map(|b| a + b))?,
170 DataType::Jsonb => deserializer.skip_bytes()?,
171 DataType::Variant => deserializer.skip_bytes()?,
172 DataType::Varchar => deserializer.skip_bytes()?,
173 DataType::Bytea => deserializer.skip_bytes()?,
174 DataType::Int256 => Int256::MEMCMP_ENCODED_SIZE,
175 };
176
177 if deserializer.position() == base_position + 1 {
179 deserializer.advance(len);
181 }
182 } else {
183 return Err(memcomparable::Error::InvalidTagEncoding(null_tag as _));
184 }
185
186 Ok(deserializer.position() - base_position)
187}
188
189#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, EstimateSize)]
190pub struct MemcmpEncoded(Box<[u8]>);
191
192impl MemcmpEncoded {
193 pub fn as_inner(&self) -> &[u8] {
194 &self.0
195 }
196
197 pub fn into_inner(self) -> Box<[u8]> {
198 self.0
199 }
200}
201
202impl AsRef<[u8]> for MemcmpEncoded {
203 fn as_ref(&self) -> &[u8] {
204 &self.0
205 }
206}
207
208impl Deref for MemcmpEncoded {
209 type Target = [u8];
210
211 fn deref(&self) -> &Self::Target {
212 &self.0
213 }
214}
215
216impl IntoIterator for MemcmpEncoded {
217 type IntoIter = std::vec::IntoIter<Self::Item>;
218 type Item = u8;
219
220 fn into_iter(self) -> Self::IntoIter {
221 self.0.into_vec().into_iter()
222 }
223}
224
225impl FromIterator<u8> for MemcmpEncoded {
226 fn from_iter<T: IntoIterator<Item = u8>>(iter: T) -> Self {
227 Self(iter.into_iter().collect())
228 }
229}
230
231impl From<Vec<u8>> for MemcmpEncoded {
232 fn from(v: Vec<u8>) -> Self {
233 Self(v.into_boxed_slice())
234 }
235}
236
237impl From<Box<[u8]>> for MemcmpEncoded {
238 fn from(v: Box<[u8]>) -> Self {
239 Self(v)
240 }
241}
242
243impl From<MemcmpEncoded> for Vec<u8> {
244 fn from(v: MemcmpEncoded) -> Self {
245 v.0.into()
246 }
247}
248
249impl From<MemcmpEncoded> for Box<[u8]> {
250 fn from(v: MemcmpEncoded) -> Self {
251 v.0
252 }
253}
254
255pub fn encode_value(
257 value: impl ToDatumRef,
258 order: OrderType,
259) -> memcomparable::Result<MemcmpEncoded> {
260 let mut serializer = memcomparable::Serializer::new(vec![]);
261 serialize_datum(value, order, &mut serializer)?;
262 Ok(serializer.into_inner().into())
263}
264
265pub fn decode_value(
267 ty: &DataType,
268 encoded_value: &[u8],
269 order: OrderType,
270) -> memcomparable::Result<Datum> {
271 let mut deserializer = memcomparable::Deserializer::new(encoded_value);
272 deserialize_datum(ty, order, &mut deserializer)
273}
274
275pub fn encode_array(
277 array: &ArrayImpl,
278 order: OrderType,
279) -> memcomparable::Result<Vec<MemcmpEncoded>> {
280 let mut data = Vec::with_capacity(array.len());
281 for datum in array.iter() {
282 data.push(encode_value(datum, order)?);
283 }
284 Ok(data)
285}
286
287pub fn encode_chunk(
289 chunk: &DataChunk,
290 column_orders: &[ColumnOrder],
291) -> memcomparable::Result<Vec<MemcmpEncoded>> {
292 let encoded_columns: Vec<_> = column_orders
293 .iter()
294 .map(|o| encode_array(chunk.column_at(o.column_index), o.order_type))
295 .try_collect()?;
296
297 let mut encoded_chunk = vec![vec![]; chunk.capacity()];
298 for encoded_column in encoded_columns {
299 for (encoded_row, data) in encoded_chunk.iter_mut().zip_eq_fast(encoded_column) {
300 encoded_row.extend(data);
301 }
302 }
303
304 Ok(encoded_chunk.into_iter().map(Into::into).collect())
305}
306
307pub fn encode_row(
309 row: impl Row,
310 order_types: &[OrderType],
311) -> memcomparable::Result<MemcmpEncoded> {
312 let mut serializer = memcomparable::Serializer::new(vec![]);
313 row.iter()
314 .zip_eq_debug(order_types)
315 .try_for_each(|(datum, order)| serialize_datum(datum, *order, &mut serializer))?;
316 Ok(serializer.into_inner().into())
317}
318
319pub fn decode_row(
321 encoded_row: &[u8],
322 data_types: &[DataType],
323 order_types: &[OrderType],
324) -> memcomparable::Result<OwnedRow> {
325 let mut deserializer = memcomparable::Deserializer::new(encoded_row);
326 let row_data = data_types
327 .iter()
328 .zip_eq_debug(order_types)
329 .map(|(dt, ot)| deserialize_datum(dt, *ot, &mut deserializer))
330 .try_collect()?;
331 Ok(OwnedRow::new(row_data))
332}
333
334#[cfg(test)]
335mod tests {
336 use std::ops::Neg;
337
338 use rand::rng as thread_rng;
339
340 use super::*;
341 use crate::array::{ListValue, StructValue};
342 use crate::row::RowExt;
343 use crate::types::FloatExt;
344
345 #[test]
346 fn test_memcomparable() {
347 fn encode_num(num: Option<i32>, order_type: OrderType) -> MemcmpEncoded {
348 encode_value(num.map(ScalarImpl::from), order_type).unwrap()
349 }
350
351 {
352 let order_type = OrderType::ascending();
354 let memcmp_minus_1 = encode_num(Some(-1), order_type);
355 let memcmp_3874 = encode_num(Some(3874), order_type);
356 let memcmp_45745 = encode_num(Some(45745), order_type);
357 let memcmp_i32_min = encode_num(Some(i32::MIN), order_type);
358 let memcmp_i32_max = encode_num(Some(i32::MAX), order_type);
359 let memcmp_none = encode_num(None, order_type);
360
361 assert!(memcmp_3874 < memcmp_45745);
362 assert!(memcmp_3874 < memcmp_i32_max);
363 assert!(memcmp_45745 < memcmp_i32_max);
364
365 assert!(memcmp_i32_min < memcmp_i32_max);
366 assert!(memcmp_i32_min < memcmp_3874);
367 assert!(memcmp_i32_min < memcmp_45745);
368
369 assert!(memcmp_minus_1 < memcmp_3874);
370 assert!(memcmp_minus_1 < memcmp_45745);
371 assert!(memcmp_minus_1 < memcmp_i32_max);
372 assert!(memcmp_minus_1 > memcmp_i32_min);
373
374 assert!(memcmp_none > memcmp_minus_1);
375 assert!(memcmp_none > memcmp_3874);
376 assert!(memcmp_none > memcmp_i32_min);
377 assert!(memcmp_none > memcmp_i32_max);
378 }
379 {
380 let order_type = OrderType::descending();
382 let memcmp_minus_1 = encode_num(Some(-1), order_type);
383 let memcmp_3874 = encode_num(Some(3874), order_type);
384 let memcmp_none = encode_num(None, order_type);
385
386 assert!(memcmp_none < memcmp_minus_1);
387 assert!(memcmp_none < memcmp_3874);
388 assert!(memcmp_3874 < memcmp_minus_1);
389 }
390 {
391 let order_type = OrderType::ascending_nulls_first();
393 let memcmp_minus_1 = encode_num(Some(-1), order_type);
394 let memcmp_3874 = encode_num(Some(3874), order_type);
395 let memcmp_none = encode_num(None, order_type);
396 assert!(memcmp_none < memcmp_minus_1);
397 assert!(memcmp_none < memcmp_3874);
398 }
399 {
400 let order_type = OrderType::ascending_nulls_last();
402 let memcmp_minus_1 = encode_num(Some(-1), order_type);
403 let memcmp_3874 = encode_num(Some(3874), order_type);
404 let memcmp_none = encode_num(None, order_type);
405 assert!(memcmp_none > memcmp_minus_1);
406 assert!(memcmp_none > memcmp_3874);
407 }
408 {
409 let order_type = OrderType::descending_nulls_first();
411 let memcmp_minus_1 = encode_num(Some(-1), order_type);
412 let memcmp_3874 = encode_num(Some(3874), order_type);
413 let memcmp_none = encode_num(None, order_type);
414 assert!(memcmp_none < memcmp_minus_1);
415 assert!(memcmp_none < memcmp_3874);
416 }
417 {
418 let order_type = OrderType::descending_nulls_last();
420 let memcmp_minus_1 = encode_num(Some(-1), order_type);
421 let memcmp_3874 = encode_num(Some(3874), order_type);
422 let memcmp_none = encode_num(None, order_type);
423 assert!(memcmp_none > memcmp_minus_1);
424 assert!(memcmp_none > memcmp_3874);
425 }
426 }
427
428 #[test]
429 fn test_memcomparable_structs() {
430 let struct_none = Datum::None;
433 let struct_1 = Datum::Some(
434 StructValue::new(vec![Some(ScalarImpl::from(1)), Some(ScalarImpl::from(2))]).into(),
435 );
436 let struct_2 = Datum::Some(
437 StructValue::new(vec![Some(ScalarImpl::from(1)), Some(ScalarImpl::from(3))]).into(),
438 );
439 let struct_3 = Datum::Some(StructValue::new(vec![Some(ScalarImpl::from(1)), None]).into());
440
441 {
442 let order_type = OrderType::ascending_nulls_first();
444 let memcmp_struct_none = encode_value(&struct_none, order_type).unwrap();
445 let memcmp_struct_1 = encode_value(&struct_1, order_type).unwrap();
446 let memcmp_struct_2 = encode_value(&struct_2, order_type).unwrap();
447 let memcmp_struct_3 = encode_value(&struct_3, order_type).unwrap();
448 assert!(memcmp_struct_none < memcmp_struct_1);
449 assert!(memcmp_struct_1 < memcmp_struct_2);
450 assert!(memcmp_struct_2 < memcmp_struct_3);
451 }
452 {
453 let order_type = OrderType::ascending_nulls_last();
455 let memcmp_struct_none = encode_value(&struct_none, order_type).unwrap();
456 let memcmp_struct_1 = encode_value(&struct_1, order_type).unwrap();
457 let memcmp_struct_2 = encode_value(&struct_2, order_type).unwrap();
458 let memcmp_struct_3 = encode_value(&struct_3, order_type).unwrap();
459 assert!(memcmp_struct_1 < memcmp_struct_2);
460 assert!(memcmp_struct_2 < memcmp_struct_3);
461 assert!(memcmp_struct_3 < memcmp_struct_none);
462 }
463 {
464 let order_type = OrderType::descending_nulls_first();
466 let memcmp_struct_none = encode_value(&struct_none, order_type).unwrap();
467 let memcmp_struct_1 = encode_value(&struct_1, order_type).unwrap();
468 let memcmp_struct_2 = encode_value(&struct_2, order_type).unwrap();
469 let memcmp_struct_3 = encode_value(&struct_3, order_type).unwrap();
470 assert!(memcmp_struct_none < memcmp_struct_3);
471 assert!(memcmp_struct_3 < memcmp_struct_2);
472 assert!(memcmp_struct_2 < memcmp_struct_1);
473 }
474 {
475 let order_type = OrderType::descending_nulls_last();
477 let memcmp_struct_none = encode_value(&struct_none, order_type).unwrap();
478 let memcmp_struct_1 = encode_value(&struct_1, order_type).unwrap();
479 let memcmp_struct_2 = encode_value(&struct_2, order_type).unwrap();
480 let memcmp_struct_3 = encode_value(&struct_3, order_type).unwrap();
481 assert!(memcmp_struct_3 < memcmp_struct_2);
482 assert!(memcmp_struct_2 < memcmp_struct_1);
483 assert!(memcmp_struct_1 < memcmp_struct_none);
484 }
485 }
486
487 #[test]
488 fn test_memcomparable_lists() {
489 let list_none = Datum::None;
492 let list_1 = Datum::Some(ListValue::from_iter([1, 2]).into());
493 let list_2 = Datum::Some(ListValue::from_iter([1, 3]).into());
494 let list_3 = Datum::Some(ListValue::from_iter([Some(1), None]).into());
495
496 {
497 let order_type = OrderType::ascending_nulls_first();
499 let memcmp_list_none = encode_value(&list_none, order_type).unwrap();
500 let memcmp_list_1 = encode_value(&list_1, order_type).unwrap();
501 let memcmp_list_2 = encode_value(&list_2, order_type).unwrap();
502 let memcmp_list_3 = encode_value(&list_3, order_type).unwrap();
503 assert!(memcmp_list_none < memcmp_list_1);
504 assert!(memcmp_list_1 < memcmp_list_2);
505 assert!(memcmp_list_2 < memcmp_list_3);
506 }
507 {
508 let order_type = OrderType::ascending_nulls_last();
510 let memcmp_list_none = encode_value(&list_none, order_type).unwrap();
511 let memcmp_list_1 = encode_value(&list_1, order_type).unwrap();
512 let memcmp_list_2 = encode_value(&list_2, order_type).unwrap();
513 let memcmp_list_3 = encode_value(&list_3, order_type).unwrap();
514 assert!(memcmp_list_1 < memcmp_list_2);
515 assert!(memcmp_list_2 < memcmp_list_3);
516 assert!(memcmp_list_3 < memcmp_list_none);
517 }
518 {
519 let order_type = OrderType::descending_nulls_first();
521 let memcmp_list_none = encode_value(&list_none, order_type).unwrap();
522 let memcmp_list_1 = encode_value(&list_1, order_type).unwrap();
523 let memcmp_list_2 = encode_value(&list_2, order_type).unwrap();
524 let memcmp_list_3 = encode_value(&list_3, order_type).unwrap();
525 assert!(memcmp_list_none < memcmp_list_3);
526 assert!(memcmp_list_3 < memcmp_list_2);
527 assert!(memcmp_list_2 < memcmp_list_1);
528 }
529 {
530 let order_type = OrderType::descending_nulls_last();
532 let memcmp_list_none = encode_value(&list_none, order_type).unwrap();
533 let memcmp_list_1 = encode_value(&list_1, order_type).unwrap();
534 let memcmp_list_2 = encode_value(&list_2, order_type).unwrap();
535 let memcmp_list_3 = encode_value(&list_3, order_type).unwrap();
536 assert!(memcmp_list_3 < memcmp_list_2);
537 assert!(memcmp_list_2 < memcmp_list_1);
538 assert!(memcmp_list_1 < memcmp_list_none);
539 }
540 }
541
542 #[test]
543 fn test_issue_legacy_2057_ordered_float_memcomparable() {
544 use num_traits::*;
545 use rand::seq::SliceRandom;
546
547 fn serialize(f: F32) -> MemcmpEncoded {
548 encode_value(Some(ScalarImpl::from(f)), OrderType::default()).unwrap()
549 }
550
551 fn deserialize(data: MemcmpEncoded) -> F32 {
552 decode_value(&DataType::Float32, &data, OrderType::default())
553 .unwrap()
554 .unwrap()
555 .into_float32()
556 }
557
558 let floats = vec![
559 F32::neg_infinity(),
561 F32::one().neg(),
563 F32::zero(),
565 F32::neg_zero(),
566 F32::zero(),
567 F32::one(),
569 F32::infinity(),
571 F32::nan(),
573 F32::nan().neg(),
574 F32::nan(),
575 ];
576 assert!(floats.is_sorted());
577
578 let mut floats_clone = floats.clone();
579 floats_clone.shuffle(&mut thread_rng());
580 floats_clone.sort();
581 assert_eq!(floats, floats_clone);
582
583 let memcomparables = floats.clone().into_iter().map(serialize).collect_vec();
584 assert!(memcomparables.is_sorted());
585
586 let decoded_floats = memcomparables.into_iter().map(deserialize).collect_vec();
587 assert!(decoded_floats.is_sorted());
588 assert_eq!(floats, decoded_floats);
589 }
590
591 #[test]
592 fn test_encode_row() {
593 let v10 = Some(ScalarImpl::Int32(42));
594 let v10_cloned = v10.clone();
595 let v11 = Some(ScalarImpl::Utf8("hello".into()));
596 let v11_cloned = v11.clone();
597 let v12 = Some(ScalarImpl::Float32(4.0.into()));
598 let v20 = Some(ScalarImpl::Int32(42));
599 let v21 = Some(ScalarImpl::Utf8("hell".into()));
600 let v22 = Some(ScalarImpl::Float32(3.0.into()));
601
602 let row1 = OwnedRow::new(vec![v10, v11, v12]);
603 let row2 = OwnedRow::new(vec![v20, v21, v22]);
604 let order_col_indices = vec![0, 1];
605 let order_types = vec![OrderType::ascending(), OrderType::descending()];
606
607 let encoded_row1 = encode_row(row1.project(&order_col_indices), &order_types).unwrap();
608 let encoded_v10 = encode_value(
609 v10_cloned.as_ref().map(|x| x.as_scalar_ref_impl()),
610 OrderType::ascending(),
611 )
612 .unwrap();
613 let encoded_v11 = encode_value(
614 v11_cloned.as_ref().map(|x| x.as_scalar_ref_impl()),
615 OrderType::descending(),
616 )
617 .unwrap();
618 let concated_encoded_row1 = encoded_v10.into_iter().chain(encoded_v11).collect();
619 assert_eq!(encoded_row1, concated_encoded_row1);
620
621 let encoded_row2 = encode_row(row2.project(&order_col_indices), &order_types).unwrap();
622 assert!(encoded_row1 < encoded_row2);
623 }
624
625 #[test]
627 fn test_decode_row() {
628 let encoded: Vec<u8> = vec![
629 0, 128, 0, 0, 42, 255, 127, 255, 255, 255, 255, 255, 255, 213, 1, 0, 193, 186, 163,
630 215, 255, 254, 153, 144, 144, 144, 144, 144, 255, 255, 249, 0, 1, 98, 97, 97, 97, 97,
631 114, 0, 0, 6,
632 ];
633
634 let order_types = vec![
635 OrderType::ascending(),
636 OrderType::descending(),
637 OrderType::ascending(),
638 OrderType::ascending(),
639 OrderType::descending(),
640 OrderType::ascending(),
641 ];
642 let data_types = vec![
643 DataType::Int32,
644 DataType::Int64,
645 DataType::Timestamp,
646 DataType::Float32,
647 DataType::Varchar,
648 DataType::Bytea,
649 ];
650
651 let result = decode_row(&encoded, &data_types, &order_types).unwrap();
652 let expected = OwnedRow::new(vec![
655 Some(ScalarImpl::Int32(42)),
656 Some(ScalarImpl::Int64(42)),
657 None,
658 Some(ScalarImpl::Float32(23.33.into())),
659 Some(ScalarImpl::Utf8("fooooo".into())),
660 Some(ScalarImpl::Bytea("baaaar".as_bytes().into())),
661 ]);
662 assert_eq!(&result, &expected);
663 }
664
665 #[test]
666 fn test_encode_chunk() {
667 let v10 = Some(ScalarImpl::Int32(42));
668 let v11 = Some(ScalarImpl::Utf8("hello".into()));
669 let v12 = Some(ScalarImpl::Float32(4.0.into()));
670 let v20 = Some(ScalarImpl::Int32(42));
671 let v21 = Some(ScalarImpl::Utf8("hell".into()));
672 let v22 = Some(ScalarImpl::Float32(3.0.into()));
673
674 let row1 = OwnedRow::new(vec![v10, v11, v12]);
675 let row2 = OwnedRow::new(vec![v20, v21, v22]);
676 let chunk = DataChunk::from_rows(
677 &[row1.clone(), row2.clone()],
678 &[DataType::Int32, DataType::Varchar, DataType::Float32],
679 );
680 let order_col_indices = vec![0, 1];
681 let order_types = vec![OrderType::ascending(), OrderType::descending()];
682 let column_orders = order_col_indices
683 .iter()
684 .zip_eq_fast(&order_types)
685 .map(|(i, o)| ColumnOrder::new(*i, *o))
686 .collect_vec();
687
688 let encoded_row1 = encode_row(row1.project(&order_col_indices), &order_types).unwrap();
689 let encoded_row2 = encode_row(row2.project(&order_col_indices), &order_types).unwrap();
690 let encoded_chunk = encode_chunk(&chunk, &column_orders).unwrap();
691 assert_eq!(&encoded_chunk, &[encoded_row1, encoded_row2]);
692 }
693}