1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
use std::collections::BTreeMap;
use core_traits::{
ValueType,
TypedValue,
};
use edn::query::{
Variable,
};
use query_algebrizer_traits::errors::{
AlgebrizerError,
Result,
};
pub struct QueryInputs {
pub(crate) types: BTreeMap<Variable, ValueType>,
pub(crate) values: BTreeMap<Variable, TypedValue>,
}
impl Default for QueryInputs {
fn default() -> Self {
QueryInputs {
types: BTreeMap::default(),
values: BTreeMap::default(),
}
}
}
impl QueryInputs {
pub fn with_value_sequence(vals: Vec<(Variable, TypedValue)>) -> QueryInputs {
let values: BTreeMap<Variable, TypedValue> = vals.into_iter().collect();
QueryInputs::with_values(values)
}
pub fn with_type_sequence(types: Vec<(Variable, ValueType)>) -> QueryInputs {
QueryInputs {
types: types.into_iter().collect(),
values: BTreeMap::default(),
}
}
pub fn with_values(values: BTreeMap<Variable, TypedValue>) -> QueryInputs {
QueryInputs {
types: values.iter().map(|(var, val)| (var.clone(), val.value_type())).collect(),
values: values,
}
}
pub fn new(mut types: BTreeMap<Variable, ValueType>,
values: BTreeMap<Variable, TypedValue>) -> Result<QueryInputs> {
for (var, v) in values.iter() {
let t = v.value_type();
let old = types.insert(var.clone(), t);
if let Some(old) = old {
if old != t {
bail!(AlgebrizerError::InputTypeDisagreement(var.name(), old, t));
}
}
}
Ok(QueryInputs { types: types, values: values })
}
}