module Discerner::Methods::Models::SearchParameterValue

Public Class Methods

included(base) click to toggle source
# File lib/discerner/methods/models/search_parameter_value.rb, line 5
def self.included(base)
  base.send :include, SoftDelete
  base.send :include, Warning

  # Associations
  base.send :belongs_to, :search_parameter, inverse_of: :search_parameter_values
  base.send :belongs_to, :parameter_value,  inverse_of: :search_parameter_values
  base.send :belongs_to, :operator,         inverse_of: :search_parameter_values

  # Scopes
  base.send(:scope, :chosen, -> { base.where(chosen: true) })
  base.send(:scope, :ordered_by_display_order, -> { base.order('discerner_search_parameter_values.display_order ASC') })

  #Validations
  base.send :validate,  :validate_operator
  base.send :validates, :search_parameter, presence: true

  # Hooks
  base.send :before_validation, :cleanup_parameter_values
  base.send :after_commit, :destroy_if_deleted_parameter_value, on: :update
  base.send :after_commit, :mark_search_updated
end
new(*args) click to toggle source

Instance Methods

Calls superclass method
# File lib/discerner/methods/models/search_parameter_value.rb, line 29
def initialize(*args)
  super(*args)
end

Public Instance Methods

disabled?() click to toggle source
# File lib/discerner/methods/models/search_parameter_value.rb, line 64
def disabled?
  return false unless persisted?
  if parameter_value.blank? && value.blank? && operator && operator.operator_type != 'presence'
    warnings.add(:base, "Parameter value has to be selected")
    return true
  end
  if chosen? && parameter_value.blank? || parameter_value && parameter_value.deleted?
    warnings.add(:base, "Parameter value has been deleted and has to be removed from the search")
    return true
  end
  if search_parameter && search_parameter.parameter && search_parameter.parameter.parameter_type.name == 'date' && !validate_dates_format
    warnings.add(:base, "Provided date is not valid")
    return true
  end
  if parameter_value.blank? && ['combobox', 'exclusive_list'].include?(search_parameter.parameter.parameter_type.name)
    warnings.add(:base, "Parameter value has to be selected")
    return true
  end
  warnings.clear
  return false
end
formatted_values() click to toggle source
# File lib/discerner/methods/models/search_parameter_value.rb, line 52
def formatted_values
  all_values = [value, additional_value].compact
  case search_parameter.parameter.parameter_type.name
  when 'date'
    all_values.map{|v| v.to_date}
  when 'numeric'
    all_values.map{|v| v.to_f}
  else
    all_values
  end
end
to_sql() click to toggle source
# File lib/discerner/methods/models/search_parameter_value.rb, line 33
def to_sql
  sql = {}
  raise "Search operator has to be defined in order to run 'to_sql' method on search_parameter_value" if operator.blank?
  case operator.operator_type
    when 'comparison'
      sql[:predicates] = "#{search_parameter.parameter.search_method} #{operator.symbol} ?"
      sql[:values]    = formatted_values.first
    when 'range'
      sql[:predicates] = "#{search_parameter.parameter.search_method} #{operator.symbol} ? and ?"
      sql[:values]    = formatted_values
    when 'text_comparison'
      sql[:predicates] = "#{search_parameter.parameter.search_method} #{operator.symbol} ?"
      sql[:values]    = "%#{formatted_values.first}%"
    when 'presence'
      sql[:predicates] = "#{search_parameter.parameter.search_method} #{operator.symbol}"
    end
  sql
end
validate_dates_format() click to toggle source
# File lib/discerner/methods/models/search_parameter_value.rb, line 86
def validate_dates_format
  validate_date(value) && validate_date(additional_value)
end

Private Instance Methods

cleanup_parameter_values() click to toggle source
# File lib/discerner/methods/models/search_parameter_value.rb, line 110
def cleanup_parameter_values
  if operator && operator.operator_type == 'presence'
    self.value = nil
    self.additional_value = nil
    self.parameter_value = nil
  end
end
destroy_if_deleted_parameter_value() click to toggle source
# File lib/discerner/methods/models/search_parameter_value.rb, line 91
def destroy_if_deleted_parameter_value
  return if parameter_value.blank? || search_parameter.blank? || search_parameter.parameter.blank? || search_parameter.parameter.parameter_type.blank?
  #return unless ['list', 'combobox'].include?(search_parameter.parameter.parameter_type.name)
  destroy if parameter_value.deleted? && search_parameter.parameter.parameter_type.name == 'list' && !chosen?
end
mark_search_updated() click to toggle source
# File lib/discerner/methods/models/search_parameter_value.rb, line 126
def mark_search_updated
  if (self.destroyed? || !previous_changes.empty?) && search_parameter && search_parameter.search
    search_parameter.search.updated_at = Time.now
    search_parameter.search.save!
  end
end
validate_date(date) click to toggle source
# File lib/discerner/methods/models/search_parameter_value.rb, line 97
def validate_date(date)
  begin
    unless date.blank?
      parsed_date = date.to_date
      #http://www.karaszi.com/sqlserver/info_datetime.asp#Why1753
      return false if parsed_date.year < 1753
    end
  rescue => e
    return false
  end
  return true
end
validate_operator() click to toggle source
# File lib/discerner/methods/models/search_parameter_value.rb, line 118
def validate_operator
  if search_parameter && search_parameter.parameter && search_parameter.parameter.parameter_type && ['list', 'combobox', 'exclusive_list'].include?(search_parameter.parameter.parameter_type.name)
    self.operator = nil
  else
    errors.add(:base, "Operator has to be selected for parameter values that do not belong to list or combobox") if operator.blank?
  end
end