Process a node pattern element
(
&mut self,
node_pattern: &crate::ast::Node,
variables: &mut HashMap<String, VariableInfo>,
)
| 86 | |
| 87 | /// Process a node pattern element |
| 88 | fn process_node_pattern( |
| 89 | &mut self, |
| 90 | node_pattern: &crate::ast::Node, |
| 91 | variables: &mut HashMap<String, VariableInfo>, |
| 92 | ) -> Result<Option<InsertPattern>, PlanningError> { |
| 93 | // Check if this is a reference to an already-defined node |
| 94 | if let Some(ref identifier) = node_pattern.identifier { |
| 95 | if self.defined_identifiers.contains(identifier) { |
| 96 | log::debug!( |
| 97 | "Node '{}' is a reference to existing definition, skipping node creation", |
| 98 | identifier |
| 99 | ); |
| 100 | return Ok(None); // This is a reference, not a new node |
| 101 | } |
| 102 | } |
| 103 | |
| 104 | // Extract properties |
| 105 | let properties = if let Some(ref prop_map) = node_pattern.properties { |
| 106 | self.extract_properties(prop_map)? |
| 107 | } else { |
| 108 | HashMap::new() |
| 109 | }; |
| 110 | |
| 111 | // Generate content-based storage ID |
| 112 | let storage_id = Self::generate_node_content_id(&node_pattern.labels, &properties); |
| 113 | |
| 114 | // If there's an identifier, add it to our mappings and mark as defined |
| 115 | if let Some(ref identifier) = node_pattern.identifier { |
| 116 | self.identifier_mappings.insert( |
| 117 | identifier.clone(), |
| 118 | NodeIdentifier { |
| 119 | storage_id: storage_id.clone(), |
| 120 | labels: node_pattern.labels.clone(), |
| 121 | is_reference: false, |
| 122 | }, |
| 123 | ); |
| 124 | self.defined_identifiers.insert(identifier.clone()); |
| 125 | |
| 126 | // Add to variables |
| 127 | variables.insert( |
| 128 | identifier.clone(), |
| 129 | VariableInfo { |
| 130 | name: identifier.clone(), |
| 131 | entity_type: EntityType::Node, |
| 132 | labels: node_pattern.labels.clone(), |
| 133 | required_properties: properties.keys().cloned().collect(), |
| 134 | }, |
| 135 | ); |
| 136 | } |
| 137 | |
| 138 | log::debug!("Creating node pattern with storage_id: {}", storage_id); |
| 139 | |
| 140 | Ok(Some(InsertPattern::CreateNode { |
| 141 | storage_id, |
| 142 | labels: node_pattern.labels.clone(), |
| 143 | properties, |
| 144 | original_identifier: node_pattern.identifier.clone(), |
| 145 | })) |
no test coverage detected