Skip to content

Commit 8ebaece

Browse files
normalise Contains relationships
1 parent 5f54b52 commit 8ebaece

File tree

6 files changed

+119
-39
lines changed

6 files changed

+119
-39
lines changed

entity/src/relationship.rs

+28
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,34 @@ pub enum Relationship {
5050
#[sea_orm(num_value = 14)]
5151
PackageOf,
5252
#[sea_orm(num_value = 15)]
53+
Contains,
54+
#[sea_orm(num_value = 16)]
55+
Dependency,
56+
#[sea_orm(num_value = 17)]
57+
DevDependency,
58+
#[sea_orm(num_value = 18)]
59+
OptionalDependency,
60+
#[sea_orm(num_value = 19)]
61+
ProvidedDependency,
62+
#[sea_orm(num_value = 20)]
63+
TestDependency,
64+
#[sea_orm(num_value = 21)]
65+
RuntimeDependency,
66+
#[sea_orm(num_value = 22)]
67+
Example,
68+
#[sea_orm(num_value = 23)]
69+
Generates,
70+
#[sea_orm(num_value = 24)]
71+
Variant,
72+
#[sea_orm(num_value = 25)]
73+
BuildTool,
74+
#[sea_orm(num_value = 26)]
75+
DevTool,
76+
#[sea_orm(num_value = 27)]
77+
Describes,
78+
#[sea_orm(num_value = 28)]
79+
Packages,
80+
#[sea_orm(num_value = 29)]
5381
Undefined,
5482
}
5583

migration/src/lib.rs

+2
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ mod m0000820_create_conversation;
102102
mod m0000830_perf_indexes;
103103
mod m0000840_add_relationship_14_15;
104104
mod m0000850_python_version;
105+
mod m0000860_normalise_relationships;
105106

106107
pub struct Migrator;
107108

@@ -211,6 +212,7 @@ impl MigratorTrait for Migrator {
211212
Box::new(m0000830_perf_indexes::Migration),
212213
Box::new(m0000840_add_relationship_14_15::Migration),
213214
Box::new(m0000850_python_version::Migration),
215+
Box::new(m0000860_normalise_relationships::Migration),
214216
]
215217
}
216218
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
use sea_orm_migration::prelude::*;
2+
3+
#[derive(DeriveMigrationName)]
4+
pub struct Migration;
5+
const DATA: [(i32, &str); 14] = [
6+
(16, "Contains"),
7+
(17, "Dependency"),
8+
(18, "DevDependency"),
9+
(19, "OptionalDependency"),
10+
(20, "ProvidedDependency"),
11+
(21, "TestDependency"),
12+
(22, "RuntimeDependency"),
13+
(23, "Example"),
14+
(24, "Generates"),
15+
(25, "Variant"),
16+
(26, "BuildTool"),
17+
(27, "DevTool"),
18+
(28, "Describes"),
19+
(29, "Packages"),
20+
];
21+
22+
#[async_trait::async_trait]
23+
impl MigrationTrait for Migration {
24+
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
25+
for (id, description) in DATA {
26+
let insert = Query::insert()
27+
.into_table(Relationship::Table)
28+
.columns([Relationship::Id, Relationship::Description])
29+
.values_panic([id.into(), description.into()])
30+
.to_owned();
31+
32+
manager.exec_stmt(insert).await?;
33+
}
34+
35+
Ok(())
36+
}
37+
38+
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
39+
for (id, _) in DATA {
40+
let insert = Query::delete()
41+
.from_table(Relationship::Table)
42+
.and_where(Expr::col(Relationship::Id).lt(id))
43+
.to_owned();
44+
45+
manager.exec_stmt(insert).await?;
46+
}
47+
48+
Ok(())
49+
}
50+
}
51+
52+
#[derive(DeriveIden)]
53+
pub enum Relationship {
54+
Table,
55+
Id,
56+
Description,
57+
}

