kopia lustrzana https://github.com/ryukoposting/Signal-Android
Utilize left join instead of inner join when querying groups.
rodzic
0deed9d4d2
commit
32dd227ab6
|
@ -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()
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue