module Philter::Evaluation

It contains all the methods for selecting the items

Private Instance Methods

item_value(item, attribute, options = {}) click to toggle source

Provide the item's value in: item, attribute, options{debug:nil} out: the item's value

# File lib/philter/evaluation.rb, line 57
def item_value(item, attribute, options = {})
  case item.class.name
  when 'Hash' then
    print " item[#{attribute}] = #{item[attribute]} " if options[:debug]
    item[attribute]
  when 'Fixnum', 'Float', 'Bignum', 'Symbol', 'String'
    print " #{item.class.name} " if options[:debug]
    print "#{item} " if options[:debug]
    item
  else
    print " item.#{attribute} " if options[:debug]
    if item.respond_to?(attribute)
      print "= #{item.send(attribute)} " if options[:debug]
      item.send(attribute)
    end
  end
end
phil_eval_attributes(item, search, options = {}) click to toggle source

Evaluate search attributes to any item in: item, search, options{debug:nil} out: true/false (if the item has been selected)

# File lib/philter/evaluation.rb, line 10
def phil_eval_attributes(item, search, options = {})
  selected_or  = nil
  selected_and = true
  search.each do |key, search_value|
    # Every item must match with search options to be selected
    puts "   search: #{key}: #{search_value} " \
         "(#{search_value.class.name})" if options[:debug]
    case search_value.class.name
    when 'Regexp'
      # search: {email: /@gmail/}
      print '   .1 ' if options[:debug]
      selected = phil_evaluate item_value(item, key, options),
                               search_value,
                               options.merge(operator: '=~')
    when 'Class'
      # search: {code: String} or {code: Fixnum}
      print '   .2 item.class == value | ' \
            "#{item.class} == #{search_value}" if options[:debug]
      selected = item_value(item, key, options).class == search_value
    when 'Array'
      # search: {id: [1,2]}
      print '   .3 ' if options[:debug]
      selected = search_value.include? item_value(item, key, options)
    else
      # search: {id: 2} or {id: '<3'} or any other operator
      print '   .4 ' if options[:debug]
      selected = phil_evaluate item_value(item, key, options),
                               search_value,
                               options.merge(operator: '==')
    end
    puts "  #{selected && '=> x'}" if options[:debug]
    selected_or   = true      if !selected_or && selected
    selected_and  = selected  if selected_and
  end

  if options[:or]
    puts " #{selected_or && '- SELECTED - (Or)'}" if options[:debug]
    selected_or
  else
    puts " #{selected_and && '- SELECTED - (And)'}" if options[:debug]
    selected_and
  end
end
phil_evaluate(item, value, options = {}) click to toggle source

Evaluate a condition: item -operator- value in: item, value, options{operator:'==',debug:false} out: true/false

# File lib/philter/evaluation.rb, line 78
def phil_evaluate(item, value, options = {})
  options = { operator: '==',
              debug:    false }.merge(options)
  value, operator = phil_get_operator_value_cleaned value
  operator ||= options[:operator]
  print " item #{operator} value" if options[:debug]
  print " | #{item} #{operator} #{value}" if options[:debug]
  case operator
  when '=~' then item.to_s =~ value
  when '===' then item === value
  when '==' then item == value
  when '>=' then item >= value
  when '<=' then item <= value
  when '!=' then item != value
  when '>' then item > value
  when '<' then item < value
  end
end
phil_get_operator(str) click to toggle source

Search an operator by regexp (?:<=?|>=?|!=|==|===|=~) in: value out: operator

# File lib/philter/evaluation.rb, line 109
def phil_get_operator(str)
  return unless str.is_a?(String)
  regexp = '(?:<=?|>=?|!=|==|===|=~)'
  str.match(/#{regexp}/).to_s if str =~ /#{regexp}/
end
phil_get_operator_value_cleaned(value) click to toggle source

Search an operator in value in: value out: value without operator, operator

# File lib/philter/evaluation.rb, line 100
def phil_get_operator_value_cleaned(value)
  operator  = phil_get_operator value
  value     = value.gsub(operator, '').to_i if operator
  [value, operator]
end