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 { fun isAcceptable(user: User): Boolean {
return user !in hiddenUsers() // if user hasn't hided this author 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() ).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 { fun isAcceptableDirect(note: Note): Boolean {
return note.reportsBy( userProfile() ).isEmpty() // if user has not reported this post 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 { fun isAcceptable(note: Note): Boolean {

View File

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

View File

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