Class: Lutaml::UmlRepository::Queries::DiagramQuery

Inherits:
BaseQuery
  • Object
show all
Defined in:
lib/lutaml/uml_repository/queries/diagram_query.rb

Overview

Query service for diagram operations.

Provides methods to find and list diagrams from packages using the diagram_index which maps package IDs/paths to diagram collections.

Examples:

Finding diagrams in a package

query = DiagramQuery.new(document, indexes)
diagrams = query.in_package("ModelRoot::i-UR::urf")

Finding a diagram by name

diagram = query.find_by_name("Class Diagram")

Getting all diagrams

all_diagrams = query.all

Instance Method Summary collapse

Methods inherited from BaseQuery

#initialize

Constructor Details

This class inherits a constructor from Lutaml::UmlRepository::Queries::BaseQuery

Instance Method Details

#allArray<Diagram>

Get all diagrams from all packages.

Examples:

all_diagrams = query.all
all_diagrams.each { |d| puts d.name }

Returns:

  • (Array<Diagram>)

    Array of all diagram objects



99
100
101
102
103
104
105
106
107
# File 'lib/lutaml/uml_repository/queries/diagram_query.rb', line 99

def all
  result = []

  indexes[:diagram_index].each_value do |diagrams|
    result.concat(diagrams)
  end

  result
end

#find_by_name(diagram_name) ⇒ Object

Find a diagram by its name.

Examples:

diagram = query.find_by_name("Building Class Diagram")

Parameters:

  • diagram_name (String)

    The diagram name to search for

Returns:

  • Diagram The diagram object, or nil if not found



54
55
56
57
58
# File 'lib/lutaml/uml_repository/queries/diagram_query.rb', line 54

def find_by_name(diagram_name)
  indexes[:diagram_index].values.filter_map do |diagrams|
    diagrams.select { |diagram| diagram.name == diagram_name }
  end.flatten.first
end

#find_by_package(package_id) ⇒ Array<Diagram>

Find diagrams containing a specific package by its XMI ID.

Parameters:

  • package_id (String)

    The XMI ID of the package

Returns:

  • (Array<Diagram>)

    Array of diagram objects



64
65
66
67
68
# File 'lib/lutaml/uml_repository/queries/diagram_query.rb', line 64

def find_by_package(package_id)
  indexes[:diagram_index].values.filter_map do |diagrams|
    diagrams.select { |diagram| diagram.package_id == package_id }
  end.flatten
end

#find_containing_class(class_xmi_id) ⇒ Array<Diagram>

Find diagrams containing a specific class by its XMI ID.

Parameters:

  • class_xmi_id (String)

    The XMI ID of the class

Returns:

  • (Array<Diagram>)

    Array of diagram objects



74
75
76
77
78
79
# File 'lib/lutaml/uml_repository/queries/diagram_query.rb', line 74

def find_containing_class(class_xmi_id)
  package = find_package_containing_class(class_xmi_id)
  return [] unless package

  find_by_package(package.xmi_id)
end

#find_package_containing_class(class_xmi_id) ⇒ Lutaml::Uml::Package?

Find the package containing a specific class by its XMI ID.

Parameters:

  • class_xmi_id (String)

    The XMI ID of the class

Returns:



85
86
87
88
89
90
91
# File 'lib/lutaml/uml_repository/queries/diagram_query.rb', line 85

def find_package_containing_class(class_xmi_id)
  qualified_name, _klass = find_class_by_id(class_xmi_id)
  return nil unless qualified_name

  package_path = qualified_name.split("::")[0..-2].join("::")
  indexes[:package_paths][package_path]
end

#in_package(package_path_string) ⇒ Array<Diagram>

Get diagrams in a specific package.

Examples:

diagrams = query.in_package("ModelRoot::i-UR::urf")

Parameters:

  • package_path_string (String)

    The package path

Returns:

  • (Array<Diagram>)

    Array of diagram objects in the package



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/lutaml/uml_repository/queries/diagram_query.rb', line 30

def in_package(package_path_string) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
  return [] if package_path_string.nil? || package_path_string.empty?

  # Try to find diagrams by path
  diagrams = indexes[:diagram_index][package_path_string]
  return diagrams if diagrams

  # Try to find the package and use its ID
  package = indexes[:package_paths][package_path_string]
  return [] unless package

  package_id = package.respond_to?(:xmi_id) ? package.xmi_id : nil
  return [] unless package_id

  indexes[:diagram_index][package_id] || []
end