cond_out = []
- if operator == '@@' # full-text-search
+ if operator == '@@'
+ # Full-text search
if attrs_in != 'any'
raise ArgumentError.new("Full text search on individual columns is not supported")
end
- attrs = [] # skip the generic per-column operator loop below
- # Use to_tsquery since plainto_tsquery does not support prefix search.
- # Instead split operand and join the words with ' & ' and add ':*' to the last word
- # Thus when searched for "some str", objects containing "some" and "str:*" are found.
+ if operand.is_a? Array
+ raise ArgumentError.new("Full text search not supported for array operands")
+ end
+
+ # Skip the generic per-column operator loop below
+ attrs = []
+ # Use to_tsquery since plainto_tsquery does not support prefix
+ # search. And, split operand and join the words with ' & '
cond_out << model_class.full_text_tsvector+" @@ to_tsquery(?)"
- operand << ':*'
param_out << operand.split.join(' & ')
- else
- attrs.each do |attr|
+ end
+ attrs.each do |attr|
if !model_class.searchable_columns(operator).index attr.to_s
raise ArgumentError.new("Invalid attribute '#{attr}' in filter")
end
end
cond_out << cond.join(' OR ')
end
- end
end
conds_out << cond_out.join(' OR ') if cond_out.any?
end