diff options
Diffstat (limited to 'lib/gitlab/database/obsolete_ignored_columns.rb')
-rw-r--r-- | lib/gitlab/database/obsolete_ignored_columns.rb | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/lib/gitlab/database/obsolete_ignored_columns.rb b/lib/gitlab/database/obsolete_ignored_columns.rb new file mode 100644 index 00000000000..6266b6a4b65 --- /dev/null +++ b/lib/gitlab/database/obsolete_ignored_columns.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +module Gitlab + module Database + # Checks which `ignored_columns` can be safely removed by scanning + # the current schema for all `ApplicationRecord` descendants. + class ObsoleteIgnoredColumns + def initialize(base = ApplicationRecord) + @base = base + end + + def execute + @base.descendants.map do |klass| + next if klass.abstract_class? + + safe_to_remove = ignored_columns_safe_to_remove_for(klass) + next if safe_to_remove.empty? + + [klass.name, safe_to_remove] + end.compact.sort_by(&:first) + end + + private + + def ignored_columns_safe_to_remove_for(klass) + ignored = klass.ignored_columns.map(&:to_s) + + return [] if ignored.empty? + + schema = klass.connection.schema_cache.columns_hash(klass.table_name) + existing = schema.values.map(&:name) + + used = ignored & existing + ignored - used + end + end + end +end |