class DatabaseValidations::Checkers::DbUniquenessValidator

Attributes

validator[R]

Public Class Methods

new(validator) click to toggle source

@param [DatabaseValidations::DbUniquenessValidator]

# File lib/database_validations/lib/checkers/db_uniqueness_validator.rb, line 12
def initialize(validator)
  @validator = validator
end
validate!(validator) click to toggle source

@param [DatabaseValidations::DbUniquenessValidator]

# File lib/database_validations/lib/checkers/db_uniqueness_validator.rb, line 7
def self.validate!(validator)
  new(validator).validate!
end

Public Instance Methods

validate!() click to toggle source
# File lib/database_validations/lib/checkers/db_uniqueness_validator.rb, line 16
def validate!
  validate_index_usage!

  validate_indexes! unless ENV['SKIP_DB_UNIQUENESS_VALIDATOR_INDEX_CHECK']
end

Private Instance Methods

valid_index?(columns, index) click to toggle source
# File lib/database_validations/lib/checkers/db_uniqueness_validator.rb, line 24
def valid_index?(columns, index)
  index_columns_size = index.columns.is_a?(Array) ? index.columns.size : (index.columns.count(',') + 1)

  (columns.size == index_columns_size) && (validator.where.nil? == index.where.nil?)
end
validate_index_usage!() click to toggle source
# File lib/database_validations/lib/checkers/db_uniqueness_validator.rb, line 30
def validate_index_usage!
  return unless validator.index_name.present? && validator.attributes.size > 1

  raise ArgumentError, "When index_name is provided validator can have only one attribute. See #{validator.inspect}"
end
validate_indexes!() click to toggle source
# File lib/database_validations/lib/checkers/db_uniqueness_validator.rb, line 36
def validate_indexes! # rubocop:disable Metrics/AbcSize
  adapter = Adapters::BaseAdapter.new(validator.klass)

  validator.attributes.map do |attribute|
    columns = KeyGenerator.unify_columns(attribute, validator.options[:scope])
    index = validator.index_name ? adapter.find_unique_index_by_name(validator.index_name.to_s) : adapter.find_unique_index(columns, validator.where) # rubocop:disable Metrics/LineLength
    raise Errors::IndexNotFound.new(columns, validator.where, validator.index_name, adapter.unique_indexes, adapter.table_name) unless index && valid_index?(columns, index) # rubocop:disable Metrics/LineLength
  end
end