Class: Criterion::Criteria

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Includes:
Enumerable
Defined in:
lib/criterion.rb

Constant Summary collapse

MULTI_VALUE_METHODS =
[ :where, :or, :not, :order ]
SINGLE_VALUE_METHODS =
[ :limit, :offset ]
RESULT_METHODS =
[
  :[], :at, :count, :empty?, :fetch, :first, :include?, :index,
  :last, :length, :reverse, :rindex, :sample, :size, :sort,
  :sort_by, :take, :take_while, :values_at
]

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(records) ⇒ Criteria

Returns a new instance of Criteria.



33
34
35
36
37
# File 'lib/criterion.rb', line 33

def initialize(records)
  @records = records
  MULTI_VALUE_METHODS.each { |v| instance_variable_set(:"@#{v}_values", {}) }
  SINGLE_VALUE_METHODS.each { |v| instance_variable_set(:"@#{v}_value", nil) }
end

Instance Attribute Details

#limit_valueObject

Returns the value of attribute limit_value.



27
28
29
# File 'lib/criterion.rb', line 27

def limit_value
  @limit_value
end

#not_valuesObject

Returns the value of attribute not_values.



27
28
29
# File 'lib/criterion.rb', line 27

def not_values
  @not_values
end

#offset_valueObject

Returns the value of attribute offset_value.



27
28
29
# File 'lib/criterion.rb', line 27

def offset_value
  @offset_value
end

#or_valuesObject

Returns the value of attribute or_values.



27
28
29
# File 'lib/criterion.rb', line 27

def or_values
  @or_values
end

#order_valuesObject

Returns the value of attribute order_values.



27
28
29
# File 'lib/criterion.rb', line 27

def order_values
  @order_values
end

#where_valuesObject

Returns the value of attribute where_values.



27
28
29
# File 'lib/criterion.rb', line 27

def where_values
  @where_values
end

Instance Method Details

#average(field) ⇒ Object



76
77
78
79
80
# File 'lib/criterion.rb', line 76

def average(field)
  total = count
  return nil if total.zero?
  sum(field) / total.to_f
end

#each(&block) ⇒ Object



128
129
130
# File 'lib/criterion.rb', line 128

def each(&block)
  to_a.each(&block)
end

#limit(value = true) ⇒ Object



67
68
69
# File 'lib/criterion.rb', line 67

def limit(value = true)
  clone.tap { |r| r.limit_value = value }
end

#limit?Boolean

Returns:

  • (Boolean)


114
115
116
# File 'lib/criterion.rb', line 114

def limit?
  valid_number?(limit_value)
end

#maximum(field) ⇒ Object



90
91
92
# File 'lib/criterion.rb', line 90

def maximum(field)
  to_a.collect { |x| x.send(field) }.max
end

#minimum(field) ⇒ Object



86
87
88
# File 'lib/criterion.rb', line 86

def minimum(field)
  to_a.collect { |x| x.send(field) }.min
end

#not(query = {}) ⇒ Object



51
52
53
54
55
# File 'lib/criterion.rb', line 51

def not(query = {})
  clone.tap do |r|
    r.not_values.merge!(query) unless query.empty?
  end
end

#not?Boolean

Returns:

  • (Boolean)


102
103
104
# File 'lib/criterion.rb', line 102

def not?
  !not_values.empty?
end

#offset(value = true) ⇒ Object Also known as: skip



71
72
73
# File 'lib/criterion.rb', line 71

def offset(value = true)
  clone.tap { |r| r.offset_value = value }
end

#offset?Boolean

Returns:

  • (Boolean)


110
111
112
# File 'lib/criterion.rb', line 110

def offset?
  valid_number?(offset_value)
end

#or(query = {}) ⇒ Object



45
46
47
48
49
# File 'lib/criterion.rb', line 45

def or(query = {})
  clone.tap do |r|
    r.or_values.merge!(query) unless query.empty?
  end
end

#or?Boolean

Returns:

  • (Boolean)


98
99
100
# File 'lib/criterion.rb', line 98

def or?
  !or_values.empty?
end

#order(*args) ⇒ Object



57
58
59
60
61
62
63
64
65
# File 'lib/criterion.rb', line 57

def order(*args)
  sort = {}
  args.collect do |arg|
    sort.merge!(arg.is_a?(Hash) ? arg : { arg => :asc })
  end
  clone.tap do |r|
    r.order_values.merge!(sort) unless sort.empty?
  end
end

#order?Boolean

Returns:

  • (Boolean)


106
107
108
# File 'lib/criterion.rb', line 106

def order?
  !order_values.empty?
end

#sum(field) ⇒ Object



82
83
84
# File 'lib/criterion.rb', line 82

def sum(field)
  to_a.inject(0) { |sum, obj| sum + obj.send(field) }
end

#to_aObject Also known as: all, to_ary



118
119
120
121
122
123
124
# File 'lib/criterion.rb', line 118

def to_a
  results = @records.select{ |record| keep?(record) }
  results = results.sort_by(&ordering_args) if order?
  results = results.drop(offset_value) if offset?
  results = results.take(limit_value) if limit?
  results
end

#where(query = {}) ⇒ Object



39
40
41
42
43
# File 'lib/criterion.rb', line 39

def where(query = {})
  clone.tap do |r|
    r.where_values.merge!(query) unless query.empty?
  end
end

#where?Boolean

Returns:

  • (Boolean)


94
95
96
# File 'lib/criterion.rb', line 94

def where?
  !where_values.empty?
end