@lde/pipeline-void 0.2.34 → 0.2.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/uriSpaceExecutor.d.ts +18 -0
- package/dist/uriSpaceExecutor.d.ts.map +1 -0
- package/dist/uriSpaceExecutor.js +81 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACpD,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACpD,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Dataset, Distribution } from '@lde/dataset';
|
|
2
|
+
import { NotSupported, type Executor, type ExecuteOptions } from '@lde/pipeline';
|
|
3
|
+
import type { Quad } from '@rdfjs/types';
|
|
4
|
+
/**
|
|
5
|
+
* Executor decorator that consumes `void:Linkset` quads from the inner executor,
|
|
6
|
+
* matches each `void:objectsTarget` against configured URI spaces using `startsWith`,
|
|
7
|
+
* aggregates triple counts per matched space, and emits filtered `void:Linkset` quads.
|
|
8
|
+
*
|
|
9
|
+
* Inner quads are consumed and replaced with aggregated output — unmatched URI spaces
|
|
10
|
+
* are discarded.
|
|
11
|
+
*/
|
|
12
|
+
export declare class UriSpaceExecutor implements Executor {
|
|
13
|
+
private readonly inner;
|
|
14
|
+
private readonly uriSpaces;
|
|
15
|
+
constructor(inner: Executor, uriSpaces: ReadonlyMap<string, readonly Quad[]>);
|
|
16
|
+
execute(dataset: Dataset, distribution: Distribution, options?: ExecuteOptions): Promise<AsyncIterable<Quad> | NotSupported>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=uriSpaceExecutor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uriSpaceExecutor.d.ts","sourceRoot":"","sources":["../src/uriSpaceExecutor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EACL,YAAY,EACZ,KAAK,QAAQ,EACb,KAAK,cAAc,EACpB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAgBzC;;;;;;;GAOG;AACH,qBAAa,gBAAiB,YAAW,QAAQ;IAE7C,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBADT,KAAK,EAAE,QAAQ,EACf,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE,CAAC;IAG5D,OAAO,CACX,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,YAAY,EAC1B,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC;CAO/C"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { NotSupported, } from '@lde/pipeline';
|
|
2
|
+
import { DataFactory } from 'n3';
|
|
3
|
+
const { namedNode, quad, literal, blankNode } = DataFactory;
|
|
4
|
+
const RDF = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
|
|
5
|
+
const VOID = 'http://rdfs.org/ns/void#';
|
|
6
|
+
const XSD = 'http://www.w3.org/2001/XMLSchema#';
|
|
7
|
+
const rdfType = namedNode(`${RDF}type`);
|
|
8
|
+
const voidLinkset = namedNode(`${VOID}Linkset`);
|
|
9
|
+
const voidSubjectsTarget = namedNode(`${VOID}subjectsTarget`);
|
|
10
|
+
const voidObjectsTarget = namedNode(`${VOID}objectsTarget`);
|
|
11
|
+
const voidTriples = namedNode(`${VOID}triples`);
|
|
12
|
+
const xsdInteger = namedNode(`${XSD}integer`);
|
|
13
|
+
/**
|
|
14
|
+
* Executor decorator that consumes `void:Linkset` quads from the inner executor,
|
|
15
|
+
* matches each `void:objectsTarget` against configured URI spaces using `startsWith`,
|
|
16
|
+
* aggregates triple counts per matched space, and emits filtered `void:Linkset` quads.
|
|
17
|
+
*
|
|
18
|
+
* Inner quads are consumed and replaced with aggregated output — unmatched URI spaces
|
|
19
|
+
* are discarded.
|
|
20
|
+
*/
|
|
21
|
+
export class UriSpaceExecutor {
|
|
22
|
+
inner;
|
|
23
|
+
uriSpaces;
|
|
24
|
+
constructor(inner, uriSpaces) {
|
|
25
|
+
this.inner = inner;
|
|
26
|
+
this.uriSpaces = uriSpaces;
|
|
27
|
+
}
|
|
28
|
+
async execute(dataset, distribution, options) {
|
|
29
|
+
const result = await this.inner.execute(dataset, distribution, options);
|
|
30
|
+
if (result instanceof NotSupported) {
|
|
31
|
+
return result;
|
|
32
|
+
}
|
|
33
|
+
return withUriSpaces(result, dataset.iri.toString(), this.uriSpaces);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
async function* withUriSpaces(quads, datasetIri, uriSpaces) {
|
|
37
|
+
// Group inner quads by subject (each subject = one Linkset).
|
|
38
|
+
const linksets = new Map();
|
|
39
|
+
for await (const q of quads) {
|
|
40
|
+
let group = linksets.get(q.subject.value);
|
|
41
|
+
if (group === undefined) {
|
|
42
|
+
group = [];
|
|
43
|
+
linksets.set(q.subject.value, group);
|
|
44
|
+
}
|
|
45
|
+
group.push(q);
|
|
46
|
+
}
|
|
47
|
+
// Extract objectsTarget and triples count per Linkset,
|
|
48
|
+
// match against configured URI spaces, and aggregate counts.
|
|
49
|
+
const aggregated = new Map();
|
|
50
|
+
for (const group of linksets.values()) {
|
|
51
|
+
const objectsTarget = group.find((q) => q.predicate.equals(voidObjectsTarget))?.object.value;
|
|
52
|
+
const triplesValue = group.find((q) => q.predicate.equals(voidTriples))
|
|
53
|
+
?.object.value;
|
|
54
|
+
if (objectsTarget === undefined || triplesValue === undefined)
|
|
55
|
+
continue;
|
|
56
|
+
const count = parseInt(triplesValue, 10);
|
|
57
|
+
for (const [uriSpace, metadata] of uriSpaces) {
|
|
58
|
+
if (objectsTarget.startsWith(uriSpace)) {
|
|
59
|
+
const existing = aggregated.get(uriSpace);
|
|
60
|
+
aggregated.set(uriSpace, {
|
|
61
|
+
count: (existing?.count ?? 0) + count,
|
|
62
|
+
metadata,
|
|
63
|
+
});
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Emit aggregated Linkset quads.
|
|
69
|
+
const datasetNode = namedNode(datasetIri);
|
|
70
|
+
for (const [uriSpace, { count, metadata }] of aggregated) {
|
|
71
|
+
const linksetNode = blankNode();
|
|
72
|
+
const uriSpaceNode = namedNode(uriSpace);
|
|
73
|
+
yield quad(linksetNode, rdfType, voidLinkset);
|
|
74
|
+
yield quad(linksetNode, voidSubjectsTarget, datasetNode);
|
|
75
|
+
yield quad(linksetNode, voidObjectsTarget, uriSpaceNode);
|
|
76
|
+
yield quad(linksetNode, voidTriples, literal(count.toString(), xsdInteger));
|
|
77
|
+
for (const metadataQuad of metadata) {
|
|
78
|
+
yield metadataQuad;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
package/package.json
CHANGED