@@ -49,12 +49,6 @@ enum Priority: Int, Codable, QueryBindable {
4949
5050extension Reminder {
5151 static let incomplete = Self . where { !$0. isCompleted }
52- static func searching( _ text: String ) -> Where < Reminder > {
53- Self . where {
54- $0. title. collate ( . nocase) . contains ( text)
55- || $0. notes. collate ( . nocase) . contains ( text)
56- }
57- }
5852 static let withTags = group ( by: \. id)
5953 . leftJoin ( ReminderTag . all) { $0. id. eq ( $1. reminderID) }
6054 . leftJoin ( Tag . all) { $1. tagID. eq ( $2. primaryKey) }
@@ -72,9 +66,6 @@ extension Reminder.TableColumns {
7266 var isScheduled : some QueryExpression < Bool > {
7367 !isCompleted && dueDate. isNot ( nil )
7468 }
75- var inlineNotes : some QueryExpression < String > {
76- notes. replace ( " \n " , " " )
77- }
7869}
7970
8071extension Tag {
@@ -83,19 +74,21 @@ extension Tag {
8374 . leftJoin ( Reminder . all) { $1. reminderID. eq ( $2. id) }
8475}
8576
86- extension Tag . TableColumns {
87- var jsonTitles : some QueryExpression < [ String ] . JSONRepresentation> {
88- self . title. jsonGroupArray ( filter: self . title. isNot ( nil ) )
89- }
90- }
91-
9277@Table ( " remindersTags " )
9378struct ReminderTag : Hashable , Identifiable {
9479 let id : UUID
9580 var reminderID : Reminder . ID
9681 var tagID : Tag . ID
9782}
9883
84+ @Table @Selection
85+ struct ReminderText : StructuredQueries . FTS5 {
86+ let rowid : Int
87+ let title : String
88+ let notes : String
89+ let tags : String
90+ }
91+
9992func appDatabase( ) throws -> any DatabaseWriter {
10093 @Dependency ( \. context) var context
10194 let database : any DatabaseWriter
@@ -173,6 +166,18 @@ func appDatabase() throws -> any DatabaseWriter {
173166 """
174167 )
175168 . execute ( db)
169+ try #sql(
170+ """
171+ CREATE VIRTUAL TABLE " reminderTexts " USING fts5(
172+ " reminderID " UNINDEXED,
173+ " title " ,
174+ " notes " ,
175+ " tags " ,
176+ tokenize = 'trigram'
177+ )
178+ """
179+ )
180+ . execute ( db)
176181 }
177182
178183 try migrator. migrate ( database)
@@ -188,12 +193,14 @@ func appDatabase() throws -> any DatabaseWriter {
188193 . update { $0. position = RemindersList . select { ( $0. position. max ( ) ?? - 1 ) + 1 } }
189194 } )
190195 . execute ( db)
196+
191197 try Reminder . createTemporaryTrigger ( after: . insert { new in
192198 Reminder
193199 . find ( new. id)
194200 . update { $0. position = Reminder . select { ( $0. position. max ( ) ?? - 1 ) + 1 } }
195201 } )
196202 . execute ( db)
203+
197204 try RemindersList . createTemporaryTrigger ( after: . delete { _ in
198205 RemindersList . insert {
199206 RemindersList . Draft (
@@ -205,6 +212,61 @@ func appDatabase() throws -> any DatabaseWriter {
205212 !RemindersList. exists ( )
206213 } )
207214 . execute ( db)
215+
216+ try Reminder . createTemporaryTrigger ( after: . insert { new in
217+ ReminderText . insert {
218+ ReminderText . Columns (
219+ rowid: new. rowid,
220+ title: new. title,
221+ notes: new. notes. replace ( " \n " , " " ) ,
222+ tags: " "
223+ )
224+ }
225+ } )
226+ . execute ( db)
227+
228+ try Reminder . createTemporaryTrigger ( after: . update {
229+ ( $0. title, $0. notes)
230+ } forEachRow: { _, new in
231+ ReminderText
232+ . where { $0. rowid. eq ( new. rowid) }
233+ . update {
234+ $0. title = new. title
235+ $0. notes = new. notes. replace ( " \n " , " " )
236+ }
237+ } )
238+ . execute ( db)
239+
240+ try Reminder . createTemporaryTrigger ( after: . delete { old in
241+ ReminderText
242+ . where { $0. rowid. eq ( old. rowid) }
243+ . delete ( )
244+ } )
245+ . execute ( db)
246+
247+ func updateReminderTextTags(
248+ for reminderID: some QueryExpression < Reminder . ID >
249+ ) -> UpdateOf < ReminderText > {
250+ ReminderText
251+ . where { $0. rowid. eq ( Reminder . find ( reminderID) . select ( \. rowid) ) }
252+ . update {
253+ $0. tags = ReminderTag
254+ . order ( by: \. tagID)
255+ . where { $0. reminderID. eq ( reminderID) }
256+ . join ( Tag . all) { $0. tagID. eq ( $1. primaryKey) }
257+ . select { ( " # " + $1. title) . groupConcat ( " " ) ?? " " }
258+ }
259+ }
260+
261+ try ReminderTag . createTemporaryTrigger ( after: . insert { new in
262+ updateReminderTextTags ( for: new. reminderID)
263+ } )
264+ . execute ( db)
265+
266+ try ReminderTag . createTemporaryTrigger ( after: . delete { old in
267+ updateReminderTextTags ( for: old. reminderID)
268+ } )
269+ . execute ( db)
208270 }
209271
210272 return database
0 commit comments