Speeding up report queries

This commit is contained in:
Vitor Pamplona 2023-02-13 15:49:51 -05:00
parent 2ac4ed8ac4
commit 49366ac47d
3 changed files with 42 additions and 20 deletions

View File

@ -424,12 +424,12 @@ class Account(
fun isAcceptable(user: User): Boolean {
return user !in hiddenUsers() // if user hasn't hided this author
&& user.reportsBy( userProfile() ).isEmpty() // if user has not reported this post
&& user.reportsBy( userProfile().follows ).size < 5
&& user.reportAuthorsBy( userProfile().follows ).size < 5
}
fun isAcceptableDirect(note: Note): Boolean {
return note.reportsBy( userProfile() ).isEmpty() // if user has not reported this post
&& note.reportsBy( userProfile().follows ).size < 5 // if it has 5 reports by reliable users
&& note.reportAuthorsBy( userProfile().follows ).size < 5 // if it has 5 reports by reliable users
}
fun isAcceptable(note: Note): Boolean {

View File

@ -47,7 +47,7 @@ class Note(val idHex: String) {
private set
var boosts = setOf<Note>()
private set
var reports = setOf<Note>()
var reports = mapOf<User, Set<Note>>()
private set
var zaps = mapOf<Note, Note?>()
private set
@ -127,8 +127,13 @@ class Note(val idHex: String) {
}
fun addReport(note: Note) {
if (note !in reports) {
reports = reports + note
val author = note.author ?: return
if (author !in reports.keys) {
reports = reports + Pair(author, setOf(note))
liveReports.invalidateData()
} else {
reports = reports + Pair(author, (reports[author] ?: emptySet()) + note)
liveReports.invalidateData()
}
}
@ -153,12 +158,18 @@ class Note(val idHex: String) {
return boosts.any { it.author == user }
}
fun reportsBy(user: User): List<Note> {
return reports.filter { it.author == user }
fun reportsBy(user: User): Set<Note> {
return reports[user] ?: emptySet()
}
fun reportAuthorsBy(users: Set<User>): List<User> {
return reports.keys.filter { it in users }
}
fun reportsBy(users: Set<User>): List<Note> {
return reports.filter { it.author in users }
return reportAuthorsBy(users).mapNotNull {
reports[it]
}.flatten()
}
fun zappedAmount(): BigDecimal {
@ -171,8 +182,10 @@ class Note(val idHex: String) {
fun hasAnyReports(): Boolean {
val dayAgo = Date().time / 1000 - 24*60*60
return author?.reports?.filter { it.event?.createdAt ?: 0 > dayAgo }?.isNotEmpty() ?: false
|| reports.isNotEmpty()
return reports.isNotEmpty() ||
(author?.reports?.values?.filter {
it.firstOrNull { it.event?.createdAt ?: 0 > dayAgo } != null
}?.isNotEmpty() ?: false)
}
fun directlyCiteUsers(): Set<User> {

View File

@ -48,7 +48,7 @@ class User(val pubkeyHex: String) {
var taggedPosts = setOf<Note>()
private set
var reports = setOf<Note>()
var reports = mapOf<User, Set<Note>>()
private set
var zaps = mapOf<Note, Note?>()
@ -159,8 +159,13 @@ class User(val pubkeyHex: String) {
}
fun addReport(note: Note) {
if (note !in reports) {
reports = reports + note
val author = note.author ?: return
if (author !in reports.keys) {
reports = reports + Pair(author, setOf(note))
liveReports.invalidateData()
} else {
reports = reports + Pair(author, (reports[author] ?: emptySet()) + note)
liveReports.invalidateData()
}
}
@ -183,12 +188,18 @@ class User(val pubkeyHex: String) {
}.sumOf { it }
}
fun reportsBy(user: User): List<Note> {
return reports.filter { it.author == user }
fun reportsBy(user: User): Set<Note> {
return reports[user] ?: emptySet()
}
fun reportAuthorsBy(users: Set<User>): List<User> {
return reports.keys.filter { it in users }
}
fun reportsBy(users: Set<User>): List<Note> {
return reports.filter { it.author in users }
return reportAuthorsBy(users).mapNotNull {
reports[it]
}.flatten()
}
@Synchronized
@ -271,10 +282,8 @@ class User(val pubkeyHex: String) {
}
fun hasReport(loggedIn: User, type: ReportEvent.ReportType): Boolean {
return reports.firstOrNull {
it.author == loggedIn
&& it.event is ReportEvent
&& (it.event as ReportEvent).reportType.contains(type)
return reports[loggedIn]?.firstOrNull() {
it.event is ReportEvent && (it.event as ReportEvent).reportType.contains(type)
} != null
}