Class: Lutaml::Qea::Database

Inherits:
Object
  • Object
show all
Defined in:
lib/lutaml/qea/database.rb,
lib/lutaml/qea/lookup_indexes.rb

Overview

Database container for all loaded EA models

This class provides a unified container for all EA table collections loaded from a QEA database. It stores collections by name and provides accessor methods, statistics, and lookup functionality.

Examples:

Load and access database

database = Lutaml::Qea::Services::DatabaseLoader.new("file.qea").load
puts database.stats
# => {"objects" => 693, "attributes" => 1910, ...}

classes = database.objects.find_by_type("Class")
obj = database.find_object(123)

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(qea_path, connection = nil) ⇒ Database

Returns a new instance of Database.



31
32
33
34
35
36
# File 'lib/lutaml/qea/database.rb', line 31

def initialize(qea_path, connection = nil)
  @qea_path = qea_path
  @connection = connection
  @collections = {}
  @mutex = Mutex.new
end

Instance Attribute Details

#collectionsHash<Symbol, Array> (readonly)

Returns Collections of records by name.

Returns:

  • (Hash<Symbol, Array>)

    Collections of records by name



23
24
25
# File 'lib/lutaml/qea/database.rb', line 23

def collections
  @collections
end

#connectionSQLite3::Database?

Returns Database connection.

Returns:

  • (SQLite3::Database, nil)

    Database connection



29
30
31
# File 'lib/lutaml/qea/database.rb', line 29

def connection
  @connection
end

#qea_pathString (readonly)

Returns Path to the QEA file.

Returns:

  • (String)

    Path to the QEA file



26
27
28
# File 'lib/lutaml/qea/database.rb', line 26

def qea_path
  @qea_path
end

Instance Method Details

#add_collection(name, records) ⇒ void

This method returns an undefined value.

Add a collection to the database

Parameters:

  • name (Symbol, String)

    Collection name (e.g., :objects)

  • records (Array)

    Array of model instances



51
52
53
54
55
# File 'lib/lutaml/qea/database.rb', line 51

def add_collection(name, records)
  @mutex.synchronize do
    @collections[name.to_sym] = records.freeze
  end
end

#attribute_tagsArray<Models::EaAttributeTag>

Get attribute tags collection

Returns:



149
150
151
# File 'lib/lutaml/qea/database.rb', line 149

def attribute_tags
  @collections[:attribute_tags] || []
end

#attributesArray<Models::EaAttribute>

Get attributes collection

Returns:



71
72
73
# File 'lib/lutaml/qea/database.rb', line 71

def attributes
  @collections[:attributes] || []
end

#attributes_for_object(object_id) ⇒ Array<Models::EaAttribute>

Get attributes for a specific object

Parameters:

  • object_id (Integer)

    Object ID

Returns:



333
334
335
336
337
# File 'lib/lutaml/qea/database.rb', line 333

def attributes_for_object(object_id)
  @attributes_by_object_id ||= build_group_index(attributes,
                                                 :ea_object_id)
  @attributes_by_object_id[object_id] || []
end

#child_packages_for(parent_id) ⇒ Array<Models::EaPackage>

Get child packages for a parent

Parameters:

  • parent_id (Integer)

    Parent package ID

Returns:



374
375
376
377
# File 'lib/lutaml/qea/database.rb', line 374

def child_packages_for(parent_id)
  @packages_by_parent ||= build_group_index(packages, :parent_id)
  @packages_by_parent[parent_id] || []
end

#collection_namesArray<Symbol>

Get collection names

Returns:

  • (Array<Symbol>)

    Array of collection names



316
317
318
# File 'lib/lutaml/qea/database.rb', line 316

def collection_names
  @collections.keys
end

#complexity_typesArray<Models::EaComplexityType>

Get complexity types collection (Priority 3 lookup table)

Returns:



216
217
218
# File 'lib/lutaml/qea/database.rb', line 216

