45 lines
1.1 KiB
Ruby
45 lines
1.1 KiB
Ruby
|
class Item
|
||
|
module Search
|
||
|
module Fields
|
||
|
class SetField < Field
|
||
|
def initialize(*args)
|
||
|
super(*args)
|
||
|
@values = {true => Set.new, false => Set.new}
|
||
|
end
|
||
|
|
||
|
def <<(filter)
|
||
|
if filter.value.respond_to?(:each)
|
||
|
filter.value.each do |value|
|
||
|
add_value(value, filter.positive?)
|
||
|
end
|
||
|
else
|
||
|
add_value(filter.value, filter.positive?)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def to_flex_params
|
||
|
{
|
||
|
key => nil_if_empty(@values[true]),
|
||
|
:"negative_#{key}" => nil_if_empty(@values[false])
|
||
|
}
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def add_value(value, is_positive)
|
||
|
if @values[!is_positive].include?(value)
|
||
|
raise Item::Search::Contradiction,
|
||
|
"positive #{key} and negative #{key} both contain #{value}"
|
||
|
end
|
||
|
|
||
|
@values[is_positive] << value
|
||
|
end
|
||
|
|
||
|
def nil_if_empty(set)
|
||
|
set unless set.empty?
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|