From 1fa3a92ed6100aac7ac8af68095d199effeea344 Mon Sep 17 00:00:00 2001 From: Lucas Di Pentima Date: Thu, 30 Jan 2020 11:55:18 -0300 Subject: [PATCH] 15781: Adds support for exact match on 'contains' filter. Arvados-DCO-1.1-Signed-off-by: Lucas Di Pentima --- services/api/lib/record_filters.rb | 3 ++- services/api/test/fixtures/collections.yml | 15 +++++++++++++++ .../test/functional/arvados/v1/filters_test.rb | 8 ++++---- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/services/api/lib/record_filters.rb b/services/api/lib/record_filters.rb index e059a6e70a..5688ca6140 100644 --- a/services/api/lib/record_filters.rb +++ b/services/api/lib/record_filters.rb @@ -141,7 +141,8 @@ module RecordFilters end param_out << proppath when 'contains' - cond_out << "#{attr_table_name}.#{attr} @> ?::jsonb" + cond_out << "#{attr_table_name}.#{attr} @> ?::jsonb OR #{attr_table_name}.#{attr} @> ?::jsonb" + param_out << SafeJSON.dump({proppath => operand}) param_out << SafeJSON.dump({proppath => [operand]}) else raise ArgumentError.new("Invalid operator for subproperty search '#{operator}'") diff --git a/services/api/test/fixtures/collections.yml b/services/api/test/fixtures/collections.yml index ff01de150f..84c3559939 100644 --- a/services/api/test/fixtures/collections.yml +++ b/services/api/test/fixtures/collections.yml @@ -1002,6 +1002,21 @@ collection_with_list_prop_even: properties: listprop: [elem2, 4, elem6] +collection_with_listprop_elem1: + uuid: zzzzz-4zz18-listpropelem1 + current_version_uuid: zzzzz-4zz18-listpropelem1 + portable_data_hash: fa7aeb5140e2848d39b416daeef4ffc5+45 + owner_uuid: zzzzz-tpzed-xurymjxw79nv3jz + created_at: 2015-02-13T17:22:54Z + modified_by_client_uuid: zzzzz-ozdt8-brczlopd8u8d0jr + modified_by_user_uuid: zzzzz-tpzed-d9tiejq69daie8f + modified_at: 2015-02-13T17:22:54Z + updated_at: 2015-02-13T17:22:54Z + manifest_text: ". 37b51d194a7513e45b56f6524f2d51f2+3 0:3:bar\n" + name: collection with list property with string value + properties: + listprop: elem1 + collection_with_uri_prop: uuid: zzzzz-4zz18-withuripropval1 current_version_uuid: zzzzz-4zz18-withuripropval1 diff --git a/services/api/test/functional/arvados/v1/filters_test.rb b/services/api/test/functional/arvados/v1/filters_test.rb index 08ca71f60b..2484127b21 100644 --- a/services/api/test/functional/arvados/v1/filters_test.rb +++ b/services/api/test/functional/arvados/v1/filters_test.rb @@ -172,10 +172,10 @@ class Arvados::V1::FiltersTest < ActionController::TestCase ['prop2', '<=', 5, [:collection_with_prop2_1, :collection_with_prop2_5], []], ['prop2', '>=', 1, [:collection_with_prop2_1, :collection_with_prop2_5], []], ['', '=', "value1", [:collection_with_uri_prop], []], - ['listprop', 'contains', 'elem1', [:collection_with_list_prop_odd], [:collection_with_list_prop_even]], - ['listprop', 'contains', 5, [:collection_with_list_prop_odd], [:collection_with_list_prop_even]], - ['listprop', 'contains', 'elem2', [:collection_with_list_prop_even], [:collection_with_list_prop_odd]], - ['listprop', 'contains', 4, [:collection_with_list_prop_even], [:collection_with_list_prop_odd]], + ['listprop', 'contains', 'elem1', [:collection_with_list_prop_odd, :collection_with_listprop_elem1], [:collection_with_list_prop_even]], + ['listprop', 'contains', 5, [:collection_with_list_prop_odd], [:collection_with_list_prop_even, :collection_with_listprop_elem1]], + ['listprop', 'contains', 'elem2', [:collection_with_list_prop_even], [:collection_with_list_prop_odd, :collection_with_listprop_elem1]], + ['listprop', 'contains', 4, [:collection_with_list_prop_even], [:collection_with_list_prop_odd, :collection_with_listprop_elem1]], ].each do |prop, op, opr, inc, ex| test "jsonb filter properties.#{prop} #{op} #{opr})" do @controller = Arvados::V1::CollectionsController.new -- 2.30.2