From f394000b789c18ab92077d8ef12683a7cbae37cf Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Mon, 21 Apr 2025 15:23:25 -0700 Subject: [PATCH 1/3] DML on optional tables. --- Sources/StructuredQueriesCore/Optional.swift | 6 ++ .../StructuredQueriesTests/SelectTests.swift | 66 +++++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/Sources/StructuredQueriesCore/Optional.swift b/Sources/StructuredQueriesCore/Optional.swift index 3b4e0e21..6cf65ade 100644 --- a/Sources/StructuredQueriesCore/Optional.swift +++ b/Sources/StructuredQueriesCore/Optional.swift @@ -99,6 +99,12 @@ extension Optional: Table where Wrapped: Table { keyPath: \.[member: \Member.self, column: column._keyPath] ) } + + public subscript( + dynamicMember keyPath: KeyPath + ) -> Q? { + Wrapped.columns[keyPath: keyPath] + } } } diff --git a/Tests/StructuredQueriesTests/SelectTests.swift b/Tests/StructuredQueriesTests/SelectTests.swift index d74dd5e1..335b3829 100644 --- a/Tests/StructuredQueriesTests/SelectTests.swift +++ b/Tests/StructuredQueriesTests/SelectTests.swift @@ -919,5 +919,71 @@ extension SnapshotTests { """ } } + + @Test func reusableHelperOnLeftJoinedTable() { + assertQuery( + RemindersList + .leftJoin(Reminder.all) { $0.id.eq($1.remindersListID) } + .where { $1.isHighPriority.ifnull(false) } + ) { + """ + SELECT "remindersLists"."id", "remindersLists"."color", "remindersLists"."name", "reminders"."id", "reminders"."assignedUserID", "reminders"."dueDate", "reminders"."isCompleted", "reminders"."isFlagged", "reminders"."notes", "reminders"."priority", "reminders"."remindersListID", "reminders"."title" + FROM "remindersLists" + LEFT JOIN "reminders" ON ("remindersLists"."id" = "reminders"."remindersListID") + WHERE ifnull(("reminders"."priority" = 3), 0) + """ + } results: { + """ + ┌────────────────────┬────────────────────────────────────────────┐ + │ RemindersList( │ Reminder( │ + │ id: 1, │ id: 3, │ + │ color: 4889071, │ assignedUserID: nil, │ + │ name: "Personal" │ dueDate: Date(2001-01-01T00:00:00.000Z), │ + │ ) │ isCompleted: false, │ + │ │ isFlagged: false, │ + │ │ notes: "Ask about diet", │ + │ │ priority: .high, │ + │ │ remindersListID: 1, │ + │ │ title: "Doctor appointment" │ + │ │ ) │ + ├────────────────────┼────────────────────────────────────────────┤ + │ RemindersList( │ Reminder( │ + │ id: 2, │ id: 6, │ + │ color: 15567157, │ assignedUserID: nil, │ + │ name: "Family" │ dueDate: Date(2001-01-03T00:00:00.000Z), │ + │ ) │ isCompleted: false, │ + │ │ isFlagged: true, │ + │ │ notes: "", │ + │ │ priority: .high, │ + │ │ remindersListID: 2, │ + │ │ title: "Pick up kids from school" │ + │ │ ) │ + ├────────────────────┼────────────────────────────────────────────┤ + │ RemindersList( │ Reminder( │ + │ id: 2, │ id: 8, │ + │ color: 15567157, │ assignedUserID: nil, │ + │ name: "Family" │ dueDate: Date(2001-01-05T00:00:00.000Z), │ + │ ) │ isCompleted: false, │ + │ │ isFlagged: false, │ + │ │ notes: "", │ + │ │ priority: .high, │ + │ │ remindersListID: 2, │ + │ │ title: "Take out trash" │ + │ │ ) │ + └────────────────────┴────────────────────────────────────────────┘ + """ + } + } + } +} + +extension Reminder.TableColumns { + var isHighPriority: some QueryExpression { + self.priority == Priority.high } } +//extension Reminder?.TableColumns { +// var isHighPriority: some QueryExpression { +// #sql("\(self.priority) = \(Priority.high)") +// } +//} From e407beb8705a3e0f678d7ffeaae1537c35e37fa9 Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Mon, 21 Apr 2025 15:33:55 -0700 Subject: [PATCH 2/3] wip --- Sources/StructuredQueriesCore/Optional.swift | 10 ++++++---- Tests/StructuredQueriesTests/SelectTests.swift | 5 ----- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/Sources/StructuredQueriesCore/Optional.swift b/Sources/StructuredQueriesCore/Optional.swift index 6cf65ade..068de631 100644 --- a/Sources/StructuredQueriesCore/Optional.swift +++ b/Sources/StructuredQueriesCore/Optional.swift @@ -100,10 +100,12 @@ extension Optional: Table where Wrapped: Table { ) } - public subscript( - dynamicMember keyPath: KeyPath - ) -> Q? { - Wrapped.columns[keyPath: keyPath] + public subscript( + dynamicMember keyPath: KeyPath> + ) -> some QueryExpression { + let tmp = Wrapped.columns[keyPath: keyPath] + let tmp1: Optional> = .some(tmp) + return tmp1 } } } diff --git a/Tests/StructuredQueriesTests/SelectTests.swift b/Tests/StructuredQueriesTests/SelectTests.swift index 335b3829..24d917ee 100644 --- a/Tests/StructuredQueriesTests/SelectTests.swift +++ b/Tests/StructuredQueriesTests/SelectTests.swift @@ -982,8 +982,3 @@ extension Reminder.TableColumns { self.priority == Priority.high } } -//extension Reminder?.TableColumns { -// var isHighPriority: some QueryExpression { -// #sql("\(self.priority) = \(Priority.high)") -// } -//} From 20aaf9991dfad18056f7e64fadf78f3c8ecdfcd8 Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Mon, 21 Apr 2025 20:09:57 -0700 Subject: [PATCH 3/3] wip --- Sources/StructuredQueriesCore/Optional.swift | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Sources/StructuredQueriesCore/Optional.swift b/Sources/StructuredQueriesCore/Optional.swift index 068de631..f044710f 100644 --- a/Sources/StructuredQueriesCore/Optional.swift +++ b/Sources/StructuredQueriesCore/Optional.swift @@ -103,9 +103,8 @@ extension Optional: Table where Wrapped: Table { public subscript( dynamicMember keyPath: KeyPath> ) -> some QueryExpression { - let tmp = Wrapped.columns[keyPath: keyPath] - let tmp1: Optional> = .some(tmp) - return tmp1 + let result: (some QueryExpression)? = .some(Wrapped.columns[keyPath: keyPath]) + return result } } }