Some reducers

This commit is contained in:
Andrew Golovashevich 2025-02-25 15:51:19 +03:00
parent d6ecd1fb4b
commit 31151a9a7f
4 changed files with 97 additions and 0 deletions

View File

@ -0,0 +1,20 @@
package ru.landgrafhomyak.db.serdha0.user_commons.reducers
import ru.landgrafhomyak.db.serdha0.api.misc.Reducer
import ru.landgrafhomyak.db.serdha0.api.runtime.InputRow
import ru.landgrafhomyak.db.serdha0.api.runtime.OutputRow
import ru.landgrafhomyak.db.serdha0.user_commons.types.U_INT_64
public class Count private constructor(context: Reducer.Constructor.Scope<Count>) : Reducer.Action<Count> {
@Suppress("PropertyName", "MemberVisibilityCanBePrivate")
public val C_Counter: Reducer.OutputColumn<ULong, U_INT_64, Count> = context.outputColumn("counter", context.types.U_INT_64, 0u)
override fun calculate(acc: OutputRow<Count>, row: OutputRow<Count>, newAcc: InputRow<Count>) {
newAcc[this.C_Counter] = acc[this.C_Counter] + 1u
}
public object Constructor : Reducer.Constructor<Count> {
override fun createReducer(context: Reducer.Constructor.Scope<Count>): Reducer.Action<Count> =
Count(context)
}
}

View File

@ -0,0 +1,21 @@
package ru.landgrafhomyak.db.serdha0.user_commons.reducers
import ru.landgrafhomyak.db.serdha0.api.misc.DatabaseType
import ru.landgrafhomyak.db.serdha0.api.misc.Reducer
import ru.landgrafhomyak.db.serdha0.api.runtime.InputRow
import ru.landgrafhomyak.db.serdha0.api.runtime.OutputRow
public class HasRows private constructor(context: Reducer.Constructor.Scope<HasRows>) : Reducer.Action<HasRows> {
@Suppress("PropertyName", "MemberVisibilityCanBePrivate")
public val C_HasRows: Reducer.OutputColumn<Boolean, DatabaseType.BOOLEAN, HasRows> =
context.outputColumn("flag", context.types.BOOLEAN, false)
override fun calculate(acc: OutputRow<HasRows>, row: OutputRow<HasRows>, newAcc: InputRow<HasRows>) {
newAcc[this.C_HasRows] = true
}
public object Constructor : Reducer.Constructor<HasRows> {
override fun createReducer(context: Reducer.Constructor.Scope<HasRows>): Reducer.Action<HasRows> =
HasRows(context)
}
}

View File

@ -0,0 +1,28 @@
package ru.landgrafhomyak.db.serdha0.user_commons.reducers
import ru.landgrafhomyak.db.serdha0.api.misc.DatabaseType
import ru.landgrafhomyak.db.serdha0.api.misc.Reducer
import ru.landgrafhomyak.db.serdha0.api.runtime.InputRow
import ru.landgrafhomyak.db.serdha0.api.runtime.OutputRow
public class Max<RT, DT : DatabaseType._VirtualType<RT, *, *>> private constructor(
context: Reducer.Constructor.Scope<Max<RT, DT>>,
private val _type: DT
) : Reducer.Action<Max<RT, DT>> {
@Suppress("PropertyName", "MemberVisibilityCanBePrivate")
public val C_MaxValue: Reducer.BidirectionalColumn<RT, DT, Max<RT, DT>> = context.bidirectionalColumn("max_value", this._type)
override fun calculate(acc: OutputRow<Max<RT, DT>>, row: OutputRow<Max<RT, DT>>, newAcc: InputRow<Max<RT, DT>>) {
val accumulatedValue = acc[this.C_MaxValue]
val newValue = row[this.C_MaxValue]
if (this._type._compare(accumulatedValue, newValue) < 0)
newAcc[this.C_MaxValue] = newValue
else
newAcc[this.C_MaxValue] = accumulatedValue
}
public class Constructor<RT, DT : DatabaseType._VirtualType<RT, *, *>>(private val type: DT) : Reducer.Constructor<Max<RT, DT>> {
override fun createReducer(context: Reducer.Constructor.Scope<Max<RT, DT>>): Reducer.Action<Max<RT, DT>> =
Max(context, this.type)
}
}

View File

@ -0,0 +1,28 @@
package ru.landgrafhomyak.db.serdha0.user_commons.reducers
import ru.landgrafhomyak.db.serdha0.api.misc.DatabaseType
import ru.landgrafhomyak.db.serdha0.api.misc.Reducer
import ru.landgrafhomyak.db.serdha0.api.runtime.InputRow
import ru.landgrafhomyak.db.serdha0.api.runtime.OutputRow
public class Min<RT, DT : DatabaseType._VirtualType<RT, *, *>> private constructor(
context: Reducer.Constructor.Scope<Min<RT, DT>>,
private val _type: DT
) : Reducer.Action<Min<RT, DT>> {
@Suppress("PropertyName", "MemberVisibilityCanBePrivate")
public val C_MinValue: Reducer.BidirectionalColumn<RT, DT, Min<RT, DT>> = context.bidirectionalColumn("min_value", this._type)
override fun calculate(acc: OutputRow<Min<RT, DT>>, row: OutputRow<Min<RT, DT>>, newAcc: InputRow<Min<RT, DT>>) {
val accumulatedValue = acc[this.C_MinValue]
val newValue = row[this.C_MinValue]
if (this._type._compare(accumulatedValue, newValue) > 0)
newAcc[this.C_MinValue] = newValue
else
newAcc[this.C_MinValue] = accumulatedValue
}
public class Constructor<RT, DT : DatabaseType._VirtualType<RT, *, *>>(private val type: DT) : Reducer.Constructor<Min<RT, DT>> {
override fun createReducer(context: Reducer.Constructor.Scope<Min<RT, DT>>): Reducer.Action<Min<RT, DT>> =
Min(context, this.type)
}
}