All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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