lutaml 0.10.2 → 0.10.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -485,9 +485,7 @@ module Lutaml
485
485
  # @return [Array<Hash>]
486
486
  # @note xpath %(//diagrams/diagram/model[@package="#{node['xmi:id']}"])
487
487
  def serialize_model_diagrams(node_id, with_package: false) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
488
- diagrams = @xmi_root_model.extension.diagrams.diagram.select do |d|
489
- d.model.package == node_id
490
- end
488
+ diagrams = diagram_lookup[node_id]
491
489
 
492
490
  diagrams.map do |diagram|
493
491
  h = {
@@ -506,6 +504,17 @@ module Lutaml
506
504
  end
507
505
  end
508
506
 
507
+ # Lazy-built hash index for O(1) diagram lookups by package
508
+ # @return [Hash] Mapping of package_id => [diagrams]
509
+ def diagram_lookup
510
+ @diagram_lookup ||= begin
511
+ idx = Hash.new { |h, k| h[k] = [] }
512
+ diagrams = @xmi_root_model.extension&.diagrams&.diagram || []
513
+ diagrams.each { |d| idx[d.model.package] << d if d.model&.package }
514
+ idx
515
+ end
516
+ end
517
+
509
518
  # @param xmi_id [String]
510
519
  # @return [Array<Hash>]
511
520
  # @note xpath %(//element[@xmi:idref="#{xmi_id}"]/links/*)
@@ -932,8 +941,22 @@ module Lutaml
932
941
  # @param source_or_target [String]
933
942
  # @return [String]
934
943
  def connector_node_by_id(xmi_id, source_or_target)
935
- @xmi_root_model.extension.connectors.connector.find do |con|
936
- con.send(source_or_target.to_sym).idref == xmi_id
944
+ connector_lookup[[source_or_target.to_sym, xmi_id]]
945
+ end
946
+
947
+ # Lazy-built hash index for O(1) connector lookups
948
+ # @return [Hash] Mapping of [direction, idref] => connector
949
+ def connector_lookup
950
+ @connector_lookup ||= begin
951
+ lookup = {}
952
+ connectors = @xmi_root_model.extension&.connectors&.connector || []
953
+ connectors.each do |con|
954
+ %i[source target].each do |dir|
955
+ idref = con.send(dir)&.idref
956
+ lookup[[dir, idref]] = con if idref
957
+ end
958
+ end
959
+ lookup
937
960
  end
938
961
  end
939
962
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lutaml
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.2
4
+ version: 0.10.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-04-23 00:00:00.000000000 Z
11
+ date: 2026-04-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: expressir