1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
# frozen_string_literal: true
module Riddle
class Client
class Filter
attr_accessor :attribute, :values, :exclude
# Attribute name, values (which can be an array or a range), and whether
# the filter should be exclusive.
def initialize(attribute, values, exclude=false)
@attribute, @values, @exclude = attribute, values, exclude
end
def exclude?
self.exclude
end
# Returns the message for this filter to send to the Sphinx service
def query_message
message = Message.new
message.append_string self.attribute.to_s
case self.values
when Range
if self.values.first.is_a?(Float) && self.values.last.is_a?(Float)
message.append_int FilterTypes[:float_range]
message.append_floats self.values.first, self.values.last
else
message.append_int FilterTypes[:range]
append_integer_range message, self.values
end
when Array
if self.values.first.is_a?(Float) && self.values.length == 1
message.append_int FilterTypes[:float_range]
message.append_floats self.values.first, self.values.first
else
message.append_int FilterTypes[:values]
message.append_int self.values.length
append_array message, self.values
end
end
message.append_int self.exclude? ? 1 : 0
message.to_s
end
private
def append_integer_range(message, range)
message.append_ints self.values.first, self.values.last
end
# Using to_f is a hack from the PHP client - to workaround 32bit signed
# ints on x32 platforms
def append_array(message, array)
message.append_ints *array.collect { |val|
case val
when TrueClass
1.0
when FalseClass
0.0
else
val.to_f
end
}
end
end
end
end
|