def complexity_types
  @collections[:complexity_types] || []
end

#connector_typesArray<Models::EaConnectorType>

Get connector types collection (Priority 3 lookup table)

Returns:



186
187
188
# File 'lib/lutaml/qea/database.rb', line 186

def connector_types
  @collections[:connector_types] || []
end

#connectorsArray<Models::EaConnector>

Get connectors collection

Returns:



92
93
94
# File 'lib/lutaml/qea/database.rb', line 92

def connectors
  @collections[:connectors] || []
end

#connectors_for_object(object_id) ⇒ Array<Models::EaConnector>

Get connectors involving a specific object (start or end)

Parameters:

  • object_id (Integer)

    Object ID

Returns:



363
364
365
366
367
368
# File 'lib/lutaml/qea/database.rb', line 363

def connectors_for_object(object_id)
  @connectors_by_start ||= build_group_index(connectors, :start_object_id)
  @connectors_by_end ||= build_group_index(connectors, :end_object_id)
  (@connectors_by_start[object_id] || []) +
    (@connectors_by_end[object_id] || [])
end

#constraint_typesArray<Models::EaConstraintType>

Get constraint types collection (Priority 3 lookup table)

Returns:



178
179
180
# File 'lib/lutaml/qea/database.rb', line 178

def constraint_types
  @collections[:constraint_types] || []
end

#datatypesArray<Models::EaDatatype>

Get datatypes collection

Returns:



170
171
172
# File 'lib/lutaml/qea/database.rb', line 170

def datatypes
  @collections[:datatypes] || []
end

Get diagram links collection (visual routing)

Returns:



120
121
122
# File 'lib/lutaml/qea/database.rb', line 120

def diagram_links
  @collections[:diagram_links] || []
end

Get diagram links for a specific diagram

Parameters:

  • diagram_id (Integer)

    Diagram ID

Returns:



411
412
413
414
# File 'lib/lutaml/qea/database.rb', line 411

def diagram_links_for(diagram_id)
  @diagram_links_by_id ||= build_group_index(diagram_links, :diagramid)
  @diagram_links_by_id[diagram_id] || []
end

#diagram_objectsArray<Models::EaDiagramObject>

Get diagram objects collection (visual placement)

Returns:



113
114
115
# File 'lib/lutaml/qea/database.rb', line 113

def diagram_objects
  @collections[:diagram_objects] || []
end

#diagram_objects_for(diagram_id) ⇒ Array<Models::EaDiagramObject>

Get diagram objects for a specific diagram

Parameters:

  • diagram_id (Integer)

    Diagram ID

Returns:



401
402
403
404
405
# File 'lib/lutaml/qea/database.rb', line 401

def diagram_objects_for(diagram_id)
  @diagram_objects_by_id ||= build_group_index(diagram_objects,
                                               :diagram_id)
  @diagram_objects_by_id[diagram_id] || []
end

#diagram_typesArray<Models::EaDiagramType>

Get diagram types collection (Priority 3 lookup table)

Returns:



194
195
196
# File 'lib/lutaml/qea/database.rb', line 194

def diagram_types
  @collections[:diagram_types] || []
end

#diagramsArray<Models::EaDiagram>

Get diagrams collection

Returns:



106
107
108
# File 'lib/lutaml/qea/database.rb', line 106

def diagrams
  @collections[:diagrams] || []
end

#diagrams_in_package(package_id) ⇒ Array<Models::EaDiagram>

Get diagrams in a specific package

Parameters:

  • package_id (Integer)

    Package ID

Returns:



392
393
394
395
# File 'lib/lutaml/qea/database.rb', line 392

def diagrams_in_package(package_id)
  @diagrams_by_package_id ||= build_group_index(diagrams, :package_id)
  @diagrams_by_package_id[package_id] || []
end

#documentsArray<Models::EaDocument>

Get documents collection (Priority 4)

