Process an edge pattern element
(
&mut self,
edge_pattern: &crate::ast::Edge,
all_elements: &[PatternElement],
current_idx: usize,
variables: &mut HashMap<String, VariableInfo>,
)
| 147 | |
| 148 | /// Process an edge pattern element |
| 149 | fn process_edge_pattern( |
| 150 | &mut self, |
| 151 | edge_pattern: &crate::ast::Edge, |
| 152 | all_elements: &[PatternElement], |
| 153 | current_idx: usize, |
| 154 | variables: &mut HashMap<String, VariableInfo>, |
| 155 | ) -> Result<Vec<InsertPattern>, PlanningError> { |
| 156 | // Find source and target nodes |
| 157 | let source_node_id = self.resolve_adjacent_node(all_elements, current_idx, -1)?; |
| 158 | let target_node_id = self.resolve_adjacent_node(all_elements, current_idx, 1)?; |
| 159 | |
| 160 | // Extract edge properties |
| 161 | let properties = if let Some(ref prop_map) = edge_pattern.properties { |
| 162 | self.extract_properties(prop_map)? |
| 163 | } else { |
| 164 | HashMap::new() |
| 165 | }; |
| 166 | |
| 167 | let edge_label = edge_pattern |
| 168 | .labels |
| 169 | .first() |
| 170 | .cloned() |
| 171 | .unwrap_or_else(|| "CONNECTED".to_string()); |
| 172 | |
| 173 | // Generate content-based storage ID for the edge |
| 174 | let edge_storage_id = Self::generate_edge_content_id( |
| 175 | &source_node_id, |
| 176 | &target_node_id, |
| 177 | &edge_label, |
| 178 | &properties, |
| 179 | ); |
| 180 | |
| 181 | // Add edge variable if present |
| 182 | if let Some(ref identifier) = edge_pattern.identifier { |
| 183 | variables.insert( |
| 184 | identifier.clone(), |
| 185 | VariableInfo { |
| 186 | name: identifier.clone(), |
| 187 | entity_type: EntityType::Edge, |
| 188 | labels: edge_pattern.labels.clone(), |
| 189 | required_properties: properties.keys().cloned().collect(), |
| 190 | }, |
| 191 | ); |
| 192 | } |
| 193 | |
| 194 | log::debug!( |
| 195 | "Creating edge pattern: {} -[{}]-> {}", |
| 196 | source_node_id, |
| 197 | edge_label, |
| 198 | target_node_id |
| 199 | ); |
| 200 | |
| 201 | Ok(vec![InsertPattern::CreateEdge { |
| 202 | storage_id: edge_storage_id, |
| 203 | from_node_id: source_node_id, |
| 204 | to_node_id: target_node_id, |
| 205 | label: edge_label, |
| 206 | properties, |
no test coverage detected