compactAllIris method

IriCompactionResult compactAllIris(
  1. RdfGraph graph,
  2. Map<String, String> customPrefixes, {
  3. String? baseUri,
})

Implementation

IriCompactionResult compactAllIris(
  RdfGraph graph,
  Map<String, String> customPrefixes, {
  String? baseUri,
}) {
  final prefixCandidates = {
    ..._namespaceMappings.asMap(),
  };
  prefixCandidates
      .removeWhere((key, value) => customPrefixes.values.contains(value));
  prefixCandidates.addAll(customPrefixes);

  final usedPrefixes = <String, String>{};
  final compactIris = <(
    IriTerm iri,
    IriRole role,
  ),
      CompactIri>{};
  // Create an inverted index for quick lookup
  final iriToPrefixMap = {
    for (final e in prefixCandidates.entries) e.value: e.key
  };
  if (iriToPrefixMap.length != prefixCandidates.length) {
    throw ArgumentError(
      'Duplicate namespace URIs found in prefix candidates: $prefixCandidates',
    );
  }
  final List<(IriTerm iri, IriRole role)> iris = graph.triples
      .expand((triple) => <(IriTerm iri, IriRole role)>[
            if (triple.subject is IriTerm)
              (triple.subject as IriTerm, IriRole.subject),
            if (triple.predicate is IriTerm)
              (triple.predicate as IriTerm, IriRole.predicate),
            if (triple.object is IriTerm && triple.predicate == Rdf.type)
              (triple.object as IriTerm, IriRole.type),
            if (triple.object is IriTerm && triple.predicate != Rdf.type)
              (triple.object as IriTerm, IriRole.object),
            if (triple.object is LiteralTerm)
              ((triple.object as LiteralTerm).datatype, IriRole.datatype),
          ])
      .toList();

  for (final (iri, role) in iris) {
    final compacted = compactIri(
        iri, role, baseUri, iriToPrefixMap, prefixCandidates, customPrefixes);
    compactIris[(iri, role)] = compacted;
    if (compacted
        case PrefixedIri(
          prefix: var prefix,
          namespace: var namespace,
        )) {
      // Add the prefix to all relevant maps
      usedPrefixes[prefix] = namespace;
      final oldNamespace = prefixCandidates[prefix];
      final oldPrefix = iriToPrefixMap[namespace];
      if (oldNamespace != null && oldNamespace != namespace) {
        throw ArgumentError(
          'Namespace conflict for prefix "$prefix": '
          'already mapped to "$oldNamespace", cannot map to "$namespace".',
        );
      }
      if (oldPrefix != null && oldPrefix != prefix) {
        throw ArgumentError(
          'Prefix conflict for namespace "$namespace": '
          'already mapped to "$oldPrefix", cannot map to "$prefix".',
        );
      }
      // Update candidates with new prefix
      prefixCandidates[prefix] = namespace;
      iriToPrefixMap[namespace] = prefix; // Update inverse mapping
    }
  }

  return IriCompactionResult(
      prefixes: usedPrefixes, compactIris: compactIris);
}