Class: Lutaml::UmlRepository::Queries::InheritanceQuery
- Defined in:
- lib/lutaml/uml_repository/queries/inheritance_query.rb
Overview
Query service for inheritance operations.
Provides methods to navigate class inheritance hierarchies using the inheritance_graph index, which maps parent qualified names to arrays of child qualified names.
Instance Method Summary collapse
-
#ancestors(class_or_qname) ⇒ Array
Get all ancestor classes up to the root.
-
#descendants(class_or_qname, max_depth: nil) ⇒ Array
Get all descendant classes.
-
#find_ancestors(class_xmi_id) ⇒ Array
Get all ancestor classes up to the root by class XMI ID.
-
#has_circular_inheritance?(class_or_id, visited: Set.new) ⇒ Boolean
Check if a class has circular inheritance.
-
#inheritance_tree(class_or_id) ⇒ Hash?
Build inheritance tree for a class.
-
#resolve_class(class_or_qname) ⇒ Lutaml::Uml::Class?
Resolve a class or qualified name to a class object.
-
#resolve_qname(class_or_qname) ⇒ String?
Resolve a class or qualified name to a qualified name string.
-
#subtypes(class_or_qname, recursive: false) ⇒ Array
(also: #find_children)
Get direct child classes (subtypes).
-
#supertype(class_or_qname) ⇒ Lutaml::Uml::Class?
(also: #find_parent)
Get the direct parent class (supertype).
Methods inherited from BaseQuery
Constructor Details
This class inherits a constructor from Lutaml::UmlRepository::Queries::BaseQuery
Instance Method Details
#ancestors(class_or_qname) ⇒ Array
Get all ancestor classes up to the root.
Returns ancestors in order from immediate parent to root.
84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
# File 'lib/lutaml/uml_repository/queries/inheritance_query.rb', line 84 def ancestors(class_or_qname) result = [] current = class_or_qname loop do parent = supertype(current) break unless parent result << parent current = parent end result end |
#descendants(class_or_qname, max_depth: nil) ⇒ Array
Get all descendant classes.
119 120 121 122 123 124 |
# File 'lib/lutaml/uml_repository/queries/inheritance_query.rb', line 119 def descendants(class_or_qname, max_depth: nil) qname_string = resolve_qname(class_or_qname) return [] unless qname_string collect_descendants(qname_string, max_depth, 0) end |
#find_ancestors(class_xmi_id) ⇒ Array
Get all ancestor classes up to the root by class XMI ID.
103 104 105 106 107 108 |
# File 'lib/lutaml/uml_repository/queries/inheritance_query.rb', line 103 def find_ancestors(class_xmi_id) qualified_name, _klass = find_class_by_id(class_xmi_id) return [] unless qualified_name ancestors(qualified_name) end |
#has_circular_inheritance?(class_or_id, visited: Set.new) ⇒ Boolean
Check if a class has circular inheritance.
187 188 189 190 191 192 193 194 195 196 197 |
# File 'lib/lutaml/uml_repository/queries/inheritance_query.rb', line 187 def has_circular_inheritance?(class_or_id, visited: Set.new) qname = resolve_to_qname(class_or_id) return false unless qname return true if visited.include?(qname) visited.add(qname) child_qnames = indexes[:inheritance_graph][qname] || [] child_qnames.any? do |child_qname| has_circular_inheritance?(child_qname, visited: visited.dup) end end |
#inheritance_tree(class_or_id) ⇒ Hash?
Build inheritance tree for a class.
164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 |
# File 'lib/lutaml/uml_repository/queries/inheritance_query.rb', line 164 def inheritance_tree(class_or_id) klass = resolve_by_id_or_qname(class_or_id) return nil unless klass qname = resolve_qname(klass) return nil unless qname child_qnames = indexes[:inheritance_graph][qname] || [] child_trees = child_qnames.filter_map do |child_qname| inheritance_tree(child_qname) end { class: klass, children: child_trees, } end |
#resolve_class(class_or_qname) ⇒ Lutaml::Uml::Class?
Resolve a class or qualified name to a class object.
or nil if not found
132 133 134 135 136 137 138 |
# File 'lib/lutaml/uml_repository/queries/inheritance_query.rb', line 132 def resolve_class(class_or_qname) if class_or_qname.is_a?(String) indexes[:qualified_names][class_or_qname] else class_or_qname end end |
#resolve_qname(class_or_qname) ⇒ String?
Resolve a class or qualified name to a qualified name string.
145 146 147 148 149 150 151 152 153 154 155 156 157 |
# File 'lib/lutaml/uml_repository/queries/inheritance_query.rb', line 145 def resolve_qname(class_or_qname) if class_or_qname.is_a?(String) && indexes[:qualified_names].key?(class_or_qname) return class_or_qname end # Search for the class in the index qname, _klass = indexes[:qualified_names].find do |_name, entity| entity == class_or_qname end qname.nil? ? nil : qname end |
#subtypes(class_or_qname, recursive: false) ⇒ Array Also known as: find_children
Get direct child classes (subtypes).
61 62 63 64 65 66 67 68 69 70 |
# File 'lib/lutaml/uml_repository/queries/inheritance_query.rb', line 61 def subtypes(class_or_qname, recursive: false) qname_string = resolve_qname(class_or_qname) return [] unless qname_string if recursive descendants(class_or_qname) else direct_subtypes(qname_string) end end |
#supertype(class_or_qname) ⇒ Lutaml::Uml::Class? Also known as: find_parent
Get the direct parent class (supertype).
or nil if no parent
33 34 35 36 37 38 39 40 41 42 43 44 45 |
# File 'lib/lutaml/uml_repository/queries/inheritance_query.rb', line 33 def supertype(class_or_qname) klass = resolve_class(class_or_qname) return nil unless valid_supertype_target?(klass) parent_name = extract_parent_name(klass.generalization) return nil unless parent_name return nil if parent_name == klass.name parent_qname = resolve_parent_qname(class_or_qname, parent_name) return nil unless parent_qname indexes[:qualified_names][parent_qname] end |