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

com.github.insanusmokrassar.AutoPostRatingsAnalyzePlugin.ChartsBuilders.RatingChangesChartBuilder.kt Maven / Gradle / Ivy

package com.github.insanusmokrassar.AutoPostRatingsAnalyzePlugin.ChartsBuilders

import com.github.insanusmokrassar.AutoPostRatingsAnalyzePlugin.database.RatingsChangesTable
import org.joda.time.DateTime
import org.knowm.xchart.*
import java.util.*
import kotlin.collections.ArrayList
import kotlin.collections.HashMap

private data class DateTimeStatistic(
    val rating: Int,
    val posts: MutableList = mutableListOf()
)

class RatingChangesChartBuilder(
    private val period: Long,
    private val ratingsChangesTable: RatingsChangesTable,
    private val chartWidth: Int = 1600,
    private val chartHeight: Int = 900,
    private val chartTitle: String = "Ratings changes"
) : ChartBuilder {
    override fun call(): ByteArray? {
        ratingsChangesTable.getStatictics(
            DateTime(System.currentTimeMillis() - period)
        ).let {
            items ->

            val ratings = mutableMapOf>()

            val history = HashMap>()

            items.forEach {
                it.rating ?.let {
                    rating ->

                    (ratings[rating] ?: mutableSetOf().also {
                        newList ->
                        ratings[rating] = newList
                    }).add(it.postId)

                    ratings.forEach {
                        (key, ratingsList) ->
                        if (key != rating) {
                            ratingsList.remove(it.postId)
                        }

                        (history[key] ?: HashMap().also {
                            newMap ->
                            history[key] = newMap
                        })[it.dateTime] = ratingsList.size
                    }
                }
            }

            return XYChartBuilder().apply {
                width(chartWidth)
                height(chartHeight)
                title(chartTitle)
                xAxisTitle("Time")
                yAxisTitle("Count")
            }.build().run {
                val dates = items.map { it.dateTime.millis }
                val labelsStep = dates.chartLabelsStep
                val overrides = dates.mapIndexed {
                    index, millis ->
                    millis.toDouble() to if (index % labelsStep != 0) {
                        " "
                    } else {
                        DateTime(dates[index]).toString()
                    }
                }.toMap()

                history.forEach {
                    (rating, map) ->
                    val sortedMap = map.toSortedMap()
                    addSeries(
                        rating.toString(),
                        sortedMap.keys.map { it.millis.toDouble() }.toDoubleArray(),
                        sortedMap.values.map { it.toDouble() }.toDoubleArray()
                    )
                }

                setXAxisLabelOverrideMap(overrides)

                BitmapEncoder.getBitmapBytes(this, BitmapEncoder.BitmapFormat.JPG)
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy