Skip to content

Commit f35bbc0

Browse files
committed
Fix prepareLabels and unstable entity type order in SparqlDataProvider:
* Fix `prepareLabels` option for `SparqlDataProvider` to be applied for `knownElementTypes()`, `knownLinkTypes()`, `elementTypes()`, `linkTypes()`, `propertyTypes()` and `elements`. * Always sort entity types returned from `SparqlDataProvider.elements()`. * Add tests for basic `SparqlDataProvider` functionality and label/image options. * Add `@comunica/query-sparql-rdfjs-lite` to `devDependencies` (for tests): - Enable `skipLibCheck` to avoid type errors in `node_modules/rdf-parse/node_modules/lru-cache/dist/esm/index.d.ts`.
1 parent 9eac30f commit f35bbc0

11 files changed

Lines changed: 10758 additions & 3441 deletions

package-lock.json

Lines changed: 10058 additions & 3402 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
"react-dom": "^17.0.2 || ^18 || ^19"
5252
},
5353
"devDependencies": {
54+
"@comunica/query-sparql-rdfjs-lite": "^5.1.3",
5455
"@eslint/js": "^9.39.1",
5556
"@rdfjs/types": "^2.0.1",
5657
"@types/d3-color": "^3.1.3",

src/data/rdf/rdfModel.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@ export type BlankNode = RdfJs.BlankNode;
99
export type Literal = RdfJs.Literal;
1010
export type Variable = RdfJs.Variable;
1111
export type DefaultGraph = RdfJs.DefaultGraph;
12+
export type BaseQuad = RdfJs.BaseQuad;
1213
export type Quad = RdfJs.Quad;
1314

14-
export type Term = NamedNode | BlankNode | Literal | Variable | DefaultGraph | Quad;
15+
export type Term = NamedNode | BlankNode | Literal | Variable | DefaultGraph | BaseQuad;
1516
export type DataFactory = RdfJs.DataFactory;
1617

1718
export const DefaultDataFactory: RdfJs.DataFactory = N3.DataFactory;

src/data/sparql/responseHandler.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,10 @@ export function getElementsInfo(
250250
}
251251
}
252252

253+
for (const instance of instances.values()) {
254+
instance.types.sort();
255+
}
256+
253257
return instances;
254258
}
255259

src/data/sparql/sparqlDataProvider.ts

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ export class SparqlDataProvider implements DataProvider {
317317
}
318318

319319
if (this.options.prepareLabels) {
320-
await attachLabels(properties.values(), this.options.prepareLabels, signal);
320+
await attachLabels(Array.from(properties.values()), this.options.prepareLabels, signal);
321321
}
322322

323323
return properties;
@@ -349,7 +349,7 @@ export class SparqlDataProvider implements DataProvider {
349349
}
350350

351351
if (this.options.prepareLabels) {
352-
await attachLabels(classes.values(), this.options.prepareLabels, signal);
352+
await attachLabels(Array.from(classes.values()), this.options.prepareLabels, signal);
353353
}
354354

355355
return classes;
@@ -381,7 +381,7 @@ export class SparqlDataProvider implements DataProvider {
381381
}
382382

383383
if (this.options.prepareLabels) {
384-
await attachLabels(linkTypes.values(), this.options.prepareLabels, signal);
384+
await attachLabels(Array.from(linkTypes.values()), this.options.prepareLabels, signal);
385385
}
386386

387387
return linkTypes;
@@ -407,7 +407,7 @@ export class SparqlDataProvider implements DataProvider {
407407
const linkTypes = getLinkTypes(result);
408408

409409
if (this.options.prepareLabels) {
410-
await attachLabels(linkTypes.values(), this.options.prepareLabels, signal);
410+
await attachLabels(Array.from(linkTypes.values()), this.options.prepareLabels, signal);
411411
}
412412

413413
return Array.from(linkTypes.values());
@@ -454,7 +454,7 @@ export class SparqlDataProvider implements DataProvider {
454454

455455
if (this.options.prepareLabels) {
456456
await attachProperties(
457-
elementModels.values(),
457+
Array.from(elementModels.values()),
458458
this.options.prepareLabels,
459459
this.labelPredicate,
460460
signal
@@ -1063,11 +1063,11 @@ interface LabeledItem {
10631063
}
10641064

10651065
async function attachLabels(
1066-
items: Iterable<LabeledItem>,
1066+
items: readonly LabeledItem[],
10671067
fetchLabels: NonNullable<SparqlDataProviderOptions['prepareLabels']>,
10681068
signal: AbortSignal | undefined
10691069
): Promise<void> {
1070-
const resources = new Set<string>(Array.from(items, item => item.id));
1070+
const resources = new Set(items.map(item => item.id));
10711071
const labels = await fetchLabels(resources, signal);
10721072
for (const item of items) {
10731073
const itemLabels = labels.get(item.id);
@@ -1080,19 +1080,17 @@ async function attachLabels(
10801080
type MutableProperties = Record<PropertyTypeIri, Array<Rdf.NamedNode | Rdf.Literal>>;
10811081

10821082
async function attachProperties(
1083-
items: Iterable<ElementModel>,
1083+
items: readonly ElementModel[],
10841084
fetchProperties: NonNullable<SparqlDataProviderOptions['prepareLabels']>,
10851085
propertyIri: PropertyTypeIri,
10861086
signal: AbortSignal | undefined
10871087
) {
1088-
const resources = new Set<string>(Array.from(items, item => item.id));
1088+
const resources = new Set(items.map(item => item.id));
10891089
const properties = await fetchProperties(resources, signal);
10901090
for (const item of items) {
10911091
const itemValues = properties.get(item.id);
10921092
if (itemValues) {
1093-
for (const value of itemValues) {
1094-
appendProperty(item.properties as MutableProperties, propertyIri, value);
1095-
}
1093+
(item.properties as MutableProperties)[propertyIri] = itemValues;
10961094
}
10971095
}
10981096
}

test/data/indexedDbCachedProvider.test.ts

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@ import { expect, describe, it, vi } from 'vitest';
22

33
import { IndexedDbCachedProvider } from '../../src/data/indexedDb/indexedDbCachedProvider';
44
import type {
5-
ElementIri, ElementTypeIri, LinkModel, LinkTypeIri, PropertyTypeIri,
5+
ElementIri, ElementTypeIri, LinkTypeIri, PropertyTypeIri,
66
} from '../../src/data/model';
77
import {
88
MockDataProvider, element, elementType, linkType, propertyType, missing,
99
} from '../mock/mockDataProvider';
10+
import { compareLinks } from '../utilities/dataCompare';
1011

1112
describe('IndexedDbCachedProvider', () => {
1213
it('caches data once for known element/link types', async () => {
@@ -498,28 +499,3 @@ describe('IndexedDbCachedProvider', () => {
498499
}
499500
});
500501
});
501-
502-
function compareLinks(a: LinkModel, b: LinkModel): number {
503-
let result = (
504-
a.sourceId < b.sourceId ? -1 :
505-
a.sourceId > b.sourceId ? 1 :
506-
0
507-
);
508-
if (result !== 0) {
509-
return result;
510-
}
511-
result = (
512-
a.targetId < b.targetId ? -1 :
513-
a.targetId > b.targetId ? 1 :
514-
0
515-
);
516-
if (result !== 0) {
517-
return result;
518-
}
519-
result = (
520-
a.linkTypeId < b.linkTypeId ? -1 :
521-
a.linkTypeId > b.linkTypeId ? 1 :
522-
0
523-
);
524-
return result;
525-
}

0 commit comments

Comments
 (0)