
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