data/RelationGraphFamilies.cpp
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #include "RelationGraphFamilies.h" | ||
| 2 | |||
| 3 | #include <QHash> | ||
| 4 | #include <algorithm> | ||
| 5 | |||
| 6 | namespace RelationGraph::Families { | ||
| 7 | |||
| 8 | 103999 | bool isMembership(const StoredEdge &e) { | |
| 9 |
4/4✓ Branch 4 → 5 taken 101714 times.
✓ Branch 4 → 12 taken 2285 times.
✓ Branch 7 → 8 taken 101220 times.
✓ Branch 7 → 11 taken 494 times.
|
306933 | return e.role == QLatin1String("relation") && |
| 10 |
2/2✓ Branch 10 → 11 taken 11 times.
✓ Branch 10 → 12 taken 101209 times.
|
306933 | (e.type == QLatin1String("member") || e.type == QLatin1String("member-of")); |
| 11 | } | ||
| 12 | |||
| 13 | // F103-10: family card → its members (from "member" lines on the family | ||
| 14 | // card and "member-of" lines on a member's card). | ||
| 15 | 163 | QHash<qint64, QList<qint64>> of(const Input &input) { | |
| 16 | 163 | QHash<qint64, QList<qint64>> families; | |
| 17 |
2/2✓ Branch 28 → 4 taken 70114 times.
✓ Branch 28 → 29 taken 163 times.
|
70277 | for (const StoredEdge &e : input.edges) { |
| 18 |
5/6✓ Branch 6 → 7 taken 451 times.
✓ Branch 6 → 8 taken 69663 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 9 taken 451 times.
✓ Branch 10 → 11 taken 69663 times.
✓ Branch 10 → 12 taken 451 times.
|
70114 | if (!isMembership(e) || e.toCardId <= 0) // 0: a name that is no family stand-in |
| 19 | 69663 | continue; | |
| 20 | 451 | const bool onFamily = e.type == QLatin1String("member"); | |
| 21 |
2/2✓ Branch 14 → 15 taken 443 times.
✓ Branch 14 → 16 taken 8 times.
|
451 | const qint64 family = onFamily ? e.fromCardId : e.toCardId; |
| 22 |
2/2✓ Branch 17 → 18 taken 443 times.
✓ Branch 17 → 19 taken 8 times.
|
451 | const qint64 member = onFamily ? e.toCardId : e.fromCardId; |
| 23 |
2/3✓ Branch 20 → 21 taken 451 times.
✓ Branch 22 → 23 taken 451 times.
✗ Branch 22 → 25 not taken.
|
451 | if (!families[family].contains(member)) |
| 24 |
2/2✓ Branch 23 → 24 taken 451 times.
✓ Branch 24 → 25 taken 451 times.
|
451 | families[family].append(member); |
| 25 | } | ||
| 26 | 163 | return families; | |
| 27 | ✗ | } | |
| 28 | |||
| 29 | 48 | void addNamedFamilies(Input *input) { | |
| 30 | 48 | QHash<QString, qint64> ids; | |
| 31 |
4/4✓ Branch 2 → 3 taken 48 times.
✓ Branch 3 → 4 taken 48 times.
✓ Branch 47 → 5 taken 1056 times.
✓ Branch 47 → 48 taken 48 times.
|
1104 | for (StoredEdge &e : input->edges) { |
| 32 |
7/8✓ Branch 6 → 7 taken 22 times.
✓ Branch 6 → 13 taken 1034 times.
✓ Branch 9 → 10 taken 22 times.
✗ Branch 9 → 13 not taken.
✓ Branch 12 → 13 taken 20 times.
✓ Branch 12 → 14 taken 2 times.
✓ Branch 15 → 16 taken 1054 times.
✓ Branch 15 → 17 taken 2 times.
|
1056 | if (e.toCardId != 0 || e.role != QLatin1String("relation") || e.type != QLatin1String("member-of")) |
| 33 | 1054 | continue; | |
| 34 |
1/1✓ Branch 17 → 18 taken 2 times.
|
2 | const QString name = e.toName.simplified(); |
| 35 |
1/2✗ Branch 19 → 20 not taken.
✓ Branch 19 → 21 taken 2 times.
|
2 | if (name.isEmpty()) |
| 36 | ✗ | continue; | |
| 37 |
1/1✓ Branch 21 → 22 taken 2 times.
|
2 | const QString folded = name.toCaseFolded(); |
| 38 | 2 | qint64 id = ids.value(folded); | |
| 39 |
2/2✓ Branch 23 → 24 taken 1 time.
✓ Branch 23 → 38 taken 1 time.
|
2 | if (id == 0) { |
| 40 | 1 | id = NamedFamilyBase + ids.size(); | |
| 41 |
1/1✓ Branch 25 → 26 taken 1 time.
|
1 | ids.insert(folded, id); |
| 42 | 1 | Person family; | |
| 43 | 1 | family.cardId = id; | |
| 44 |
1/1✓ Branch 29 → 30 taken 1 time.
|
1 | family.key = QStringLiteral("family:") + folded; |
| 45 | 1 | family.name = name; | |
| 46 |
1/1✓ Branch 35 → 36 taken 1 time.
|
1 | input->people.append(family); |
| 47 | 1 | } | |
| 48 | 2 | e.toCardId = id; | |
| 49 | 2 | } | |
| 50 | 48 | } | |
| 51 | |||
| 52 | // The areas of `graph`: every family with at least one shown member. | ||
| 53 | 163 | void addAreas(const Input &input, const QHash<qint64, QList<qint64>> &families, qint64 centerCardId, Graph *graph) { | |
| 54 | 163 | QHash<qint64, const Person *> people; | |
| 55 |
2/2✓ Branch 8 → 4 taken 43482 times.
✓ Branch 8 → 9 taken 163 times.
|
43645 | for (const Person &p : input.people) |
| 56 |
1/1✓ Branch 5 → 6 taken 43482 times.
|
43482 | people.insert(p.cardId, &p); |
| 57 |
1/1✓ Branch 9 → 10 taken 163 times.
|
163 | QList<qint64> ids = families.keys(); |
| 58 |
3/3✓ Branch 10 → 11 taken 163 times.
✓ Branch 11 → 12 taken 163 times.
✓ Branch 12 → 13 taken 163 times.
|
163 | std::sort(ids.begin(), ids.end()); |
| 59 |
2/2✓ Branch 51 → 16 taken 159 times.
✓ Branch 51 → 52 taken 163 times.
|
322 | for (qint64 family : std::as_const(ids)) { |
| 60 | 159 | const Person *card = people.value(family); | |
| 61 |
1/2✗ Branch 18 → 19 not taken.
✓ Branch 18 → 20 taken 159 times.
|
159 | if (!card) |
| 62 | ✗ | continue; | |
| 63 | 159 | Area area; | |
| 64 | 159 | area.familyCardId = family; | |
| 65 | 159 | area.key = card->key; | |
| 66 | 159 | area.name = card->name; | |
| 67 | // F103-13/F103-16: a family is its area. Only as the centre is its card a | ||
| 68 | // visible node inside the area; elsewhere (the overview) the node stays | ||
| 69 | // for the layout, hidden and not part of the outline. | ||
| 70 |
3/3✓ Branch 22 → 23 taken 159 times.
✓ Branch 23 → 24 taken 20 times.
✓ Branch 23 → 28 taken 139 times.
|
159 | if (const int self = graph->indexOf(family); self >= 0) { |
| 71 |
2/2✓ Branch 24 → 25 taken 4 times.
✓ Branch 24 → 26 taken 16 times.
|
20 | if (family == centerCardId) |
| 72 |
1/1✓ Branch 25 → 28 taken 4 times.
|
4 | area.members.append(self); |
| 73 | else | ||
| 74 |
1/1✓ Branch 26 → 27 taken 16 times.
|
16 | graph->nodes[self].family = true; |
| 75 | } | ||
| 76 |
4/4✓ Branch 29 → 30 taken 159 times.
✓ Branch 30 → 31 taken 159 times.
✓ Branch 38 → 32 taken 451 times.
✓ Branch 38 → 39 taken 159 times.
|
610 | for (qint64 member : families.value(family)) |
| 77 |
3/3✓ Branch 33 → 34 taken 451 times.
✓ Branch 34 → 35 taken 279 times.
✓ Branch 34 → 36 taken 172 times.
|
451 | if (const int index = graph->indexOf(member); index >= 0) |
| 78 |
1/1✓ Branch 35 → 36 taken 279 times.
|
438 | area.members.append(index); |
| 79 | // F103-33: one shown member is enough — a family of one is still a family. | ||
| 80 |
2/2✓ Branch 41 → 42 taken 4 times.
✓ Branch 41 → 43 taken 155 times.
|
159 | const int shownMembers = int(area.members.size()) - (family == centerCardId ? 1 : 0); |
| 81 |
3/4✓ Branch 44 → 45 taken 34 times.
✓ Branch 44 → 46 taken 125 times.
✗ Branch 45 → 46 not taken.
✓ Branch 45 → 47 taken 34 times.
|
159 | if (shownMembers >= 1 || family == centerCardId) |
| 82 |
1/1✓ Branch 46 → 47 taken 125 times.
|
125 | graph->areas.append(area); |
| 83 | 159 | } | |
| 84 | 163 | } | |
| 85 | |||
| 86 | } // namespace RelationGraph::Families | ||
| 87 |