ic_dbms_api/
utils.rs

1use crate::prelude::{ColumnDef, Value, ValuesSource};
2
3/// Helper function which takes a list of `(ValuesSource, Value)` tuples, take only those with
4/// [`ValuesSource::Foreign`] matching the provided table and column names, and returns a vector of
5/// the corresponding `Value`s. with the [`ValuesSource`] set to [`ValuesSource::This`].
6pub fn self_reference_values(
7    values: &[(ValuesSource, Vec<(ColumnDef, Value)>)],
8    table: &'static str,
9    local_column: &'static str,
10) -> Vec<(ValuesSource, Vec<(ColumnDef, Value)>)> {
11    values
12        .iter()
13        .filter(|(source, _)| matches!(source, ValuesSource::Foreign { table: t, column } if *t == table && *column == local_column))
14        .map(|(_, value)| (ValuesSource::This, value.clone())
15    )
16    .collect()
17}
18
19#[cfg(test)]
20mod tests {
21
22    use ic_dbms_api::prelude::TableSchema;
23
24    use super::*;
25    use crate::tests::User;
26
27    #[test]
28    fn test_self_reference_values() {
29        let col = User::columns()[0]; // id column
30
31        let values = vec![(
32            ValuesSource::Foreign {
33                table: "users".to_string(),
34                column: "id".to_string(),
35            },
36            vec![(col, ic_dbms_api::prelude::Value::Uint64(42.into()))],
37        )];
38
39        let result = self_reference_values(&values, "users", "id");
40        assert_eq!(result.len(), 1);
41        assert_eq!(result[0].0, ValuesSource::This);
42        assert_eq!(result[0].1, values[0].1);
43    }
44}