1use crate::prelude::{ColumnDef, Value, ValuesSource};
2
3pub 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]; 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}