impress/app/models/item/search/fields/set_field.rb

45 lines
1.1 KiB
Ruby
Raw Normal View History

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