91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
# File 'lib/rulz/evaluator.rb', line 91
def where(condition, *args, &block)
if condition.is_a? String
@receiver.instance_eval(&block) if Rulz::Evaluator::Condition.new(@receiver, condition, *args).evaluate
elsif condition.is_a? Proc
@receiver.instance_eval(&block) if condition.call(*args)
elsif condition.is_a? Array
split_condition = condition.inject([[]]) do |results, element|
if ["AND", "OR"].include? element
results << {"AND" => "&&", "OR" => "||"}[element]
results << []
elsif element.is_a?(Hash)
results.pop if results.last.respond_to?(:empty?) && results.last.empty?
results << element
else
results.last << element
end
results
end
split_condition.map! do |element|
if element.is_a?(Array)
Rulz::Evaluator::Condition.new(@receiver, *element).evaluate
elsif element.is_a?(Hash)
attribute, element = *element.first
Rulz::Evaluator::AttributeCondition.new(@receiver, attribute, *element).evaluate
else
element
end
end
@receiver.instance_eval(&block) if eval(split_condition.join(" "))
elsif condition.is_a? Hash
attribute, condition = *condition.first
@receiver.instance_eval(&block) if Rulz::Evaluator::AttributeCondition.new(@receiver, attribute, *condition).evaluate
else
raise ArgumentError, "Invalid condition"
end
end
|