Skip to content

Commit

Permalink
rdflib-utils: queryRegistrationsForType returns instance containers
Browse files Browse the repository at this point in the history
  • Loading branch information
angelo-v committed Jul 10, 2024
1 parent dae54df commit cb4f02e
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 13 deletions.
55 changes: 52 additions & 3 deletions utils/rdflib/src/queries/TypeIndexQuery.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,40 @@ describe("TypeIndexQuery", () => {
});
});

it("combines instances from multiple type registrations for given class", () => {
it("returns all instance containers listed in the type registration for given class", () => {
const store = graph();

parse(
`
@prefix : <#>.
@prefix vcard: <http://www.w3.org/2006/vcard/ns#>.
@prefix solid: <http://www.w3.org/ns/solid/terms#>.
:registration-1 a solid:TypeRegistration ;
solid:forClass vcard:AddressBook ;
solid:instanceContainer <https://pod.test/alice/contacts/>, <https://pod.test/alice/address-books/> ;
.
`,
store,
"https://pod.test/alice/setting/publicTypeIndex.ttl",
);

const query = new TypeIndexQuery(
store,
sym("https://pod.test/alice/setting/publicTypeIndex.ttl"),
);
const result = query.queryRegistrationsForType(VCARD_ADDRESS_BOOK);
expect(result).toEqual({
instances: [],
instanceContainers: [
"https://pod.test/alice/contacts/",
"https://pod.test/alice/address-books/",
],
});
});

it("combines instances and containers from multiple type registrations for given class", () => {
// see https://github.com/solid/type-indexes/issues/32#issuecomment-2013540668
const store = graph();

Expand All @@ -203,6 +236,18 @@ describe("TypeIndexQuery", () => {
:registration-3 a solid:TypeRegistration ;
solid:forClass :SomeThingElse ;
solid:instance <https://pod.test/alice/something/else/index.ttl#this> .
:registration-4 a solid:TypeRegistration ;
solid:forClass vcard:AddressBook ;
solid:instanceContainer <https://pod.test/alice/contacts-container-1/> .
:registration-5 a solid:TypeRegistration ;
solid:forClass vcard:AddressBook ;
solid:instanceContainer <https://pod.test/alice/contacts-container-2/> .
:registration-6 a solid:TypeRegistration ;
solid:forClass :SomeThingElse ;
solid:instanceContainer <https://pod.test/alice/other-container/> .
`,
store,
Expand All @@ -219,7 +264,10 @@ describe("TypeIndexQuery", () => {
"https://pod.test/alice/contacts/1/index.ttl#this",
"https://pod.test/alice/contacts/2/index.ttl#this",
],
instanceContainers: [],
instanceContainers: [
"https://pod.test/alice/contacts-container-1/",
"https://pod.test/alice/contacts-container-2/",
],
});
});

Expand Down Expand Up @@ -253,6 +301,7 @@ describe("TypeIndexQuery", () => {
:registration-1 a solid:TypeRegistration ;
solid:forClass vcard:AddressBook ;
solid:instance <https://pod.test/alice/contacts/1/index.ttl#this>, <https://pod.test/alice/contacts/2/index.ttl#this> ;
solid:instanceContainer <https://pod.test/alice/contacts-container/> ;
.
`,
Expand All @@ -270,7 +319,7 @@ describe("TypeIndexQuery", () => {
"https://pod.test/alice/contacts/1/index.ttl#this",
"https://pod.test/alice/contacts/2/index.ttl#this",
],
instanceContainers: [],
instanceContainers: ["https://pod.test/alice/contacts-container/"],
});
});

Expand Down
36 changes: 26 additions & 10 deletions utils/rdflib/src/queries/TypeIndexQuery.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,12 @@ export class TypeIndexQuery {
return this.queryRegistrationsForType(type).instances;
}

private getInstanceValues(registration: NamedNode) {
private getValuesOf(
which: "instance" | "instanceContainer",
registration: NamedNode,
) {
return this.store
.each(registration, solid("instance"), null, this.typeIndexDoc)
.each(registration, solid(which), null, this.typeIndexDoc)
.map((it) => it.value);
}

Expand All @@ -32,13 +35,26 @@ export class TypeIndexQuery {
type,
this.typeIndexDoc,
);
const instances = registrations.flatMap((registration) => {
if (!isNamedNode(registration)) return [];
return this.getInstanceValues(registration as NamedNode);
});
return {
instances,
instanceContainers: [],
};
return registrations
.filter((it) => isNamedNode(it))
.map((registration: NamedNode) => {
return {
instances: this.getValuesOf("instance", registration),
instanceContainers: this.getValuesOf(
"instanceContainer",
registration,
),
};
})
.reduce(
(acc, current) => ({
instances: [...acc.instances, ...current.instances],
instanceContainers: [
...acc.instanceContainers,
...current.instanceContainers,
],
}),
{ instanceContainers: [], instances: [] },
);
}
}

0 comments on commit cb4f02e

Please sign in to comment.