linkrs_query/optimizer/analysis/required_properties/
map.rs1use std::collections::HashMap;
4
5use super::requirement::PropertyRequirement;
6
7#[derive(Debug, Clone, Default)]
10pub struct RequiredPropertiesMap {
11 requirements: HashMap<i64, Vec<PropertyRequirement>>,
12}
13
14impl RequiredPropertiesMap {
15 pub fn record(&mut self, node_id: i64, requirements: &[PropertyRequirement]) {
17 self.requirements.insert(node_id, requirements.to_vec());
18 }
19
20 pub fn get(&self, node_id: i64) -> Option<&[PropertyRequirement]> {
22 self.requirements.get(&node_id).map(Vec::as_slice)
23 }
24
25 pub fn requirement_for_var(&self, node_id: i64, var: &str) -> Option<PropertyRequirement> {
27 let mut merged: Option<PropertyRequirement> = None;
28 for req in self.requirements.get(&node_id)? {
29 if req.alias == var {
30 match merged.as_mut() {
31 Some(acc) => acc.merge(req),
32 None => merged = Some(req.clone()),
33 }
34 }
35 }
36 merged
37 }
38
39 pub fn narrowable_properties(&self, node_id: i64, var: &str) -> Option<Vec<String>> {
47 let req = self.requirement_for_var(node_id, var)?;
48 if !req.is_narrowable() {
49 return None;
50 }
51 Some(req.prop_names.into_iter().collect())
52 }
53}