From 289d6b7923f5176083d0c8e3b45f2af415f3603f Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Mon, 11 Aug 2025 14:39:39 -0500 Subject: [PATCH 1/7] Add uniqueness to tag titles. --- .../xcshareddata/swiftpm/Package.resolved | 20 +++++- Examples/Reminders/ReminderForm.swift | 4 +- Examples/Reminders/RemindersDetail.swift | 4 +- Examples/Reminders/RemindersLists.swift | 4 +- Examples/Reminders/Schema.swift | 61 ++++++++--------- Examples/Reminders/SearchReminders.swift | 2 +- Examples/Reminders/TagRow.swift | 2 +- Examples/Reminders/TagsForm.swift | 68 ++++++++++++++++++- 8 files changed, 124 insertions(+), 41 deletions(-) diff --git a/Examples/Examples.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Examples/Examples.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index b78c0c5e..5e9d9dc3 100644 --- a/Examples/Examples.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Examples/Examples.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "045453ad987825e0124358340f9eb671db13456ca8713bb035043d7c4e34e24b", + "originHash" : "05461ecd2d6ddd848b677fd572ee263adc87ab3aebd38d91f3f4c49ddaf3cdde", "pins" : [ { "identity" : "combine-schedulers", @@ -73,6 +73,24 @@ "version" : "1.9.2" } }, + { + "identity" : "swift-docc-plugin", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-docc-plugin", + "state" : { + "revision" : "3e4f133a77e644a5812911a0513aeb7288b07d06", + "version" : "1.4.5" + } + }, + { + "identity" : "swift-docc-symbolkit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/swiftlang/swift-docc-symbolkit", + "state" : { + "revision" : "b45d1f2ed151d057b54504d653e0da5552844e34", + "version" : "1.0.0" + } + }, { "identity" : "swift-identified-collections", "kind" : "remoteSourceControl", diff --git a/Examples/Reminders/ReminderForm.swift b/Examples/Reminders/ReminderForm.swift index e627a467..018b04c5 100644 --- a/Examples/Reminders/ReminderForm.swift +++ b/Examples/Reminders/ReminderForm.swift @@ -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.title.eq($1.tag) } .where { $1.reminderID.eq(reminderID) } .select { tag, _ in tag } .fetchAll(db) @@ -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, tag: tag.title) } } .execute(db) diff --git a/Examples/Reminders/RemindersDetail.swift b/Examples/Reminders/RemindersDetail.swift index 9565330a..ea9f2996 100644 --- a/Examples/Reminders/RemindersDetail.swift +++ b/Examples/Reminders/RemindersDetail.swift @@ -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 } } @@ -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)") ) } } diff --git a/Examples/Reminders/RemindersLists.swift b/Examples/Reminders/RemindersLists.swift index 18b416d2..02d88a3c 100644 --- a/Examples/Reminders/RemindersLists.swift +++ b/Examples/Reminders/RemindersLists.swift @@ -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) } diff --git a/Examples/Reminders/Schema.swift b/Examples/Reminders/Schema.swift index 2edf2d31..44769d52 100644 --- a/Examples/Reminders/Schema.swift +++ b/Examples/Reminders/Schema.swift @@ -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 { @@ -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.tag.eq($2.title) } } extension Reminder.TableColumns { @@ -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.title.eq($1.tag) } .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)) } } @@ -100,7 +101,7 @@ extension Tag.TableColumns { struct ReminderTag: Hashable, Identifiable { let id: UUID var reminderID: Reminder.ID - var tagID: Tag.ID + var tag: Tag.ID } func appDatabase() throws -> any DatabaseWriter { @@ -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 ON CONFLICT REPLACE DEFAULT '' ) STRICT """ ) @@ -194,10 +194,10 @@ 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, + "tag" TEXT NOT NULL, FOREIGN KEY("reminderID") REFERENCES "reminders"("id") ON DELETE CASCADE, - FOREIGN KEY("tagID") REFERENCES "tags"("id") ON DELETE CASCADE + FOREIGN KEY("tag") REFERENCES "tags"("title") ON DELETE CASCADE ON UPDATE CASCADE ) STRICT """ ) @@ -246,7 +246,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], @@ -347,25 +346,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], tag: "someday") + ReminderTag.Draft(reminderID: remindersIDs[0], tag: "optional") + ReminderTag.Draft(reminderID: remindersIDs[0], tag: "adulting") + ReminderTag.Draft(reminderID: remindersIDs[1], tag: "someday") + ReminderTag.Draft(reminderID: remindersIDs[1], tag: "optional") + ReminderTag.Draft(reminderID: remindersIDs[2], tag: "adulting") + ReminderTag.Draft(reminderID: remindersIDs[3], tag: "car") + ReminderTag.Draft(reminderID: remindersIDs[3], tag: "kids") + ReminderTag.Draft(reminderID: remindersIDs[4], tag: "social") + ReminderTag.Draft(reminderID: remindersIDs[3], tag: "social") + ReminderTag.Draft(reminderID: remindersIDs[10], tag: "social") + ReminderTag.Draft(reminderID: remindersIDs[4], tag: "night") } } } diff --git a/Examples/Reminders/SearchReminders.swift b/Examples/Reminders/SearchReminders.swift index 0cc0ed5a..1c73ba6b 100644 --- a/Examples/Reminders/SearchReminders.swift +++ b/Examples/Reminders/SearchReminders.swift @@ -67,7 +67,7 @@ class SearchRemindersModel { notes: $0.inlineNotes, reminder: $0, remindersList: $3, - tags: #sql("\($2.jsonNames)") + tags: #sql("\($2.jsonTitles)") ) }, animation: .default diff --git a/Examples/Reminders/TagRow.swift b/Examples/Reminders/TagRow.swift index ffe38591..42b126f5 100644 --- a/Examples/Reminders/TagRow.swift +++ b/Examples/Reminders/TagRow.swift @@ -34,7 +34,7 @@ struct TagRow: View { #Preview { NavigationStack { List { - TagRow(tag: Tag(id: UUID(1), title: "optional")) + TagRow(tag: Tag(title: "optional")) } } } diff --git a/Examples/Reminders/TagsForm.swift b/Examples/Reminders/TagsForm.swift index 0c576c16..b6bccc00 100644 --- a/Examples/Reminders/TagsForm.swift +++ b/Examples/Reminders/TagsForm.swift @@ -4,12 +4,21 @@ import SwiftUI struct TagsView: View { @Fetch(Tags()) var tags = Tags.Value() @Binding var selectedTags: [Tag] + @State var editingTag: Tag.Draft? + @State var tagTitle = "" + @Dependency(\.defaultDatabase) var database @Environment(\.dismiss) var dismiss var body: some View { Form { let selectedTagIDs = Set(selectedTags.map(\.id)) + Section { + Button("New tag") { + tagTitle = "" + editingTag = Tag.Draft() + } + } if !tags.top.isEmpty { Section { ForEach(tags.top, id: \.id) { tag in @@ -18,6 +27,14 @@ struct TagsView: View { selectedTags: $selectedTags, tag: tag ) + .swipeActions { + Button("Delete", role: .destructive) { + deleteButtonTapped(tag: tag) + } + Button("Edit") { + editButtonTapped(tag: tag) + } + } } } header: { Text("Top tags") @@ -31,10 +48,26 @@ struct TagsView: View { selectedTags: $selectedTags, tag: tag ) + .swipeActions { + Button("Delete", role: .destructive) { + deleteButtonTapped(tag: tag) + } + Button("Edit") { + editButtonTapped(tag: tag) + } + } } } } } + .alert(item: $editingTag) { item in + Text(item.title == nil ? "New tag" : "Edit tag") + } actions: { item in + TextField("Tag name", text: $tagTitle) + Button("Save") { + saveButtonTapped() + } + } .toolbar { ToolbarItem { Button("Done") { dismiss() } @@ -43,6 +76,39 @@ struct TagsView: View { .navigationTitle(Text("Tags")) } + func deleteButtonTapped(tag: Tag) { + withErrorReporting { + try database.write { db in + try Tag.find(tag.title).delete().execute(db) + } + } + } + + func editButtonTapped(tag: Tag) { + tagTitle = tag.title + editingTag = Tag.Draft(tag) + } + + func saveButtonTapped() { + defer { tagTitle = "" } + let tag = Tag(title: tagTitle) + selectedTags.append(tag) + withErrorReporting { + try database.write { db in + if let existingTagTitle = editingTag?.title { + selectedTags.removeAll(where: { $0.title == existingTagTitle }) + try Tag + .update { $0.title = tagTitle } + .where { $0.title.eq(existingTagTitle) } + .execute(db) + } else { + try Tag.insert(or: .ignore) { tag } + .execute(db) + } + } + } + } + struct Tags: FetchKeyRequest { func fetch(_ db: Database) throws -> Value { let top = @@ -56,7 +122,7 @@ struct TagsView: View { let rest = try Tag - .where { !$0.id.in(top.map(\.id)) } + .where { !$0.title.in(top.map(\.title)) } .order(by: \.title) .fetchAll(db) From 1485d2e805bb93525b7425145a1d89beca3af084 Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Tue, 12 Aug 2025 12:26:14 -0500 Subject: [PATCH 2/7] wip --- Examples/Reminders/TagsForm.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Examples/Reminders/TagsForm.swift b/Examples/Reminders/TagsForm.swift index b6bccc00..3545a977 100644 --- a/Examples/Reminders/TagsForm.swift +++ b/Examples/Reminders/TagsForm.swift @@ -92,7 +92,6 @@ struct TagsView: View { func saveButtonTapped() { defer { tagTitle = "" } let tag = Tag(title: tagTitle) - selectedTags.append(tag) withErrorReporting { try database.write { db in if let existingTagTitle = editingTag?.title { @@ -106,6 +105,7 @@ struct TagsView: View { .execute(db) } } + selectedTags.append(tag) } } From c45326a6a3196d6ad0b9d56ccc39aeda1b78b2e3 Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Tue, 12 Aug 2025 12:30:14 -0500 Subject: [PATCH 3/7] wip --- .../xcshareddata/swiftpm/Package.resolved | 6 ++-- Examples/Reminders/ReminderForm.swift | 4 +-- Examples/Reminders/RemindersDetail.swift | 2 +- Examples/Reminders/Schema.swift | 30 +++++++++---------- Package.swift | 2 +- 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/Examples/Examples.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Examples/Examples.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 5e9d9dc3..5c8d479d 100644 --- a/Examples/Examples.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Examples/Examples.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "05461ecd2d6ddd848b677fd572ee263adc87ab3aebd38d91f3f4c49ddaf3cdde", + "originHash" : "80ce8831f89d2da19d6c4e6f30a71328a79a080602e0d57e255665812e2823d7", "pins" : [ { "identity" : "combine-schedulers", @@ -141,8 +141,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/pointfreeco/swift-structured-queries", "state" : { - "branch" : "main", - "revision" : "2d9f1d94f5cbfbd37c5ab0b2500b385db95516a3" + "revision" : "2468f4e34d909d11c053d773562c03ffea40a72e", + "version" : "0.12.1" } }, { diff --git a/Examples/Reminders/ReminderForm.swift b/Examples/Reminders/ReminderForm.swift index 018b04c5..4fc55ec0 100644 --- a/Examples/Reminders/ReminderForm.swift +++ b/Examples/Reminders/ReminderForm.swift @@ -135,7 +135,7 @@ struct ReminderFormView: View { selectedTags = try await database.read { db in try Tag .order(by: \.title) - .join(ReminderTag.all) { $0.title.eq($1.tag) } + .join(ReminderTag.all) { $0.primaryKey.eq($1.tagID) } .where { $1.reminderID.eq(reminderID) } .select { tag, _ in tag } .fetchAll(db) @@ -179,7 +179,7 @@ struct ReminderFormView: View { .execute(db) try ReminderTag.insert { selectedTags.map { tag in - ReminderTag.Draft(reminderID: reminderID, tag: tag.title) + ReminderTag.Draft(reminderID: reminderID, tagID: tag.title) } } .execute(db) diff --git a/Examples/Reminders/RemindersDetail.swift b/Examples/Reminders/RemindersDetail.swift index ea9f2996..c9cfea9c 100644 --- a/Examples/Reminders/RemindersDetail.swift +++ b/Examples/Reminders/RemindersDetail.swift @@ -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.title.ifnull("").in(tags.map(\.title)) + case .tags(let tags): tag.primaryKey.ifnull("").in(tags.map(\.title)) case .today: reminder.isToday } } diff --git a/Examples/Reminders/Schema.swift b/Examples/Reminders/Schema.swift index 44769d52..b18e0400 100644 --- a/Examples/Reminders/Schema.swift +++ b/Examples/Reminders/Schema.swift @@ -65,7 +65,7 @@ extension Reminder { } static let withTags = group(by: \.id) .leftJoin(ReminderTag.all) { $0.id.eq($1.reminderID) } - .leftJoin(Tag.all) { $1.tag.eq($2.title) } + .leftJoin(Tag.all) { $1.tagID.eq($2.primaryKey) } } extension Reminder.TableColumns { @@ -87,7 +87,7 @@ extension Reminder.TableColumns { extension Tag { static let withReminders = group(by: \.title) - .leftJoin(ReminderTag.all) { $0.title.eq($1.tag) } + .leftJoin(ReminderTag.all) { $0.primaryKey.eq($1.tagID) } .leftJoin(Reminder.all) { $1.reminderID.eq($2.id) } } @@ -101,7 +101,7 @@ extension Tag.TableColumns { struct ReminderTag: Hashable, Identifiable { let id: UUID var reminderID: Reminder.ID - var tag: Tag.ID + var tagID: Tag.ID } func appDatabase() throws -> any DatabaseWriter { @@ -353,18 +353,18 @@ private let logger = Logger(subsystem: "Reminders", category: "Database") Tag(title: "social") Tag(title: "night") Tag(title: "adulting") - ReminderTag.Draft(reminderID: remindersIDs[0], tag: "someday") - ReminderTag.Draft(reminderID: remindersIDs[0], tag: "optional") - ReminderTag.Draft(reminderID: remindersIDs[0], tag: "adulting") - ReminderTag.Draft(reminderID: remindersIDs[1], tag: "someday") - ReminderTag.Draft(reminderID: remindersIDs[1], tag: "optional") - ReminderTag.Draft(reminderID: remindersIDs[2], tag: "adulting") - ReminderTag.Draft(reminderID: remindersIDs[3], tag: "car") - ReminderTag.Draft(reminderID: remindersIDs[3], tag: "kids") - ReminderTag.Draft(reminderID: remindersIDs[4], tag: "social") - ReminderTag.Draft(reminderID: remindersIDs[3], tag: "social") - ReminderTag.Draft(reminderID: remindersIDs[10], tag: "social") - ReminderTag.Draft(reminderID: remindersIDs[4], tag: "night") + 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") } } } diff --git a/Package.swift b/Package.swift index 62a3f7ad..33585949 100644 --- a/Package.swift +++ b/Package.swift @@ -34,7 +34,7 @@ let package = Package( .package(url: "https://github.com/pointfreeco/swift-dependencies", from: "1.9.0"), .package(url: "https://github.com/pointfreeco/swift-sharing", from: "2.3.0"), .package(url: "https://github.com/pointfreeco/swift-snapshot-testing", from: "1.0.0"), - .package(url: "https://github.com/pointfreeco/swift-structured-queries", branch: "main"), + .package(url: "https://github.com/pointfreeco/swift-structured-queries", from: "0.7.0"), .package(url: "https://github.com/pointfreeco/xctest-dynamic-overlay", from: "1.5.0"), ], targets: [ From 7a1e636659eb709ba7fcac3f64de5d820017458b Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Tue, 12 Aug 2025 12:32:54 -0500 Subject: [PATCH 4/7] wip --- Examples/Reminders/RemindersDetail.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Examples/Reminders/RemindersDetail.swift b/Examples/Reminders/RemindersDetail.swift index c9cfea9c..ea9f2996 100644 --- a/Examples/Reminders/RemindersDetail.swift +++ b/Examples/Reminders/RemindersDetail.swift @@ -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.primaryKey.ifnull("").in(tags.map(\.title)) + case .tags(let tags): tag.title.ifnull("").in(tags.map(\.title)) case .today: reminder.isToday } } From b4a321c1e431908ab664e0251d30bad71ff404b8 Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Tue, 12 Aug 2025 12:33:23 -0500 Subject: [PATCH 5/7] wip --- Examples/Reminders/Schema.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Examples/Reminders/Schema.swift b/Examples/Reminders/Schema.swift index b18e0400..bdda316a 100644 --- a/Examples/Reminders/Schema.swift +++ b/Examples/Reminders/Schema.swift @@ -184,7 +184,7 @@ func appDatabase() throws -> any DatabaseWriter { try #sql( """ CREATE TABLE "tags" ( - "title" TEXT COLLATE NOCASE PRIMARY KEY NOT NULL ON CONFLICT REPLACE DEFAULT '' + "title" TEXT COLLATE NOCASE PRIMARY KEY NOT NULL ) STRICT """ ) From ddd1023faf9f5d1bbae42dfb8d4193bbe8819d69 Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Tue, 12 Aug 2025 12:33:44 -0500 Subject: [PATCH 6/7] wip --- Examples/Reminders/Schema.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Examples/Reminders/Schema.swift b/Examples/Reminders/Schema.swift index bdda316a..e1d3873a 100644 --- a/Examples/Reminders/Schema.swift +++ b/Examples/Reminders/Schema.swift @@ -194,7 +194,7 @@ func appDatabase() throws -> any DatabaseWriter { CREATE TABLE "remindersTags" ( "id" TEXT PRIMARY KEY NOT NULL ON CONFLICT REPLACE DEFAULT (uuid()), "reminderID" TEXT NOT NULL, - "tag" TEXT NOT NULL, + "tagID" TEXT NOT NULL, FOREIGN KEY("reminderID") REFERENCES "reminders"("id") ON DELETE CASCADE, FOREIGN KEY("tag") REFERENCES "tags"("title") ON DELETE CASCADE ON UPDATE CASCADE From f4be28941d7cef132ca45780569ff9f50d06810f Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Tue, 12 Aug 2025 12:41:58 -0500 Subject: [PATCH 7/7] wip --- Examples/Reminders/Schema.swift | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Examples/Reminders/Schema.swift b/Examples/Reminders/Schema.swift index e1d3873a..c5b89c88 100644 --- a/Examples/Reminders/Schema.swift +++ b/Examples/Reminders/Schema.swift @@ -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("tag") REFERENCES "tags"("title") ON DELETE CASCADE ON UPDATE 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 """ )