data/ContactPlaceIndexer.cpp
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #include "ContactPlaceIndexer.h" | ||
| 2 | |||
| 3 | #include "GeoData.h" | ||
| 4 | #include "PlaceGazetteer.h" | ||
| 5 | |||
| 6 | #include <QCryptographicHash> | ||
| 7 | #include <QDateTime> | ||
| 8 | #include <QLoggingCategory> | ||
| 9 | #include <QSqlError> | ||
| 10 | #include <QSqlQuery> | ||
| 11 | #include <QVariant> | ||
| 12 | |||
| 13 | Q_DECLARE_LOGGING_CATEGORY(lcContactPeople) | ||
| 14 | |||
| 15 | namespace ContactPlaceIndexer { | ||
| 16 | |||
| 17 | namespace { | ||
| 18 | |||
| 19 | struct Pending { | ||
| 20 | qint64 rowId = 0; | ||
| 21 | QString kind, text; | ||
| 22 | ContactAddress address; | ||
| 23 | }; | ||
| 24 | |||
| 25 |
4/4✓ Branch 3 → 4 taken 224 times.
✓ Branch 3 → 7 taken 6831 times.
✓ Branch 9 → 10 taken 224 times.
✓ Branch 9 → 11 taken 6831 times.
|
7279 | QString text(const QString &value) { return value.isNull() ? QStringLiteral("") : value; } |
| 26 | |||
| 27 | 1049 | bool cached(QSqlDatabase &db, const QString &key, PlaceGazetteer::Place *place, bool *known, bool *online) { | |
| 28 |
1/1✓ Branch 2 → 3 taken 1049 times.
|
1049 | QSqlQuery q(db); |
| 29 |
1/1✓ Branch 6 → 7 taken 1049 times.
|
1049 | q.prepare(QStringLiteral("SELECT lat, lon, precision, tz, place_name, country, source FROM place_cache" |
| 30 | " WHERE address_hash = ?")); | ||
| 31 |
1/1✓ Branch 11 → 12 taken 1049 times.
|
1049 | q.addBindValue(key); |
| 32 |
7/8✓ Branch 13 → 14 taken 1049 times.
✓ Branch 14 → 15 taken 1049 times.
✗ Branch 14 → 17 not taken.
✓ Branch 15 → 16 taken 1049 times.
✓ Branch 16 → 17 taken 977 times.
✓ Branch 16 → 18 taken 72 times.
✓ Branch 19 → 20 taken 977 times.
✓ Branch 19 → 21 taken 72 times.
|
1049 | if (!q.exec() || !q.next()) |
| 33 | 977 | return false; | |
| 34 | 72 | *known = true; | |
| 35 |
2/2✓ Branch 22 → 23 taken 72 times.
✓ Branch 23 → 24 taken 72 times.
|
72 | *online = q.value(6).toString() == QLatin1String("online"); // S103.1.9 |
| 36 |
3/4✓ Branch 27 → 28 taken 72 times.
✓ Branch 28 → 29 taken 72 times.
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 32 taken 72 times.
|
72 | if (q.value(0).isNull()) |
| 37 | ✗ | return true; // known as not placeable | |
| 38 |
5/5✓ Branch 32 → 33 taken 72 times.
✓ Branch 33 → 34 taken 72 times.
✓ Branch 34 → 35 taken 72 times.
✓ Branch 35 → 36 taken 72 times.
✓ Branch 36 → 37 taken 72 times.
|
72 | place->position = GeoPoint::at(q.value(0).toDouble(), q.value(1).toDouble()); |
| 39 |
2/2✓ Branch 39 → 40 taken 72 times.
✓ Branch 40 → 41 taken 72 times.
|
72 | place->precision = q.value(2).toString(); |
| 40 |
2/2✓ Branch 44 → 45 taken 72 times.
✓ Branch 45 → 46 taken 72 times.
|
72 | place->timeZone = q.value(3).toString(); |
| 41 |
2/2✓ Branch 49 → 50 taken 72 times.
✓ Branch 50 → 51 taken 72 times.
|
72 | place->placeName = q.value(4).toString(); |
| 42 |
2/2✓ Branch 54 → 55 taken 72 times.
✓ Branch 55 → 56 taken 72 times.
|
72 | place->countryIso = q.value(5).toString(); |
| 43 | 72 | return true; | |
| 44 | 1049 | } | |
| 45 | |||
| 46 | 977 | void remember(QSqlDatabase &db, const QString &key, const PlaceGazetteer::Place &place) { | |
| 47 |
1/1✓ Branch 2 → 3 taken 977 times.
|
977 | QSqlQuery q(db); |
| 48 |
1/1✓ Branch 6 → 7 taken 977 times.
|
977 | q.prepare(QStringLiteral("INSERT OR REPLACE INTO place_cache (address_hash, lat, lon, precision, source, tz," |
| 49 | " looked_up, place_name, country) VALUES (?, ?, ?, ?, 'gazetteer', ?, ?, ?, ?)")); | ||
| 50 |
1/1✓ Branch 11 → 12 taken 977 times.
|
977 | q.addBindValue(key); |
| 51 |
5/5✓ Branch 15 → 16 taken 945 times.
✓ Branch 15 → 17 taken 32 times.
✓ Branch 17 → 18 taken 32 times.
✓ Branch 18 → 19 taken 32 times.
✓ Branch 19 → 20 taken 977 times.
|
977 | q.addBindValue(place.isValid() ? QVariant(place.position.latitude) : QVariant(QMetaType(QMetaType::Double))); |
| 52 |
5/5✓ Branch 23 → 24 taken 945 times.
✓ Branch 23 → 25 taken 32 times.
✓ Branch 25 → 26 taken 32 times.
✓ Branch 26 → 27 taken 32 times.
✓ Branch 27 → 28 taken 977 times.
|
977 | q.addBindValue(place.isValid() ? QVariant(place.position.longitude) : QVariant(QMetaType(QMetaType::Double))); |
| 53 |
2/2✓ Branch 30 → 31 taken 977 times.
✓ Branch 32 → 33 taken 977 times.
|
977 | q.addBindValue(text(place.precision)); |
| 54 |
2/2✓ Branch 36 → 37 taken 977 times.
✓ Branch 38 → 39 taken 977 times.
|
977 | q.addBindValue(text(place.timeZone)); |
| 55 |
3/3✓ Branch 42 → 43 taken 977 times.
✓ Branch 43 → 44 taken 977 times.
✓ Branch 45 → 46 taken 977 times.
|
977 | q.addBindValue(QDateTime::currentDateTimeUtc().toString(Qt::ISODate)); |
| 56 |
2/2✓ Branch 50 → 51 taken 977 times.
✓ Branch 52 → 53 taken 977 times.
|
977 | q.addBindValue(text(place.placeName)); |
| 57 |
2/2✓ Branch 56 → 57 taken 977 times.
✓ Branch 58 → 59 taken 977 times.
|
977 | q.addBindValue(text(place.countryIso)); |
| 58 |
1/1✓ Branch 61 → 62 taken 977 times.
|
977 | q.exec(); |
| 59 | 977 | } | |
| 60 | |||
| 61 | } // namespace | ||
| 62 | |||
| 63 | 1075 | QString cacheKey(const QString &kind, const QString &placeText, const QString &street, const QString &postalCode, | |
| 64 | const QString &locality, const QString ®ion, const QString &country) { | ||
| 65 | 1075 | QString key; | |
| 66 |
6/6✓ Branch 4 → 5 taken 1031 times.
✓ Branch 4 → 8 taken 44 times.
✓ Branch 7 → 8 taken 14 times.
✓ Branch 7 → 9 taken 1017 times.
✓ Branch 10 → 11 taken 58 times.
✓ Branch 10 → 22 taken 1017 times.
|
1075 | if (kind == QLatin1String("met") || kind == QLatin1String("birth")) { |
| 67 |
2/2✓ Branch 11 → 12 taken 58 times.
✓ Branch 15 → 16 taken 58 times.
|
116 | key = QStringLiteral("text:") + GeoData::key(placeText); |
| 68 | } else { | ||
| 69 | 1017 | ContactAddress address; | |
| 70 | 1017 | address.street = street; | |
| 71 | 1017 | address.postalCode = postalCode; | |
| 72 | 1017 | address.locality = locality; | |
| 73 | 1017 | address.region = region; | |
| 74 | 1017 | address.country = country; | |
| 75 |
2/2✓ Branch 27 → 28 taken 1017 times.
✓ Branch 31 → 32 taken 1017 times.
|
2034 | key = QStringLiteral("adr:") + PlaceGazetteer::addressKey(address); |
| 76 | 1017 | } | |
| 77 | // Hashed: the cache holds no readable addresses (D-16). | ||
| 78 |
4/4✓ Branch 39 → 40 taken 1075 times.
✓ Branch 41 → 42 taken 1075 times.
✓ Branch 42 → 43 taken 1075 times.
✓ Branch 43 → 44 taken 1075 times.
|
2150 | return QString::fromLatin1(QCryptographicHash::hash(key.toUtf8(), QCryptographicHash::Sha1).toHex()); |
| 79 | 1075 | } | |
| 80 | |||
| 81 | 26 | Result run(QSqlDatabase &db, const GeoData &data, const QString &defaultCountry, int limit) { | |
| 82 | 26 | Result result; | |
| 83 | 26 | QList<Pending> pending; | |
| 84 | { | ||
| 85 |
1/1✓ Branch 2 → 3 taken 26 times.
|
26 | QSqlQuery q(db); |
| 86 |
1/1✓ Branch 6 → 7 taken 26 times.
|
26 | q.prepare(QStringLiteral("SELECT rowid, kind, text, street, postal_code, locality, region, country FROM card_places" |
| 87 | " WHERE source = '' ORDER BY rowid LIMIT ?")); | ||
| 88 |
1/1✓ Branch 11 → 12 taken 26 times.
|
26 | q.addBindValue(limit); |
| 89 |
2/3✓ Branch 13 → 14 taken 26 times.
✗ Branch 14 → 15 not taken.
✓ Branch 14 → 31 taken 26 times.
|
26 | if (!q.exec()) { |
| 90 | ✗ | qCWarning(lcContactPeople) << "Pending places could not be read:" << q.lastError().text(); | |
| 91 | ✗ | return result; | |
| 92 | } | ||
| 93 |
3/3✓ Branch 73 → 74 taken 1075 times.
✓ Branch 74 → 32 taken 1049 times.
✓ Branch 74 → 75 taken 26 times.
|
1075 | while (q.next()) { |
| 94 | 1049 | Pending p; | |
| 95 |
2/2✓ Branch 32 → 33 taken 1049 times.
✓ Branch 33 → 34 taken 1049 times.
|
1049 | p.rowId = q.value(0).toLongLong(); |
| 96 |
2/2✓ Branch 35 → 36 taken 1049 times.
✓ Branch 36 → 37 taken 1049 times.
|
1049 | p.kind = q.value(1).toString(); |
| 97 |
2/2✓ Branch 40 → 41 taken 1049 times.
✓ Branch 41 → 42 taken 1049 times.
|
1049 | p.text = q.value(2).toString(); |
| 98 |
2/2✓ Branch 45 → 46 taken 1049 times.
✓ Branch 46 → 47 taken 1049 times.
|
1049 | p.address.street = q.value(3).toString(); |
| 99 |
2/2✓ Branch 50 → 51 taken 1049 times.
✓ Branch 51 → 52 taken 1049 times.
|
1049 | p.address.postalCode = q.value(4).toString(); |
| 100 |
2/2✓ Branch 55 → 56 taken 1049 times.
✓ Branch 56 → 57 taken 1049 times.
|
1049 | p.address.locality = q.value(5).toString(); |
| 101 |
2/2✓ Branch 60 → 61 taken 1049 times.
✓ Branch 61 → 62 taken 1049 times.
|
1049 | p.address.region = q.value(6).toString(); |
| 102 |
2/2✓ Branch 65 → 66 taken 1049 times.
✓ Branch 66 → 67 taken 1049 times.
|
1049 | p.address.country = q.value(7).toString(); |
| 103 |
1/1✓ Branch 70 → 71 taken 1049 times.
|
1049 | pending.append(p); |
| 104 | 1049 | } | |
| 105 | 26 | } | |
| 106 |
1/1✓ Branch 79 → 81 taken 26 times.
|
26 | db.transaction(); |
| 107 |
4/4✓ Branch 81 → 82 taken 26 times.
✓ Branch 82 → 83 taken 26 times.
✓ Branch 189 → 84 taken 1049 times.
✓ Branch 189 → 190 taken 26 times.
|
1075 | for (const Pending &p : pending) { |
| 108 | 1049 | const QString key = cacheKey(p.kind, p.text, p.address.street, p.address.postalCode, p.address.locality, | |
| 109 |
1/1✓ Branch 85 → 86 taken 1049 times.
|
1049 | p.address.region, p.address.country); |
| 110 | 1049 | PlaceGazetteer::Place place; | |
| 111 | 1049 | bool known = false; | |
| 112 | 1049 | bool online = false; | |
| 113 |
6/7✓ Branch 86 → 87 taken 1049 times.
✓ Branch 87 → 88 taken 72 times.
✓ Branch 87 → 89 taken 977 times.
✗ Branch 88 → 89 not taken.
✓ Branch 88 → 90 taken 72 times.
✓ Branch 91 → 92 taken 977 times.
✓ Branch 91 → 104 taken 72 times.
|
1049 | if (!cached(db, key, &place, &known, &online) || !known) { |
| 114 |
2/2✓ Branch 97 → 98 taken 14 times.
✓ Branch 97 → 100 taken 933 times.
|
1924 | place = p.kind == QLatin1String("met") || p.kind == QLatin1String("birth") |
| 115 |
3/3✓ Branch 94 → 95 taken 947 times.
✓ Branch 94 → 98 taken 30 times.
✓ Branch 98 → 99 taken 44 times.
|
1968 | ? PlaceGazetteer::locateText(data, p.text, defaultCountry) |
| 116 |
1/1✓ Branch 100 → 101 taken 933 times.
|
977 | : PlaceGazetteer::locate(data, p.address, defaultCountry); |
| 117 |
1/1✓ Branch 103 → 104 taken 977 times.
|
977 | remember(db, key, place); |
| 118 | } | ||
| 119 |
8/10✓ Branch 104 → 105 taken 977 times.
✓ Branch 104 → 108 taken 72 times.
✗ Branch 108 → 109 not taken.
✓ Branch 108 → 112 taken 72 times.
✓ Branch 115 → 116 taken 72 times.
✓ Branch 115 → 117 taken 977 times.
✗ Branch 117 → 118 not taken.
✓ Branch 117 → 119 taken 1049 times.
✓ Branch 119 → 120 taken 977 times.
✓ Branch 119 → 121 taken 72 times.
|
2098 | const QString source = !known ? QStringLiteral("gazetteer") : online ? QStringLiteral("online") : QStringLiteral("cache"); |
| 120 |
1/1✓ Branch 121 → 122 taken 1049 times.
|
1049 | QSqlQuery update(db); |
| 121 |
1/1✓ Branch 125 → 126 taken 1049 times.
|
1049 | update.prepare(QStringLiteral("UPDATE card_places SET lat = ?, lon = ?, precision = ?, source = ?, tz = ?," |
| 122 | " place_name = ? WHERE rowid = ?")); | ||
| 123 |
5/5✓ Branch 130 → 131 taken 1017 times.
✓ Branch 130 → 132 taken 32 times.
✓ Branch 132 → 133 taken 32 times.
✓ Branch 133 → 134 taken 32 times.
✓ Branch 134 → 135 taken 1049 times.
|
1049 | update.addBindValue(place.isValid() ? QVariant(place.position.latitude) : QVariant(QMetaType(QMetaType::Double))); |
| 124 |
5/5✓ Branch 138 → 139 taken 1017 times.
✓ Branch 138 → 140 taken 32 times.
✓ Branch 140 → 141 taken 32 times.
✓ Branch 141 → 142 taken 32 times.
✓ Branch 142 → 143 taken 1049 times.
|
1049 | update.addBindValue(place.isValid() ? QVariant(place.position.longitude) : QVariant(QMetaType(QMetaType::Double))); |
| 125 |
2/2✓ Branch 145 → 146 taken 1049 times.
✓ Branch 147 → 148 taken 1049 times.
|
1049 | update.addBindValue(text(place.precision)); |
| 126 |
5/7✓ Branch 152 → 153 taken 1017 times.
✓ Branch 152 → 154 taken 32 times.
✓ Branch 158 → 159 taken 1049 times.
✓ Branch 161 → 162 taken 32 times.
✓ Branch 161 → 163 taken 1017 times.
✗ Branch 318 → 319 not taken.
✗ Branch 318 → 320 not taken.
|
1081 | update.addBindValue(place.isValid() ? source : QStringLiteral("none")); |
| 127 |
2/2✓ Branch 164 → 165 taken 1049 times.
✓ Branch 166 → 167 taken 1049 times.
|
1049 | update.addBindValue(text(place.timeZone)); |
| 128 |
2/2✓ Branch 170 → 171 taken 1049 times.
✓ Branch 172 → 173 taken 1049 times.
|
1049 | update.addBindValue(text(place.placeName)); |
| 129 |
1/1✓ Branch 177 → 178 taken 1049 times.
|
1049 | update.addBindValue(p.rowId); |
| 130 |
1/1✓ Branch 179 → 180 taken 1049 times.
|
1049 | update.exec(); |
| 131 | 1049 | ++result.processed; | |
| 132 |
2/2✓ Branch 181 → 182 taken 1017 times.
✓ Branch 181 → 183 taken 32 times.
|
1049 | if (place.isValid()) |
| 133 | 1017 | ++result.placed; | |
| 134 | 1049 | } | |
| 135 |
1/1✓ Branch 190 → 191 taken 26 times.
|
26 | db.commit(); |
| 136 |
1/1✓ Branch 191 → 192 taken 26 times.
|
26 | QSqlQuery left(db); |
| 137 |
7/16✓ Branch 195 → 196 taken 26 times.
✓ Branch 196 → 197 taken 26 times.
✗ Branch 196 → 200 not taken.
✓ Branch 197 → 198 taken 26 times.
✓ Branch 198 → 199 taken 26 times.
✗ Branch 198 → 200 not taken.
✓ Branch 201 → 202 taken 26 times.
✗ Branch 201 → 203 not taken.
✓ Branch 203 → 204 taken 26 times.
✗ Branch 203 → 205 not taken.
✓ Branch 205 → 206 taken 26 times.
✗ Branch 205 → 210 not taken.
✗ Branch 353 → 354 not taken.
✗ Branch 353 → 355 not taken.
✗ Branch 357 → 358 not taken.
✗ Branch 357 → 359 not taken.
|
52 | if (left.exec(QStringLiteral("SELECT COUNT(*) FROM card_places WHERE source = ''")) && left.next()) |
| 138 |
2/2✓ Branch 206 → 207 taken 26 times.
✓ Branch 207 → 208 taken 26 times.
|
26 | result.remaining = left.value(0).toInt(); |
| 139 |
9/9✓ Branch 210 → 211 taken 26 times.
✓ Branch 214 → 215 taken 26 times.
✓ Branch 215 → 216 taken 26 times.
✓ Branch 216 → 217 taken 26 times.
✓ Branch 217 → 218 taken 26 times.
✓ Branch 218 → 219 taken 26 times.
✓ Branch 219 → 220 taken 26 times.
✓ Branch 225 → 212 taken 26 times.
✓ Branch 225 → 226 taken 26 times.
|
52 | qCDebug(lcContactPeople) << "Places slice:" << result.processed << "processed," << result.placed << "placed," |
| 140 |
2/2✓ Branch 220 → 221 taken 26 times.
✓ Branch 221 → 222 taken 26 times.
|
26 | << result.remaining << "left"; |
| 141 | 26 | return result; | |
| 142 | 26 | } | |
| 143 | |||
| 144 | } // namespace ContactPlaceIndexer | ||
| 145 |