diff --git a/site/cds_rdm/inspire_harvester/load/matcher.py b/site/cds_rdm/inspire_harvester/load/matcher.py index 12ac2e15..0635d4e4 100644 --- a/site/cds_rdm/inspire_harvester/load/matcher.py +++ b/site/cds_rdm/inspire_harvester/load/matcher.py @@ -110,10 +110,10 @@ class ReportNumberMatchFilter(FilterCandidate): def query(self): """Build the CDS report number query.""" return [ - dsl.Q("term", **{"metadata.related_identifiers.scheme": "cdsrn"}), + dsl.Q("term", **{"metadata.identifiers.scheme": "cdsrn"}), dsl.Q( "term", - **{"metadata.related_identifiers.identifier": self.value}, + **{"metadata.identifiers.identifier": self.value}, ), ] @@ -163,11 +163,12 @@ def _retrieve_identifier(self, identifiers, scheme) -> Optional[str]: def _build_filter_priority(self, entry, inspire_id, cdsrdm_id): """Build the priority-ordered record match candidates.""" doi = entry.get("pids", {}).get("doi", {}).get("identifier") + identifiers = entry["metadata"].get("identifiers", []) related_identifiers = entry["metadata"].get("related_identifiers", []) cds_id = self._retrieve_identifier(related_identifiers, "cds") arxiv_id = self._retrieve_identifier(related_identifiers, "arxiv") - report_number = self._retrieve_identifier(related_identifiers, "cdsrn") + report_number = self._retrieve_identifier(identifiers, "cdsrn") return [ ParentMatchFilter(value=cdsrdm_id), CDSIdentifierMatchFilter(value=cds_id), diff --git a/site/cds_rdm/inspire_harvester/transform/mappers/identifiers.py b/site/cds_rdm/inspire_harvester/transform/mappers/identifiers.py index 387fb211..0906d891 100644 --- a/site/cds_rdm/inspire_harvester/transform/mappers/identifiers.py +++ b/site/cds_rdm/inspire_harvester/transform/mappers/identifiers.py @@ -104,6 +104,13 @@ def map_value(self, src_record, ctx, logger): "Unexpected schema in external_system_identifiers. " f"| details: schema={schema}, value={value}" ) + + # CDS report numbers that start with CERN- belong on the record itself. + for rn in src_metadata.get("report_numbers", []): + value = rn.get("value") + if value and value.startswith("CERN-"): + identifiers.append({"identifier": value, "scheme": "cdsrn"}) + unique_ids = [dict(t) for t in {tuple(sorted(d.items())) for d in identifiers}] return unique_ids @@ -211,10 +218,13 @@ def map_value(self, src_record, ctx, logger): report_numbers = src_metadata.get("report_numbers", []) for rn in report_numbers: + value = rn.get("value") + if not value or value.startswith("CERN-"): + continue identifiers.append( { "scheme": "cdsrn", - "identifier": f"{rn['value']}", + "identifier": value, "relation_type": {"id": "isvariantformof"}, "resource_type": {"id": ctx.resource_type.value}, }