mirror of
https://github.com/ncruces/go-sqlite3.git
synced 2026-01-12 22:19:14 +00:00
47 lines
755 B
Go
47 lines
755 B
Go
package stats
|
|
|
|
import "github.com/ncruces/go-sqlite3"
|
|
|
|
const (
|
|
every = iota
|
|
some
|
|
)
|
|
|
|
func newBoolean(kind int) func() sqlite3.AggregateFunction {
|
|
return func() sqlite3.AggregateFunction { return &boolean{kind: kind} }
|
|
}
|
|
|
|
type boolean struct {
|
|
count int
|
|
total int
|
|
kind int
|
|
}
|
|
|
|
func (b *boolean) Value(ctx sqlite3.Context) {
|
|
if b.kind == every {
|
|
ctx.ResultBool(b.count == b.total)
|
|
} else {
|
|
ctx.ResultBool(b.count > 0)
|
|
}
|
|
}
|
|
|
|
func (b *boolean) Step(ctx sqlite3.Context, arg ...sqlite3.Value) {
|
|
a := arg[0]
|
|
if a.Bool() {
|
|
b.count++
|
|
}
|
|
if a.Type() != sqlite3.NULL {
|
|
b.total++
|
|
}
|
|
}
|
|
|
|
func (b *boolean) Inverse(ctx sqlite3.Context, arg ...sqlite3.Value) {
|
|
a := arg[0]
|
|
if a.Bool() {
|
|
b.count--
|
|
}
|
|
if a.Type() != sqlite3.NULL {
|
|
b.total--
|
|
}
|
|
}
|