Skip to content

Commit

Permalink
Fix method to find MMS group.
Browse files Browse the repository at this point in the history
  • Loading branch information
greyson-signal committed Feb 9, 2023
1 parent 7ffdf91 commit 61e127f
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,48 @@ class GroupTableTest {
assertEquals(mmsGroup, actual)
}

@Test
fun givenMultipleMmsGroups_whenIGetOrCreateMmsGroup_thenIExpectMyMmsGroup() {
val group1Members: List<RecipientId> = listOf(harness.self.id, harness.others[0], harness.others[1])
val group2Members: List<RecipientId> = listOf(harness.self.id, harness.others[0], harness.others[2])

val group1: GroupId = insertMmsGroup(group1Members)
val group2: GroupId = insertMmsGroup(group2Members)

val group1Result: GroupId = groupTable.getOrCreateMmsGroupForMembers(group1Members.toSet())
val group2Result: GroupId = groupTable.getOrCreateMmsGroupForMembers(group2Members.toSet())

assertEquals(group1, group1Result)
assertEquals(group2, group2Result)
assertNotEquals(group1Result, group2Result)
}

@Test
fun givenMultipleMmsGroupsWithDifferentMemberOrders_whenIGetOrCreateMmsGroup_thenIExpectMyMmsGroup() {
val group1Members: List<RecipientId> = listOf(harness.self.id, harness.others[0], harness.others[1], harness.others[2]).shuffled()
val group2Members: List<RecipientId> = listOf(harness.self.id, harness.others[0], harness.others[2], harness.others[3]).shuffled()

val group1: GroupId = insertMmsGroup(group1Members)
val group2: GroupId = insertMmsGroup(group2Members)

val group1Result: GroupId = groupTable.getOrCreateMmsGroupForMembers(group1Members.shuffled().toSet())
val group2Result: GroupId = groupTable.getOrCreateMmsGroupForMembers(group2Members.shuffled().toSet())

assertEquals(group1, group1Result)
assertEquals(group2, group2Result)
assertNotEquals(group1Result, group2Result)
}

@Test
fun givenMmsGroupWithOneMember_whenIGetOrCreateMmsGroup_thenIExpectMyMmsGroup() {
val groupMembers: List<RecipientId> = listOf(harness.self.id)
val group: GroupId = insertMmsGroup(groupMembers)

val groupResult: GroupId = groupTable.getOrCreateMmsGroupForMembers(groupMembers.toSet())

assertEquals(group, groupResult)
}

@Test
fun givenTwoGroupsWithoutMembers_whenIQueryThem_thenIExpectEach() {
val g1 = insertPushGroup(listOf())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -502,18 +502,30 @@ class GroupTable(context: Context?, databaseHelper: SignalDatabase?) : DatabaseT
}

fun getOrCreateMmsGroupForMembers(members: Set<RecipientId>): GroupId.Mms {
val joinedTestMembers = members
.toList()
.map { it.toLong() }
.sorted()
.joinToString(separator = ",")

//language=sql
val statement = """
SELECT ${MembershipTable.TABLE_NAME}.${MembershipTable.GROUP_ID} as gid
FROM ${MembershipTable.TABLE_NAME}
INNER JOIN $TABLE_NAME ON ${MembershipTable.TABLE_NAME}.${MembershipTable.GROUP_ID} = $TABLE_NAME.$GROUP_ID
WHERE ${MembershipTable.TABLE_NAME}.$RECIPIENT_ID IN (${members.joinToString(",") { it.serialize() }}) AND $TABLE_NAME.$MMS = 1
GROUP BY $TABLE_NAME.$GROUP_ID
HAVING (SELECT COUNT(*) FROM ${MembershipTable.TABLE_NAME} WHERE ${MembershipTable.GROUP_ID} = gid) = ${members.size}
ORDER BY ${MembershipTable.TABLE_NAME}.${MembershipTable.ID} ASC
SELECT
$TABLE_NAME.$GROUP_ID as gid,
(
SELECT GROUP_CONCAT(${MembershipTable.RECIPIENT_ID}, ',')
FROM (
SELECT ${MembershipTable.TABLE_NAME}.${MembershipTable.RECIPIENT_ID}
FROM ${MembershipTable.TABLE_NAME}
WHERE ${MembershipTable.TABLE_NAME}.${MembershipTable.GROUP_ID} = $TABLE_NAME.$GROUP_ID
ORDER BY ${MembershipTable.TABLE_NAME}.${MembershipTable.RECIPIENT_ID} ASC
)
) as $MEMBER_GROUP_CONCAT
FROM $TABLE_NAME
WHERE $MEMBER_GROUP_CONCAT = ?
""".toSingleLine()

return readableDatabase.query(statement).use { cursor ->
return readableDatabase.rawQuery(statement, buildArgs(joinedTestMembers)).use { cursor ->
if (cursor.moveToNext()) {
return GroupId.parseOrThrow(cursor.requireNonNullString("gid")).requireMms()
} else {
Expand Down

0 comments on commit 61e127f

Please sign in to comment.