From 61e127fabf9e7414878a1b8113dcca3cbaeb8a0e Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Wed, 8 Feb 2023 21:12:00 -0500 Subject: [PATCH] Fix method to find MMS group. --- .../securesms/database/GroupTableTest.kt | 42 +++++++++++++++++++ .../securesms/database/GroupTable.kt | 28 +++++++++---- 2 files changed, 62 insertions(+), 8 deletions(-) diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/GroupTableTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/GroupTableTest.kt index 7b5b969d3..f791e6f64 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/GroupTableTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/GroupTableTest.kt @@ -170,6 +170,48 @@ class GroupTableTest { assertEquals(mmsGroup, actual) } + @Test + fun givenMultipleMmsGroups_whenIGetOrCreateMmsGroup_thenIExpectMyMmsGroup() { + val group1Members: List = listOf(harness.self.id, harness.others[0], harness.others[1]) + val group2Members: List = 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 = listOf(harness.self.id, harness.others[0], harness.others[1], harness.others[2]).shuffled() + val group2Members: List = 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 = 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()) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/GroupTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/GroupTable.kt index fde53e906..d4138feb5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/GroupTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/GroupTable.kt @@ -502,18 +502,30 @@ class GroupTable(context: Context?, databaseHelper: SignalDatabase?) : DatabaseT } fun getOrCreateMmsGroupForMembers(members: Set): 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 {