Returns:



223
224
225
# File 'lib/lutaml/qea/database.rb', line 223

def documents
  @collections[:documents] || []
end

#empty?Boolean

Check if database is empty

Returns:

  • (Boolean)

    true if no collections loaded



309
310
311
# File 'lib/lutaml/qea/database.rb', line 309

def empty?
  @collections.empty? || total_records.zero?
end

#find_attribute(id) ⇒ Models::EaAttribute?

Find an attribute by ID

Parameters:

  • id (Integer)

    Attribute ID

Returns:



281
282
283
284
# File 'lib/lutaml/qea/database.rb', line 281

def find_attribute(id)
  @attributes_by_id ||= build_group_index(attributes, :id, single: true)
  @attributes_by_id[id]
end

#find_connector(id) ⇒ Models::EaConnector?

Find a connector by ID

Parameters:

  • id (Integer)

    Connector ID

Returns:



290
291
292
293
294
# File 'lib/lutaml/qea/database.rb', line 290

def find_connector(id)
  @connectors_by_id ||= build_group_index(connectors, :connector_id,
                                          single: true)
  @connectors_by_id[id]
end

#find_diagram(id) ⇒ Models::EaDiagram?

Find a diagram by ID

Parameters:

  • id (Integer)

    Diagram ID

Returns:



300
301
302
303
304
# File 'lib/lutaml/qea/database.rb', line 300

def find_diagram(id)
  @diagrams_by_id ||= build_group_index(diagrams, :diagram_id,
                                        single: true)
  @diagrams_by_id[id]
end

#find_object(id) ⇒ Models::EaObject?

Find an object by ID

Parameters:

  • id (Integer)

    Object ID

Returns:



263
264
265
# File 'lib/lutaml/qea/database.rb', line 263

def find_object(id)
  objects.find_by_key(:ea_object_id, id)
end

#find_object_by_guid(ea_guid) ⇒ Models::EaObject?

Find object by ea_guid

Parameters:

  • ea_guid (String)

    Object GUID

Returns:



324
325
326
327
# File 'lib/lutaml/qea/database.rb', line 324

def find_object_by_guid(ea_guid)
  @objects_by_guid ||= build_group_index(objects, :ea_guid, single: true)
  @objects_by_guid[ea_guid]
end

#find_package(id) ⇒ Models::EaPackage?

Find a package by ID

Parameters:

  • id (Integer)

    Package ID

Returns:



271
272
273
274
275
# File 'lib/lutaml/qea/database.rb', line 271

def find_package(id)
  @packages_by_id ||= build_group_index(packages, :package_id,
                                        single: true)
  @packages_by_id[id]
end

#freezeself

Freeze all collections to make database immutable

Returns:

  • (self)


419
420
421
422
423
424
425
426
427
428
# File 'lib/lutaml/qea/database.rb', line 419

def freeze
  # Memoize repositories before freezing
  objects

  # Eagerly build all lookup indexes before freezing
  build_lookup_indexes

  @collections.freeze
  super
end

#object_constraintsArray<Models::EaObjectConstraint>

Get object constraints collection

Returns:



128
129
130
# File 'lib/lutaml/qea/database.rb', line 128

def object_constraints
  @collections[:object_constraints] || []
end

#object_propertiesArray<Models::EaObjectProperty>

Get object properties collection

Returns:



142
143
144
# File 'lib/lutaml/qea/database.rb', line 142

def object_properties
  @collections[:object_properties] || []
end

#object_typesArray<Models::EaObjectType>

Get object types collection (Priority 3 lookup table)

Returns:



201
202
203
# File 'lib/lutaml/qea/database.rb', line 201

def object_types
  @collections[:object_types] || []
end

#objectsRepositories::ObjectRepository

Get objects collection

Returns:



60
61
62
63
64
65
66
# File 'lib/lutaml/qea/database.rb', line 60

