Skip to content

Commit 12d70ad

Browse files
committed
refactor(graphdb): extract analyzed info for relationships into a struct
1 parent 45df230 commit 12d70ad

File tree

2 files changed

+61
-76
lines changed

2 files changed

+61
-76
lines changed

src/ops/storages/neo4j.rs

Lines changed: 36 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -362,14 +362,12 @@ impl ExportContext {
362362
rel_type = rel_spec.rel_type,
363363
};
364364

365-
let analyzed_src = analyzed_data_coll
366-
.source
365+
let analyzed_rel = analyzed_data_coll
366+
.rel
367367
.as_ref()
368-
.ok_or_else(|| anyhow!("Relationship spec requires source fields"))?;
369-
let analyzed_tgt = analyzed_data_coll
370-
.target
371-
.as_ref()
372-
.ok_or_else(|| anyhow!("Relationship spec requires target fields"))?;
368+
.ok_or_else(invariance_violation)?;
369+
let analyzed_src = &analyzed_rel.source;
370+
let analyzed_tgt = &analyzed_rel.target;
373371

374372
let (src_key_field_params, src_key_fields_literal) =
375373
Self::build_key_field_params_n_literal(
@@ -475,57 +473,41 @@ impl ExportContext {
475473
}
476474

477475
let value = &upsert.value;
478-
let mut insert_cypher =
476+
let mut query =
479477
self.bind_rel_key_field_params(neo4rs::query(&self.insert_cypher), &upsert.key)?;
480478

481-
if let Some(analyzed_src) = &self.analyzed_data_coll.source {
482-
insert_cypher = Self::bind_key_field_params(
483-
insert_cypher,
484-
&self.src_key_field_params,
485-
std::iter::zip(
486-
analyzed_src.schema.key_fields.iter(),
487-
analyzed_src.fields_input_idx.key.iter(),
488-
)
489-
.map(|(f, field_idx)| (&f.value_type.typ, &value.fields[*field_idx])),
490-
)?;
491-
492-
if analyzed_src.has_value_fields() {
493-
insert_cypher = insert_cypher.param(
494-
SRC_PROPS_PARAM,
495-
mapped_field_values_to_bolt(
496-
&analyzed_src.schema.value_fields,
497-
&analyzed_src.fields_input_idx.value,
498-
value,
499-
)?,
500-
);
501-
}
502-
}
503-
504-
if let Some(analyzed_tgt) = &self.analyzed_data_coll.target {
505-
insert_cypher = Self::bind_key_field_params(
506-
insert_cypher,
507-
&self.tgt_key_field_params,
508-
std::iter::zip(
509-
analyzed_tgt.schema.key_fields.iter(),
510-
analyzed_tgt.fields_input_idx.key.iter(),
511-
)
512-
.map(|(f, field_idx)| (&f.value_type.typ, &value.fields[*field_idx])),
513-
)?;
514-
515-
if analyzed_tgt.has_value_fields() {
516-
insert_cypher = insert_cypher.param(
517-
TGT_PROPS_PARAM,
518-
mapped_field_values_to_bolt(
519-
&analyzed_tgt.schema.value_fields,
520-
&analyzed_tgt.fields_input_idx.value,
521-
value,
522-
)?,
523-
);
524-
}
479+
if let Some(analyzed_rel) = &self.analyzed_data_coll.rel {
480+
let bind_params = |query: neo4rs::Query,
481+
analyzed: &AnalyzedGraphElementFieldMapping,
482+
key_field_params: &[String]|
483+
-> Result<neo4rs::Query> {
484+
let mut query = Self::bind_key_field_params(
485+
query,
486+
key_field_params,
487+
std::iter::zip(
488+
analyzed.schema.key_fields.iter(),
489+
analyzed.fields_input_idx.key.iter(),
490+
)
491+
.map(|(f, field_idx)| (&f.value_type.typ, &value.fields[*field_idx])),
492+
)?;
493+
if analyzed.has_value_fields() {
494+
query = query.param(
495+
SRC_PROPS_PARAM,
496+
mapped_field_values_to_bolt(
497+
&analyzed.schema.value_fields,
498+
&analyzed.fields_input_idx.value,
499+
value,
500+
)?,
501+
);
502+
}
503+
Ok(query)
504+
};
505+
query = bind_params(query, &analyzed_rel.source, &self.src_key_field_params)?;
506+
query = bind_params(query, &analyzed_rel.target, &self.tgt_key_field_params)?;
525507
}
526508

527509
if !self.analyzed_data_coll.value_fields_input_idx.is_empty() {
528-
insert_cypher = insert_cypher.param(
510+
query = query.param(
529511
CORE_PROPS_PARAM,
530512
mapped_field_values_to_bolt(
531513
&self.analyzed_data_coll.schema.value_fields,
@@ -534,7 +516,7 @@ impl ExportContext {
534516
)?,
535517
);
536518
}
537-
queries.push(insert_cypher);
519+
queries.push(query);
538520
Ok(())
539521
}
540522

src/ops/storages/shared/property_graph.rs

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -132,22 +132,24 @@ impl AnalyzedGraphElementFieldMapping {
132132
}
133133
}
134134

135+
pub struct AnalyzedRelationshipInfo {
136+
pub source: AnalyzedGraphElementFieldMapping,
137+
pub target: AnalyzedGraphElementFieldMapping,
138+
}
139+
135140
pub struct AnalyzedDataCollection {
136141
pub schema: Arc<GraphElementSchema>,
137142
pub value_fields_input_idx: Vec<usize>,
138143

139-
pub source: Option<AnalyzedGraphElementFieldMapping>,
140-
pub target: Option<AnalyzedGraphElementFieldMapping>,
144+
pub rel: Option<AnalyzedRelationshipInfo>,
141145
}
142146

143147
impl AnalyzedDataCollection {
144148
pub fn dependent_node_labels(&self) -> IndexSet<&str> {
145149
let mut dependent_node_labels = IndexSet::new();
146-
if let Some(source) = &self.source {
147-
dependent_node_labels.insert(source.schema.elem_type.label());
148-
}
149-
if let Some(target) = &self.target {
150-
dependent_node_labels.insert(target.schema.elem_type.label());
150+
if let Some(rel) = &self.rel {
151+
dependent_node_labels.insert(rel.source.schema.elem_type.label());
152+
dependent_node_labels.insert(rel.target.schema.elem_type.label());
151153
}
152154
dependent_node_labels
153155
}
@@ -514,26 +516,27 @@ pub fn analyze_graph_mappings<'a, AuthEntry: 'a>(
514516
.ok_or_else(invariance_violation)?
515517
.clone(),
516518
value_fields_input_idx: processed_info.value_input_fields_idx,
517-
source: None,
518-
target: None,
519+
rel: None,
519520
},
520521
// Relationship
521522
Some(rel_info) => AnalyzedDataCollection {
522523
schema: Arc::new(rel_info.rel_schema),
523524
value_fields_input_idx: processed_info.value_input_fields_idx,
524-
source: Some(AnalyzedGraphElementFieldMapping {
525-
schema: node_schemas
526-
.get(&rel_info.source_typ)
527-
.ok_or_else(invariance_violation)?
528-
.clone(),
529-
fields_input_idx: rel_info.source_fields_idx,
530-
}),
531-
target: Some(AnalyzedGraphElementFieldMapping {
532-
schema: node_schemas
533-
.get(&rel_info.target_typ)
534-
.ok_or_else(invariance_violation)?
535-
.clone(),
536-
fields_input_idx: rel_info.target_fields_idx,
525+
rel: Some(AnalyzedRelationshipInfo {
526+
source: AnalyzedGraphElementFieldMapping {
527+
schema: node_schemas
528+
.get(&rel_info.source_typ)
529+
.ok_or_else(invariance_violation)?
530+
.clone(),
531+
fields_input_idx: rel_info.source_fields_idx,
532+
},
533+
target: AnalyzedGraphElementFieldMapping {
534+
schema: node_schemas
535+
.get(&rel_info.target_typ)
536+
.ok_or_else(invariance_violation)?
537+
.clone(),
538+
fields_input_idx: rel_info.target_fields_idx,
539+
},
537540
}),
538541
},
539542
};

0 commit comments

Comments
 (0)