Class: Lutaml::Qea::Database

Inherits:
Object
  • Object
show all
Defined in:
lib/lutaml/qea/database.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.



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

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



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

def collections
  @collections
end

#connectionSQLite3::Database?

Returns Database connection.

Returns:

  • (SQLite3::Database, nil)

    Database connection



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

def connection
  @connection
end

#qea_pathString (readonly)

Returns Path to the QEA file.

Returns:

  • (String)

    Path to the QEA file



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

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



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

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:



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

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

#attributesArray<Models::EaAttribute>

Get attributes collection

Returns:



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

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:



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

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:



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

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



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

def collection_names
  @collections.keys
end

#complexity_typesArray<Models::EaComplexityType>

Get complexity types collection (Priority 3 lookup table)

Returns:



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

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

#connector_typesArray<Models::EaConnectorType>

Get connector types collection (Priority 3 lookup table)

Returns:



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

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

#connectorsArray<Models::EaConnector>

Get connectors collection

Returns:



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

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:



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

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:



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

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

#datatypesArray<Models::EaDatatype>

Get datatypes collection

Returns:



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

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

Get diagram links collection (visual routing)

Returns:



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

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

Get diagram links for a specific diagram

Parameters:

  • diagram_id (Integer)

    Diagram ID

Returns:



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

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:



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

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:



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

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:



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

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

#diagramsArray<Models::EaDiagram>

Get diagrams collection

Returns:



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

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:



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

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:



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

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

#empty?Boolean

Check if database is empty

Returns:

  • (Boolean)

    true if no collections loaded



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

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

#find_attribute(id) ⇒ Models::EaAttribute?

Find an attribute by ID

Parameters:

  • id (Integer)

    Attribute ID

Returns:



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

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:



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

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:



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

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:



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

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:



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

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:



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

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)


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

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:



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

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

#object_propertiesArray<Models::EaObjectProperty>

Get object properties collection

Returns:



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

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

#object_typesArray<Models::EaObjectType>

Get object types collection (Priority 3 lookup table)

Returns:



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

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

#objectsRepositories::ObjectRepository

Get objects collection

Returns:



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

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:



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

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:



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

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:



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

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:



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

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:



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

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:



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

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

#scriptsArray<Models::EaScript>

Get scripts collection (Priority 4)

Returns:



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

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



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

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:



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

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

#stereotypesArray<Models::EaStereotype>

Get stereotypes collection

Returns:



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

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

#tagged_valuesArray<Models::EaTaggedValue>

Get tagged values collection

Returns:



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

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

#total_recordsInteger

Get total number of records across all collections

Returns:

  • (Integer)

    Total record count



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

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

#xrefsArray<Models::EaXref>

Get cross-references collection

Returns:



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

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