@lde/pipeline 0.11.0 → 0.13.0
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/distribution/importResolver.d.ts.map +1 -1
- package/dist/distribution/importResolver.js +2 -1
- package/dist/distribution/resolver.d.ts +3 -1
- package/dist/distribution/resolver.d.ts.map +1 -1
- package/dist/distribution/resolver.js +5 -1
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +37 -15
- package/dist/progressReporter.d.ts +21 -10
- package/dist/progressReporter.d.ts.map +1 -1
- package/dist/sparql/executor.d.ts.map +1 -1
- package/dist/sparql/executor.js +5 -4
- package/dist/sparql/graph.d.ts +2 -2
- package/dist/sparql/graph.d.ts.map +1 -1
- package/dist/sparql/graph.js +3 -2
- package/dist/sparql/selector.d.ts.map +1 -1
- package/dist/sparql/selector.js +15 -7
- package/dist/sparql/values.d.ts +4 -5
- package/dist/sparql/values.d.ts.map +1 -1
- package/dist/sparql/values.js +12 -8
- package/package.json +4 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"importResolver.d.ts","sourceRoot":"","sources":["../../src/distribution/importResolver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EACL,KAAK,oBAAoB,EACzB,uBAAuB,EACvB,oBAAoB,EACrB,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED;;;;;;GAMG;AACH,qBAAa,cAAe,YAAW,oBAAoB;IAEvD,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBADP,KAAK,EAAE,oBAAoB,EAC3B,OAAO,EAAE,qBAAqB;IAG3C,OAAO,CACX,GAAG,IAAI,EAAE,UAAU,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,GACnD,OAAO,CAAC,oBAAoB,GAAG,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"importResolver.d.ts","sourceRoot":"","sources":["../../src/distribution/importResolver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EACL,KAAK,oBAAoB,EACzB,uBAAuB,EACvB,oBAAoB,EACrB,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED;;;;;;GAMG;AACH,qBAAa,cAAe,YAAW,oBAAoB;IAEvD,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBADP,KAAK,EAAE,oBAAoB,EAC3B,OAAO,EAAE,qBAAqB;IAG3C,OAAO,CACX,GAAG,IAAI,EAAE,UAAU,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,GACnD,OAAO,CAAC,oBAAoB,GAAG,uBAAuB,CAAC;IAiCpD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
|
|
@@ -20,12 +20,13 @@ export class ImportResolver {
|
|
|
20
20
|
if (result instanceof ResolvedDistribution)
|
|
21
21
|
return result;
|
|
22
22
|
const [dataset] = args;
|
|
23
|
+
const importStart = Date.now();
|
|
23
24
|
const importResult = await this.options.importer.import(dataset);
|
|
24
25
|
if (importResult instanceof ImportSuccessful) {
|
|
25
26
|
await this.options.server.start();
|
|
26
27
|
const distribution = Distribution.sparql(this.options.server.queryEndpoint, importResult.identifier);
|
|
27
28
|
distribution.subjectFilter = importResult.distribution.subjectFilter;
|
|
28
|
-
return new ResolvedDistribution(distribution, result.probeResults);
|
|
29
|
+
return new ResolvedDistribution(distribution, result.probeResults, importResult.distribution, Date.now() - importStart);
|
|
29
30
|
}
|
|
30
31
|
return new NoDistributionAvailable(dataset, 'No SPARQL endpoint or importable data dump available', result.probeResults, importResult instanceof ImportFailed ? importResult : undefined);
|
|
31
32
|
}
|
|
@@ -4,7 +4,9 @@ import { type ProbeResultType } from './probe.js';
|
|
|
4
4
|
export declare class ResolvedDistribution {
|
|
5
5
|
readonly distribution: Distribution;
|
|
6
6
|
readonly probeResults: ProbeResultType[];
|
|
7
|
-
|
|
7
|
+
readonly importedFrom?: Distribution | undefined;
|
|
8
|
+
readonly importDuration?: number | undefined;
|
|
9
|
+
constructor(distribution: Distribution, probeResults: ProbeResultType[], importedFrom?: Distribution | undefined, importDuration?: number | undefined);
|
|
8
10
|
}
|
|
9
11
|
export declare class NoDistributionAvailable {
|
|
10
12
|
readonly dataset: Dataset;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/distribution/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAA4B,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAE5E,qBAAa,oBAAoB;IAE7B,QAAQ,CAAC,YAAY,EAAE,YAAY;IACnC,QAAQ,CAAC,YAAY,EAAE,eAAe,EAAE;
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/distribution/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAA4B,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAE5E,qBAAa,oBAAoB;IAE7B,QAAQ,CAAC,YAAY,EAAE,YAAY;IACnC,QAAQ,CAAC,YAAY,EAAE,eAAe,EAAE;IACxC,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY;IACpC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM;gBAHvB,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,eAAe,EAAE,EAC/B,YAAY,CAAC,EAAE,YAAY,YAAA,EAC3B,cAAc,CAAC,EAAE,MAAM,YAAA;CAEnC;AAED,qBAAa,uBAAuB;IAEhC,QAAQ,CAAC,OAAO,EAAE,OAAO;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM;IACxB,QAAQ,CAAC,YAAY,EAAE,eAAe,EAAE;IACxC,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY;gBAH3B,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,eAAe,EAAE,EAC/B,YAAY,CAAC,EAAE,YAAY,YAAA;CAEvC;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CACL,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,oBAAoB,GAAG,uBAAuB,CAAC,CAAC;IAC3D,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,iCAAiC;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;GAQG;AACH,qBAAa,0BAA2B,YAAW,oBAAoB;IACrE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,CAAC,EAAE,iCAAiC;IAIjD,OAAO,CACX,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,oBAAoB,GAAG,uBAAuB,CAAC;CA2B3D"}
|
|
@@ -2,9 +2,13 @@ import { probe, SparqlProbeResult } from './probe.js';
|
|
|
2
2
|
export class ResolvedDistribution {
|
|
3
3
|
distribution;
|
|
4
4
|
probeResults;
|
|
5
|
-
|
|
5
|
+
importedFrom;
|
|
6
|
+
importDuration;
|
|
7
|
+
constructor(distribution, probeResults, importedFrom, importDuration) {
|
|
6
8
|
this.distribution = distribution;
|
|
7
9
|
this.probeResults = probeResults;
|
|
10
|
+
this.importedFrom = importedFrom;
|
|
11
|
+
this.importDuration = importDuration;
|
|
8
12
|
}
|
|
9
13
|
}
|
|
10
14
|
export class NoDistributionAvailable {
|
package/dist/pipeline.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,EACL,KAAK,oBAAoB,EAE1B,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,EACL,KAAK,oBAAoB,EAE1B,MAAM,4BAA4B,CAAC;AAQpC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EAEV,gBAAgB,EACjB,MAAM,uBAAuB,CAAC;AAE/B,wDAAwD;AACxD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,gBAAgB,CAAC,EAAE,aAAa,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,eAAe,CAAC;IACjC,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC3B,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,QAAQ,CAAC,EAAE;QACT,mBAAmB,EAAE,mBAAmB,CAAC;QACzC,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B;AA8BD,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAuB;IAC5D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAA8B;IACxD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAmB;gBAEjC,OAAO,EAAE,eAAe;IAgC9B,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;YAaZ,cAAc;YA4Cd,QAAQ;YA8BR,QAAQ;YAmDR,eAAe;YAkCd,SAAS;CAUzB"}
|
package/dist/pipeline.js
CHANGED
|
@@ -3,6 +3,7 @@ import { StreamParser } from 'n3';
|
|
|
3
3
|
import { FileWriter } from './writer/fileWriter.js';
|
|
4
4
|
import { NoDistributionAvailable, } from './distribution/resolver.js';
|
|
5
5
|
import { SparqlDistributionResolver } from './distribution/index.js';
|
|
6
|
+
import { NetworkError, SparqlProbeResult, } from './distribution/probe.js';
|
|
6
7
|
import { NotSupported } from './sparql/executor.js';
|
|
7
8
|
class FanOutWriter {
|
|
8
9
|
writers;
|
|
@@ -65,21 +66,22 @@ export class Pipeline {
|
|
|
65
66
|
}
|
|
66
67
|
async run() {
|
|
67
68
|
const start = Date.now();
|
|
68
|
-
this.reporter?.pipelineStart(this.name);
|
|
69
|
+
this.reporter?.pipelineStart?.(this.name);
|
|
69
70
|
const datasets = await this.datasetSelector.select();
|
|
70
71
|
for await (const dataset of datasets) {
|
|
71
72
|
await this.processDataset(dataset);
|
|
72
73
|
}
|
|
73
|
-
this.reporter?.pipelineComplete({ duration: Date.now() - start });
|
|
74
|
+
this.reporter?.pipelineComplete?.({ duration: Date.now() - start });
|
|
74
75
|
}
|
|
75
76
|
async processDataset(dataset) {
|
|
76
|
-
|
|
77
|
-
this.reporter?.datasetStart(datasetIri);
|
|
77
|
+
this.reporter?.datasetStart?.(dataset);
|
|
78
78
|
const resolved = await this.distributionResolver.resolve(dataset);
|
|
79
|
+
this.reporter?.distributionsAnalyzed?.(dataset, mapProbeResults(dataset, resolved.probeResults));
|
|
79
80
|
if (resolved instanceof NoDistributionAvailable) {
|
|
80
|
-
this.reporter?.datasetSkipped(
|
|
81
|
+
this.reporter?.datasetSkipped?.(dataset, resolved.message);
|
|
81
82
|
return;
|
|
82
83
|
}
|
|
84
|
+
this.reporter?.distributionSelected?.(dataset, resolved.distribution, resolved.importedFrom, resolved.importDuration);
|
|
83
85
|
try {
|
|
84
86
|
for (const stage of this.stages) {
|
|
85
87
|
try {
|
|
@@ -91,17 +93,17 @@ export class Pipeline {
|
|
|
91
93
|
}
|
|
92
94
|
}
|
|
93
95
|
catch (error) {
|
|
94
|
-
this.reporter?.stageFailed(stage.name, error instanceof Error ? error : new Error(String(error)));
|
|
96
|
+
this.reporter?.stageFailed?.(stage.name, error instanceof Error ? error : new Error(String(error)));
|
|
95
97
|
}
|
|
96
98
|
}
|
|
97
99
|
}
|
|
98
100
|
finally {
|
|
99
101
|
await this.distributionResolver.cleanup?.();
|
|
100
102
|
}
|
|
101
|
-
this.reporter?.datasetComplete(
|
|
103
|
+
this.reporter?.datasetComplete?.(dataset);
|
|
102
104
|
}
|
|
103
105
|
async runStage(dataset, distribution, stage) {
|
|
104
|
-
this.reporter?.stageStart(stage.name);
|
|
106
|
+
this.reporter?.stageStart?.(stage.name);
|
|
105
107
|
const stageStart = Date.now();
|
|
106
108
|
let elementsProcessed = 0;
|
|
107
109
|
let quadsGenerated = 0;
|
|
@@ -109,14 +111,14 @@ export class Pipeline {
|
|
|
109
111
|
onProgress: (elements, quads) => {
|
|
110
112
|
elementsProcessed = elements;
|
|
111
113
|
quadsGenerated = quads;
|
|
112
|
-
this.reporter?.stageProgress({ elementsProcessed, quadsGenerated });
|
|
114
|
+
this.reporter?.stageProgress?.({ elementsProcessed, quadsGenerated });
|
|
113
115
|
},
|
|
114
116
|
});
|
|
115
117
|
if (result instanceof NotSupported) {
|
|
116
|
-
this.reporter?.stageSkipped(stage.name, result.message);
|
|
118
|
+
this.reporter?.stageSkipped?.(stage.name, result.message);
|
|
117
119
|
}
|
|
118
120
|
else {
|
|
119
|
-
this.reporter?.stageComplete(stage.name, {
|
|
121
|
+
this.reporter?.stageComplete?.(stage.name, {
|
|
120
122
|
elementsProcessed,
|
|
121
123
|
quadsGenerated,
|
|
122
124
|
duration: Date.now() - stageStart,
|
|
@@ -156,7 +158,7 @@ export class Pipeline {
|
|
|
156
158
|
}
|
|
157
159
|
}
|
|
158
160
|
async runChainedStage(dataset, distribution, stage, stageWriter) {
|
|
159
|
-
this.reporter?.stageStart(stage.name);
|
|
161
|
+
this.reporter?.stageStart?.(stage.name);
|
|
160
162
|
const stageStart = Date.now();
|
|
161
163
|
let elementsProcessed = 0;
|
|
162
164
|
let quadsGenerated = 0;
|
|
@@ -164,14 +166,14 @@ export class Pipeline {
|
|
|
164
166
|
onProgress: (elements, quads) => {
|
|
165
167
|
elementsProcessed = elements;
|
|
166
168
|
quadsGenerated = quads;
|
|
167
|
-
this.reporter?.stageProgress({ elementsProcessed, quadsGenerated });
|
|
169
|
+
this.reporter?.stageProgress?.({ elementsProcessed, quadsGenerated });
|
|
168
170
|
},
|
|
169
171
|
});
|
|
170
172
|
if (result instanceof NotSupported) {
|
|
171
|
-
this.reporter?.stageSkipped(stage.name, result.message);
|
|
173
|
+
this.reporter?.stageSkipped?.(stage.name, result.message);
|
|
172
174
|
throw new Error(`Stage '${stage.name}' returned NotSupported in chained mode`);
|
|
173
175
|
}
|
|
174
|
-
this.reporter?.stageComplete(stage.name, {
|
|
176
|
+
this.reporter?.stageComplete?.(stage.name, {
|
|
175
177
|
elementsProcessed,
|
|
176
178
|
quadsGenerated,
|
|
177
179
|
duration: Date.now() - stageStart,
|
|
@@ -188,3 +190,23 @@ export class Pipeline {
|
|
|
188
190
|
}
|
|
189
191
|
}
|
|
190
192
|
}
|
|
193
|
+
function mapProbeResults(dataset, probeResults) {
|
|
194
|
+
return probeResults.map((result, index) => {
|
|
195
|
+
if (result instanceof NetworkError) {
|
|
196
|
+
return {
|
|
197
|
+
distribution: dataset.distributions[index],
|
|
198
|
+
type: 'network-error',
|
|
199
|
+
available: false,
|
|
200
|
+
error: result.message,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
return {
|
|
204
|
+
distribution: dataset.distributions[index],
|
|
205
|
+
type: result instanceof SparqlProbeResult
|
|
206
|
+
? 'sparql'
|
|
207
|
+
: 'data-dump',
|
|
208
|
+
available: result.isSuccess(),
|
|
209
|
+
statusCode: result.statusCode,
|
|
210
|
+
};
|
|
211
|
+
});
|
|
212
|
+
}
|
|
@@ -1,21 +1,32 @@
|
|
|
1
|
+
import type { Dataset, Distribution } from '@lde/dataset';
|
|
2
|
+
export interface DistributionAnalysisResult {
|
|
3
|
+
distribution: Distribution;
|
|
4
|
+
type: 'sparql' | 'data-dump' | 'network-error';
|
|
5
|
+
available: boolean;
|
|
6
|
+
statusCode?: number;
|
|
7
|
+
error?: string;
|
|
8
|
+
}
|
|
1
9
|
export interface ProgressReporter {
|
|
2
|
-
pipelineStart(name: string): void;
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
10
|
+
pipelineStart?(name: string): void;
|
|
11
|
+
datasetsSelected?(count: number): void;
|
|
12
|
+
datasetStart?(dataset: Dataset): void;
|
|
13
|
+
distributionsAnalyzed?(dataset: Dataset, results: DistributionAnalysisResult[]): void;
|
|
14
|
+
distributionSelected?(dataset: Dataset, distribution: Distribution, importedFrom?: Distribution, importDuration?: number): void;
|
|
15
|
+
stageStart?(stage: string): void;
|
|
16
|
+
stageProgress?(update: {
|
|
6
17
|
elementsProcessed: number;
|
|
7
18
|
quadsGenerated: number;
|
|
8
19
|
}): void;
|
|
9
|
-
stageComplete(stage: string, result: {
|
|
20
|
+
stageComplete?(stage: string, result: {
|
|
10
21
|
elementsProcessed: number;
|
|
11
22
|
quadsGenerated: number;
|
|
12
23
|
duration: number;
|
|
13
24
|
}): void;
|
|
14
|
-
stageFailed(stage: string, error: Error): void;
|
|
15
|
-
stageSkipped(stage: string, reason: string): void;
|
|
16
|
-
datasetComplete(dataset:
|
|
17
|
-
datasetSkipped(dataset:
|
|
18
|
-
pipelineComplete(result: {
|
|
25
|
+
stageFailed?(stage: string, error: Error): void;
|
|
26
|
+
stageSkipped?(stage: string, reason: string): void;
|
|
27
|
+
datasetComplete?(dataset: Dataset): void;
|
|
28
|
+
datasetSkipped?(dataset: Dataset, reason: string): void;
|
|
29
|
+
pipelineComplete?(result: {
|
|
19
30
|
duration: number;
|
|
20
31
|
}): void;
|
|
21
32
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"progressReporter.d.ts","sourceRoot":"","sources":["../src/progressReporter.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"progressReporter.d.ts","sourceRoot":"","sources":["../src/progressReporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE1D,MAAM,WAAW,0BAA0B;IACzC,YAAY,EAAE,YAAY,CAAC;IAC3B,IAAI,EAAE,QAAQ,GAAG,WAAW,GAAG,eAAe,CAAC;IAC/C,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,aAAa,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,gBAAgB,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,YAAY,CAAC,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACtC,qBAAqB,CAAC,CACpB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,0BAA0B,EAAE,GACpC,IAAI,CAAC;IACR,oBAAoB,CAAC,CACnB,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,YAAY,EAC1B,YAAY,CAAC,EAAE,YAAY,EAC3B,cAAc,CAAC,EAAE,MAAM,GACtB,IAAI,CAAC;IACR,UAAU,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,aAAa,CAAC,CAAC,MAAM,EAAE;QACrB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,cAAc,EAAE,MAAM,CAAC;KACxB,GAAG,IAAI,CAAC;IACT,aAAa,CAAC,CACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE;QACN,iBAAiB,EAAE,MAAM,CAAC;QAC1B,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC;KAClB,GACA,IAAI,CAAC;IACR,WAAW,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAChD,YAAY,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACnD,eAAe,CAAC,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACzC,cAAc,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACxD,gBAAgB,CAAC,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACvD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/sparql/executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/sparql/executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AASpD;;GAEG;AACH,qBAAa,YAAY;aACK,OAAO,EAAE,MAAM;gBAAf,OAAO,EAAE,MAAM;CAC5C;AAED,qEAAqE;AACrE,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAEzD,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,CACL,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,YAAY,EAC1B,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;CAChD;AAED;;GAEG;AACH,MAAM,WAAW,8BAA8B;IAC7C;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,OAAO,CAAC,EAAE,qBAAqB,CAAC;CACjC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,uBAAwB,YAAW,QAAQ;IACtD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAiB;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmB;gBAEjC,OAAO,EAAE,8BAA8B;IAkBnD;;;;;;;OAOG;IACG,OAAO,CACX,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,YAAY,EAC1B,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAiC/B;;;;;OAKG;WACiB,QAAQ,CAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,IAAI,CAAC,8BAA8B,EAAE,OAAO,CAAC,GACtD,OAAO,CAAC,uBAAuB,CAAC;CAIpC;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAErE"}
|
package/dist/sparql/executor.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { SparqlEndpointFetcher } from 'fetch-sparql-endpoint';
|
|
2
2
|
import { readFile } from 'node:fs/promises';
|
|
3
3
|
import { resolve } from 'node:path';
|
|
4
|
-
import {
|
|
4
|
+
import { Parser } from '@traqula/parser-sparql-1-1';
|
|
5
|
+
import { Generator } from '@traqula/generator-sparql-1-1';
|
|
5
6
|
import { withDefaultGraph } from './graph.js';
|
|
6
7
|
import { injectValues } from './values.js';
|
|
7
8
|
/**
|
|
@@ -49,7 +50,7 @@ export class SparqlConstructExecutor {
|
|
|
49
50
|
this.rawQuery = options.query;
|
|
50
51
|
if (!options.query.includes('#subjectFilter#')) {
|
|
51
52
|
const parsed = new Parser().parse(options.query);
|
|
52
|
-
if (parsed.type !== 'query' || parsed.
|
|
53
|
+
if (parsed.type !== 'query' || parsed.subType !== 'construct') {
|
|
53
54
|
throw new Error('Query must be a CONSTRUCT query');
|
|
54
55
|
}
|
|
55
56
|
this.preParsed = parsed;
|
|
@@ -77,7 +78,7 @@ export class SparqlConstructExecutor {
|
|
|
77
78
|
else {
|
|
78
79
|
const substituted = this.rawQuery.replace('#subjectFilter#', distribution.subjectFilter ?? '');
|
|
79
80
|
const parsed = new Parser().parse(substituted);
|
|
80
|
-
if (parsed.type !== 'query' || parsed.
|
|
81
|
+
if (parsed.type !== 'query' || parsed.subType !== 'construct') {
|
|
81
82
|
throw new Error('Query must be a CONSTRUCT query');
|
|
82
83
|
}
|
|
83
84
|
ast = parsed;
|
|
@@ -89,7 +90,7 @@ export class SparqlConstructExecutor {
|
|
|
89
90
|
if (bindings !== undefined && bindings.length > 0) {
|
|
90
91
|
ast = injectValues(ast, bindings);
|
|
91
92
|
}
|
|
92
|
-
let query = this.generator.
|
|
93
|
+
let query = this.generator.generate(ast);
|
|
93
94
|
query = query.replaceAll('?dataset', `<${dataset.iri}>`);
|
|
94
95
|
return await this.fetcher.fetchTriples(endpoint.toString(), query);
|
|
95
96
|
}
|
package/dist/sparql/graph.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type QueryConstruct } from '@traqula/rules-sparql-1-1';
|
|
2
2
|
/**
|
|
3
3
|
* Set the default graph (FROM clause) on a parsed CONSTRUCT query.
|
|
4
4
|
*
|
|
5
5
|
* Mutates the query in place, replacing any existing FROM clause.
|
|
6
6
|
*/
|
|
7
|
-
export declare function withDefaultGraph(query:
|
|
7
|
+
export declare function withDefaultGraph(query: QueryConstruct, graphIri: string): void;
|
|
8
8
|
//# sourceMappingURL=graph.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/sparql/graph.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/sparql/graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAI5E;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,cAAc,EACrB,QAAQ,EAAE,MAAM,GACf,IAAI,CAKN"}
|
package/dist/sparql/graph.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { AstFactory } from '@traqula/rules-sparql-1-1';
|
|
2
|
+
const F = new AstFactory();
|
|
2
3
|
/**
|
|
3
4
|
* Set the default graph (FROM clause) on a parsed CONSTRUCT query.
|
|
4
5
|
*
|
|
5
6
|
* Mutates the query in place, replacing any existing FROM clause.
|
|
6
7
|
*/
|
|
7
8
|
export function withDefaultGraph(query, graphIri) {
|
|
8
|
-
query.
|
|
9
|
+
query.datasets = F.datasetClauses([{ clauseType: 'default', value: F.termNamed(F.gen(), graphIri) }], F.gen());
|
|
9
10
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selector.d.ts","sourceRoot":"","sources":["../../src/sparql/selector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAQ9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"selector.d.ts","sourceRoot":"","sources":["../../src/sparql/selector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAQ9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAMtD,MAAM,WAAW,yBAAyB;IACxC,4GAA4G;IAC5G,KAAK,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,OAAO,CAAC,EAAE,qBAAqB,CAAC;CACjC;AAED;;;;;;;;;GASG;AACH,qBAAa,kBAAmB,YAAW,YAAY;IACrD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;gBAEpC,OAAO,EAAE,yBAAyB;IAqBvC,MAAM,CACX,YAAY,EAAE,YAAY,GACzB,qBAAqB,CAAC,gBAAgB,CAAC;CAsC3C"}
|
package/dist/sparql/selector.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { SparqlEndpointFetcher } from 'fetch-sparql-endpoint';
|
|
2
|
-
import {
|
|
2
|
+
import { Parser } from '@traqula/parser-sparql-1-1';
|
|
3
|
+
import { Generator } from '@traqula/generator-sparql-1-1';
|
|
4
|
+
import { AstFactory, } from '@traqula/rules-sparql-1-1';
|
|
3
5
|
const parser = new Parser();
|
|
4
6
|
const generator = new Generator();
|
|
7
|
+
const F = new AstFactory();
|
|
5
8
|
/**
|
|
6
9
|
* {@link ItemSelector} that pages through SPARQL SELECT results,
|
|
7
10
|
* yielding all projected variable bindings (NamedNode values only) per row.
|
|
@@ -18,7 +21,7 @@ export class SparqlItemSelector {
|
|
|
18
21
|
fetcher;
|
|
19
22
|
constructor(options) {
|
|
20
23
|
const parsed = parser.parse(options.query);
|
|
21
|
-
if (parsed.type !== 'query' || parsed.
|
|
24
|
+
if (parsed.type !== 'query' || parsed.subType !== 'select') {
|
|
22
25
|
throw new Error('Query must be a SELECT query');
|
|
23
26
|
}
|
|
24
27
|
const variables = parsed.variables.filter(isVariableTerm);
|
|
@@ -26,16 +29,18 @@ export class SparqlItemSelector {
|
|
|
26
29
|
throw new Error('Query must project at least one named variable (SELECT * is not supported)');
|
|
27
30
|
}
|
|
28
31
|
this.parsed = parsed;
|
|
29
|
-
this.pageSize =
|
|
32
|
+
this.pageSize =
|
|
33
|
+
options.pageSize ??
|
|
34
|
+
this.parsed.solutionModifiers.limitOffset?.limit ??
|
|
35
|
+
10;
|
|
30
36
|
this.fetcher = options.fetcher ?? new SparqlEndpointFetcher();
|
|
31
37
|
}
|
|
32
38
|
async *select(distribution) {
|
|
33
39
|
const endpoint = distribution.accessUrl;
|
|
34
40
|
let offset = 0;
|
|
35
41
|
while (true) {
|
|
36
|
-
this.parsed.
|
|
37
|
-
this.parsed
|
|
38
|
-
const paginatedQuery = generator.stringify(this.parsed);
|
|
42
|
+
this.parsed.solutionModifiers.limitOffset = F.solutionModifierLimitOffset(this.pageSize, offset, F.gen());
|
|
43
|
+
const paginatedQuery = generator.generate(this.parsed);
|
|
39
44
|
const stream = (await this.fetcher.fetchBindings(endpoint.toString(), paginatedQuery));
|
|
40
45
|
let pageSize = 0;
|
|
41
46
|
for await (const record of stream) {
|
|
@@ -53,5 +58,8 @@ export class SparqlItemSelector {
|
|
|
53
58
|
}
|
|
54
59
|
}
|
|
55
60
|
function isVariableTerm(v) {
|
|
56
|
-
return '
|
|
61
|
+
return ('type' in v &&
|
|
62
|
+
v.type === 'term' &&
|
|
63
|
+
'subType' in v &&
|
|
64
|
+
v.subType === 'variable');
|
|
57
65
|
}
|
package/dist/sparql/values.d.ts
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type QueryConstruct } from '@traqula/rules-sparql-1-1';
|
|
2
2
|
import type { VariableBindings } from './executor.js';
|
|
3
3
|
/**
|
|
4
4
|
* Inject a VALUES clause into a parsed CONSTRUCT query for the given binding rows.
|
|
5
5
|
*
|
|
6
|
-
* Each row's keys become
|
|
7
|
-
*
|
|
8
|
-
* query's WHERE patterns.
|
|
6
|
+
* Each row's keys become SPARQL variables; NamedNode values become IRIs in the
|
|
7
|
+
* VALUES block. The VALUES clause is prepended to the query's WHERE patterns.
|
|
9
8
|
*
|
|
10
9
|
* The caller owns parsing and stringifying; this function operates on the AST.
|
|
11
10
|
*/
|
|
12
|
-
export declare function injectValues(query:
|
|
11
|
+
export declare function injectValues(query: QueryConstruct, bindings: VariableBindings[]): QueryConstruct;
|
|
13
12
|
//# sourceMappingURL=values.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"values.d.ts","sourceRoot":"","sources":["../../src/sparql/values.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"values.d.ts","sourceRoot":"","sources":["../../src/sparql/values.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAItD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,cAAc,EACrB,QAAQ,EAAE,gBAAgB,EAAE,GAC3B,cAAc,CAoBhB"}
|
package/dist/sparql/values.js
CHANGED
|
@@ -1,19 +1,23 @@
|
|
|
1
|
+
import { AstFactory, } from '@traqula/rules-sparql-1-1';
|
|
2
|
+
const F = new AstFactory();
|
|
1
3
|
/**
|
|
2
4
|
* Inject a VALUES clause into a parsed CONSTRUCT query for the given binding rows.
|
|
3
5
|
*
|
|
4
|
-
* Each row's keys become
|
|
5
|
-
*
|
|
6
|
-
* query's WHERE patterns.
|
|
6
|
+
* Each row's keys become SPARQL variables; NamedNode values become IRIs in the
|
|
7
|
+
* VALUES block. The VALUES clause is prepended to the query's WHERE patterns.
|
|
7
8
|
*
|
|
8
9
|
* The caller owns parsing and stringifying; this function operates on the AST.
|
|
9
10
|
*/
|
|
10
11
|
export function injectValues(query, bindings) {
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
const variableNames = bindings.length > 0 ? Object.keys(bindings[0]) : [];
|
|
13
|
+
const variables = variableNames.map((name) => F.termVariable(name, F.gen()));
|
|
14
|
+
const values = bindings.map((row) => Object.fromEntries(Object.entries(row).map(([name, node]) => [
|
|
15
|
+
name,
|
|
16
|
+
F.termNamed(F.gen(), node.value),
|
|
17
|
+
])));
|
|
18
|
+
const valuesPattern = F.patternValues(variables, values, F.gen());
|
|
15
19
|
return {
|
|
16
20
|
...query,
|
|
17
|
-
where: [valuesPattern, ...
|
|
21
|
+
where: F.patternGroup([valuesPattern, ...query.where.patterns], F.gen()),
|
|
18
22
|
};
|
|
19
23
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lde/pipeline",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.0",
|
|
4
4
|
"repository": {
|
|
5
5
|
"url": "https://github.com/ldengine/lde",
|
|
6
6
|
"directory": "packages/pipeline"
|
|
@@ -28,13 +28,12 @@
|
|
|
28
28
|
"@lde/sparql-importer": "0.3.0",
|
|
29
29
|
"@lde/sparql-server": "0.4.10",
|
|
30
30
|
"@rdfjs/types": "^2.0.1",
|
|
31
|
+
"@traqula/generator-sparql-1-1": "^1.0.3",
|
|
32
|
+
"@traqula/parser-sparql-1-1": "^1.0.3",
|
|
33
|
+
"@traqula/rules-sparql-1-1": "^1.0.3",
|
|
31
34
|
"fetch-sparql-endpoint": "^7.1.0",
|
|
32
35
|
"filenamify-url": "^4.0.0",
|
|
33
36
|
"n3": "^2.0.1",
|
|
34
|
-
"sparqljs": "^3.7.4",
|
|
35
37
|
"tslib": "^2.3.0"
|
|
36
|
-
},
|
|
37
|
-
"devDependencies": {
|
|
38
|
-
"@types/sparqljs": "^3.1.12"
|
|
39
38
|
}
|
|
40
39
|
}
|