From: Lucas Di Pentima Date: Wed, 27 Jul 2022 19:07:56 +0000 (-0300) Subject: 19297: Raises an error only when no object types have the requested attribute. X-Git-Tag: 2.5.0~107^2~1 X-Git-Url: https://git.arvados.org/arvados.git/commitdiff_plain/6cd62b6e286d4470ef9e2b2c70653d78a05f8cf2 19297: Raises an error only when no object types have the requested attribute. Arvados-DCO-1.1-Signed-off-by: Lucas Di Pentima --- diff --git a/services/api/app/controllers/arvados/v1/groups_controller.rb b/services/api/app/controllers/arvados/v1/groups_controller.rb index 3473c7e4e0..de0c43a77e 100644 --- a/services/api/app/controllers/arvados/v1/groups_controller.rb +++ b/services/api/app/controllers/arvados/v1/groups_controller.rb @@ -263,6 +263,9 @@ class Arvados::V1::GroupsController < ApplicationController included_by_uuid = {} seen_last_class = false + error_by_class = {} + any_success = false + klasses.each do |klass| # check if current klass is same as params['last_object_class'] seen_last_class = true if((params['count'].andand.==('none')) and @@ -318,7 +321,19 @@ class Arvados::V1::GroupsController < ApplicationController # Adjust the limit based on number of objects fetched so far klass_limit = limit_all - all_objects.count @limit = klass_limit - apply_where_limit_order_params klass + + begin + apply_where_limit_order_params klass + rescue ArgumentError => e + if e.inspect =~ /Invalid attribute '.+' for operator '.+' in filter/ or + e.inspect =~ /Invalid attribute '.+' for subproperty filter/ + error_by_class[klass.name] = e + next + end + raise + else + any_success = true + end # This actually fetches the objects klass_object_list = object_list(model_class: klass) @@ -349,6 +364,14 @@ class Arvados::V1::GroupsController < ApplicationController end end + # Only error out when every searchable object type errored out + if !any_success + error_msg = error_by_class.collect do |klass, err| + "#{err} on object type #{klass}" + end.join("\n") + raise ArgumentError.new(error_msg) + end + if params["include"] @extra_included = included_by_uuid.values end diff --git a/services/api/lib/record_filters.rb b/services/api/lib/record_filters.rb index 2f5b67074a..65c25810ac 100644 --- a/services/api/lib/record_filters.rb +++ b/services/api/lib/record_filters.rb @@ -136,7 +136,7 @@ module RecordFilters raise ArgumentError.new("Invalid operator for subproperty search '#{operator}'") end elsif operator == "exists" - if col.type != :jsonb + if col.nil? or col.type != :jsonb raise ArgumentError.new("Invalid attribute '#{attr}' for operator '#{operator}' in filter") end