18003: add 'contains' and 'exists' to the permitted operators for filter
authorWard Vandewege <ward@curii.com>
Tue, 28 Sep 2021 20:38:34 +0000 (16:38 -0400)
committerWard Vandewege <ward@curii.com>
Tue, 28 Sep 2021 20:59:08 +0000 (16:59 -0400)
       groups.

Arvados-DCO-1.1-Signed-off-by: Ward Vandewege <ward@curii.com>

sdk/go/arvados/fs_project_test.go
sdk/go/arvados/fs_site_test.go
services/api/app/models/group.rb
services/api/test/fixtures/groups.yml

index 0564e2fae61a2c85e68d677b0344572014e184e8..f68e7c8b08e97b4dd2fdd9bd9252ecd563060b59 100644 (file)
@@ -73,6 +73,30 @@ func (s *SiteFSSuite) TestFilterGroup(c *check.C) {
 
        _, err = s.fs.OpenFile("/fg3/A Subproject", 0, 0)
        c.Assert(err, check.Not(check.IsNil))
+
+       // An 'exists' 'arvados#collection' filter means only collections with certain properties should be returned.
+       s.fs.MountProject("fg4", fixtureAFilterGroupFourUUID)
+
+       _, err = s.fs.Stat("/fg4/collection with list property with odd values")
+       c.Assert(err, check.IsNil)
+
+       _, err = s.fs.Stat("/fg4/collection with list property with even values")
+       c.Assert(err, check.IsNil)
+
+       // A 'contains' 'arvados#collection' filter means only collections with certain properties should be returned.
+       s.fs.MountProject("fg5", fixtureAFilterGroupFiveUUID)
+
+       _, err = s.fs.Stat("/fg5/collection with list property with odd values")
+       c.Assert(err, check.IsNil)
+
+       _, err = s.fs.Stat("/fg5/collection with list property with string value")
+       c.Assert(err, check.IsNil)
+
+       _, err = s.fs.Stat("/fg5/collection with prop2 5")
+       c.Assert(err, check.Not(check.IsNil))
+
+       _, err = s.fs.Stat("/fg5/collection with list property with even values")
+       c.Assert(err, check.Not(check.IsNil))
 }
 
 func (s *SiteFSSuite) TestCurrentUserHome(c *check.C) {
index 3c7c146f6975f26e36e9966ee0c17be7171a9dc6..51ca88764e6625dd25428a526f325e6acf138af8 100644 (file)
@@ -21,6 +21,8 @@ const (
        fixtureThisFilterGroupUUID          = "zzzzz-j7d0g-thisfiltergroup"
        fixtureAFilterGroupTwoUUID          = "zzzzz-j7d0g-afiltergrouptwo"
        fixtureAFilterGroupThreeUUID        = "zzzzz-j7d0g-filtergroupthre"
+       fixtureAFilterGroupFourUUID         = "zzzzz-j7d0g-filtergroupfour"
+       fixtureAFilterGroupFiveUUID         = "zzzzz-j7d0g-filtergroupfive"
        fixtureFooAndBarFilesInDirUUID      = "zzzzz-4zz18-foonbarfilesdir"
        fixtureFooCollectionName            = "zzzzz-4zz18-fy296fx3hot09f7 added sometime"
        fixtureFooCollectionPDH             = "1f4b0bc7583c2a7f9102c395f4ffc5e3+45"
index fd2f5f18c2ac8018b152307042e82d587f8290a7..8565b2a417efc0a28d611c2ff1ed873acfc39a8c 100644 (file)
@@ -84,8 +84,8 @@ class Group < ArvadosModel
           errors.add :properties, "when filter operator is 'is_a', attribute must be 'uuid'"
           return
         end
-        if ! ["=","<","<=",">",">=","!=","like","ilike","in","not in","is_a"].include?(filter[1].downcase)
-          errors.add :properties, "filter operator is not valid (must be =,<,<=,>,>=,!=,like,ilike,in,not in,is_a)"
+        if ! ["=","<","<=",">",">=","!=","like","ilike","in","not in","is_a","exists","contains"].include?(filter[1].downcase)
+          errors.add :properties, "filter operator is not valid (must be =,<,<=,>,>=,!=,like,ilike,in,not in,is_a,exists,contains)"
           return
         end
       end
index 48925a27027a7cbd96dba6bd5bfa5eeb67757928..9a2dc169b63aec6ff8d624bf4128c69483e0ce3b 100644 (file)
@@ -146,6 +146,32 @@ afiltergroup3:
   properties:
     filters: [["uuid", "is_a", "arvados#collection"]]
 
+afiltergroup4:
+  uuid: zzzzz-j7d0g-filtergroupfour
+  owner_uuid: zzzzz-tpzed-xurymjxw79nv3jz
+  created_at: 2014-04-21 15:37:48 -0400
+  modified_by_client_uuid: zzzzz-ozdt8-brczlopd8u8d0jr
+  modified_by_user_uuid: zzzzz-tpzed-xurymjxw79nv3jz
+  modified_at: 2014-04-21 15:37:48 -0400
+  updated_at: 2014-04-21 15:37:48 -0400
+  name: A filter group with an exists collections filter
+  group_class: filter
+  properties:
+    filters: [["collections.properties.listprop","exists",true],["uuid", "is_a", "arvados#collection"]]
+
+afiltergroup5:
+  uuid: zzzzz-j7d0g-filtergroupfive
+  owner_uuid: zzzzz-tpzed-xurymjxw79nv3jz
+  created_at: 2014-04-21 15:37:48 -0400
+  modified_by_client_uuid: zzzzz-ozdt8-brczlopd8u8d0jr
+  modified_by_user_uuid: zzzzz-tpzed-xurymjxw79nv3jz
+  modified_at: 2014-04-21 15:37:48 -0400
+  updated_at: 2014-04-21 15:37:48 -0400
+  name: A filter group with a contains collections filter
+  group_class: filter
+  properties:
+    filters: [["collections.properties.listprop","contains","elem1"],["uuid", "is_a", "arvados#collection"]]
+
 future_project_viewing_group:
   uuid: zzzzz-j7d0g-futrprojviewgrp
   owner_uuid: zzzzz-tpzed-000000000000000