import Combine import GRDB import GRDBQuery /// A player request can be used with the `@Query` property wrapper in order to /// feed a view with a list of players. /// /// For example: /// /// struct MyView: View { /// @Query(RibbonRequest(ordering: .byName)) private var players: [Ribbon] /// /// var body: some View { /// List(players) { player in ... ) /// } /// } var idColumn = Column("id") struct RibbonRequest: Queryable { // enum Ordering { // case byScore // case byName // } /// The ordering used by the player request. // var ordering: Ordering var id: Int64! // 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] { var sql = """ select distinct r1.* from Ribbon r1 join Ribbon r2 ON \ r1.undoLevel = r2.currentLevel AND r1.id = r2.id ORDER BY pos ASC """ do { var ret = try Ribbon.fetchAll(db, sql: sql) print("xxxxx fetching ribbons") print(ret) return ret } catch { print(error.localizedDescription) print(error) print("Error") return [] } 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) // } } }