modules/analysis/src/service/mod.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,11 @@ pub fn dep_nodes(
5656
return;
5757
}
5858
visited.insert(node);
59-
for neighbor in graph.neighbors_directed(node, Direction::Incoming) {
59+
for neighbor in graph.neighbors_directed(node, Direction::Outgoing) {
6060
if let Some(dep_packagenode) = graph.node_weight(neighbor).cloned() {
6161
// Attempt to find the edge and get the relationship in a more elegant way
6262
if let Some(relationship) = graph
63-
.find_edge(neighbor, node)
63+
.find_edge(node, neighbor)
6464
.and_then(|edge_index| graph.edge_weight(edge_index))
6565
{
6666
let dep_node = DepNode {
@@ -102,10 +102,10 @@ pub fn ancestor_nodes(
102102

103103
while let Some(node) = stack.pop() {
104104
if discovered.visit(node) {
105-
for succ in graph.neighbors_directed(node, Direction::Outgoing) {
105+
for succ in graph.neighbors_directed(node, Direction::Incoming) {
106106
if !discovered.is_visited(&succ) {
107107
if let Some(anc_packagenode) = graph.node_weight(succ).cloned() {
108-
if let Some(edge) = graph.find_edge(node, succ) {
108+
if let Some(edge) = graph.find_edge(succ, node) {
109109
if let Some(relationship) = graph.edge_weight(edge) {
110110
let anc_node = AncNode {
111111
sbom_id: anc_packagenode.sbom_id,
@@ -133,7 +133,7 @@ pub fn ancestor_nodes(
133133
}
134134
}
135135
}
136-
if graph.neighbors_directed(node, Direction::Outgoing).count() == 0 {
136+
if graph.neighbors_directed(node, Direction::Incoming).count() == 0 {
137137
continue; // we are at the root
138138
}
139139
}

modules/ingestor/src/graph/sbom/cyclonedx.rs

+9-16
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use crate::graph::{
99
};
1010
use sea_orm::ConnectionTrait;
1111
use serde_cyclonedx::cyclonedx::v_1_6::{
12-
Component, ComponentEvidenceIdentity, CycloneDx, LicenseChoiceUrl, RefLinkType,
12+
Component, ComponentEvidenceIdentity, CycloneDx, LicenseChoiceUrl,
1313
};
1414
use std::str::FromStr;
1515
use time::{format_description::well_known::Iso8601, OffsetDateTime};
@@ -137,9 +137,9 @@ impl SbomContext {
137137
// create a relationship
138138

139139
creator.relate(
140-
bom_ref,
141-
Relationship::DescribedBy,
142140
CYCLONEDX_DOC_REF.to_string(),
141+
Relationship::Describes,
142+
bom_ref,
143143
);
144144
}
145145
}
@@ -151,12 +151,16 @@ impl SbomContext {
151151
// create relationships
152152

153153
for left in sbom.dependencies.iter().flatten() {
154-
creator.relate_all(&left.ref_, Relationship::DependencyOf, &left.depends_on);
154+
for target in left.depends_on.iter().flatten() {
155+
creator.relate(left.ref_.clone(), Relationship::Dependency, target.clone());
156+
}
155157

156158
// https://github.com/trustification/trustify/issues/1131
157159
// Do we need to qualify this so that only "arch=src" refs
158160
// get the GeneratedFrom relationship?
159-
creator.relate_all(&left.ref_, Relationship::GeneratedFrom, &left.provides);
161+
for target in left.depends_on.iter().flatten() {
162+
creator.relate(left.ref_.clone(), Relationship::Generates, target.clone());
163+
}
160164
}
161165

162166
// create
@@ -208,17 +212,6 @@ impl<'a> Creator<'a> {
208212
self.relations.push((left, rel, right));
209213
}
210214

211-
pub fn relate_all(
212-
&mut self,
213-
source: &RefLinkType,
214-
rel: Relationship,
215-
targets: &Option<Vec<RefLinkType>>,
216-
) {
217-
for target in targets.iter().flatten() {
218-
self.relate(target.clone(), rel, source.clone());
219-
}
220-
}
221-
222215
pub async fn create(self, db: &impl ConnectionTrait) -> anyhow::Result<()> {
223216
let mut purls = PurlCreator::new();
224217
let mut cpes = CpeCreator::new();

modules/ingestor/src/graph/sbom/spdx.rs

+18-18
Original file line numberDiff line numberDiff line change
@@ -251,31 +251,31 @@ impl<'spdx> TryFrom<(&'spdx str, &'spdx RelationshipType, &'spdx str)> for SpdxR
251251
) -> Result<Self, Self::Error> {
252252
match rel {
253253
RelationshipType::AncestorOf => Ok((left, Relationship::AncestorOf, right)),
254-
RelationshipType::BuildToolOf => Ok((left, Relationship::BuildToolOf, right)),
255-
RelationshipType::ContainedBy => Ok((left, Relationship::ContainedBy, right)),
256-
RelationshipType::Contains => Ok((right, Relationship::ContainedBy, left)),
257-
RelationshipType::DependencyOf => Ok((left, Relationship::DependencyOf, right)),
258-
RelationshipType::DependsOn => Ok((right, Relationship::DependencyOf, left)),
254+
RelationshipType::BuildToolOf => Ok((right, Relationship::BuildTool, left)),
255+
RelationshipType::ContainedBy => Ok((right, Relationship::Contains, left)),
256+
RelationshipType::Contains => Ok((left, Relationship::Contains, right)),
257+
RelationshipType::DependencyOf => Ok((right, Relationship::Dependency, left)),
258+
RelationshipType::DependsOn => Ok((left, Relationship::Dependency, right)),
259259
RelationshipType::DescendantOf => Ok((right, Relationship::AncestorOf, left)),
260-
RelationshipType::DescribedBy => Ok((left, Relationship::DescribedBy, right)),
261-
RelationshipType::Describes => Ok((right, Relationship::DescribedBy, left)),
262-
RelationshipType::DevDependencyOf => Ok((left, Relationship::DevDependencyOf, right)),
263-
RelationshipType::DevToolOf => Ok((left, Relationship::DevToolOf, right)),
264-
RelationshipType::ExampleOf => Ok((left, Relationship::ExampleOf, right)),
265-
RelationshipType::GeneratedFrom => Ok((left, Relationship::GeneratedFrom, right)),
266-
RelationshipType::Generates => Ok((right, Relationship::GeneratedFrom, left)),
260+
RelationshipType::DescribedBy => Ok((right, Relationship::Describes, left)),
261+
RelationshipType::Describes => Ok((left, Relationship::Describes, right)),
262+
RelationshipType::DevDependencyOf => Ok((right, Relationship::DevDependency, left)),
263+
RelationshipType::DevToolOf => Ok((right, Relationship::DevTool, left)),
264+
RelationshipType::ExampleOf => Ok((right, Relationship::Example, left)),
265+
RelationshipType::GeneratedFrom => Ok((right, Relationship::Generates, left)),
266+
RelationshipType::Generates => Ok((left, Relationship::Generates, right)),
267267
RelationshipType::OptionalDependencyOf => {
268-
Ok((left, Relationship::OptionalDependencyOf, right))
268+
Ok((right, Relationship::OptionalDependency, left))
269269
}
270-
RelationshipType::PackageOf => Ok((right, Relationship::PackageOf, left)),
270+
RelationshipType::PackageOf => Ok((right, Relationship::Packages, left)),
271271
RelationshipType::ProvidedDependencyOf => {
272-
Ok((left, Relationship::ProvidedDependencyOf, right))
272+
Ok((right, Relationship::ProvidedDependency, left))
273273
}
274274
RelationshipType::RuntimeDependencyOf => {
275-
Ok((left, Relationship::RuntimeDependencyOf, right))
275+
Ok((right, Relationship::RuntimeDependency, left))
276276
}
277-
RelationshipType::TestDependencyOf => Ok((left, Relationship::TestDependencyOf, right)),
278-
RelationshipType::VariantOf => Ok((left, Relationship::VariantOf, right)),
277+
RelationshipType::TestDependencyOf => Ok((right, Relationship::TestDependency, left)),
278+
RelationshipType::VariantOf => Ok((right, Relationship::Variant, left)),
279279
_ => Err(()),
280280
}
281281
.map(|(left, rel, right)| Self(left, rel, right))

0 commit comments

Comments
 (0)