Utilize left join instead of inner join when querying groups.

main
Alex Hart 2023-01-25 16:51:35 -04:00 zatwierdzone przez Greyson Parrelli
rodzic 0deed9d4d2
commit 32dd227ab6
2 zmienionych plików z 36 dodań i 23 usunięć

Wyświetl plik

@ -170,6 +170,18 @@ class GroupTableTest {
assertEquals(mmsGroup, actual) assertEquals(mmsGroup, actual)
} }
@Test
fun givenTwoGroupsWithoutMembers_whenIQueryThem_thenIExpectEach() {
val g1 = insertPushGroup(listOf())
val g2 = insertPushGroup(listOf())
val gr1 = groupTable.getGroup(g1)
val gr2 = groupTable.getGroup(g2)
assertEquals(g1, gr1.get().id)
assertEquals(g2, gr2.get().id)
}
private fun insertThread(groupId: GroupId): Long { private fun insertThread(groupId: GroupId): Long {
val groupRecipient = SignalDatabase.recipients.getByGroupId(groupId).get() val groupRecipient = SignalDatabase.recipients.getByGroupId(groupId).get()
return SignalDatabase.threads.getOrCreateThreadIdFor(Recipient.resolved(groupRecipient)) return SignalDatabase.threads.getOrCreateThreadIdFor(Recipient.resolved(groupRecipient))
@ -188,11 +200,8 @@ class GroupTableTest {
return id return id
} }
private fun insertPushGroup(): GroupId { private fun insertPushGroup(
val groupMasterKey = GroupMasterKey(Random.nextBytes(GroupMasterKey.SIZE)) members: List<DecryptedMember> = listOf(
val decryptedGroupState = DecryptedGroup.newBuilder()
.addAllMembers(
listOf(
DecryptedMember.newBuilder() DecryptedMember.newBuilder()
.setUuid(harness.self.requireServiceId().toByteString()) .setUuid(harness.self.requireServiceId().toByteString())
.setJoinedAtRevision(0) .setJoinedAtRevision(0)
@ -204,7 +213,10 @@ class GroupTableTest {
.setRole(Member.Role.DEFAULT) .setRole(Member.Role.DEFAULT)
.build() .build()
) )
) ): GroupId {
val groupMasterKey = GroupMasterKey(Random.nextBytes(GroupMasterKey.SIZE))
val decryptedGroupState = DecryptedGroup.newBuilder()
.addAllMembers(members)
.setRevision(0) .setRevision(0)
.build() .build()

Wyświetl plik

@ -167,7 +167,7 @@ class GroupTable(context: Context?, databaseHelper: SignalDatabase?) : DatabaseT
DISTINCT $TABLE_NAME.*, DISTINCT $TABLE_NAME.*,
GROUP_CONCAT(${MembershipTable.TABLE_NAME}.${MembershipTable.RECIPIENT_ID}) as $MEMBER_GROUP_CONCAT GROUP_CONCAT(${MembershipTable.TABLE_NAME}.${MembershipTable.RECIPIENT_ID}) as $MEMBER_GROUP_CONCAT
FROM $TABLE_NAME FROM $TABLE_NAME
INNER JOIN ${MembershipTable.TABLE_NAME} ON ${MembershipTable.TABLE_NAME}.${MembershipTable.GROUP_ID} = $TABLE_NAME.$GROUP_ID LEFT JOIN ${MembershipTable.TABLE_NAME} ON ${MembershipTable.TABLE_NAME}.${MembershipTable.GROUP_ID} = $TABLE_NAME.$GROUP_ID
""".toSingleLine() """.toSingleLine()
val CREATE_TABLES = arrayOf(CREATE_TABLE, MembershipTable.CREATE_TABLE) val CREATE_TABLES = arrayOf(CREATE_TABLE, MembershipTable.CREATE_TABLE)
@ -204,7 +204,7 @@ class GroupTable(context: Context?, databaseHelper: SignalDatabase?) : DatabaseT
private fun getGroup(query: SqlUtil.Query): Optional<GroupRecord> { private fun getGroup(query: SqlUtil.Query): Optional<GroupRecord> {
//language=sql //language=sql
val select = "$JOINED_GROUP_SELECT WHERE ${query.where} GROUP BY ${MembershipTable.TABLE_NAME}.${MembershipTable.GROUP_ID}" val select = "$JOINED_GROUP_SELECT WHERE ${query.where} GROUP BY $TABLE_NAME.$GROUP_ID"
readableDatabase readableDatabase
.query(select, query.whereArgs) .query(select, query.whereArgs)
@ -345,10 +345,11 @@ class GroupTable(context: Context?, databaseHelper: SignalDatabase?) : DatabaseT
fun queryGroupsByTitle(inputQuery: String, includeInactive: Boolean, excludeV1: Boolean, excludeMms: Boolean): Reader { fun queryGroupsByTitle(inputQuery: String, includeInactive: Boolean, excludeV1: Boolean, excludeMms: Boolean): Reader {
val query = getGroupQueryWhereStatement(inputQuery, includeInactive, excludeV1, excludeMms) val query = getGroupQueryWhereStatement(inputQuery, includeInactive, excludeV1, excludeMms)
//language=sql
val statement = """ val statement = """
$JOINED_GROUP_SELECT $JOINED_GROUP_SELECT
WHERE ${query.where} WHERE ${query.where}
GROUP BY ${MembershipTable.TABLE_NAME}.${MembershipTable.GROUP_ID} GROUP BY $TABLE_NAME.$GROUP_ID
ORDER BY $TITLE COLLATE NOCASE ASC ORDER BY $TITLE COLLATE NOCASE ASC
""".trimIndent() """.trimIndent()
@ -388,7 +389,7 @@ class GroupTable(context: Context?, databaseHelper: SignalDatabase?) : DatabaseT
query += " AND $MMS = 0" query += " AND $MMS = 0"
} }
return Reader(readableDatabase.query("$JOINED_GROUP_SELECT WHERE $query GROUP BY ${MembershipTable.TABLE_NAME}.${MembershipTable.GROUP_ID}", queryArgs)) return Reader(readableDatabase.query("$JOINED_GROUP_SELECT WHERE $query GROUP BY $TABLE_NAME.$GROUP_ID", queryArgs))
} }
private fun queryGroupsByRecency(groupQuery: GroupQuery): Reader { private fun queryGroupsByRecency(groupQuery: GroupQuery): Reader {
@ -396,7 +397,7 @@ class GroupTable(context: Context?, databaseHelper: SignalDatabase?) : DatabaseT
val sql = """ val sql = """
$JOINED_GROUP_SELECT $JOINED_GROUP_SELECT
WHERE ${query.where} WHERE ${query.where}
${"GROUP BY ${MembershipTable.TABLE_NAME}.${MembershipTable.GROUP_ID}"} GROUP BY $TABLE_NAME.$GROUP_ID
ORDER BY ${ThreadTable.TABLE_NAME}.${ThreadTable.DATE} DESC ORDER BY ${ThreadTable.TABLE_NAME}.${ThreadTable.DATE} DESC
""".toSingleLine() """.toSingleLine()
@ -473,7 +474,7 @@ class GroupTable(context: Context?, databaseHelper: SignalDatabase?) : DatabaseT
FROM ${MembershipTable.TABLE_NAME} FROM ${MembershipTable.TABLE_NAME}
INNER JOIN $TABLE_NAME ON ${MembershipTable.TABLE_NAME}.${MembershipTable.GROUP_ID} = $TABLE_NAME.$GROUP_ID 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 WHERE ${MembershipTable.TABLE_NAME}.$RECIPIENT_ID IN (${members.joinToString(",") { it.serialize() }}) AND $TABLE_NAME.$MMS = 1
GROUP BY ${MembershipTable.TABLE_NAME}.${MembershipTable.GROUP_ID} GROUP BY $TABLE_NAME.$GROUP_ID
HAVING (SELECT COUNT(*) FROM ${MembershipTable.TABLE_NAME} WHERE ${MembershipTable.GROUP_ID} = gid) = ${members.size} HAVING (SELECT COUNT(*) FROM ${MembershipTable.TABLE_NAME} WHERE ${MembershipTable.GROUP_ID} = gid) = ${members.size}
ORDER BY ${MembershipTable.TABLE_NAME}.${MembershipTable.ID} ASC ORDER BY ${MembershipTable.TABLE_NAME}.${MembershipTable.ID} ASC
""".toSingleLine() """.toSingleLine()
@ -528,14 +529,14 @@ class GroupTable(context: Context?, databaseHelper: SignalDatabase?) : DatabaseT
} }
return readableDatabase return readableDatabase
.query("$table WHERE $query GROUP BY ${MembershipTable.TABLE_NAME}.${MembershipTable.GROUP_ID} ORDER BY $orderBy".apply { println(this) }, args) .query("$table WHERE $query GROUP BY $TABLE_NAME.$GROUP_ID ORDER BY $orderBy".apply { println(this) }, args)
.readToList { cursor -> .readToList { cursor ->
getGroup(cursor).get() getGroup(cursor).get()
} }
} }
fun getGroups(): Reader { fun getGroups(): Reader {
val cursor = readableDatabase.query("$JOINED_GROUP_SELECT GROUP BY ${MembershipTable.TABLE_NAME}.${MembershipTable.GROUP_ID}") val cursor = readableDatabase.query("$JOINED_GROUP_SELECT GROUP BY $TABLE_NAME.$GROUP_ID")
return Reader(cursor) return Reader(cursor)
} }