DatabaseAggregate

The protocol for custom SQLite aggregates.

DatabaseFunction.swift:460
protocol DatabaseAggregate
Browse conforming types

For example:

struct MySum : DatabaseAggregate {
    var sum: Int = 0

    mutating func step(_ dbValues: [DatabaseValue]) {
        if let int = Int.fromDatabaseValue(dbValues[0]) {
            sum += int
        }
    }

    func finalize() -> (any DatabaseValueConvertible)? {
        return sum
    }
}

let dbQueue = try DatabaseQueue()
let mySum = DatabaseFunction("mySum", argumentCount: 1, aggregate: MySum.self)
try dbQueue.write { db in
    db.add(function: mySum)
    try db.execute(sql: "CREATE TABLE test(i)")
    try db.execute(sql: "INSERT INTO test(i) VALUES (1)")
    try db.execute(sql: "INSERT INTO test(i) VALUES (2)")
    try Int.fetchOne(db, sql: "SELECT mysum(i) FROM test")! // 3
}