Merge lp:~rainct/zeitgeist/fts-sorting into lp:~zeitgeist/zeitgeist/bluebird
- fts-sorting
- Merge into bluebird
Proposed by
Siegfried Gevatter
Status: | Merged |
---|---|
Approved by: | Michal Hruby |
Approved revision: | no longer in the source branch. |
Merged at revision: | 438 |
Proposed branch: | lp:~rainct/zeitgeist/fts-sorting |
Merge into: | lp:~zeitgeist/zeitgeist/bluebird |
Diff against target: |
296 lines (+108/-51) 3 files modified
extensions/fts++/indexer.cpp (+19/-8) src/datamodel.vala (+51/-1) src/db-reader.vala (+38/-42) |
To merge this branch: | bzr merge lp:~rainct/zeitgeist/fts-sorting |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Michal Hruby (community) | Approve | ||
Review via email: mp+97985@code.launchpad.net |
Commit message
Description of the change
To post a comment you must log in.
lp:~rainct/zeitgeist/fts-sorting
updated
- 433. By Seif Lotfy
-
Merged Trever's fixes for bug 953041
- 434. By Seif Lotfy
-
DS-Registry: fix vala 0.16 incompatiblity
- 435. By Seif Lotfy
-
Storage Monitor Extensions: fix bug lp:950983
- 436. By Seif Lotfy
-
Storage Monitor Extension: refactor the INSERT OR REPLACE statement
Revision history for this message
Michal Hruby (mhr3) wrote : | # |
But perhaps the is_asc method should be a (static?) method of ResultType.
lp:~rainct/zeitgeist/fts-sorting
updated
- 437. By Siegfried Gevatter
-
Fix typo in table-lookup comment.
- 438. By Siegfried Gevatter
-
Refactor ResultType sorting and fix FTS++'s Search() with LeastRecent*
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'extensions/fts++/indexer.cpp' | |||
2 | --- extensions/fts++/indexer.cpp 2012-03-16 20:03:05 +0000 | |||
3 | +++ extensions/fts++/indexer.cpp 2012-03-19 20:01:23 +0000 | |||
4 | @@ -778,7 +778,9 @@ | |||
5 | 778 | } | 778 | } |
6 | 779 | else | 779 | else |
7 | 780 | { | 780 | { |
9 | 781 | enquire->set_sort_by_value (VALUE_TIMESTAMP, true); | 781 | bool reversed_sort = not |
10 | 782 | zeitgeist_result_type_is_sort_order_asc (result_type); | ||
11 | 783 | enquire->set_sort_by_value (VALUE_TIMESTAMP, reversed_sort); | ||
12 | 782 | } | 784 | } |
13 | 783 | 785 | ||
14 | 784 | if (result_type == ZEITGEIST_RESULT_TYPE_MOST_RECENT_SUBJECTS || | 786 | if (result_type == ZEITGEIST_RESULT_TYPE_MOST_RECENT_SUBJECTS || |
15 | @@ -786,7 +788,20 @@ | |||
16 | 786 | result_type == ZEITGEIST_RESULT_TYPE_MOST_POPULAR_SUBJECTS || | 788 | result_type == ZEITGEIST_RESULT_TYPE_MOST_POPULAR_SUBJECTS || |
17 | 787 | result_type == ZEITGEIST_RESULT_TYPE_LEAST_POPULAR_SUBJECTS) | 789 | result_type == ZEITGEIST_RESULT_TYPE_LEAST_POPULAR_SUBJECTS) |
18 | 788 | { | 790 | { |
20 | 789 | enquire->set_collapse_key (VALUE_URI_HASH); | 791 | enquire->set_collapse_key (VALUE_URI_HASH); |
21 | 792 | } | ||
22 | 793 | else if (result_type == ZEITGEIST_RESULT_TYPE_MOST_RECENT_ORIGIN || | ||
23 | 794 | result_type == ZEITGEIST_RESULT_TYPE_LEAST_RECENT_ORIGIN || | ||
24 | 795 | result_type == ZEITGEIST_RESULT_TYPE_MOST_POPULAR_ORIGIN || | ||
25 | 796 | result_type == ZEITGEIST_RESULT_TYPE_LEAST_POPULAR_ORIGIN) | ||
26 | 797 | { | ||
27 | 798 | // FIXME: not really correct but close :) | ||
28 | 799 | enquire->set_collapse_key (VALUE_URI_HASH); | ||
29 | 800 | } | ||
30 | 801 | else if (result_type == ZEITGEIST_RESULT_TYPE_MOST_RECENT_EVENTS || | ||
31 | 802 | result_type == ZEITGEIST_RESULT_TYPE_LEAST_RECENT_EVENTS) | ||
32 | 803 | { | ||
33 | 804 | enquire->set_collapse_key (VALUE_EVENT_ID); | ||
34 | 790 | } | 805 | } |
35 | 791 | 806 | ||
36 | 792 | Xapian::Query q(query_parser->parse_query (query_string, QUERY_PARSER_FLAGS)); | 807 | Xapian::Query q(query_parser->parse_query (query_string, QUERY_PARSER_FLAGS)); |
37 | @@ -1096,12 +1111,8 @@ | |||
38 | 1096 | return NULL; | 1111 | return NULL; |
39 | 1097 | } | 1112 | } |
40 | 1098 | 1113 | ||
47 | 1099 | bool reversed_sort = | 1114 | bool reversed_sort = not |
48 | 1100 | result_type == ZEITGEIST_RESULT_TYPE_MOST_RECENT_EVENTS || | 1115 | zeitgeist_result_type_is_sort_order_asc (result_type); |
43 | 1101 | result_type == ZEITGEIST_RESULT_TYPE_MOST_RECENT_SUBJECTS || | ||
44 | 1102 | result_type == ZEITGEIST_RESULT_TYPE_MOST_POPULAR_SUBJECTS || | ||
45 | 1103 | result_type == ZEITGEIST_RESULT_TYPE_MOST_RECENT_ORIGIN || | ||
46 | 1104 | result_type == ZEITGEIST_RESULT_TYPE_MOST_POPULAR_ORIGIN; | ||
49 | 1105 | 1116 | ||
50 | 1106 | if (result_type == RELEVANCY_RESULT_TYPE) | 1117 | if (result_type == RELEVANCY_RESULT_TYPE) |
51 | 1107 | { | 1118 | { |
52 | 1108 | 1119 | ||
53 | === modified file 'src/datamodel.vala' | |||
54 | --- src/datamodel.vala 2012-02-18 21:33:57 +0000 | |||
55 | +++ src/datamodel.vala 2012-03-19 20:01:23 +0000 | |||
56 | @@ -230,10 +230,60 @@ | |||
57 | 230 | // different origin ordered | 230 | // different origin ordered |
58 | 231 | // by the popularity of the | 231 | // by the popularity of the |
59 | 232 | // origins | 232 | // origins |
61 | 233 | LEAST_POPULAR_EVENT_ORIGIN = 30, // The last event of each | 233 | LEAST_POPULAR_EVENT_ORIGIN = 30; // The last event of each |
62 | 234 | // different origin, ordered | 234 | // different origin, ordered |
63 | 235 | // ascendingly by the | 235 | // ascendingly by the |
64 | 236 | // popularity of the origin | 236 | // popularity of the origin |
65 | 237 | |||
66 | 238 | /* | ||
67 | 239 | * Returns true if the results for the given result_type will be sorted | ||
68 | 240 | * ascendantly by date, false if they'll be sorted descendingly. | ||
69 | 241 | **/ | ||
70 | 242 | public static bool is_sort_order_asc (ResultType result_type) | ||
71 | 243 | { | ||
72 | 244 | switch (result_type) | ||
73 | 245 | { | ||
74 | 246 | // FIXME: Why are LEAST_POPULAR_* using ASC? | ||
75 | 247 | case ResultType.LEAST_RECENT_EVENTS: | ||
76 | 248 | case ResultType.LEAST_RECENT_EVENT_ORIGIN: | ||
77 | 249 | case ResultType.LEAST_POPULAR_EVENT_ORIGIN: | ||
78 | 250 | case ResultType.LEAST_RECENT_SUBJECTS: | ||
79 | 251 | case ResultType.LEAST_POPULAR_SUBJECTS: | ||
80 | 252 | case ResultType.LEAST_RECENT_CURRENT_URI: | ||
81 | 253 | case ResultType.LEAST_POPULAR_CURRENT_URI: | ||
82 | 254 | case ResultType.LEAST_RECENT_ACTOR: | ||
83 | 255 | case ResultType.LEAST_POPULAR_ACTOR: | ||
84 | 256 | case ResultType.OLDEST_ACTOR: | ||
85 | 257 | case ResultType.LEAST_RECENT_ORIGIN: | ||
86 | 258 | case ResultType.LEAST_POPULAR_ORIGIN: | ||
87 | 259 | case ResultType.LEAST_RECENT_SUBJECT_INTERPRETATION: | ||
88 | 260 | case ResultType.LEAST_POPULAR_SUBJECT_INTERPRETATION: | ||
89 | 261 | case ResultType.LEAST_RECENT_MIMETYPE: | ||
90 | 262 | case ResultType.LEAST_POPULAR_MIMETYPE: | ||
91 | 263 | return true; | ||
92 | 264 | |||
93 | 265 | case ResultType.MOST_RECENT_EVENTS: | ||
94 | 266 | case ResultType.MOST_RECENT_EVENT_ORIGIN: | ||
95 | 267 | case ResultType.MOST_POPULAR_EVENT_ORIGIN: | ||
96 | 268 | case ResultType.MOST_RECENT_SUBJECTS: | ||
97 | 269 | case ResultType.MOST_POPULAR_SUBJECTS: | ||
98 | 270 | case ResultType.MOST_RECENT_CURRENT_URI: | ||
99 | 271 | case ResultType.MOST_POPULAR_CURRENT_URI: | ||
100 | 272 | case ResultType.MOST_RECENT_ACTOR: | ||
101 | 273 | case ResultType.MOST_POPULAR_ACTOR: | ||
102 | 274 | case ResultType.MOST_RECENT_ORIGIN: | ||
103 | 275 | case ResultType.MOST_POPULAR_ORIGIN: | ||
104 | 276 | case ResultType.MOST_RECENT_SUBJECT_INTERPRETATION: | ||
105 | 277 | case ResultType.MOST_POPULAR_SUBJECT_INTERPRETATION: | ||
106 | 278 | case ResultType.MOST_RECENT_MIMETYPE: | ||
107 | 279 | case ResultType.MOST_POPULAR_MIMETYPE: | ||
108 | 280 | return false; | ||
109 | 281 | |||
110 | 282 | default: | ||
111 | 283 | warning ("Unrecognized ResultType: %u", (uint) result_type); | ||
112 | 284 | return true; | ||
113 | 285 | } | ||
114 | 286 | } | ||
115 | 237 | } | 287 | } |
116 | 238 | 288 | ||
117 | 239 | /* | 289 | /* |
118 | 240 | 290 | ||
119 | === modified file 'src/db-reader.vala' | |||
120 | --- src/db-reader.vala 2012-03-17 14:47:09 +0000 | |||
121 | +++ src/db-reader.vala 2012-03-19 20:01:23 +0000 | |||
122 | @@ -173,109 +173,107 @@ | |||
123 | 173 | switch (result_type) | 173 | switch (result_type) |
124 | 174 | { | 174 | { |
125 | 175 | case ResultType.MOST_RECENT_EVENTS: | 175 | case ResultType.MOST_RECENT_EVENTS: |
127 | 176 | sql += where_sql + " ORDER BY timestamp DESC"; | 176 | sql += where_sql + " ORDER BY "; |
128 | 177 | break; | 177 | break; |
129 | 178 | case ResultType.LEAST_RECENT_EVENTS: | 178 | case ResultType.LEAST_RECENT_EVENTS: |
131 | 179 | sql += where_sql + " ORDER BY timestamp ASC"; | 179 | sql += where_sql + " ORDER BY "; |
132 | 180 | break; | 180 | break; |
133 | 181 | case ResultType.MOST_RECENT_EVENT_ORIGIN: | 181 | case ResultType.MOST_RECENT_EVENT_ORIGIN: |
135 | 182 | sql += group_and_sort ("origin", where_sql, false); | 182 | sql += group_and_sort ("origin", where_sql); |
136 | 183 | break; | 183 | break; |
137 | 184 | case ResultType.LEAST_RECENT_EVENT_ORIGIN: | 184 | case ResultType.LEAST_RECENT_EVENT_ORIGIN: |
139 | 185 | sql += group_and_sort ("origin", where_sql, true); | 185 | sql += group_and_sort ("origin", where_sql); |
140 | 186 | break; | 186 | break; |
141 | 187 | case ResultType.MOST_POPULAR_EVENT_ORIGIN: | 187 | case ResultType.MOST_POPULAR_EVENT_ORIGIN: |
143 | 188 | sql += group_and_sort ("origin", where_sql, false, false); | 188 | sql += group_and_sort ("origin", where_sql, false); |
144 | 189 | break; | 189 | break; |
145 | 190 | case ResultType.LEAST_POPULAR_EVENT_ORIGIN: | 190 | case ResultType.LEAST_POPULAR_EVENT_ORIGIN: |
147 | 191 | sql += group_and_sort ("origin", where_sql, true, true); | 191 | sql += group_and_sort ("origin", where_sql, true); |
148 | 192 | break; | 192 | break; |
149 | 193 | case ResultType.MOST_RECENT_SUBJECTS: | 193 | case ResultType.MOST_RECENT_SUBJECTS: |
151 | 194 | sql += group_and_sort ("subj_id", where_sql, false); | 194 | sql += group_and_sort ("subj_id", where_sql); |
152 | 195 | break; | 195 | break; |
153 | 196 | case ResultType.LEAST_RECENT_SUBJECTS: | 196 | case ResultType.LEAST_RECENT_SUBJECTS: |
155 | 197 | sql += group_and_sort ("subj_id", where_sql, true); | 197 | sql += group_and_sort ("subj_id", where_sql); |
156 | 198 | break; | 198 | break; |
157 | 199 | case ResultType.MOST_POPULAR_SUBJECTS: | 199 | case ResultType.MOST_POPULAR_SUBJECTS: |
159 | 200 | sql += group_and_sort ("subj_id", where_sql, false, false); | 200 | sql += group_and_sort ("subj_id", where_sql, false); |
160 | 201 | break; | 201 | break; |
161 | 202 | case ResultType.LEAST_POPULAR_SUBJECTS: | 202 | case ResultType.LEAST_POPULAR_SUBJECTS: |
163 | 203 | sql += group_and_sort ("subj_id", where_sql, true, true); | 203 | sql += group_and_sort ("subj_id", where_sql, true); |
164 | 204 | break; | 204 | break; |
165 | 205 | case ResultType.MOST_RECENT_CURRENT_URI: | 205 | case ResultType.MOST_RECENT_CURRENT_URI: |
167 | 206 | sql += group_and_sort ("subj_id_current", where_sql, false); | 206 | sql += group_and_sort ("subj_id_current", where_sql); |
168 | 207 | break; | 207 | break; |
169 | 208 | case ResultType.LEAST_RECENT_CURRENT_URI: | 208 | case ResultType.LEAST_RECENT_CURRENT_URI: |
171 | 209 | sql += group_and_sort ("subj_id_current", where_sql, true); | 209 | sql += group_and_sort ("subj_id_current", where_sql); |
172 | 210 | break; | 210 | break; |
173 | 211 | case ResultType.MOST_POPULAR_CURRENT_URI: | 211 | case ResultType.MOST_POPULAR_CURRENT_URI: |
176 | 212 | sql += group_and_sort ("subj_id_current", where_sql, | 212 | sql += group_and_sort ("subj_id_current", where_sql, false); |
175 | 213 | false, false); | ||
177 | 214 | break; | 213 | break; |
178 | 215 | case ResultType.LEAST_POPULAR_CURRENT_URI: | 214 | case ResultType.LEAST_POPULAR_CURRENT_URI: |
181 | 216 | sql += group_and_sort ("subj_id_current", where_sql, | 215 | sql += group_and_sort ("subj_id_current", where_sql, true); |
180 | 217 | true, true); | ||
182 | 218 | break; | 216 | break; |
183 | 219 | case ResultType.MOST_RECENT_ACTOR: | 217 | case ResultType.MOST_RECENT_ACTOR: |
185 | 220 | sql += group_and_sort ("actor", where_sql, false); | 218 | sql += group_and_sort ("actor", where_sql); |
186 | 221 | break; | 219 | break; |
187 | 222 | case ResultType.LEAST_RECENT_ACTOR: | 220 | case ResultType.LEAST_RECENT_ACTOR: |
189 | 223 | sql += group_and_sort ("actor", where_sql, true); | 221 | sql += group_and_sort ("actor", where_sql); |
190 | 224 | break; | 222 | break; |
191 | 225 | case ResultType.MOST_POPULAR_ACTOR: | 223 | case ResultType.MOST_POPULAR_ACTOR: |
193 | 226 | sql += group_and_sort ("actor", where_sql, false, false); | 224 | sql += group_and_sort ("actor", where_sql, false); |
194 | 227 | break; | 225 | break; |
195 | 228 | case ResultType.LEAST_POPULAR_ACTOR: | 226 | case ResultType.LEAST_POPULAR_ACTOR: |
197 | 229 | sql += group_and_sort ("actor", where_sql, true, true); | 227 | sql += group_and_sort ("actor", where_sql, true); |
198 | 230 | break; | 228 | break; |
199 | 231 | case ResultType.OLDEST_ACTOR: | 229 | case ResultType.OLDEST_ACTOR: |
201 | 232 | sql += group_and_sort ("actor", where_sql, true, null, "min"); | 230 | sql += group_and_sort ("actor", where_sql, null, "min"); |
202 | 233 | break; | 231 | break; |
203 | 234 | case ResultType.MOST_RECENT_ORIGIN: | 232 | case ResultType.MOST_RECENT_ORIGIN: |
205 | 235 | sql += group_and_sort ("subj_origin", where_sql, false); | 233 | sql += group_and_sort ("subj_origin", where_sql); |
206 | 236 | break; | 234 | break; |
207 | 237 | case ResultType.LEAST_RECENT_ORIGIN: | 235 | case ResultType.LEAST_RECENT_ORIGIN: |
209 | 238 | sql += group_and_sort ("subj_origin", where_sql, true); | 236 | sql += group_and_sort ("subj_origin", where_sql); |
210 | 239 | break; | 237 | break; |
211 | 240 | case ResultType.MOST_POPULAR_ORIGIN: | 238 | case ResultType.MOST_POPULAR_ORIGIN: |
213 | 241 | sql += group_and_sort ("subj_origin", where_sql, false, false); | 239 | sql += group_and_sort ("subj_origin", where_sql, false); |
214 | 242 | break; | 240 | break; |
215 | 243 | case ResultType.LEAST_POPULAR_ORIGIN: | 241 | case ResultType.LEAST_POPULAR_ORIGIN: |
217 | 244 | sql += group_and_sort ("subj_origin", where_sql, true, true); | 242 | sql += group_and_sort ("subj_origin", where_sql, true); |
218 | 245 | break; | 243 | break; |
219 | 246 | case ResultType.MOST_RECENT_SUBJECT_INTERPRETATION: | 244 | case ResultType.MOST_RECENT_SUBJECT_INTERPRETATION: |
221 | 247 | sql += group_and_sort ("subj_interpretation", where_sql, false); | 245 | sql += group_and_sort ("subj_interpretation", where_sql); |
222 | 248 | break; | 246 | break; |
223 | 249 | case ResultType.LEAST_RECENT_SUBJECT_INTERPRETATION: | 247 | case ResultType.LEAST_RECENT_SUBJECT_INTERPRETATION: |
225 | 250 | sql += group_and_sort ("subj_interpretation", where_sql, true); | 248 | sql += group_and_sort ("subj_interpretation", where_sql); |
226 | 251 | break; | 249 | break; |
227 | 252 | case ResultType.MOST_POPULAR_SUBJECT_INTERPRETATION: | 250 | case ResultType.MOST_POPULAR_SUBJECT_INTERPRETATION: |
230 | 253 | sql += group_and_sort ("subj_interpretation", where_sql, | 251 | sql += group_and_sort ("subj_interpretation", where_sql, false); |
229 | 254 | false, false); | ||
231 | 255 | break; | 252 | break; |
232 | 256 | case ResultType.LEAST_POPULAR_SUBJECT_INTERPRETATION: | 253 | case ResultType.LEAST_POPULAR_SUBJECT_INTERPRETATION: |
235 | 257 | sql += group_and_sort ("subj_interpretation", where_sql, | 254 | sql += group_and_sort ("subj_interpretation", where_sql, true); |
234 | 258 | true, true); | ||
236 | 259 | break; | 255 | break; |
237 | 260 | case ResultType.MOST_RECENT_MIMETYPE: | 256 | case ResultType.MOST_RECENT_MIMETYPE: |
239 | 261 | sql += group_and_sort ("subj_mimetype", where_sql, false); | 257 | sql += group_and_sort ("subj_mimetype", where_sql); |
240 | 262 | break; | 258 | break; |
241 | 263 | case ResultType.LEAST_RECENT_MIMETYPE: | 259 | case ResultType.LEAST_RECENT_MIMETYPE: |
243 | 264 | sql += group_and_sort ("subj_mimetype", where_sql, true); | 260 | sql += group_and_sort ("subj_mimetype", where_sql); |
244 | 265 | break; | 261 | break; |
245 | 266 | case ResultType.MOST_POPULAR_MIMETYPE: | 262 | case ResultType.MOST_POPULAR_MIMETYPE: |
248 | 267 | sql += group_and_sort ("subj_mimetype", where_sql, | 263 | sql += group_and_sort ("subj_mimetype", where_sql, false); |
247 | 268 | false, false); | ||
249 | 269 | break; | 264 | break; |
250 | 270 | case ResultType.LEAST_POPULAR_MIMETYPE: | 265 | case ResultType.LEAST_POPULAR_MIMETYPE: |
253 | 271 | sql += group_and_sort ("subj_mimetype", where_sql, | 266 | sql += group_and_sort ("subj_mimetype", where_sql, true); |
252 | 272 | true, true); | ||
254 | 273 | break; | 267 | break; |
255 | 274 | default: | 268 | default: |
256 | 275 | string error_message = "Invalid ResultType."; | 269 | string error_message = "Invalid ResultType."; |
257 | 276 | warning (error_message); | 270 | warning (error_message); |
258 | 277 | throw new EngineError.INVALID_ARGUMENT (error_message); | 271 | throw new EngineError.INVALID_ARGUMENT (error_message); |
259 | 278 | } | 272 | } |
260 | 273 | |||
261 | 274 | // complete the sort rule | ||
262 | 275 | bool time_asc = ResultType.is_sort_order_asc ((ResultType) result_type); | ||
263 | 276 | sql += " timestamp %s".printf ((time_asc) ? "ASC" : "DESC"); | ||
264 | 279 | 277 | ||
265 | 280 | int rc; | 278 | int rc; |
266 | 281 | Sqlite.Statement stmt; | 279 | Sqlite.Statement stmt; |
267 | @@ -578,10 +576,8 @@ | |||
268 | 578 | 576 | ||
269 | 579 | // Used by find_event_ids | 577 | // Used by find_event_ids |
270 | 580 | private string group_and_sort (string field, string where_sql, | 578 | private string group_and_sort (string field, string where_sql, |
273 | 581 | bool time_asc=false, bool? count_asc=null, | 579 | bool? count_asc=null, string aggregation_type="max") |
272 | 582 | string aggregation_type="max") | ||
274 | 583 | { | 580 | { |
275 | 584 | string time_sorting = (time_asc) ? "ASC" : "DESC"; | ||
276 | 585 | string aggregation_sql = ""; | 581 | string aggregation_sql = ""; |
277 | 586 | string order_sql = ""; | 582 | string order_sql = ""; |
278 | 587 | 583 | ||
279 | @@ -599,7 +595,7 @@ | |||
280 | 599 | FROM event_view %s | 595 | FROM event_view %s |
281 | 600 | GROUP BY %s) | 596 | GROUP BY %s) |
282 | 601 | GROUP BY %s | 597 | GROUP BY %s |
284 | 602 | ORDER BY %s timestamp %s | 598 | ORDER BY %s |
285 | 603 | """.printf ( | 599 | """.printf ( |
286 | 604 | field, | 600 | field, |
287 | 605 | aggregation_type, | 601 | aggregation_type, |
288 | @@ -607,7 +603,7 @@ | |||
289 | 607 | where_sql, | 603 | where_sql, |
290 | 608 | field, | 604 | field, |
291 | 609 | field, | 605 | field, |
293 | 610 | order_sql, time_sorting); | 606 | order_sql); |
294 | 611 | } | 607 | } |
295 | 612 | 608 | ||
296 | 613 | // Used by find_event_ids | 609 | // Used by find_event_ids |
Looks fine.