Class: Lagoon::Analyzer::DatabaseSchemaAnalyzer
- Inherits:
-
Object
- Object
- Lagoon::Analyzer::DatabaseSchemaAnalyzer
- Defined in:
- lib/lagoon/analyzer/database_schema_analyzer.rb
Instance Method Summary collapse
- #analyze_column(column, primary_keys: [], foreign_keys: [], unique_columns: []) ⇒ Object
- #analyze_table(table_name, columns, primary_keys: [], foreign_keys: [], indexes: []) ⇒ Object
- #extract_foreign_keys(table_name, columns, foreign_keys:, indexes: [], primary_keys: [], table_prefix: nil) ⇒ Object
- #internal_table?(table_name, internal_tables: %w[schema_migrations ar_internal_metadata])) ⇒ Boolean
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 } = (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: , foreign_key: column_names } end end |
#internal_table?(table_name, internal_tables: %w[schema_migrations ar_internal_metadata])) ⇒ 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 |