|
|
|
@ -2,7 +2,7 @@
|
|
|
|
|
* Copyright 2022, The Cozo Project Authors. Licensed under AGPL-3 or later.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
use std::cmp::Reverse;
|
|
|
|
|
use std::cmp::{Ordering};
|
|
|
|
|
use std::collections::BTreeMap;
|
|
|
|
|
|
|
|
|
|
use itertools::Itertools;
|
|
|
|
@ -11,7 +11,6 @@ use miette::Result;
|
|
|
|
|
use crate::data::program::SortDir;
|
|
|
|
|
use crate::data::symb::Symbol;
|
|
|
|
|
use crate::data::tuple::Tuple;
|
|
|
|
|
use crate::data::value::DataValue;
|
|
|
|
|
use crate::runtime::in_mem::InMemRelation;
|
|
|
|
|
use crate::runtime::transact::SessionTx;
|
|
|
|
|
|
|
|
|
@ -21,29 +20,29 @@ impl SessionTx {
|
|
|
|
|
original: InMemRelation,
|
|
|
|
|
sorters: &[(Symbol, SortDir)],
|
|
|
|
|
head: &[Symbol],
|
|
|
|
|
) -> Result<InMemRelation> {
|
|
|
|
|
) -> Result<Vec<Tuple>> {
|
|
|
|
|
let head_indices: BTreeMap<_, _> = head.iter().enumerate().map(|(i, k)| (k, i)).collect();
|
|
|
|
|
let idx_sorters = sorters
|
|
|
|
|
.iter()
|
|
|
|
|
.map(|(k, dir)| (head_indices[k], *dir))
|
|
|
|
|
.collect_vec();
|
|
|
|
|
let ret = self.new_temp_store(original.rule_name.symbol().span);
|
|
|
|
|
for (idx, tuple) in original.scan_all().enumerate() {
|
|
|
|
|
let tuple = tuple?;
|
|
|
|
|
let mut key = idx_sorters
|
|
|
|
|
.iter()
|
|
|
|
|
.map(|(idx, dir)| {
|
|
|
|
|
let mut val = tuple.0[*idx].clone();
|
|
|
|
|
if *dir == SortDir::Dsc {
|
|
|
|
|
val = DataValue::Rev(Reverse(Box::new(val)));
|
|
|
|
|
|
|
|
|
|
let mut all_data: Vec<_> = original.scan_all().try_collect()?;
|
|
|
|
|
all_data.sort_by(|a, b| {
|
|
|
|
|
for (idx, dir) in &idx_sorters {
|
|
|
|
|
match a.0[*idx].cmp(&b.0[*idx]) {
|
|
|
|
|
Ordering::Equal => {}
|
|
|
|
|
o => {
|
|
|
|
|
return match dir {
|
|
|
|
|
SortDir::Asc => o,
|
|
|
|
|
SortDir::Dsc => o.reverse(),
|
|
|
|
|
}
|
|
|
|
|
val
|
|
|
|
|
})
|
|
|
|
|
.collect_vec();
|
|
|
|
|
key.push(DataValue::from(idx as i64));
|
|
|
|
|
let key = Tuple(key);
|
|
|
|
|
ret.put_kv(key, tuple, 0);
|
|
|
|
|
}
|
|
|
|
|
Ok(ret)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
Ordering::Equal
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Ok(all_data)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|