| import org.jetbrains.kotlinx.dataframe.* | |
| import org.jetbrains.kotlinx.dataframe.annotations.* | |
| import org.jetbrains.kotlinx.dataframe.api.* | |
| import org.jetbrains.kotlinx.dataframe.api.groupBy | |
| import org.jetbrains.kotlinx.dataframe.io.* | |
| enum class State { | |
| Idle, | |
| Productive, | |
| Maintenance, | |
| } | |
| class Event(val toolId: String, val state: State, val timestamp: Long) | |
| fun box(): String { | |
| val tool1 = "tool_1" | |
| val tool2 = "tool_2" | |
| val tool3 = "tool_3" | |
| val events = listOf( | |
| Event(tool1, State.Idle, 0), | |
| Event(tool1, State.Productive, 5), | |
| Event(tool2, State.Idle, 0), | |
| Event(tool2, State.Maintenance, 10), | |
| Event(tool2, State.Idle, 20), | |
| Event(tool3, State.Idle, 0), | |
| Event(tool3, State.Productive, 25), | |
| ).toDataFrame() | |
| val lastTimestamp = events.maxOf { timestamp } | |
| val groupBy = events | |
| .groupBy { toolId } | |
| .sortBy { timestamp } | |
| .add("stateDuration") { | |
| (next()?.timestamp ?: lastTimestamp) - timestamp | |
| }.toDataFrame() | |
| groupBy.group[0].stateDuration | |
| groupBy.compareSchemas(strict = true) | |
| return "OK" | |
| } |