Skip to content

Commit e4c2ac9

Browse files
authored
Dynamic member lookup on optional table definitions (pointfreeco#2)
* DML on optional tables. * wip * wip
1 parent e249737 commit e4c2ac9

File tree

2 files changed

+68
-0
lines changed

2 files changed

+68
-0
lines changed

Sources/StructuredQueriesCore/Optional.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,13 @@ extension Optional: Table where Wrapped: Table {
9999
keyPath: \.[member: \Member.self, column: column._keyPath]
100100
)
101101
}
102+
103+
public subscript<QueryValue>(
104+
dynamicMember keyPath: KeyPath<Wrapped.TableColumns, some QueryExpression<QueryValue>>
105+
) -> some QueryExpression<QueryValue?> {
106+
let result: (some QueryExpression<QueryValue>)? = .some(Wrapped.columns[keyPath: keyPath])
107+
return result
108+
}
102109
}
103110
}
104111

Tests/StructuredQueriesTests/SelectTests.swift

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -919,5 +919,66 @@ extension SnapshotTests {
919919
"""
920920
}
921921
}
922+
923+
@Test func reusableHelperOnLeftJoinedTable() {
924+
assertQuery(
925+
RemindersList
926+
.leftJoin(Reminder.all) { $0.id.eq($1.remindersListID) }
927+
.where { $1.isHighPriority.ifnull(false) }
928+
) {
929+
"""
930+
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"
931+
FROM "remindersLists"
932+
LEFT JOIN "reminders" ON ("remindersLists"."id" = "reminders"."remindersListID")
933+
WHERE ifnull(("reminders"."priority" = 3), 0)
934+
"""
935+
} results: {
936+
"""
937+
┌────────────────────┬────────────────────────────────────────────┐
938+
│ RemindersList( │ Reminder( │
939+
│ id: 1, │ id: 3, │
940+
│ color: 4889071, │ assignedUserID: nil, │
941+
│ name: "Personal" │ dueDate: Date(2001-01-01T00:00:00.000Z), │
942+
│ ) │ isCompleted: false, │
943+
│ │ isFlagged: false, │
944+
│ │ notes: "Ask about diet", │
945+
│ │ priority: .high, │
946+
│ │ remindersListID: 1, │
947+
│ │ title: "Doctor appointment"
948+
│ │ ) │
949+
├────────────────────┼────────────────────────────────────────────┤
950+
│ RemindersList( │ Reminder( │
951+
│ id: 2, │ id: 6, │
952+
│ color: 15567157, │ assignedUserID: nil, │
953+
│ name: "Family" │ dueDate: Date(2001-01-03T00:00:00.000Z), │
954+
│ ) │ isCompleted: false, │
955+
│ │ isFlagged: true, │
956+
│ │ notes: "", │
957+
│ │ priority: .high, │
958+
│ │ remindersListID: 2, │
959+
│ │ title: "Pick up kids from school"
960+
│ │ ) │
961+
├────────────────────┼────────────────────────────────────────────┤
962+
│ RemindersList( │ Reminder( │
963+
│ id: 2, │ id: 8, │
964+
│ color: 15567157, │ assignedUserID: nil, │
965+
│ name: "Family" │ dueDate: Date(2001-01-05T00:00:00.000Z), │
966+
│ ) │ isCompleted: false, │
967+
│ │ isFlagged: false, │
968+
│ │ notes: "", │
969+
│ │ priority: .high, │
970+
│ │ remindersListID: 2, │
971+
│ │ title: "Take out trash"
972+
│ │ ) │
973+
└────────────────────┴────────────────────────────────────────────┘
974+
"""
975+
}
976+
}
977+
}
978+
}
979+
980+
extension Reminder.TableColumns {
981+
var isHighPriority: some QueryExpression<Bool> {
982+
self.priority == Priority.high
922983
}
923984
}

0 commit comments

Comments
 (0)