data/CalendarPeopleIndex.cpp
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #include "CalendarPeopleIndex.h" | ||
| 2 | |||
| 3 | #include "CalendarStore.h" | ||
| 4 | |||
| 5 | #include "ICalEventCodec.h" | ||
| 6 | #include "ICalendar.h" | ||
| 7 | |||
| 8 | #include <QHash> | ||
| 9 | #include <QLoggingCategory> | ||
| 10 | #include <QSqlError> | ||
| 11 | #include <QSqlQuery> | ||
| 12 | #include <QVariant> | ||
| 13 | |||
| 14 |
3/7✓ Branch 2 → 3 taken 4 times.
✗ Branch 2 → 8 not taken.
✓ Branch 4 → 5 taken 4 times.
✗ Branch 4 → 8 not taken.
✓ Branch 5 → 6 taken 4 times.
✗ Branch 10 → 11 not taken.
✗ Branch 10 → 12 not taken.
|
4 | Q_LOGGING_CATEGORY(lcCalendarPeople, "mailjd.calendar.people") |
| 15 | |||
| 16 | namespace CalendarPeopleIndex { | ||
| 17 | |||
| 18 | namespace { | ||
| 19 | |||
| 20 | 156 | bool insert(QSqlDatabase &db, qint64 eventId, const QString &kind, const QString &uid, const QString &address, | |
| 21 | const QString &name, const QString &partstat) { | ||
| 22 |
1/1✓ Branch 2 → 3 taken 156 times.
|
156 | QSqlQuery q(db); |
| 23 |
1/1✓ Branch 6 → 7 taken 156 times.
|
156 | q.prepare(QStringLiteral("INSERT INTO event_people (event_id, kind, card_uid, address, name, partstat)" |
| 24 | " VALUES (?, ?, ?, ?, ?, ?)")); | ||
| 25 | // A null QString binds as SQL NULL; the columns are NOT NULL ''. | ||
| 26 |
4/4✓ Branch 3 → 4 taken 261 times.
✓ Branch 3 → 7 taken 363 times.
✓ Branch 9 → 10 taken 261 times.
✓ Branch 9 → 11 taken 363 times.
|
885 | const auto text = [](const QString &value) { return value.isNull() ? QStringLiteral("") : value; }; |
| 27 |
1/1✓ Branch 11 → 12 taken 156 times.
|
156 | q.addBindValue(eventId); |
| 28 |
1/1✓ Branch 15 → 16 taken 156 times.
|
156 | q.addBindValue(kind); |
| 29 |
3/3✓ Branch 18 → 19 taken 156 times.
✓ Branch 19 → 20 taken 156 times.
✓ Branch 21 → 22 taken 156 times.
|
156 | q.addBindValue(text(uid.toLower())); |
| 30 |
3/3✓ Branch 26 → 27 taken 156 times.
✓ Branch 27 → 28 taken 156 times.
✓ Branch 29 → 30 taken 156 times.
|
156 | q.addBindValue(text(address.toLower())); |
| 31 |
2/2✓ Branch 34 → 35 taken 156 times.
✓ Branch 36 → 37 taken 156 times.
|
156 | q.addBindValue(text(name)); |
| 32 |
2/2✓ Branch 40 → 41 taken 156 times.
✓ Branch 42 → 43 taken 156 times.
|
156 | q.addBindValue(text(partstat)); |
| 33 |
1/1✓ Branch 45 → 46 taken 156 times.
|
312 | return q.exec(); |
| 34 | 156 | } | |
| 35 | |||
| 36 | } // namespace | ||
| 37 | |||
| 38 | 294 | QStringList schemaStatements() { | |
| 39 | ✗ | return {QStringLiteral("CREATE TABLE IF NOT EXISTS event_people (" | |
| 40 | " event_id INTEGER NOT NULL REFERENCES events(id) ON DELETE CASCADE," | ||
| 41 | " kind TEXT NOT NULL, card_uid TEXT NOT NULL DEFAULT '', address TEXT NOT NULL DEFAULT ''," | ||
| 42 | " name TEXT NOT NULL DEFAULT '', partstat TEXT NOT NULL DEFAULT '')"), | ||
| 43 | 294 | QStringLiteral("CREATE INDEX IF NOT EXISTS idx_event_people_event ON event_people(event_id)"), | |
| 44 | 294 | QStringLiteral("CREATE INDEX IF NOT EXISTS idx_event_people_uid ON event_people(card_uid)"), | |
| 45 |
2/4✓ Branch 16 → 17 taken 1176 times.
✓ Branch 16 → 18 taken 294 times.
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 27 not taken.
|
1764 | QStringLiteral("CREATE INDEX IF NOT EXISTS idx_event_people_address ON event_people(address)")}; |
| 46 | 1470 | } | |
| 47 | |||
| 48 | 2024 | bool write(QSqlDatabase &db, qint64 eventId, const CalendarEvent &event) { | |
| 49 |
1/1✓ Branch 2 → 3 taken 2024 times.
|
2024 | QSqlQuery clear(db); |
| 50 |
1/1✓ Branch 6 → 7 taken 2024 times.
|
2024 | clear.prepare(QStringLiteral("DELETE FROM event_people WHERE event_id = ?")); |
| 51 |
1/1✓ Branch 11 → 12 taken 2024 times.
|
2024 | clear.addBindValue(eventId); |
| 52 |
1/1✓ Branch 13 → 14 taken 2024 times.
|
2024 | bool ok = clear.exec(); |
| 53 | 2024 | QList<EventPerson> people = event.people; | |
| 54 | 2024 | QList<EventAttendee> attendees = event.attendees; | |
| 55 |
6/6✓ Branch 16 → 17 taken 1437 times.
✓ Branch 16 → 20 taken 587 times.
✓ Branch 18 → 19 taken 166 times.
✓ Branch 18 → 20 taken 1271 times.
✓ Branch 21 → 22 taken 166 times.
✓ Branch 21 → 36 taken 1858 times.
|
2024 | if (!event.peopleSet && !event.icalRaw.isEmpty()) { |
| 56 |
1/1✓ Branch 25 → 26 taken 166 times.
|
166 | const ICal::Component vevent = ICal::parseFirst(event.icalRaw, QStringLiteral("VEVENT")); |
| 57 |
1/1✓ Branch 28 → 29 taken 166 times.
|
166 | people = ICalEventCodec::peopleOf(vevent); |
| 58 |
1/1✓ Branch 31 → 32 taken 166 times.
|
166 | attendees = ICalEventCodec::attendeesOf(vevent); |
| 59 | 166 | } | |
| 60 |
4/4✓ Branch 36 → 37 taken 2024 times.
✓ Branch 37 → 38 taken 2024 times.
✓ Branch 60 → 39 taken 29 times.
✓ Branch 60 → 61 taken 2024 times.
|
2053 | for (const EventPerson &person : people) |
| 61 |
8/21✓ Branch 45 → 46 taken 29 times.
✓ Branch 46 → 47 taken 28 times.
✓ Branch 46 → 49 taken 1 time.
✓ Branch 47 → 48 taken 28 times.
✗ Branch 47 → 49 not taken.
✓ Branch 50 → 51 taken 29 times.
✗ Branch 50 → 52 not taken.
✓ Branch 52 → 53 taken 29 times.
✗ Branch 52 → 54 not taken.
✓ Branch 54 → 55 taken 29 times.
✗ Branch 54 → 56 not taken.
✓ Branch 56 → 57 taken 29 times.
✗ Branch 56 → 58 not taken.
✗ Branch 129 → 130 not taken.
✗ Branch 129 → 131 not taken.
✗ Branch 133 → 134 not taken.
✗ Branch 133 → 135 not taken.
✗ Branch 137 → 138 not taken.
✗ Branch 137 → 139 not taken.
✗ Branch 141 → 142 not taken.
✗ Branch 141 → 143 not taken.
|
58 | ok = insert(db, eventId, QStringLiteral("named"), person.uid, QString(), person.name, QString()) && ok; |
| 62 |
4/4✓ Branch 61 → 62 taken 2024 times.
✓ Branch 62 → 63 taken 2024 times.
✓ Branch 88 → 64 taken 127 times.
✓ Branch 88 → 89 taken 2024 times.
|
2151 | for (const EventAttendee &attendee : attendees) |
| 63 |
6/16✓ Branch 78 → 79 taken 127 times.
✗ Branch 78 → 80 not taken.
✓ Branch 80 → 81 taken 84 times.
✓ Branch 80 → 82 taken 43 times.
✓ Branch 82 → 83 taken 43 times.
✓ Branch 82 → 84 taken 84 times.
✓ Branch 84 → 85 taken 127 times.
✗ Branch 84 → 86 not taken.
✗ Branch 146 → 147 not taken.
✗ Branch 146 → 148 not taken.
✗ Branch 150 → 151 not taken.
✗ Branch 150 → 152 not taken.
✗ Branch 154 → 155 not taken.
✗ Branch 154 → 156 not taken.
✗ Branch 158 → 159 not taken.
✗ Branch 158 → 160 not taken.
|
254 | ok = insert(db, eventId, attendee.organizer ? QStringLiteral("organizer") : QStringLiteral("attendee"), QString(), |
| 64 |
5/7✓ Branch 66 → 67 taken 43 times.
✓ Branch 66 → 70 taken 84 times.
✓ Branch 73 → 74 taken 127 times.
✓ Branch 74 → 75 taken 127 times.
✗ Branch 74 → 77 not taken.
✓ Branch 75 → 76 taken 127 times.
✗ Branch 75 → 77 not taken.
|
254 | attendee.address, attendee.name, attendee.partstat) && |
| 65 | ok; | ||
| 66 |
2/2✓ Branch 89 → 90 taken 1 time.
✓ Branch 89 → 103 taken 2023 times.
|
2024 | if (!ok) |
| 67 |
7/7✓ Branch 90 → 91 taken 1 time.
✓ Branch 94 → 95 taken 1 time.
✓ Branch 95 → 96 taken 1 time.
✓ Branch 96 → 97 taken 1 time.
✓ Branch 97 → 98 taken 1 time.
✓ Branch 101 → 92 taken 1 time.
✓ Branch 101 → 102 taken 1 time.
|
2 | qCWarning(lcCalendarPeople) << "People of event row" << eventId << "could not be indexed"; |
| 68 | 2024 | return ok; | |
| 69 | 2024 | } | |
| 70 | |||
| 71 | 3 | bool backfill(QSqlDatabase &db) { | |
| 72 |
1/1✓ Branch 2 → 3 taken 3 times.
|
3 | QSqlQuery all(db); |
| 73 | 3 | QList<QPair<qint64, QString>> rows; | |
| 74 |
2/3✓ Branch 6 → 7 taken 3 times.
✓ Branch 9 → 10 taken 3 times.
✗ Branch 9 → 24 not taken.
|
3 | if (all.exec(QStringLiteral("SELECT id, ical_raw FROM events WHERE ical_raw IS NOT NULL AND ical_raw <> ''"))) |
| 75 |
3/3✓ Branch 22 → 23 taken 4 times.
✓ Branch 23 → 11 taken 1 time.
✓ Branch 23 → 24 taken 3 times.
|
4 | while (all.next()) |
| 76 |
5/5✓ Branch 11 → 12 taken 1 time.
✓ Branch 12 → 13 taken 1 time.
✓ Branch 13 → 14 taken 1 time.
✓ Branch 14 → 15 taken 1 time.
✓ Branch 16 → 17 taken 1 time.
|
1 | rows.append({all.value(0).toLongLong(), all.value(1).toString()}); |
| 77 |
1/1✓ Branch 24 → 25 taken 3 times.
|
3 | all.finish(); |
| 78 | 3 | bool ok = true; | |
| 79 |
4/4✓ Branch 25 → 26 taken 3 times.
✓ Branch 26 → 27 taken 3 times.
✓ Branch 39 → 28 taken 1 time.
✓ Branch 39 → 40 taken 3 times.
|
4 | for (const auto &row : rows) { |
| 80 | 1 | CalendarEvent event; | |
| 81 | 1 | event.icalRaw = row.second; | |
| 82 |
3/5✓ Branch 31 → 32 taken 1 time.
✓ Branch 32 → 33 taken 1 time.
✗ Branch 32 → 35 not taken.
✓ Branch 33 → 34 taken 1 time.
✗ Branch 33 → 35 not taken.
|
1 | ok = write(db, row.first, event) && ok; |
| 83 | 1 | } | |
| 84 |
7/7✓ Branch 40 → 41 taken 3 times.
✓ Branch 44 → 45 taken 3 times.
✓ Branch 45 → 46 taken 3 times.
✓ Branch 47 → 48 taken 3 times.
✓ Branch 48 → 49 taken 3 times.
✓ Branch 52 → 42 taken 3 times.
✓ Branch 52 → 53 taken 3 times.
|
6 | qCInfo(lcCalendarPeople) << "Calendar v15: people indexed for" << rows.size() << "events"; |
| 85 | 3 | return ok; | |
| 86 | 3 | } | |
| 87 | |||
| 88 | 244 | QList<EventRef> eventsWith(const QSqlDatabase &db, const QStringList &cardUids, const QStringList &addresses, | |
| 89 | int limit) { | ||
| 90 | 244 | QList<EventRef> events; | |
| 91 | 244 | QStringList clauses; | |
| 92 | 244 | QVariantList values; | |
| 93 |
2/2✓ Branch 35 → 4 taken 154 times.
✓ Branch 35 → 36 taken 244 times.
|
398 | for (const QString &uid : cardUids) { |
| 94 |
2/2✓ Branch 5 → 6 taken 154 times.
✓ Branch 6 → 7 taken 154 times.
|
154 | QString bare = uid.trimmed().toLower(); |
| 95 |
3/3✓ Branch 9 → 10 taken 154 times.
✓ Branch 10 → 11 taken 1 time.
✓ Branch 10 → 15 taken 153 times.
|
154 | if (bare.startsWith(QLatin1String("urn:uuid:"))) |
| 96 |
1/1✓ Branch 11 → 12 taken 1 time.
|
1 | bare = bare.mid(9); |
| 97 |
1/2✗ Branch 16 → 17 not taken.
✓ Branch 16 → 18 taken 154 times.
|
154 | if (bare.isEmpty()) |
| 98 | ✗ | continue; | |
| 99 |
1/1✓ Branch 21 → 22 taken 154 times.
|
154 | clauses << QStringLiteral("p.card_uid = ?"); |
| 100 |
1/1✓ Branch 25 → 26 taken 154 times.
|
154 | values << bare; |
| 101 | 154 | } | |
| 102 |
2/2✓ Branch 60 → 38 taken 150 times.
✓ Branch 60 → 61 taken 244 times.
|
394 | for (const QString &address : addresses) { |
| 103 |
2/3✓ Branch 39 → 40 taken 150 times.
✗ Branch 42 → 43 not taken.
✓ Branch 42 → 44 taken 150 times.
|
150 | if (address.trimmed().isEmpty()) |
| 104 | ✗ | continue; | |
| 105 |
1/1✓ Branch 47 → 48 taken 150 times.
|
150 | clauses << QStringLiteral("p.address = ?"); |
| 106 |
3/3✓ Branch 50 → 51 taken 150 times.
✓ Branch 51 → 52 taken 150 times.
✓ Branch 53 → 54 taken 150 times.
|
150 | values << address.trimmed().toLower(); |
| 107 | } | ||
| 108 |
2/2✓ Branch 62 → 63 taken 88 times.
✓ Branch 62 → 64 taken 156 times.
|
244 | if (clauses.isEmpty()) |
| 109 | 88 | return events; | |
| 110 |
1/1✓ Branch 64 → 65 taken 156 times.
|
156 | QSqlQuery q(db); |
| 111 |
1/1✓ Branch 74 → 75 taken 156 times.
|
468 | q.prepare(QStringLiteral("SELECT e.id, e.uid, c.accountId, c.path, e.summary, e.location, e.dt_start, e.dt_end," |
| 112 | " e.all_day, COALESCE(e.rrule, ''), MIN(CASE p.kind WHEN 'named' THEN 0 WHEN 'organizer'" | ||
| 113 | " THEN 1 ELSE 2 END) FROM event_people p JOIN events e ON e.id = p.event_id" | ||
| 114 | " JOIN calendars c ON c.id = e.calendar_id WHERE %1 GROUP BY e.id" | ||
| 115 | " ORDER BY e.dt_start DESC LIMIT ?") | ||
| 116 |
2/2✓ Branch 72 → 73 taken 156 times.
✓ Branch 73 → 74 taken 156 times.
|
312 | .arg(clauses.join(QStringLiteral(" OR ")))); |
| 117 |
4/4✓ Branch 81 → 82 taken 156 times.
✓ Branch 82 → 83 taken 156 times.
✓ Branch 89 → 84 taken 304 times.
✓ Branch 89 → 90 taken 156 times.
|
460 | for (const QVariant &value : values) |
| 118 |
1/1✓ Branch 86 → 87 taken 304 times.
|
304 | q.addBindValue(value); |
| 119 |
1/1✓ Branch 92 → 93 taken 156 times.
|
156 | q.addBindValue(limit); |
| 120 |
2/3✓ Branch 94 → 95 taken 156 times.
✗ Branch 95 → 96 not taken.
✓ Branch 95 → 112 taken 156 times.
|
156 | if (!q.exec()) { |
| 121 | ✗ | qCWarning(lcCalendarPeople) << "Events of a person could not be read:" << q.lastError().text(); | |
| 122 | ✗ | return events; | |
| 123 | } | ||
| 124 |
5/10✓ Branch 112 → 113 taken 9 times.
✓ Branch 112 → 134 taken 147 times.
✓ Branch 114 → 115 taken 9 times.
✗ Branch 114 → 134 not taken.
✓ Branch 128 → 129 taken 27 times.
✓ Branch 128 → 130 taken 9 times.
✗ Branch 283 → 284 not taken.
✗ Branch 283 → 285 not taken.
✗ Branch 301 → 302 not taken.
✗ Branch 301 → 303 not taken.
|
192 | static const QStringList kinds{QStringLiteral("named"), QStringLiteral("organizer"), QStringLiteral("attendee")}; |
| 125 |
3/3✓ Branch 203 → 204 taken 173 times.
✓ Branch 204 → 135 taken 17 times.
✓ Branch 204 → 205 taken 156 times.
|
173 | while (q.next()) { |
| 126 | 17 | EventRef ref; | |
| 127 |
2/2✓ Branch 136 → 137 taken 17 times.
✓ Branch 137 → 138 taken 17 times.
|
17 | ref.eventId = q.value(0).toLongLong(); |
| 128 |
2/2✓ Branch 139 → 140 taken 17 times.
✓ Branch 140 → 141 taken 17 times.
|
17 | ref.uid = q.value(1).toString(); |
| 129 |
2/2✓ Branch 144 → 145 taken 17 times.
✓ Branch 145 → 146 taken 17 times.
|
17 | ref.accountId = q.value(2).toString(); |
| 130 |
2/2✓ Branch 149 → 150 taken 17 times.
✓ Branch 150 → 151 taken 17 times.
|
17 | ref.calendarPath = q.value(3).toString(); |
| 131 |
2/2✓ Branch 154 → 155 taken 17 times.
✓ Branch 155 → 156 taken 17 times.
|
17 | ref.summary = q.value(4).toString(); |
| 132 |
2/2✓ Branch 159 → 160 taken 17 times.
✓ Branch 160 → 161 taken 17 times.
|
17 | ref.location = q.value(5).toString(); |
| 133 |
3/4✓ Branch 164 → 165 taken 17 times.
✓ Branch 165 → 166 taken 17 times.
✓ Branch 167 → 168 taken 17 times.
✗ Branch 167 → 175 not taken.
|
17 | if (!q.value(6).isNull()) |
| 134 |
3/3✓ Branch 168 → 169 taken 17 times.
✓ Branch 169 → 170 taken 17 times.
✓ Branch 170 → 171 taken 17 times.
|
17 | ref.start = QDateTime::fromSecsSinceEpoch(q.value(6).toLongLong()); |
| 135 |
3/4✓ Branch 175 → 176 taken 17 times.
✓ Branch 176 → 177 taken 17 times.
✓ Branch 178 → 179 taken 17 times.
✗ Branch 178 → 186 not taken.
|
17 | if (!q.value(7).isNull()) |
| 136 |
3/3✓ Branch 179 → 180 taken 17 times.
✓ Branch 180 → 181 taken 17 times.
✓ Branch 181 → 182 taken 17 times.
|
17 | ref.end = QDateTime::fromSecsSinceEpoch(q.value(7).toLongLong()); |
| 137 |
2/2✓ Branch 186 → 187 taken 17 times.
✓ Branch 187 → 188 taken 17 times.
|
17 | ref.allDay = q.value(8).toBool(); |
| 138 |
2/2✓ Branch 189 → 190 taken 17 times.
✓ Branch 190 → 191 taken 17 times.
|
17 | ref.recurring = !q.value(9).toString().isEmpty(); |
| 139 |
3/3✓ Branch 194 → 195 taken 17 times.
✓ Branch 195 → 196 taken 17 times.
✓ Branch 196 → 197 taken 17 times.
|
17 | ref.kind = kinds.value(q.value(10).toInt()); |
| 140 |
1/1✓ Branch 200 → 201 taken 17 times.
|
17 | events.append(ref); |
| 141 | 17 | } | |
| 142 | 156 | return events; | |
| 143 | 280 | } | |
| 144 | |||
| 145 | 12 | QString eventKey(const QString &accountId, const QString &calendarPath, const QString &uid) { | |
| 146 |
4/4✓ Branch 4 → 5 taken 12 times.
✓ Branch 5 → 6 taken 12 times.
✓ Branch 6 → 7 taken 12 times.
✓ Branch 7 → 8 taken 12 times.
|
12 | return accountId + QChar(0x1f) + calendarPath + QChar(0x1f) + uid; |
| 147 | } | ||
| 148 | |||
| 149 | 57 | QHash<QString, QList<EventPerson>> namedPeople(const QSqlDatabase &db) { | |
| 150 | 57 | QHash<QString, QList<EventPerson>> people; | |
| 151 |
1/1✓ Branch 2 → 3 taken 57 times.
|
57 | QSqlQuery q(db); |
| 152 |
1/1✓ Branch 3 → 4 taken 57 times.
|
57 | q.setForwardOnly(true); |
| 153 |
2/3✓ Branch 7 → 8 taken 57 times.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 27 taken 57 times.
|
57 | if (!q.exec(QStringLiteral("SELECT c.accountId, c.path, e.uid, e.id, p.card_uid, p.name FROM event_people p" |
| 154 | " JOIN events e ON e.id = p.event_id JOIN calendars c ON c.id = e.calendar_id" | ||
| 155 | " WHERE p.kind = 'named' ORDER BY e.id, p.rowid"))) { | ||
| 156 | ✗ | qCWarning(lcCalendarPeople) << "Named people query failed:" << q.lastError().text(); | |
| 157 | ✗ | return people; | |
| 158 | } | ||
| 159 | 57 | QHash<QString, qint64> rowOf; // the first event row of each UID | |
| 160 |
3/3✓ Branch 70 → 71 taken 63 times.
✓ Branch 71 → 28 taken 6 times.
✓ Branch 71 → 72 taken 57 times.
|
63 | while (q.next()) { |
| 161 |
7/7✓ Branch 28 → 29 taken 6 times.
✓ Branch 29 → 30 taken 6 times.
✓ Branch 30 → 31 taken 6 times.
✓ Branch 31 → 32 taken 6 times.
✓ Branch 32 → 33 taken 6 times.
✓ Branch 33 → 34 taken 6 times.
✓ Branch 34 → 35 taken 6 times.
|
6 | const QString key = eventKey(q.value(0).toString(), q.value(1).toString(), q.value(2).toString()); |
| 162 |
2/2✓ Branch 41 → 42 taken 6 times.
✓ Branch 42 → 43 taken 6 times.
|
6 | const qint64 row = q.value(3).toLongLong(); |
| 163 |
4/6✓ Branch 47 → 48 taken 3 times.
✓ Branch 47 → 51 taken 3 times.
✗ Branch 49 → 50 not taken.
✓ Branch 49 → 51 taken 3 times.
✗ Branch 52 → 53 not taken.
✓ Branch 52 → 54 taken 6 times.
|
6 | if (const auto known = rowOf.constFind(key); known != rowOf.cend() && *known != row) |
| 164 | ✗ | continue; | |
| 165 |
1/1✓ Branch 54 → 55 taken 6 times.
|
6 | rowOf.insert(key, row); |
| 166 |
6/10✓ Branch 55 → 56 taken 6 times.
✓ Branch 56 → 57 taken 6 times.
✓ Branch 57 → 58 taken 6 times.
✓ Branch 58 → 59 taken 6 times.
✓ Branch 59 → 60 taken 6 times.
✓ Branch 60 → 61 taken 6 times.
✗ Branch 119 → 120 not taken.
✗ Branch 119 → 121 not taken.
✗ Branch 125 → 126 not taken.
✗ Branch 125 → 127 not taken.
|
6 | people[key].append(EventPerson{QString(), q.value(4).toString(), q.value(5).toString()}); |
| 167 | 6 | } | |
| 168 | 57 | return people; | |
| 169 | 57 | } | |
| 170 | |||
| 171 | } // namespace CalendarPeopleIndex | ||
| 172 | |||
| 173 | 244 | QList<CalendarPeopleIndex::EventRef> CalendarStore::eventsOfPerson(const QStringList &cardUids, | |
| 174 | const QStringList &addresses, int limit) const { | ||
| 175 | 244 | return CalendarPeopleIndex::eventsWith(m_db, cardUids, addresses, limit); | |
| 176 | } | ||
| 177 | |||
| 178 | 57 | QHash<QString, QList<EventPerson>> CalendarStore::namedPeopleByEvent() const { | |
| 179 | 57 | return CalendarPeopleIndex::namedPeople(m_db); | |
| 180 | } | ||
| 181 |