X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/c430a289af3eeed00e220b5658f9d64191798b1c..c4fa80c6ed2445e1e384455944eb6c4108906cad:/services/api/lib/record_filters.rb diff --git a/services/api/lib/record_filters.rb b/services/api/lib/record_filters.rb index 256997e4ba..c009bf537f 100644 --- a/services/api/lib/record_filters.rb +++ b/services/api/lib/record_filters.rb @@ -34,14 +34,26 @@ module RecordFilters elsif !operator.is_a? String raise ArgumentError.new("Invalid operator '#{operator}' (#{operator.class}) in filter") end + 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 + 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 = '-' if (!operand or operand.empty?) - param_out << operand.split.each {|s| s.concat(':*')}.join(' & ') - else - attrs.each do |attr| + param_out << operand.split.join(' & ') + end + attrs.each do |attr| if !model_class.searchable_columns(operator).index attr.to_s raise ArgumentError.new("Invalid attribute '#{attr}' in filter") end @@ -110,7 +122,6 @@ module RecordFilters end cond_out << cond.join(' OR ') end - end end conds_out << cond_out.join(' OR ') if cond_out.any? end