use sql_cli::data::data_view::DataView;
use sql_cli::data::datatable::{DataColumn, DataRow, DataTable, DataValue};
use std::sync::Arc;
#[test]
fn test_sort_with_interned_strings() {
let mut table = DataTable::new("test");
table.add_column(DataColumn::new("id"));
table.add_column(DataColumn::new("name"));
table.add_column(DataColumn::new("category"));
let cat_a = Arc::new("Alpha".to_string());
let cat_b = Arc::new("Beta".to_string());
let cat_c = Arc::new("Charlie".to_string());
table
.add_row(DataRow::new(vec![
DataValue::Integer(1),
DataValue::String("Item1".to_string()),
DataValue::InternedString(cat_b.clone()),
]))
.unwrap();
table
.add_row(DataRow::new(vec![
DataValue::Integer(2),
DataValue::String("Item2".to_string()),
DataValue::InternedString(cat_c.clone()),
]))
.unwrap();
table
.add_row(DataRow::new(vec![
DataValue::Integer(3),
DataValue::String("Item3".to_string()),
DataValue::InternedString(cat_a.clone()),
]))
.unwrap();
let mut view = DataView::new(Arc::new(table));
view.apply_sort(2, true).unwrap();
let row0 = view.get_row(0).unwrap();
let row1 = view.get_row(1).unwrap();
let row2 = view.get_row(2).unwrap();
assert_eq!(row0.values[0], DataValue::Integer(3)); assert_eq!(row1.values[0], DataValue::Integer(1)); assert_eq!(row2.values[0], DataValue::Integer(2));
view.apply_sort(2, false).unwrap();
let row0 = view.get_row(0).unwrap();
let row1 = view.get_row(1).unwrap();
let row2 = view.get_row(2).unwrap();
assert_eq!(row0.values[0], DataValue::Integer(2)); assert_eq!(row1.values[0], DataValue::Integer(1)); assert_eq!(row2.values[0], DataValue::Integer(3)); }
#[test]
fn test_sort_mixed_string_and_interned() {
let mut table = DataTable::new("test");
table.add_column(DataColumn::new("id"));
table.add_column(DataColumn::new("value"));
let interned_b = Arc::new("Bravo".to_string());
let interned_d = Arc::new("Delta".to_string());
table
.add_row(DataRow::new(vec![
DataValue::Integer(1),
DataValue::String("Charlie".to_string()),
]))
.unwrap();
table
.add_row(DataRow::new(vec![
DataValue::Integer(2),
DataValue::InternedString(interned_b.clone()),
]))
.unwrap();
table
.add_row(DataRow::new(vec![
DataValue::Integer(3),
DataValue::String("Alpha".to_string()),
]))
.unwrap();
table
.add_row(DataRow::new(vec![
DataValue::Integer(4),
DataValue::InternedString(interned_d.clone()),
]))
.unwrap();
let mut view = DataView::new(Arc::new(table));
view.apply_sort(1, true).unwrap();
let row0 = view.get_row(0).unwrap();
let row1 = view.get_row(1).unwrap();
let row2 = view.get_row(2).unwrap();
let row3 = view.get_row(3).unwrap();
assert_eq!(row0.values[0], DataValue::Integer(3)); assert_eq!(row1.values[0], DataValue::Integer(2)); assert_eq!(row2.values[0], DataValue::Integer(1)); assert_eq!(row3.values[0], DataValue::Integer(4)); }
#[test]
fn test_sort_with_nulls_and_interned() {
let mut table = DataTable::new("test");
table.add_column(DataColumn::new("id"));
table.add_column(DataColumn::new("value"));
let interned = Arc::new("Middle".to_string());
table
.add_row(DataRow::new(vec![
DataValue::Integer(1),
DataValue::InternedString(interned.clone()),
]))
.unwrap();
table
.add_row(DataRow::new(vec![DataValue::Integer(2), DataValue::Null]))
.unwrap();
table
.add_row(DataRow::new(vec![
DataValue::Integer(3),
DataValue::String("Zebra".to_string()),
]))
.unwrap();
let mut view = DataView::new(Arc::new(table));
view.apply_sort(1, true).unwrap();
let row0 = view.get_row(0).unwrap();
let row1 = view.get_row(1).unwrap();
let row2 = view.get_row(2).unwrap();
assert_eq!(row0.values[0], DataValue::Integer(2)); assert_eq!(row1.values[0], DataValue::Integer(1)); assert_eq!(row2.values[0], DataValue::Integer(3)); }