Class: Criterion::Criteria
- Inherits:
-
Object
- Object
- Criterion::Criteria
- 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
-
#limit_value ⇒ Object
Returns the value of attribute limit_value.
-
#not_values ⇒ Object
Returns the value of attribute not_values.
-
#offset_value ⇒ Object
Returns the value of attribute offset_value.
-
#or_values ⇒ Object
Returns the value of attribute or_values.
-
#order_values ⇒ Object
Returns the value of attribute order_values.
-
#where_values ⇒ Object
Returns the value of attribute where_values.
Instance Method Summary collapse
- #average(field) ⇒ Object
- #each(&block) ⇒ Object
-
#initialize(records) ⇒ Criteria
constructor
A new instance of Criteria.
- #limit(value = true) ⇒ Object
- #limit? ⇒ Boolean
- #maximum(field) ⇒ Object
- #minimum(field) ⇒ Object
- #not(query = {}) ⇒ Object
- #not? ⇒ Boolean
- #offset(value = true) ⇒ Object (also: #skip)
- #offset? ⇒ Boolean
- #or(query = {}) ⇒ Object
- #or? ⇒ Boolean
- #order(*args) ⇒ Object
- #order? ⇒ Boolean
- #sum(field) ⇒ Object
- #to_a ⇒ Object (also: #all, #to_ary)
- #where(query = {}) ⇒ Object
- #where? ⇒ Boolean
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_value ⇒ Object
Returns the value of attribute limit_value.
27 28 29 |
# File 'lib/criterion.rb', line 27 def limit_value @limit_value end |
#not_values ⇒ Object
Returns the value of attribute not_values.
27 28 29 |
# File 'lib/criterion.rb', line 27 def not_values @not_values end |
#offset_value ⇒ Object
Returns the value of attribute offset_value.
27 28 29 |
# File 'lib/criterion.rb', line 27 def offset_value @offset_value end |
#or_values ⇒ Object
Returns the value of attribute or_values.
27 28 29 |
# File 'lib/criterion.rb', line 27 def or_values @or_values end |
#order_values ⇒ Object
Returns the value of attribute order_values.
27 28 29 |
# File 'lib/criterion.rb', line 27 def order_values @order_values end |
#where_values ⇒ Object
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
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
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
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
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
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_a ⇒ Object 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
94 95 96 |
# File 'lib/criterion.rb', line 94 def where? !where_values.empty? end |