def objects
  return @objects if defined?(@objects)

  @objects = Repositories::ObjectRepository.new(
    @collections[:objects] || [],
  )
end

#objects_in_package(package_id) ⇒ Array<Models::EaObject>

Get objects in a specific package

Parameters:

  • package_id (Integer)

    Package ID

Returns:



383
384
385
386
# File 'lib/lutaml/qea/database.rb', line 383

def objects_in_package(package_id)
  @objects_by_package_id ||= build_group_index(objects, :package_id)
  @objects_by_package_id[package_id] || []
end

#operation_paramsArray<Models::EaOperationParam>

Get operation parameters collection

Returns:



85
86
87
# File 'lib/lutaml/qea/database.rb', line 85

def operation_params
  @collections[:operation_params] || []
end

#operation_params_for(operation_id) ⇒ Array<Models::EaOperationParam>

Get operation parameters for a specific operation

Parameters:

  • operation_id (Integer)

    Operation ID

Returns:



353
354
355
356
357
# File 'lib/lutaml/qea/database.rb', line 353

def operation_params_for(operation_id)
  @operation_params_by_id ||= build_group_index(operation_params,
                                                :operationid)
  @operation_params_by_id[operation_id] || []
end

#operationsArray<Models::EaOperation>

Get operations collection

Returns:



78
79
80
# File 'lib/lutaml/qea/database.rb', line 78

def operations
  @collections[:operations] || []
end

#operations_for_object(object_id) ⇒ Array<Models::EaOperation>

Get operations for a specific object

Parameters:

  • object_id (Integer)

    Object ID

Returns:



343
344
345
346
347
# File 'lib/lutaml/qea/database.rb', line 343

def operations_for_object(object_id)
  @operations_by_object_id ||= build_group_index(operations,
                                                 :ea_object_id)
  @operations_by_object_id[object_id] || []
end

#packagesArray<Models::EaPackage>

Get packages collection

Returns:



99
100
101
# File 'lib/lutaml/qea/database.rb', line 99

def packages
  @collections[:packages] || []
end

#scriptsArray<Models::EaScript>

Get scripts collection (Priority 4)

Returns:



230
231
232
# File 'lib/lutaml/qea/database.rb', line 230

def scripts
  @collections[:scripts] || []
end

#statsHash<String, Integer>

Get statistics for all collections

Examples:

database.stats
# => {
#   "objects" => 693,
#   "attributes" => 1910,
#   "connectors" => 908,
#   ...
# }

Returns:

  • (Hash<String, Integer>)

    Record counts by collection name



246
247
248
249
250
# File 'lib/lutaml/qea/database.rb', line 246

def stats
  @collections.each_with_object({}) do |(name, records), hash|
    hash[name.to_s] = records.size
  end
end

#status_typesArray<Models::EaStatusType>

Get status types collection (Priority 3 lookup table)

Returns:



208
209
210
# File 'lib/lutaml/qea/database.rb', line 208

def status_types
  @collections[:status_types] || []
end

#stereotypesArray<Models::EaStereotype>

Get stereotypes collection

Returns:



163
164
165
# File 'lib/lutaml/qea/database.rb', line 163

def stereotypes
  @collections[:stereotypes] || []
end

#tagged_valuesArray<Models::EaTaggedValue>

Get tagged values collection

Returns:



135
136
137
# File 'lib/lutaml/qea/database.rb', line 135

def tagged_values
  @collections[:tagged_values] || []
end

#total_recordsInteger

Get total number of records across all collections

Returns:

  • (Integer)

    Total record count



255
256
257
# File 'lib/lutaml/qea/database.rb', line 255

def total_records
  @collections.values.sum(&:size)
end

#xrefsArray<Models::EaXref>

Get cross-references collection

Returns:



156
157
158
# File 'lib/lutaml/qea/database.rb', line 156

def xrefs
  @collections[:xrefs] || []
end