Skip to content

Commit 2826524

Browse files
JimFuller-RedHatctron
authored andcommitted
latest analysis: fixes TC-3278 and TC-3073 by providing tie breaker logic for when equal external node_id
1 parent 6eaba34 commit 2826524

File tree

2 files changed

+25
-18
lines changed

2 files changed

+25
-18
lines changed

modules/analysis/src/endpoints/tests/latest_filters.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -963,14 +963,14 @@ async fn test_tc3518(ctx: &TrustifyContext) -> Result<(), anyhow::Error> {
963963
"2025-12-22 17:55:59+00",
964964
"2025-12-22 17:55:59+00",
965965
"2025-12-22 17:55:59+00",
966-
"2025-11-17 17:21:45+00",
967-
"2025-11-17 17:21:45+00",
968-
"2025-11-17 17:21:45+00",
969-
"2025-11-17 17:21:45+00",
970-
"2025-11-17 17:21:45+00",
971-
"2025-11-17 17:21:45+00",
972-
"2025-11-17 17:21:45+00",
973-
"2025-11-17 17:21:45+00",
966+
"2025-12-22 17:21:45+00",
967+
"2025-12-22 17:21:45+00",
968+
"2025-12-22 17:21:45+00",
969+
"2025-12-22 17:21:45+00",
970+
"2025-12-22 17:21:45+00",
971+
"2025-12-22 17:21:45+00",
972+
"2025-12-22 17:21:45+00",
973+
"2025-12-22 17:21:45+00"
974974
]
975975
);
976976

modules/analysis/src/service/mod.rs

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ use petgraph::{
2929
visit::{VisitMap, Visitable},
3030
};
3131
use sea_orm::{
32-
ColumnTrait, EntityOrSelect, EntityTrait, PaginatorTrait, QueryFilter, QuerySelect,
32+
ColumnTrait, EntityOrSelect, EntityTrait, PaginatorTrait, QueryFilter, QueryOrder, QuerySelect,
3333
RelationTrait, prelude::ConnectionTrait,
3434
};
3535
use sea_query::JoinType;
@@ -103,9 +103,15 @@ async fn resolve_external_sbom<C: ConnectionTrait>(
103103
node_id: &str,
104104
connection: &C,
105105
) -> Result<Option<ResolvedSbom>, Error> {
106-
// we first lookup in sbom_external_node
106+
// 1. Lookup in sbom_external_node.
107+
// TIE-BREAKER: Join with Sbom to pick the latest published version of this node mapping.
107108
let Some(sbom_external_node) = sbom_external_node::Entity::find()
109+
.join(
110+
JoinType::InnerJoin,
111+
sbom_external_node::Relation::Sbom.def(),
112+
)
108113
.filter(sbom_external_node::Column::NodeId.eq(node_id))
114+
.order_by_desc(trustify_entity::sbom::Column::Published)
109115
.one(connection)
110116
.await?
111117
else {
@@ -139,18 +145,18 @@ async fn resolve_external_sbom<C: ConnectionTrait>(
139145
DiscriminatorType::Sha256 => {
140146
query = query.filter(source_document::Column::Sha256.eq(&discriminator_value))
141147
}
142-
_ => {
143-
return Ok(None);
144-
}
148+
_ => return Ok(None),
145149
};
146150

147-
Ok(match query.one(connection).await? {
148-
Some(entity) => Some(ResolvedSbom {
151+
// TIE-BREAKER: Order by published date to ensure we get the latest SPDX doc
152+
Ok(query
153+
.order_by_desc(sbom::Column::Published)
154+
.one(connection)
155+
.await?
156+
.map(|entity| ResolvedSbom {
149157
sbom_id: entity.sbom_id,
150158
node_id: sbom_external_node.external_node_ref,
151-
}),
152-
_ => None,
153-
})
159+
}))
154160
}
155161
ExternalType::CycloneDx => {
156162
// For cyclonedx, sbom_external_node discriminator_type and discriminator_value are used
@@ -170,6 +176,7 @@ async fn resolve_external_sbom<C: ConnectionTrait>(
170176

171177
Ok(sbom::Entity::find()
172178
.filter(sbom::Column::DocumentId.eq(external_doc_id))
179+
.order_by_desc(sbom::Column::Published)
173180
.one(connection)
174181
.await?
175182
.map(|entity| ResolvedSbom {

0 commit comments

Comments
 (0)