Class: Lagoon::Analyzer::DatabaseSchemaAnalyzer

Inherits:
Object
  • Object
show all
Defined in:
lib/lagoon/analyzer/database_schema_analyzer.rb

Instance Method Summary collapse

Instance Method Details

#analyze_column(column, primary_keys: [], foreign_keys: [], unique_columns: []) ⇒ Object



24
25
26
27
28
29
30
31
32
# File 'lib/lagoon/analyzer/database_schema_analyzer.rb', line 24

def analyze_column(column, primary_keys: [], foreign_keys: [], unique_columns: [])
  {
    name: column.name,
    type: column.type,
    primary_key: primary_keys.include?(column.name.to_s),
    foreign_key: foreign_keys.include?(column.name.to_s),
    unique: unique_columns.include?(column.name.to_s)
  }
end

#analyze_table(table_name, columns, primary_keys: [], foreign_keys: [], indexes: []) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/lagoon/analyzer/database_schema_analyzer.rb', line 6

def analyze_table(table_name, columns, primary_keys: [], foreign_keys: [], indexes: [])
  foreign_key_columns = foreign_keys.flat_map { |foreign_key| Array(foreign_key.column).map(&:to_s) }
  unique_columns = single_column_unique_indexes(indexes)
  primary_key_columns = Array(primary_keys).map(&:to_s)

  {
    name: table_name,
    attributes: columns.map do |column|
      analyze_column(
        column,
        primary_keys: primary_key_columns,
        foreign_keys: foreign_key_columns,
        unique_columns: unique_columns
      )
    end
  }
end

#extract_foreign_keys(table_name, columns, foreign_keys:, indexes: [], primary_keys: [], table_prefix: nil) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/lagoon/analyzer/database_schema_analyzer.rb', line 34

def extract_foreign_keys(table_name, columns, foreign_keys:, indexes: [], primary_keys: [], table_prefix: nil)
  columns_by_name = columns.to_h { |column| [column.name.to_s, column] }
  primary_key_columns = Array(primary_keys).map(&:to_s)

  foreign_keys.filter_map do |foreign_key|
    column_names = Array(foreign_key.column).map(&:to_s)
    foreign_key_columns = column_names.filter_map { |name| columns_by_name[name] }
    next if foreign_key_columns.empty?

    unique = unique_foreign_key?(column_names, indexes)
    nullable = foreign_key_columns.any? { |column| column.respond_to?(:null) ? column.null : true }
    identifying = (column_names - primary_key_columns).empty?

    {
      source: qualify_table(foreign_key.to_table, table_prefix),
      target: table_name,
      label: unique ? 'has one' : 'has many',
      source_cardinality: nullable ? :zero_or_one : :one,
      target_cardinality: unique ? :zero_or_one : :zero_or_many,
      identifying: identifying,
      foreign_key: column_names
    }
  end
end

#internal_table?(table_name, internal_tables: %w[schema_migrations ar_internal_metadata])) ⇒ Boolean

Returns:

  • (Boolean)


59
60
61
# File 'lib/lagoon/analyzer/database_schema_analyzer.rb', line 59

def internal_table?(table_name, internal_tables: %w[schema_migrations ar_internal_metadata])
  internal_tables.include?(table_name.to_s)
end