45 lines
1.8 KiB
Swift
45 lines
1.8 KiB
Swift
import Foundation
|
|
import SQLite
|
|
|
|
extension Sample {
|
|
|
|
private static let table = Table("samples")
|
|
|
|
private static let columnDataId = Expression<Int>("data_id")
|
|
|
|
// NOTE: Technically optional
|
|
private static let columnStartDate = Expression<Double>("start_date")
|
|
|
|
// NOTE: Technically optional
|
|
private static let columnEndDate = Expression<Double>("end_date")
|
|
|
|
private static let columnDataType = Expression<Int>("data_type")
|
|
|
|
static func samples(from start: Date, to end: Date, in database: Database) throws -> [Sample] {
|
|
let start = start.timeIntervalSinceReferenceDate
|
|
let end = end.timeIntervalSinceReferenceDate
|
|
return try database.prepare(table.filter(columnStartDate >= start && columnEndDate <= end)).compactMap { (row: Row) -> Sample? in
|
|
let dataId = row[columnDataId]
|
|
guard let quantity = try Sample.quantity(for: dataId, in: database) else {
|
|
return nil
|
|
}
|
|
|
|
let unit = try quantity.unit.map { try Sample.unit(for: $0, in: database) }
|
|
|
|
return Sample(
|
|
startDate: Date(timeIntervalSinceReferenceDate: row[columnStartDate]),
|
|
endDate: Date(timeIntervalSinceReferenceDate: row[columnEndDate]),
|
|
dataType: .init(rawValue: row[columnDataType]),
|
|
quantity: quantity.quantity,
|
|
originalQuantity: quantity.original,
|
|
originalUnit: unit)
|
|
}
|
|
}
|
|
|
|
static func sampleCount(from start: Date, to end: Date, in database: Database) throws -> Int {
|
|
let start = start.timeIntervalSinceReferenceDate
|
|
let end = end.timeIntervalSinceReferenceDate
|
|
return try database.scalar(table.filter(columnStartDate >= start && columnEndDate <= end).count)
|
|
}
|
|
}
|