gloss-ios/RibbonRequest.swift

162 lines
5.1 KiB
Swift
Raw Normal View History

import Combine
import GRDB
import GRDBQuery
2023-02-28 14:03:58 -08:00
var idColumn = Column("id")
struct RibbonRequest: Queryable {
2024-05-29 13:02:08 -07:00
enum UndoDir {
case prev
case next
}
/// The ordering used by the player request.
// var ordering: Ordering
2023-02-28 14:03:58 -08:00
var id: Int64!
2024-05-29 13:02:08 -07:00
var dir: UndoDir?
var groupId: Int?
// MARK: - Queryable Implementation
static var defaultValue: [Ribbon] { [] }
func publisher(in appDatabase: AppDatabase) -> AnyPublisher<[Ribbon], Error> {
// Build the publisher from the general-purpose read-only access
// granted by `appDatabase.reader`.
// Some apps will prefer to call a dedicated method of `appDatabase`.
ValueObservation
.tracking(fetchValue(_:))
.publisher(
in: appDatabase.reader,
// The `.immediate` scheduling feeds the view right on
// subscription, and avoids an undesired animation when the
// application starts.
scheduling: .immediate)
.eraseToAnyPublisher()
}
// This method is not required by Queryable, but it makes it easier
func fetchValue(_ db: Database) throws -> [Ribbon] {
2024-05-29 13:02:08 -07:00
var ret: [Ribbon]
var sql: String
2024-05-29 13:02:08 -07:00
// this has to be a global variable
let totalLevels = 3
do {
2024-05-31 10:04:43 -07:00
print("back reload")
2024-05-29 13:02:08 -07:00
if dir != nil && groupId != nil {
sql = """
SELECT * FROM Ribbon \
WHERE groupId = ?
"""
ret = try Ribbon.fetchAll(db, sql: sql, arguments: [groupId])
if ret.count == 0 {
print("error no ribbons found")
return []
}
2024-05-31 10:04:43 -07:00
print("back all ribbon all: \(ret)")
2024-05-29 13:02:08 -07:00
let currentLevel = ret[0].currentLevel
let minLevel = ret[0].minLevel
let maxLevel = ret[0].maxLevel
var newCurrentLevel = (currentLevel - 1) %% totalLevels
// probably need more error checking to check
// if current level gets into an error state
// between minLevel and maxLevel somehow but there
// are probably a bunch of edge cases casue of the
// mod stuff
if dir == .prev {
// no back undo steps left
if currentLevel == minLevel {
2024-05-31 10:04:43 -07:00
newCurrentLevel = currentLevel
2024-05-29 13:02:08 -07:00
}
} else if dir == .prev {
// no forward redo steps left
if currentLevel == maxLevel {
2024-05-31 10:04:43 -07:00
newCurrentLevel = maxLevel
} else {
newCurrentLevel = (currentLevel + 1) %% totalLevels
2024-05-29 13:02:08 -07:00
}
}
print("back newcurrentlevel \(newCurrentLevel)")
sql = """
SELECT * FROM Ribbon \
WHERE groupId = ? AND
undoLevel = ?
LIMIT 1
"""
ret = try Ribbon.fetchAll(db, sql: sql, arguments: [groupId, newCurrentLevel])
2024-05-31 10:04:43 -07:00
print("back ribbon return: \(ret)")
2024-05-29 13:02:08 -07:00
return ret
2024-05-29 13:02:08 -07:00
} else {
2024-05-31 10:04:43 -07:00
if groupId != nil {
let sql = """
SELECT * from Ribbon r1 \
WHERE r1.groupId = ?
ORDER BY undoLevel ASC
"""
var ret = try Ribbon.fetchAll(db, sql: sql, arguments: [groupId])
print("xxxxx fetching ribbons")
print(ret)
return ret
} else {
let sql = """
select distinct r1.* from Ribbon r1 join Ribbon r2 ON \
r1.undoLevel = r2.currentLevel AND r1.id = r2.id ORDER BY pos ASC
"""
var ret = try Ribbon.fetchAll(db, sql: sql)
print("xxxxx fetching ribbons")
print(ret)
return ret
}
2024-05-29 13:02:08 -07:00
}
} catch {
print(error.localizedDescription)
print(error)
print("Error")
return []
}
2024-05-29 13:02:08 -07:00
// if id == nil {
// return try Ribbon.order(Column("pos")).fetchAll(db)
// } else {
// return try Ribbon.filter(idColumn == id).fetchAll(db)
// }
// {
// if book == "" {
// return try Ribbon.filter(bookColumn == Ribbon.randomBook()).fetchAll(db)
// } else {
// return try Ribbon.filter(bookColumn == book).fetchAll(db)
// }
// switch ordering {
// case .byScore:
// return try Ribbon.all().fetchAll(db)
// case .byName:
// // return try Ribbon.all().orderedByName().fetchAll(db)
// return try Ribbon.all().fetchAll(db)
// }
}
}
2024-05-29 13:02:08 -07:00
infix operator %%
extension Int {
static func %% (_ left: Int, _ right: Int) -> Int {
let mod = left % right
return mod >= 0 ? mod : mod + right
}
}