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

#collection_namesArray<Symbol>

Get collection names

Returns:

  • (Array<Symbol>)

    Array of collection names



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

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

#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

#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_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

#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



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

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

#find_attribute(id) ⇒ Models::EaAttribute?

Find an attribute by ID

Parameters:

  • id (Integer)

    Attribute ID

Returns:



278
279
280
# File 'lib/lutaml/qea/database.rb', line 278

def find_attribute(id)
  attributes.find { |attr| attr.id == id }
end

#find_connector(id) ⇒ Models::EaConnector?

Find a connector by ID

Parameters:

  • id (Integer)

    Connector ID

Returns:



286
287
288
# File 'lib/lutaml/qea/database.rb', line 286

def find_connector(id)
  connectors.find { |conn| conn.connector_id == id }
end

#find_diagram(id) ⇒ Models::EaDiagram?

Find a diagram by ID

Parameters:

  • id (Integer)

    Diagram ID

Returns:



294
295
296
# File 'lib/lutaml/qea/database.rb', line 294

def find_diagram(id)
  diagrams.find { |diag| diag.diagram_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_package(id) ⇒ Models::EaPackage?

Find a package by ID

Parameters:

  • id (Integer)

    Package ID

Returns:



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

def find_package(id)
  packages.find { |pkg| pkg.package_id == id }
end

#freezeself

Freeze all collections to make database immutable

Returns:

  • (self)


315
316
317
318
319
320
321
# File 'lib/lutaml/qea/database.rb', line 315

def freeze
  # Memoize repositories before freezing
  objects

  @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

#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

#operationsArray<Models::EaOperation>

Get operations collection

Returns:



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

def operations
  @collections[:operations] || []
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