Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions Examples/Reminders/ReminderForm.swift
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ struct ReminderFormView: View {
selectedTags = try await database.read { db in
try Tag
.order(by: \.title)
.join(ReminderTag.all) { $0.id.eq($1.tagID) }
.join(ReminderTag.all) { $0.primaryKey.eq($1.tagID) }
.where { $1.reminderID.eq(reminderID) }
.select { tag, _ in tag }
.fetchAll(db)
Expand Down Expand Up @@ -179,7 +179,7 @@ struct ReminderFormView: View {
.execute(db)
try ReminderTag.insert {
selectedTags.map { tag in
ReminderTag.Draft(reminderID: reminderID, tagID: tag.id)
ReminderTag.Draft(reminderID: reminderID, tagID: tag.title)
}
}
.execute(db)
Expand Down
4 changes: 2 additions & 2 deletions Examples/Reminders/RemindersDetail.swift
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ class RemindersDetailModel: HashableObject {
case .flagged: reminder.isFlagged
case .remindersList(let list): reminder.remindersListID.eq(list.id)
case .scheduled: reminder.isScheduled
case .tags(let tags): tag.id.ifnull(UUID(0)).in(tags.map(\.id))
case .tags(let tags): tag.title.ifnull("").in(tags.map(\.title))
case .today: reminder.isToday
}
}
Expand All @@ -114,7 +114,7 @@ class RemindersDetailModel: HashableObject {
remindersList: $3,
isPastDue: $0.isPastDue,
notes: $0.inlineNotes.substr(0, 200),
tags: #sql("\($2.jsonNames)")
tags: #sql("\($2.jsonTitles)")
)
}
}
Expand Down
4 changes: 2 additions & 2 deletions Examples/Reminders/RemindersLists.swift
Original file line number Diff line number Diff line change
Expand Up @@ -124,10 +124,10 @@ class RemindersListsModel {

func deleteTags(indexSet: IndexSet) {
withErrorReporting {
let tagIDs = indexSet.map { tags[$0].id }
let tagTitles = indexSet.map { tags[$0].title }
try database.write { db in
try Tag
.where { $0.id.in(tagIDs) }
.where { $0.title.in(tagTitles) }
.delete()
.execute(db)
}
Expand Down
62 changes: 29 additions & 33 deletions Examples/Reminders/Schema.swift
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,9 @@ extension Reminder.Draft: Identifiable {}

@Table
struct Tag: Hashable, Identifiable {
let id: UUID
var title = ""
@Column(primaryKey: true)
var title: String
var id: String { title }
}

enum Priority: Int, Codable, QueryBindable {
Expand All @@ -64,7 +65,7 @@ extension Reminder {
}
static let withTags = group(by: \.id)
.leftJoin(ReminderTag.all) { $0.id.eq($1.reminderID) }
.leftJoin(Tag.all) { $1.tagID.eq($2.id) }
.leftJoin(Tag.all) { $1.tagID.eq($2.primaryKey) }
}

extension Reminder.TableColumns {
Expand All @@ -85,13 +86,13 @@ extension Reminder.TableColumns {
}

extension Tag {
static let withReminders = group(by: \.id)
.leftJoin(ReminderTag.all) { $0.id.eq($1.tagID) }
static let withReminders = group(by: \.title)
.leftJoin(ReminderTag.all) { $0.primaryKey.eq($1.tagID) }
.leftJoin(Reminder.all) { $1.reminderID.eq($2.id) }
}

extension Tag.TableColumns {
var jsonNames: some QueryExpression<[String].JSONRepresentation> {
var jsonTitles: some QueryExpression<[String].JSONRepresentation> {
self.title.jsonGroupArray(filter: self.title.isNot(nil))
}
}
Expand Down Expand Up @@ -183,8 +184,7 @@ func appDatabase() throws -> any DatabaseWriter {
try #sql(
"""
CREATE TABLE "tags" (
"id" TEXT PRIMARY KEY NOT NULL ON CONFLICT REPLACE DEFAULT (uuid()),
"title" TEXT NOT NULL DEFAULT ''
"title" TEXT COLLATE NOCASE PRIMARY KEY NOT NULL
) STRICT
"""
)
Expand All @@ -193,11 +193,8 @@ func appDatabase() throws -> any DatabaseWriter {
"""
CREATE TABLE "remindersTags" (
"id" TEXT PRIMARY KEY NOT NULL ON CONFLICT REPLACE DEFAULT (uuid()),
"reminderID" TEXT NOT NULL,
"tagID" TEXT NOT NULL,

FOREIGN KEY("reminderID") REFERENCES "reminders"("id") ON DELETE CASCADE,
FOREIGN KEY("tagID") REFERENCES "tags"("id") ON DELETE CASCADE
"reminderID" TEXT NOT NULL REFERENCES "reminders"("id") ON DELETE CASCADE,
"tagID" TEXT NOT NULL REFERENCES "tags"("title") ON DELETE CASCADE ON UPDATE CASCADE
) STRICT
"""
)
Expand Down Expand Up @@ -246,7 +243,6 @@ private let logger = Logger(subsystem: "Reminders", category: "Database")
func seedSampleData() throws {
let remindersListsIDs = (0...2).map { _ in UUID() }
let remindersIDs = (0...10).map { _ in UUID() }
let tagsIDs = (0...6).map { _ in UUID() }
try seed {
RemindersList(
id: remindersListsIDs[0],
Expand Down Expand Up @@ -347,25 +343,25 @@ private let logger = Logger(subsystem: "Reminders", category: "Database")
remindersListID: remindersListsIDs[2],
title: "Prepare for WWDC"
)
Tag(id: tagsIDs[0], title: "car")
Tag(id: tagsIDs[1], title: "kids")
Tag(id: tagsIDs[2], title: "someday")
Tag(id: tagsIDs[3], title: "optional")
Tag(id: tagsIDs[4], title: "social")
Tag(id: tagsIDs[5], title: "night")
Tag(id: tagsIDs[6], title: "adulting")
ReminderTag.Draft(reminderID: remindersIDs[0], tagID: tagsIDs[2])
ReminderTag.Draft(reminderID: remindersIDs[0], tagID: tagsIDs[3])
ReminderTag.Draft(reminderID: remindersIDs[0], tagID: tagsIDs[6])
ReminderTag.Draft(reminderID: remindersIDs[1], tagID: tagsIDs[2])
ReminderTag.Draft(reminderID: remindersIDs[1], tagID: tagsIDs[3])
ReminderTag.Draft(reminderID: remindersIDs[2], tagID: tagsIDs[6])
ReminderTag.Draft(reminderID: remindersIDs[3], tagID: tagsIDs[0])
ReminderTag.Draft(reminderID: remindersIDs[3], tagID: tagsIDs[1])
ReminderTag.Draft(reminderID: remindersIDs[4], tagID: tagsIDs[4])
ReminderTag.Draft(reminderID: remindersIDs[3], tagID: tagsIDs[4])
ReminderTag.Draft(reminderID: remindersIDs[10], tagID: tagsIDs[4])
ReminderTag.Draft(reminderID: remindersIDs[4], tagID: tagsIDs[5])
Tag(title: "car")
Tag(title: "kids")
Tag(title: "someday")
Tag(title: "optional")
Tag(title: "social")
Tag(title: "night")
Tag(title: "adulting")
ReminderTag.Draft(reminderID: remindersIDs[0], tagID: "someday")
ReminderTag.Draft(reminderID: remindersIDs[0], tagID: "optional")
ReminderTag.Draft(reminderID: remindersIDs[0], tagID: "adulting")
ReminderTag.Draft(reminderID: remindersIDs[1], tagID: "someday")
ReminderTag.Draft(reminderID: remindersIDs[1], tagID: "optional")
ReminderTag.Draft(reminderID: remindersIDs[2], tagID: "adulting")
ReminderTag.Draft(reminderID: remindersIDs[3], tagID: "car")
ReminderTag.Draft(reminderID: remindersIDs[3], tagID: "kids")
ReminderTag.Draft(reminderID: remindersIDs[4], tagID: "social")
ReminderTag.Draft(reminderID: remindersIDs[3], tagID: "social")
ReminderTag.Draft(reminderID: remindersIDs[10], tagID: "social")
ReminderTag.Draft(reminderID: remindersIDs[4], tagID: "night")
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion Examples/Reminders/SearchReminders.swift
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ class SearchRemindersModel {
notes: $0.inlineNotes,
reminder: $0,
remindersList: $3,
tags: #sql("\($2.jsonNames)")
tags: #sql("\($2.jsonTitles)")
)
},
animation: .default
Expand Down
2 changes: 1 addition & 1 deletion Examples/Reminders/TagRow.swift
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ struct TagRow: View {
#Preview {
NavigationStack {
List {
TagRow(tag: Tag(id: UUID(1), title: "optional"))
TagRow(tag: Tag(title: "optional"))
}
}
}
Loading
Loading