
com.github.insanusmokrassar.AutoPostRatingsAnalyzePlugin.database.CountOfRatedPostsTable.kt Maven / Gradle / Ivy
package com.github.insanusmokrassar.AutoPostRatingsAnalyzePlugin.database
import com.github.insanusmokrassar.AutoPostRatingsAnalyzePlugin.extensions.safeAnd
import com.github.insanusmokrassar.AutoPostTelegramBot.plugins.rating.database.PostsLikesMessagesTable
import com.github.insanusmokrassar.AutoPostTelegramBot.utils.extensions.subscribe
import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.SqlExpressionBuilder.greater
import org.jetbrains.exposed.sql.SqlExpressionBuilder.lessEq
import org.jetbrains.exposed.sql.transactions.transaction
import org.joda.time.DateTime
typealias DateTimeRatingPair = Pair
class CountOfRatedPostsTable(
postsLikesMessagesTable: PostsLikesMessagesTable
) : Table() {
private val ratingDateTime = datetime("ratingDateTime").primaryKey().clientDefault {
DateTime.now()
}
private val ratesCount = integer("ratesCount").clientDefault {
postsCount
}
@Volatile
private var postsCount: Int = transaction {
postsLikesMessagesTable.selectAll().count()
}
init {
transaction {
SchemaUtils.createMissingTablesAndColumns(this@CountOfRatedPostsTable)
}
postsLikesMessagesTable.ratingMessageRegisteredChannel.subscribe {
transaction {
postsCount++
insert {}
}
}
postsLikesMessagesTable.ratingMessageUnregisteredChannel.subscribe {
transaction {
postsCount--
insert {}
}
}
}
fun getRates(
fromDate: DateTime? = null,
toDate: DateTime? = null
): List {
return transaction {
var expression: Op? = null
expression = fromDate ?.let {
ratingDateTime.greater(it)
}
expression = toDate ?.let {
ratingDateTime.lessEq(it)
} ?.let {
expression ?.and(it) ?: it
} ?: expression
(
expression ?.let {
select { it }
} ?: selectAll()
).map {
DateTimeRatingPair(it[ratingDateTime], it[ratesCount])
}
}
}
fun clearBefore(lessDateTime: DateTime): Int {
return transaction {
deleteWhere {
ratingDateTime.less(lessDateTime)
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy