| import java.time.LocalDateTime |
| import java.time.format.DateTimeFormatter |
| import java.time.temporal.ChronoUnit |
| import java.time.temporal.Temporal |
| import org.jetbrains.kotlinx.dataframe.* |
| import org.jetbrains.kotlinx.dataframe.annotations.* |
| import org.jetbrains.kotlinx.dataframe.api.* |
| import org.jetbrains.kotlinx.dataframe.io.* |
| |
| fun <T, V : Temporal> DataRow<T>.diff(unit: ChronoUnit, expression: RowExpression<T, V>): Long? = prev()?.let { p -> unit.between(expression(p, p), expression(this, this)) } |
| |
| /** |
| char,level,race,charclass,zone,guild,timestamp |
| 59425,1,Orc,Rogue,Orgrimmar,165,01/01/08 00:02:04 |
| 65494,9,Orc,Hunter,Durotar,-1,01/01/08 00:02:04 |
| */ |
| @DataSchema |
| interface ActivePlayer { |
| val char: Int |
| val level: Int |
| val race: String |
| val charclass: String |
| val zone: String |
| val guild: Int |
| val timestamp: String |
| } |
| |
| fun box(): String { |
| val df = @DisableInterpretation DataFrame.readDelimStr(""" |
| char,level,race,charclass,zone,guild,timestamp |
| 59425,1,Orc,Rogue,Orgrimmar,165,01/01/08 00:02:04 |
| 65494,9,Orc,Hunter,Durotar,-1,01/01/08 00:02:04 |
| """.trimIndent()) |
| val df1 = df.cast<ActivePlayer>() |
| |
| val format = DateTimeFormatter.ofPattern("MM/dd/yy HH:mm:ss") |
| val df2 = df1 |
| .convert { timestamp }.with { LocalDateTime.parse(it, format) } |
| .sortBy { char and timestamp } |
| .add("tsDiff") { diff(ChronoUnit.MINUTES) { timestamp }?.let { it > 20 } ?: true } |
| .add("charDiff") { diffOrNull { char }?.let { it != 0 } ?: true } |
| |
| df2.print() |
| return "OK" |
| } |