Skip to content

Commit ff4c952

Browse files
authored
CORE-282 sort top groups (#1643)
1 parent cae696c commit ff4c952

File tree

6 files changed

+22
-19
lines changed

6 files changed

+22
-19
lines changed

src/main/scala/org/broadinstitute/dsde/workbench/sam/dataAccess/DirectoryDAO.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import org.broadinstitute.dsde.workbench.sam.azure.{
1111
PetManagedIdentity,
1212
PetManagedIdentityId
1313
}
14-
import org.broadinstitute.dsde.workbench.sam.model.api.{AdminUpdateUserRequest, SamUser, SamUserAttributes}
14+
import org.broadinstitute.dsde.workbench.sam.model.api.{AdminUpdateUserRequest, GroupMembershipCount, SamUser, SamUserAttributes}
1515
import org.broadinstitute.dsde.workbench.sam.model.{BasicWorkbenchGroup, FullyQualifiedResourceId, ResourceAction, ResourceTypeName, SamUserTos}
1616
import org.broadinstitute.dsde.workbench.sam.util.SamRequestContext
1717

@@ -217,5 +217,5 @@ trait DirectoryDAO {
217217
* @return
218218
* a map of group to membership count
219219
*/
220-
def listGroupsContributingToMostMemberships(samUser: SamUser, limit: Int, samRequestContext: SamRequestContext): IO[Map[WorkbenchGroupIdentity, Int]]
220+
def listGroupsContributingToMostMemberships(samUser: SamUser, limit: Int, samRequestContext: SamRequestContext): IO[List[GroupMembershipCount]]
221221
}

src/main/scala/org/broadinstitute/dsde/workbench/sam/dataAccess/PostgresDirectoryDAO.scala

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import org.broadinstitute.dsde.workbench.sam.db.SamTypeBinders._
2424
import org.broadinstitute.dsde.workbench.sam.db._
2525
import org.broadinstitute.dsde.workbench.sam.db.tables._
2626
import org.broadinstitute.dsde.workbench.sam.model._
27-
import org.broadinstitute.dsde.workbench.sam.model.api.{AdminUpdateUserRequest, SamUser, SamUserAttributes}
27+
import org.broadinstitute.dsde.workbench.sam.model.api.{AdminUpdateUserRequest, GroupMembershipCount, SamUser, SamUserAttributes}
2828
import org.broadinstitute.dsde.workbench.sam.util.{DatabaseSupport, SamRequestContext}
2929
import org.postgresql.util.PSQLException
3030
import scalikejdbc._
@@ -736,8 +736,8 @@ class PostgresDirectoryDAO(protected val writeDbRef: DbReference, protected val
736736
samUser: SamUser,
737737
limit: Int,
738738
samRequestContext: SamRequestContext
739-
): IO[Map[WorkbenchGroupIdentity, Int]] = if (limit <= 0) {
740-
IO.pure(Map.empty)
739+
): IO[List[GroupMembershipCount]] = if (limit <= 0) {
740+
IO.pure(List.empty)
741741
} else {
742742
readOnlyTransaction("listGroupsContributingToMostMemberships", samRequestContext) { implicit session =>
743743
val f = GroupMemberFlatTable.syntax("f")
@@ -762,15 +762,15 @@ class PostgresDirectoryDAO(protected val writeDbRef: DbReference, protected val
762762
left join ${PolicyTable as p} on ${p.groupId} = ${g.id}
763763
left join ${ResourceTable as r} on ${p.resourceId} = ${r.id}
764764
left join ${ResourceTypeTable as rt} on ${r.resourceTypeId} = ${rt.id}
765+
order by gc.membership_count desc
765766
"""
766767

767768
query
768769
.map { rs =>
769-
resultSetToGroupIdentity(rs, g, p, r, rt) -> rs.int("membership_count")
770+
GroupMembershipCount(resultSetToGroupIdentity(rs, g, p, r, rt), rs.int("membership_count"))
770771
}
771772
.list()
772773
.apply()
773-
.toMap
774774
}
775775
}
776776

src/main/scala/org/broadinstitute/dsde/workbench/sam/service/UserService.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -520,7 +520,7 @@ class UserService(
520520
def countIndirectPublicGroupMemberships(samUser: SamUser, samRequestContext: SamRequestContext): IO[Int] =
521521
directoryDAO.countIndirectPublicGroupMemberships(samUser, samRequestContext)
522522

523-
def listGroupsContributingToMostMemberships(samUser: SamUser, limit: Int, samRequestContext: SamRequestContext): IO[Map[WorkbenchGroupIdentity, Int]] =
523+
def listGroupsContributingToMostMemberships(samUser: SamUser, limit: Int, samRequestContext: SamRequestContext): IO[List[GroupMembershipCount]] =
524524
directoryDAO.listGroupsContributingToMostMemberships(samUser, limit, samRequestContext)
525525

526526
def getSamUserCombinedState(
@@ -573,7 +573,8 @@ class UserService(
573573
),
574574
Map("enterpriseFeatures" -> enterpriseFeatures.toJson),
575575
favoriteResources,
576-
topGroups.map { case (group, count) => GroupMembershipCount(group, count) }.toList match {
576+
topGroups match {
577+
// we want to omit the topGroups field if it's empty so that it does not seem like there are no groups
577578
case Nil => None
578579
case list => Option(list)
579580
}

src/test/scala/org/broadinstitute/dsde/workbench/sam/dataAccess/MockDirectoryDAO.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import org.broadinstitute.dsde.workbench.sam.azure.{
1515
PetManagedIdentityId
1616
}
1717
import org.broadinstitute.dsde.workbench.sam.db.tables.TosTable
18-
import org.broadinstitute.dsde.workbench.sam.model.api.{AdminUpdateUserRequest, SamUser, SamUserAttributes}
18+
import org.broadinstitute.dsde.workbench.sam.model.api.{AdminUpdateUserRequest, GroupMembershipCount, SamUser, SamUserAttributes}
1919
import org.broadinstitute.dsde.workbench.sam.model.{AccessPolicy, BasicWorkbenchGroup, FullyQualifiedResourceId, ResourceAction, ResourceTypeName, SamUserTos}
2020
import org.broadinstitute.dsde.workbench.sam.util.SamRequestContext
2121

@@ -525,5 +525,5 @@ class MockDirectoryDAO(val groups: mutable.Map[WorkbenchGroupIdentity, Workbench
525525
samUser: SamUser,
526526
limit: Int,
527527
samRequestContext: SamRequestContext
528-
): IO[Map[WorkbenchGroupIdentity, Int]] = ???
528+
): IO[List[GroupMembershipCount]] = ???
529529
}

src/test/scala/org/broadinstitute/dsde/workbench/sam/dataAccess/PostgresDirectoryDAOSpec.scala

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import org.broadinstitute.dsde.workbench.sam.db.TestDbReference
1212
import org.broadinstitute.dsde.workbench.sam.db.tables.TosTable
1313
import org.broadinstitute.dsde.workbench.sam.matchers.TimeMatchers
1414
import org.broadinstitute.dsde.workbench.sam.model._
15-
import org.broadinstitute.dsde.workbench.sam.model.api.{AdminUpdateUserRequest, SamUser, SamUserAttributes}
15+
import org.broadinstitute.dsde.workbench.sam.model.api.{AdminUpdateUserRequest, GroupMembershipCount, SamUser, SamUserAttributes}
1616
import org.broadinstitute.dsde.workbench.sam.{Generator, TestSupport}
1717
import org.scalatest.Inside.inside
1818
import org.scalatest.freespec.AnyFreeSpec
@@ -2259,11 +2259,13 @@ class PostgresDirectoryDAOSpec extends AnyFreeSpec with Matchers with BeforeAndA
22592259
dao.addGroupMember(testGroups.last._1.id, otherUser.id, samRequestContext).unsafeRunSync()
22602260

22612261
val result = dao.listGroupsContributingToMostMemberships(defaultUser, limit, samRequestContext).unsafeRunSync()
2262-
result should be(testGroups.drop(drop).map { case (group, index) => group.id -> (1 + index * multiplier) }.toMap)
2262+
result.reverse should contain theSameElementsInOrderAs testGroups.drop(drop).map { case (group, index) =>
2263+
GroupMembershipCount(group.id, 1 + index * multiplier)
2264+
}
22632265

22642266
// check that another user gives different results
22652267
val otherResult = dao.listGroupsContributingToMostMemberships(otherUser, limit, samRequestContext).unsafeRunSync()
2266-
otherResult should be(Map(testGroups.last._1.id -> (1 + (limit + drop) * multiplier)))
2268+
otherResult should be(List(GroupMembershipCount(testGroups.last._1.id, 1 + (limit + drop) * multiplier)))
22672269
}
22682270

22692271
"list policies and groups" in {
@@ -2282,7 +2284,7 @@ class PostgresDirectoryDAOSpec extends AnyFreeSpec with Matchers with BeforeAndA
22822284
dao.updateSynchronizedDateAndVersion(group, samRequestContext).unsafeRunSync()
22832285

22842286
val result = dao.listGroupsContributingToMostMemberships(defaultUser, 10, samRequestContext).unsafeRunSync()
2285-
result should be(Map(policy.id -> 1, group.id -> 1))
2287+
result should contain theSameElementsAs List(GroupMembershipCount(policy.id, 1), GroupMembershipCount(group.id, 1))
22862288
}
22872289

22882290
"ignores unsynchronized groups" in {
@@ -2297,10 +2299,10 @@ class PostgresDirectoryDAOSpec extends AnyFreeSpec with Matchers with BeforeAndA
22972299
val parentUuid = UUID.randomUUID().toString
22982300
val parentGroup = BasicWorkbenchGroup(WorkbenchGroupName(parentUuid), Set(leafGroup.id), WorkbenchEmail(parentUuid))
22992301
dao.createGroup(parentGroup, samRequestContext = samRequestContext).unsafeRunSync()
2300-
// not synchronized
2302+
// updateSynchronizedDateAndVersion not called
23012303

23022304
val result = dao.listGroupsContributingToMostMemberships(defaultUser, 10, samRequestContext).unsafeRunSync()
2303-
result should be(Map(leafGroup.id -> 1))
2305+
result should be(List(GroupMembershipCount(leafGroup.id, 1)))
23042306
}
23052307
}
23062308
}

src/test/scala/org/broadinstitute/dsde/workbench/sam/service/UserServiceSpecs/SupportSummarySpec.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,11 +97,11 @@ class SupportSummarySpec extends UserServiceTestTraits with TimeMatchers {
9797
.when(directoryDAO)
9898
.countIndirectPublicGroupMemberships(any[SamUser], any[SamRequestContext])
9999
lenient()
100-
.doReturn(IO.pure(Map(testGroupName -> 1, testPolicyId -> 2)))
100+
.doReturn(IO.pure(List(GroupMembershipCount(testGroupName, 1), GroupMembershipCount(testPolicyId, 2))))
101101
.when(directoryDAO)
102102
.listGroupsContributingToMostMemberships(any[SamUser], any[Int], any[SamRequestContext])
103103
lenient()
104-
.doReturn(IO.pure(Map.empty))
104+
.doReturn(IO.pure(List.empty))
105105
.when(directoryDAO)
106106
.listGroupsContributingToMostMemberships(any[SamUser], ArgumentMatchers.eq(0), any[SamRequestContext])
107107

0 commit comments

Comments
 (0)