Add "Group Members" section to ConversationList search results.

This commit is contained in:
Alex Hart
2023-01-26 14:10:38 -04:00
committed by Greyson Parrelli
parent e84c6187b9
commit 09902e5d11
14 changed files with 265 additions and 39 deletions

View File

@@ -69,6 +69,7 @@ class GroupTable(context: Context?, databaseHelper: SignalDatabase?) : DatabaseT
private val TAG = Log.tag(GroupTable::class.java)
const val MEMBER_GROUP_CONCAT = "member_group_concat"
const val THREAD_DATE = "thread_date"
const val TABLE_NAME = "groups"
const val ID = "_id"
@@ -346,6 +347,24 @@ class GroupTable(context: Context?, databaseHelper: SignalDatabase?) : DatabaseT
return noMetadata && noMembers
}
fun queryGroupsByMemberName(inputQuery: String): Cursor {
val subquery = recipients.getAllContactsSubquery(inputQuery)
val statement = """
SELECT
DISTINCT $TABLE_NAME.*,
GROUP_CONCAT(${MembershipTable.TABLE_NAME}.${MembershipTable.RECIPIENT_ID}) as $MEMBER_GROUP_CONCAT,
${ThreadTable.TABLE_NAME}.${ThreadTable.DATE} as $THREAD_DATE
FROM $TABLE_NAME
INNER JOIN ${MembershipTable.TABLE_NAME} ON ${MembershipTable.TABLE_NAME}.${MembershipTable.GROUP_ID} = $TABLE_NAME.$GROUP_ID
INNER JOIN ${ThreadTable.TABLE_NAME} ON ${ThreadTable.TABLE_NAME}.${ThreadTable.RECIPIENT_ID} = $TABLE_NAME.$RECIPIENT_ID
WHERE $ACTIVE = 1 AND ${MembershipTable.TABLE_NAME}.${MembershipTable.RECIPIENT_ID} IN (${subquery.where})
GROUP BY ${MembershipTable.TABLE_NAME}.${MembershipTable.GROUP_ID}
ORDER BY $TITLE COLLATE NOCASE ASC
""".toSingleLine()
return databaseHelper.signalReadableDatabase.query(statement, subquery.whereArgs)
}
fun queryGroupsByTitle(inputQuery: String, includeInactive: Boolean, excludeV1: Boolean, excludeMms: Boolean): Reader {
val query = getGroupQueryWhereStatement(inputQuery, includeInactive, excludeV1, excludeMms)
//language=sql

View File

@@ -30,6 +30,7 @@ import org.signal.core.util.requireLong
import org.signal.core.util.requireNonNullString
import org.signal.core.util.requireString
import org.signal.core.util.select
import org.signal.core.util.toSingleLine
import org.signal.core.util.update
import org.signal.core.util.withinTransaction
import org.signal.libsignal.protocol.IdentityKey
@@ -3179,6 +3180,27 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da
return readableDatabase.query(TABLE_NAME, SEARCH_PROJECTION, selection, args, null, null, null)
}
/**
* Gets the query used for performing the all contacts search so that it can be injected as a subquery.
*/
fun getAllContactsSubquery(inputQuery: String): SqlUtil.Query {
val query = SqlUtil.buildCaseInsensitiveGlobPattern(inputQuery)
//language=sql
val subquery = """SELECT $ID FROM (
SELECT ${SEARCH_PROJECTION.joinToString(",")} FROM $TABLE_NAME
WHERE $BLOCKED = ? AND $HIDDEN = ? AND
(
$SORT_NAME GLOB ? OR
$USERNAME GLOB ? OR
$PHONE GLOB ? OR
$EMAIL GLOB ?
))
""".toSingleLine()
return SqlUtil.Query(subquery, SqlUtil.buildArgs(0, 0, query, query, query, query))
}
@JvmOverloads
fun queryRecipientsForMentions(inputQuery: String, recipientIds: List<RecipientId>? = null): List<Recipient> {
val query = SqlUtil.buildCaseInsensitiveGlobPattern(inputQuery)