Skip to content

Commit 23385f1

Browse files
committed
Apollo: Improve Timat object caching some more
We now define proper id fields for: - Versioned entities with `id` & `version` fields. - Unversioned identified entities with `id` field. - Embedded entitities without identity: Not normalized and Stored in cache as part of the owning parent object. Additionally it is safe to merge all aforementioned Tiamat types.
1 parent 3828b0e commit 23385f1

3 files changed

Lines changed: 93 additions & 34 deletions

File tree

codegen/TiamatVersionedObjectTypesResolverPlugin.ts

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,35 @@ function TiamatVersionedObjectTypesResolverPluginImplementation(
2525
.filter((type) => type instanceof GraphQLObjectType)
2626
.filter((type) => type.name.startsWith('stop_registry_'));
2727

28+
// Tiamat Output Objects that define both an id field
29+
const tiamatObjectsWithIds = tiamatObjects.filter((object) =>
30+
hasField(object, 'id'),
31+
);
32+
2833
// Tiamat Output Objects that define both an id and version field
29-
const versionedObjects = tiamatObjects.filter(
30-
(object) => hasField(object, 'id') && hasField(object, 'version'),
34+
const versionedObjects = tiamatObjectsWithIds.filter((object) =>
35+
hasField(object, 'version'),
3136
);
3237

33-
const outputContent = versionedObjects.map((object) => object.name).sort();
34-
return JSON.stringify(outputContent, null, 2);
38+
const typesWithVersion = versionedObjects.map((object) => object.name).sort();
39+
40+
const typesWithId = tiamatObjectsWithIds
41+
.map((object) => object.name)
42+
.filter((name) => !typesWithVersion.includes(name))
43+
.sort();
44+
45+
const embeddedTypes = tiamatObjects
46+
.map((type) => type.name)
47+
.filter(
48+
(name) => !typesWithVersion.includes(name) && !typesWithId.includes(name),
49+
)
50+
.sort();
51+
52+
return JSON.stringify(
53+
{ typesWithVersion, typesWithId, embeddedTypes },
54+
null,
55+
2,
56+
);
3557
}
3658

3759
const TiamatVersionedObjectTypesResolverPlugin = {
Lines changed: 56 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,56 @@
1-
[
2-
"stop_registry_AccessibilityAssessment",
3-
"stop_registry_AccessibilityLimitations",
4-
"stop_registry_AddressablePlace",
5-
"stop_registry_Contact",
6-
"stop_registry_CycleStorageEquipment",
7-
"stop_registry_FareZone",
8-
"stop_registry_GeneralSign",
9-
"stop_registry_GroupOfStopPlaces",
10-
"stop_registry_GroupOfTariffZones",
11-
"stop_registry_HslAccessibilityProperties",
12-
"stop_registry_Organisation",
13-
"stop_registry_ParentStopPlace",
14-
"stop_registry_Parking",
15-
"stop_registry_PathLink",
16-
"stop_registry_PurposeOfGrouping",
17-
"stop_registry_Quay",
18-
"stop_registry_SanitaryEquipment",
19-
"stop_registry_ShelterEquipment",
20-
"stop_registry_StopPlace",
21-
"stop_registry_TariffZone",
22-
"stop_registry_TicketingEquipment",
23-
"stop_registry_TopographicPlace",
24-
"stop_registry_WaitingRoomEquipment",
25-
"stop_registry_infoSpot",
26-
"stop_registry_poster"
27-
]
1+
{
2+
"typesWithVersion": [
3+
"stop_registry_AccessibilityAssessment",
4+
"stop_registry_AccessibilityLimitations",
5+
"stop_registry_AddressablePlace",
6+
"stop_registry_Contact",
7+
"stop_registry_CycleStorageEquipment",
8+
"stop_registry_FareZone",
9+
"stop_registry_GeneralSign",
10+
"stop_registry_GroupOfStopPlaces",
11+
"stop_registry_GroupOfTariffZones",
12+
"stop_registry_HslAccessibilityProperties",
13+
"stop_registry_Organisation",
14+
"stop_registry_ParentStopPlace",
15+
"stop_registry_Parking",
16+
"stop_registry_PathLink",
17+
"stop_registry_PurposeOfGrouping",
18+
"stop_registry_Quay",
19+
"stop_registry_SanitaryEquipment",
20+
"stop_registry_ShelterEquipment",
21+
"stop_registry_StopPlace",
22+
"stop_registry_TariffZone",
23+
"stop_registry_TicketingEquipment",
24+
"stop_registry_TopographicPlace",
25+
"stop_registry_WaitingRoomEquipment",
26+
"stop_registry_infoSpot",
27+
"stop_registry_poster"
28+
],
29+
"typesWithId": [
30+
"stop_registry_BoardingPosition",
31+
"stop_registry_PathLinkEnd",
32+
"stop_registry_PlaceEquipments"
33+
],
34+
"embeddedTypes": [
35+
"stop_registry_AlternativeName",
36+
"stop_registry_EmbeddableMultilingualString",
37+
"stop_registry_EntityPermissions",
38+
"stop_registry_EntityRef",
39+
"stop_registry_GeoJSON",
40+
"stop_registry_KeyValues",
41+
"stop_registry_LocationRef",
42+
"stop_registry_ParkingArea",
43+
"stop_registry_ParkingCapacity",
44+
"stop_registry_ParkingProperties",
45+
"stop_registry_PrivateCode",
46+
"stop_registry_StopPlaceOrganisationRef",
47+
"stop_registry_Tag",
48+
"stop_registry_TransferDuration",
49+
"stop_registry_TransportModes",
50+
"stop_registry_UserPermissions",
51+
"stop_registry_ValidBetween",
52+
"stop_registry_VersionLessEntityRef",
53+
"stop_registry_externalLink",
54+
"stop_registry_stopPlaceExternalLink"
55+
]
56+
}

ui/src/graphql/client.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,13 @@ import isString from 'lodash/isString';
1717
import { DateTime, Duration } from 'luxon';
1818
import introspectionResult from '../../graphql.schema.json';
1919
import { joreConfig } from '../config';
20-
import versionedTiamatEntities from '../generated/versionedTiamatEntities.json' with { type: 'json' };
20+
import tiamatTypeInfo from '../generated/versionedTiamatEntities.json' with { type: 'json' };
2121
import { isDateLike, parseDate } from '../time';
2222
import { mapHttpToWs } from '../utils/url';
2323
import { authRoleMiddleware, roleHeaderMap, userHasuraRole } from './auth';
2424

25+
const { embeddedTypes, typesWithId, typesWithVersion } = tiamatTypeInfo;
26+
2527
function parseDateTime(raw: unknown) {
2628
if (!isDateLike(raw)) {
2729
throw new Error(`Invalid graphql date input: '${raw}'`);
@@ -313,11 +315,17 @@ const buildCacheDefinition = () => {
313315
keyFields: ['netexId', 'version'],
314316
},
315317
...Object.fromEntries(
316-
versionedTiamatEntities.map((name) => [
318+
typesWithVersion.map((name) => [
317319
name,
318-
{ keyFields: ['id', 'version'] },
320+
{ keyFields: ['id', 'version'], merge: true },
319321
]),
320322
),
323+
...Object.fromEntries(
324+
typesWithId.map((name) => [name, { keyFields: ['id'], merge: true }]),
325+
),
326+
...Object.fromEntries(
327+
embeddedTypes.map((name) => [name, { keyFields: false, merge: true }]),
328+
),
321329
},
322330
});
323331

0 commit comments

Comments
 (0)