@netwerk-digitaal-erfgoed/network-of-terms-query 1.0.1
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/README.md +3 -0
- package/build/catalog.d.ts +38 -0
- package/build/catalog.d.ts.map +1 -0
- package/build/catalog.js +43 -0
- package/build/catalog.js.map +1 -0
- package/build/distributions.d.ts +30 -0
- package/build/distributions.d.ts.map +1 -0
- package/build/distributions.js +47 -0
- package/build/distributions.js.map +1 -0
- package/build/helpers/logger-pino.d.ts +16 -0
- package/build/helpers/logger-pino.d.ts.map +1 -0
- package/build/helpers/logger-pino.js +32 -0
- package/build/helpers/logger-pino.js.map +1 -0
- package/build/helpers/logger.d.ts +8 -0
- package/build/helpers/logger.d.ts.map +1 -0
- package/build/helpers/logger.js +45 -0
- package/build/helpers/logger.js.map +1 -0
- package/build/index.d.ts +10 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +11 -0
- package/build/index.js.map +1 -0
- package/build/lookup/lookup.d.ts +27 -0
- package/build/lookup/lookup.d.ts.map +1 -0
- package/build/lookup/lookup.js +63 -0
- package/build/lookup/lookup.js.map +1 -0
- package/build/query.d.ts +36 -0
- package/build/query.d.ts.map +1 -0
- package/build/query.js +101 -0
- package/build/query.js.map +1 -0
- package/build/search/query-mode.d.ts +7 -0
- package/build/search/query-mode.d.ts.map +1 -0
- package/build/search/query-mode.js +43 -0
- package/build/search/query-mode.js.map +1 -0
- package/build/server-test.d.ts +4 -0
- package/build/server-test.d.ts.map +1 -0
- package/build/server-test.js +64 -0
- package/build/server-test.js.map +1 -0
- package/build/terms.d.ts +34 -0
- package/build/terms.d.ts.map +1 -0
- package/build/terms.js +109 -0
- package/build/terms.js.map +1 -0
- package/package.json +56 -0
package/README.md
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { URL } from 'url';
|
|
3
|
+
export declare class Catalog {
|
|
4
|
+
readonly datasets: ReadonlyArray<Dataset>;
|
|
5
|
+
constructor(datasets: ReadonlyArray<Dataset>);
|
|
6
|
+
getDatasetByDistributionIri(iri: IRI): Dataset | undefined;
|
|
7
|
+
getDatasetByTermIri(iri: IRI): Dataset | undefined;
|
|
8
|
+
}
|
|
9
|
+
export declare class Dataset {
|
|
10
|
+
readonly iri: IRI;
|
|
11
|
+
readonly name: string;
|
|
12
|
+
readonly termsPrefixes: IRI[];
|
|
13
|
+
readonly creators: [Organization];
|
|
14
|
+
readonly distributions: [Distribution];
|
|
15
|
+
readonly alternateName?: string | undefined;
|
|
16
|
+
constructor(iri: IRI, name: string, termsPrefixes: IRI[], creators: [Organization], distributions: [Distribution], alternateName?: string | undefined);
|
|
17
|
+
getDistributionByIri(iri: IRI): Distribution | undefined;
|
|
18
|
+
}
|
|
19
|
+
export declare class Organization {
|
|
20
|
+
readonly iri: IRI;
|
|
21
|
+
readonly name: string;
|
|
22
|
+
readonly alternateName: string;
|
|
23
|
+
constructor(iri: IRI, name: string, alternateName: string);
|
|
24
|
+
}
|
|
25
|
+
export declare class SparqlDistribution {
|
|
26
|
+
readonly iri: IRI;
|
|
27
|
+
readonly endpoint: IRI;
|
|
28
|
+
readonly searchQuery: string;
|
|
29
|
+
readonly lookupQuery: string;
|
|
30
|
+
constructor(iri: IRI, endpoint: IRI, searchQuery: string, lookupQuery: string);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* A union type to be extended in the future with other distribution types.
|
|
34
|
+
*/
|
|
35
|
+
export declare type Distribution = SparqlDistribution;
|
|
36
|
+
export declare class IRI extends URL {
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":";AAAA,OAAO,EAAC,GAAG,EAAC,MAAM,KAAK,CAAC;AAExB,qBAAa,OAAO;IACN,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC;gBAAhC,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC;IAE9C,2BAA2B,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,GAAG,SAAS;IAM1D,mBAAmB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,GAAG,SAAS;CAO1D;AAED,qBAAa,OAAO;IAEhB,QAAQ,CAAC,GAAG,EAAE,GAAG;IACjB,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC7B,QAAQ,CAAC,QAAQ,EAAE,CAAC,YAAY,CAAC;IACjC,QAAQ,CAAC,aAAa,EAAE,CAAC,YAAY,CAAC;IACtC,QAAQ,CAAC,aAAa,CAAC;gBALd,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,GAAG,EAAE,EACpB,QAAQ,EAAE,CAAC,YAAY,CAAC,EACxB,aAAa,EAAE,CAAC,YAAY,CAAC,EAC7B,aAAa,CAAC,oBAAQ;IAG1B,oBAAoB,CAAC,GAAG,EAAE,GAAG,GAAG,YAAY,GAAG,SAAS;CAKhE;AAED,qBAAa,YAAY;IAErB,QAAQ,CAAC,GAAG,EAAE,GAAG;IACjB,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,aAAa,EAAE,MAAM;gBAFrB,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM;CAEjC;AAED,qBAAa,kBAAkB;IAE3B,QAAQ,CAAC,GAAG,EAAE,GAAG;IACjB,QAAQ,CAAC,QAAQ,EAAE,GAAG;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM;gBAHnB,GAAG,EAAE,GAAG,EACR,QAAQ,EAAE,GAAG,EACb,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM;CAE/B;AAED;;GAEG;AACH,oBAAY,YAAY,GAAG,kBAAkB,CAAC;AAE9C,qBAAa,GAAI,SAAQ,GAAG;CAAG"}
|
package/build/catalog.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { URL } from 'url';
|
|
2
|
+
export class Catalog {
|
|
3
|
+
constructor(datasets) {
|
|
4
|
+
this.datasets = datasets;
|
|
5
|
+
}
|
|
6
|
+
getDatasetByDistributionIri(iri) {
|
|
7
|
+
return this.datasets.find(dataset => dataset.getDistributionByIri(iri) !== undefined);
|
|
8
|
+
}
|
|
9
|
+
getDatasetByTermIri(iri) {
|
|
10
|
+
return this.datasets.find(dataset => dataset.termsPrefixes.some(termPrefix => iri.toString().startsWith(termPrefix.toString())));
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class Dataset {
|
|
14
|
+
constructor(iri, name, termsPrefixes, creators, distributions, alternateName) {
|
|
15
|
+
this.iri = iri;
|
|
16
|
+
this.name = name;
|
|
17
|
+
this.termsPrefixes = termsPrefixes;
|
|
18
|
+
this.creators = creators;
|
|
19
|
+
this.distributions = distributions;
|
|
20
|
+
this.alternateName = alternateName;
|
|
21
|
+
}
|
|
22
|
+
getDistributionByIri(iri) {
|
|
23
|
+
return this.distributions.find(distribution => distribution.iri.toString() === iri.toString());
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export class Organization {
|
|
27
|
+
constructor(iri, name, alternateName) {
|
|
28
|
+
this.iri = iri;
|
|
29
|
+
this.name = name;
|
|
30
|
+
this.alternateName = alternateName;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export class SparqlDistribution {
|
|
34
|
+
constructor(iri, endpoint, searchQuery, lookupQuery) {
|
|
35
|
+
this.iri = iri;
|
|
36
|
+
this.endpoint = endpoint;
|
|
37
|
+
this.searchQuery = searchQuery;
|
|
38
|
+
this.lookupQuery = lookupQuery;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export class IRI extends URL {
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,EAAC,MAAM,KAAK,CAAC;AAExB,MAAM,OAAO,OAAO;IAClB,YAAqB,QAAgC;QAAhC,aAAQ,GAAR,QAAQ,CAAwB;IAAG,CAAC;IAElD,2BAA2B,CAAC,GAAQ;QACzC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,SAAS,CAC3D,CAAC;IACJ,CAAC;IAEM,mBAAmB,CAAC,GAAQ;QACjC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAClC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CACtC,GAAG,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CACjD,CACF,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,OAAO;IAClB,YACW,GAAQ,EACR,IAAY,EACZ,aAAoB,EACpB,QAAwB,EACxB,aAA6B,EAC7B,aAAsB;QALtB,QAAG,GAAH,GAAG,CAAK;QACR,SAAI,GAAJ,IAAI,CAAQ;QACZ,kBAAa,GAAb,aAAa,CAAO;QACpB,aAAQ,GAAR,QAAQ,CAAgB;QACxB,kBAAa,GAAb,aAAa,CAAgB;QAC7B,kBAAa,GAAb,aAAa,CAAS;IAC9B,CAAC;IAEG,oBAAoB,CAAC,GAAQ;QAClC,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAC5B,YAAY,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,QAAQ,EAAE,CAC/D,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,YAAY;IACvB,YACW,GAAQ,EACR,IAAY,EACZ,aAAqB;QAFrB,QAAG,GAAH,GAAG,CAAK;QACR,SAAI,GAAJ,IAAI,CAAQ;QACZ,kBAAa,GAAb,aAAa,CAAQ;IAC7B,CAAC;CACL;AAED,MAAM,OAAO,kBAAkB;IAC7B,YACW,GAAQ,EACR,QAAa,EACb,WAAmB,EACnB,WAAmB;QAHnB,QAAG,GAAH,GAAG,CAAK;QACR,aAAQ,GAAR,QAAQ,CAAK;QACb,gBAAW,GAAX,WAAW,CAAQ;QACnB,gBAAW,GAAX,WAAW,CAAQ;IAC3B,CAAC;CACL;AAOD,MAAM,OAAO,GAAI,SAAQ,GAAG;CAAG"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { ActorInitSparql } from '@comunica/actor-init-sparql';
|
|
2
|
+
import Pino from 'pino';
|
|
3
|
+
import { TermsResult } from './query';
|
|
4
|
+
import { QueryMode } from './search/query-mode';
|
|
5
|
+
import { Catalog, IRI } from './catalog';
|
|
6
|
+
export interface QueryOptions {
|
|
7
|
+
source: IRI;
|
|
8
|
+
query: string;
|
|
9
|
+
queryMode: QueryMode;
|
|
10
|
+
timeoutMs: number;
|
|
11
|
+
}
|
|
12
|
+
export interface QueryAllOptions {
|
|
13
|
+
sources: IRI[];
|
|
14
|
+
query: string;
|
|
15
|
+
queryMode: QueryMode;
|
|
16
|
+
timeoutMs: number;
|
|
17
|
+
}
|
|
18
|
+
export declare class DistributionsService {
|
|
19
|
+
private logger;
|
|
20
|
+
private catalog;
|
|
21
|
+
private comunica;
|
|
22
|
+
constructor(options: {
|
|
23
|
+
logger: Pino.Logger;
|
|
24
|
+
catalog: Catalog;
|
|
25
|
+
comunica?: ActorInitSparql;
|
|
26
|
+
});
|
|
27
|
+
query(options: QueryOptions): Promise<TermsResult>;
|
|
28
|
+
queryAll(options: QueryAllOptions): Promise<TermsResult[]>;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=distributions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"distributions.d.ts","sourceRoot":"","sources":["../src/distributions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,6BAA6B,CAAC;AAE5D,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAoB,WAAW,EAAC,MAAM,SAAS,CAAC;AACvD,OAAO,EAAC,SAAS,EAAC,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAC,OAAO,EAAE,GAAG,EAAC,MAAM,WAAW,CAAC;AAGvC,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,GAAG,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AASD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,GAAG,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AASD,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,QAAQ,CAAkB;gBAEtB,OAAO,EAAE;QACnB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;QACpB,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,CAAC,EAAE,eAAe,CAAC;KAC5B;IAMK,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IAoBlD,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;CAYjE"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import Joi from 'joi';
|
|
2
|
+
import { QueryTermsService } from './query';
|
|
3
|
+
import { comunica } from './index';
|
|
4
|
+
const schemaQuery = Joi.object({
|
|
5
|
+
source: Joi.object().required(),
|
|
6
|
+
query: Joi.string().required(),
|
|
7
|
+
queryMode: Joi.string().required(),
|
|
8
|
+
timeoutMs: Joi.number().integer(),
|
|
9
|
+
});
|
|
10
|
+
const schemaQueryAll = Joi.object({
|
|
11
|
+
sources: Joi.array().items(Joi.object().required()).min(1).required(),
|
|
12
|
+
query: Joi.string().required(),
|
|
13
|
+
queryMode: Joi.string().required(),
|
|
14
|
+
timeoutMs: Joi.number().integer(),
|
|
15
|
+
});
|
|
16
|
+
export class DistributionsService {
|
|
17
|
+
constructor(options) {
|
|
18
|
+
this.logger = options.logger;
|
|
19
|
+
this.catalog = options.catalog;
|
|
20
|
+
this.comunica = options.comunica || comunica;
|
|
21
|
+
}
|
|
22
|
+
async query(options) {
|
|
23
|
+
const args = Joi.attempt(options, schemaQuery);
|
|
24
|
+
this.logger.info(`Preparing to query source "${args.source}"...`);
|
|
25
|
+
const dataset = await this.catalog.getDatasetByDistributionIri(args.source);
|
|
26
|
+
if (dataset === undefined) {
|
|
27
|
+
throw Error(`Source with URI "${args.source}" not found`);
|
|
28
|
+
}
|
|
29
|
+
const distribution = dataset.getDistributionByIri(args.source);
|
|
30
|
+
const queryService = new QueryTermsService({
|
|
31
|
+
logger: this.logger,
|
|
32
|
+
comunica: this.comunica,
|
|
33
|
+
});
|
|
34
|
+
return queryService.search(args.query, args.queryMode, distribution, args.timeoutMs);
|
|
35
|
+
}
|
|
36
|
+
async queryAll(options) {
|
|
37
|
+
const args = Joi.attempt(options, schemaQueryAll);
|
|
38
|
+
const requests = args.sources.map((source) => this.query({
|
|
39
|
+
source,
|
|
40
|
+
query: args.query,
|
|
41
|
+
queryMode: args.queryMode,
|
|
42
|
+
timeoutMs: args.timeoutMs,
|
|
43
|
+
}));
|
|
44
|
+
return Promise.all(requests);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=distributions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"distributions.js","sourceRoot":"","sources":["../src/distributions.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAC,iBAAiB,EAAc,MAAM,SAAS,CAAC;AAGvD,OAAO,EAAC,QAAQ,EAAC,MAAM,SAAS,CAAC;AASjC,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC;IAC7B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE;CAClC,CAAC,CAAC;AASH,MAAM,cAAc,GAAG,GAAG,CAAC,MAAM,CAAC;IAChC,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACrE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE;CAClC,CAAC,CAAC;AAEH,MAAM,OAAO,oBAAoB;IAK/B,YAAY,OAIX;QACC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAAqB;QAC/B,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,IAAI,CAAC,MAAM,MAAM,CAAC,CAAC;QAClE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,2BAA2B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5E,IAAI,OAAO,KAAK,SAAS,EAAE;YACzB,MAAM,KAAK,CAAC,oBAAoB,IAAI,CAAC,MAAM,aAAa,CAAC,CAAC;SAC3D;QACD,MAAM,YAAY,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAE,CAAC;QAChE,MAAM,YAAY,GAAG,IAAI,iBAAiB,CAAC;YACzC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;QACH,OAAO,YAAY,CAAC,MAAM,CACxB,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,SAAS,EACd,YAAY,EACZ,IAAI,CAAC,SAAS,CACf,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAwB;QACrC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAW,EAAE,EAAE,CAChD,IAAI,CAAC,KAAK,CAAC;YACT,MAAM;YACN,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CACH,CAAC;QACF,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Logger } from '@comunica/core';
|
|
2
|
+
import Pino from 'pino';
|
|
3
|
+
export interface ConstructorOptions {
|
|
4
|
+
logger: Pino.Logger;
|
|
5
|
+
}
|
|
6
|
+
export declare class LoggerPino extends Logger {
|
|
7
|
+
protected logger: Pino.Logger;
|
|
8
|
+
constructor(options: ConstructorOptions);
|
|
9
|
+
debug(message: string, data?: any): void;
|
|
10
|
+
error(message: string, data?: any): void;
|
|
11
|
+
fatal(message: string, data?: any): void;
|
|
12
|
+
info(message: string, data?: any): void;
|
|
13
|
+
trace(message: string, data?: any): void;
|
|
14
|
+
warn(message: string, data?: any): void;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=logger-pino.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger-pino.d.ts","sourceRoot":"","sources":["../../src/helpers/logger-pino.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,gBAAgB,CAAC;AACtC,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;CACrB;AAED,qBAAa,UAAW,SAAQ,MAAM;IACpC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;gBAElB,OAAO,EAAE,kBAAkB;IAMvC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAKxC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAKxC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAKxC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAKvC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAKxC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;CAGxC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Logger } from '@comunica/core';
|
|
2
|
+
export class LoggerPino extends Logger {
|
|
3
|
+
constructor(options) {
|
|
4
|
+
super();
|
|
5
|
+
this.logger = options.logger;
|
|
6
|
+
}
|
|
7
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
8
|
+
debug(message, data) {
|
|
9
|
+
this.logger.debug(message, data);
|
|
10
|
+
}
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
12
|
+
error(message, data) {
|
|
13
|
+
this.logger.error(message, data);
|
|
14
|
+
}
|
|
15
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
16
|
+
fatal(message, data) {
|
|
17
|
+
this.logger.fatal(message, data);
|
|
18
|
+
}
|
|
19
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
20
|
+
info(message, data) {
|
|
21
|
+
this.logger.info(message, data);
|
|
22
|
+
}
|
|
23
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
24
|
+
trace(message, data) {
|
|
25
|
+
this.logger.trace(message, data);
|
|
26
|
+
}
|
|
27
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
28
|
+
warn(message, data) {
|
|
29
|
+
this.logger.warn(message, data);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=logger-pino.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger-pino.js","sourceRoot":"","sources":["../../src/helpers/logger-pino.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,gBAAgB,CAAC;AAOtC,MAAM,OAAO,UAAW,SAAQ,MAAM;IAGpC,YAAY,OAA2B;QACrC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC/B,CAAC;IAED,8DAA8D;IAC9D,KAAK,CAAC,OAAe,EAAE,IAAU;QAC/B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,8DAA8D;IAC9D,KAAK,CAAC,OAAe,EAAE,IAAU;QAC/B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,8DAA8D;IAC9D,KAAK,CAAC,OAAe,EAAE,IAAU;QAC/B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,8DAA8D;IAC9D,IAAI,CAAC,OAAe,EAAE,IAAU;QAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,8DAA8D;IAC9D,KAAK,CAAC,OAAe,EAAE,IAAU;QAC/B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,8DAA8D;IAC9D,IAAI,CAAC,OAAe,EAAE,IAAU;QAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;CACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import Pino from 'pino';
|
|
2
|
+
export interface GetLoggerOptions {
|
|
3
|
+
name: string;
|
|
4
|
+
level: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function getCliLogger(options: GetLoggerOptions): Pino.Logger;
|
|
7
|
+
export declare function getHttpLogger(options: GetLoggerOptions): Pino.Logger;
|
|
8
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/helpers/logger.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAsBD,wBAAgB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAanE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC,MAAM,CASpE"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import Joi from 'joi';
|
|
2
|
+
import Pino from 'pino';
|
|
3
|
+
const schemaGetLogger = Joi.object({
|
|
4
|
+
name: Joi.string().required(),
|
|
5
|
+
level: Joi.string().required(),
|
|
6
|
+
});
|
|
7
|
+
const baseOptions = {
|
|
8
|
+
base: {
|
|
9
|
+
name: undefined, // Don't log PID and hostname
|
|
10
|
+
},
|
|
11
|
+
level: 'warn',
|
|
12
|
+
messageKey: 'message',
|
|
13
|
+
formatters: {
|
|
14
|
+
level(label) {
|
|
15
|
+
return {
|
|
16
|
+
level: label,
|
|
17
|
+
};
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
export function getCliLogger(options) {
|
|
22
|
+
const args = Joi.attempt(options, schemaGetLogger);
|
|
23
|
+
const loggerOptions = Object.assign(baseOptions, {
|
|
24
|
+
base: {
|
|
25
|
+
name: args.name,
|
|
26
|
+
},
|
|
27
|
+
level: args.level,
|
|
28
|
+
prettyPrint: {
|
|
29
|
+
colorize: true,
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
const destinationStdErr = Pino.destination(2);
|
|
33
|
+
return Pino(loggerOptions, destinationStdErr);
|
|
34
|
+
}
|
|
35
|
+
export function getHttpLogger(options) {
|
|
36
|
+
const args = Joi.attempt(options, schemaGetLogger);
|
|
37
|
+
const loggerOptions = Object.assign(baseOptions, {
|
|
38
|
+
base: {
|
|
39
|
+
name: args.name,
|
|
40
|
+
},
|
|
41
|
+
level: args.level,
|
|
42
|
+
});
|
|
43
|
+
return Pino(loggerOptions);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/helpers/logger.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,IAAI,MAAM,MAAM,CAAC;AAOxB,MAAM,eAAe,GAAG,GAAG,CAAC,MAAM,CAAC;IACjC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC/B,CAAC,CAAC;AAEH,MAAM,WAAW,GAAuB;IACtC,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS,EAAE,6BAA6B;KAC/C;IACD,KAAK,EAAE,MAAM;IACb,UAAU,EAAE,SAAS;IACrB,UAAU,EAAE;QACV,KAAK,CAAC,KAAK;YACT,OAAO;gBACL,KAAK,EAAE,KAAK;aACb,CAAC;QACJ,CAAC;KACF;CACF,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,OAAyB;IACpD,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IACnD,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE;QAC/C,IAAI,EAAE;YACJ,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB;QACD,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,WAAW,EAAE;YACX,QAAQ,EAAE,IAAI;SACf;KACF,CAAC,CAAC;IACH,MAAM,iBAAiB,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAyB;IACrD,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IACnD,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE;QAC/C,IAAI,EAAE;YACJ,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB;QACD,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC;AAC7B,CAAC"}
|
package/build/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from './query';
|
|
2
|
+
export * from './catalog';
|
|
3
|
+
export * from './lookup/lookup';
|
|
4
|
+
export * from './terms';
|
|
5
|
+
export * from './search/query-mode';
|
|
6
|
+
export * from './distributions';
|
|
7
|
+
export * from './helpers/logger';
|
|
8
|
+
export * from './server-test';
|
|
9
|
+
export declare const comunica: import("@comunica/actor-init-sparql/index-browser").ActorInitSparql;
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC;AACxB,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAI9B,eAAO,MAAM,QAAQ,qEAAc,CAAC"}
|
package/build/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from './query';
|
|
2
|
+
export * from './catalog';
|
|
3
|
+
export * from './lookup/lookup';
|
|
4
|
+
export * from './terms';
|
|
5
|
+
export * from './search/query-mode';
|
|
6
|
+
export * from './distributions';
|
|
7
|
+
export * from './helpers/logger';
|
|
8
|
+
export * from './server-test';
|
|
9
|
+
import { newEngine } from '@comunica/actor-init-sparql';
|
|
10
|
+
export const comunica = newEngine();
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC;AACxB,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAE9B,OAAO,EAAC,SAAS,EAAC,MAAM,6BAA6B,CAAC;AAEtD,MAAM,CAAC,MAAM,QAAQ,GAAG,SAAS,EAAE,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Catalog, Distribution, IRI } from '../catalog';
|
|
2
|
+
import { QueryTermsService, ServerError, TimeoutError } from '../query';
|
|
3
|
+
import { Term } from '../terms';
|
|
4
|
+
export declare type LookupQueryResult = {
|
|
5
|
+
uri: IRI;
|
|
6
|
+
distribution: SourceResult;
|
|
7
|
+
result: LookupResult;
|
|
8
|
+
};
|
|
9
|
+
export declare type SourceResult = Distribution | SourceNotFoundError;
|
|
10
|
+
export declare type LookupResult = Term | NotFoundError | TimeoutError | ServerError;
|
|
11
|
+
export declare class SourceNotFoundError {
|
|
12
|
+
readonly iri: IRI;
|
|
13
|
+
readonly message: string;
|
|
14
|
+
constructor(iri: IRI);
|
|
15
|
+
}
|
|
16
|
+
export declare class NotFoundError {
|
|
17
|
+
readonly iri: IRI;
|
|
18
|
+
readonly message: string;
|
|
19
|
+
constructor(iri: IRI);
|
|
20
|
+
}
|
|
21
|
+
export declare class LookupService {
|
|
22
|
+
private catalog;
|
|
23
|
+
private queryService;
|
|
24
|
+
constructor(catalog: Catalog, queryService: QueryTermsService);
|
|
25
|
+
lookup(iris: IRI[], timeoutMs: number): Promise<LookupQueryResult[]>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=lookup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lookup.d.ts","sourceRoot":"","sources":["../../src/lookup/lookup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAW,YAAY,EAAE,GAAG,EAAC,MAAM,YAAY,CAAC;AAC/D,OAAO,EAEL,iBAAiB,EACjB,WAAW,EAGX,YAAY,EACb,MAAM,UAAU,CAAC;AAClB,OAAO,EAAC,IAAI,EAAC,MAAM,UAAU,CAAC;AAE9B,oBAAY,iBAAiB,GAAG;IAC9B,GAAG,EAAE,GAAG,CAAC;IACT,YAAY,EAAE,YAAY,CAAC;IAC3B,MAAM,EAAE,YAAY,CAAC;CACtB,CAAC;AAEF,oBAAY,YAAY,GAAG,YAAY,GAAG,mBAAmB,CAAC;AAE9D,oBAAY,YAAY,GAAG,IAAI,GAAG,aAAa,GAAG,YAAY,GAAG,WAAW,CAAC;AAE7E,qBAAa,mBAAmB;IAGlB,QAAQ,CAAC,GAAG,EAAE,GAAG;IAF7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEJ,GAAG,EAAE,GAAG;CAG9B;AAED,qBAAa,aAAa;IAGZ,QAAQ,CAAC,GAAG,EAAE,GAAG;IAF7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEJ,GAAG,EAAE,GAAG;CAG9B;AAED,qBAAa,aAAa;IAEtB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,YAAY;gBADZ,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,iBAAiB;IAG5B,MAAM,CACjB,IAAI,EAAE,GAAG,EAAE,EACX,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,iBAAiB,EAAE,CAAC;CAiDhC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { Error, } from '../query';
|
|
2
|
+
export class SourceNotFoundError {
|
|
3
|
+
constructor(iri) {
|
|
4
|
+
this.iri = iri;
|
|
5
|
+
this.message = `No source found that can provide term with URI ${iri}`;
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export class NotFoundError {
|
|
9
|
+
constructor(iri) {
|
|
10
|
+
this.iri = iri;
|
|
11
|
+
this.message = `No term found with URI ${iri}`;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export class LookupService {
|
|
15
|
+
constructor(catalog, queryService) {
|
|
16
|
+
this.catalog = catalog;
|
|
17
|
+
this.queryService = queryService;
|
|
18
|
+
}
|
|
19
|
+
async lookup(iris, timeoutMs) {
|
|
20
|
+
const irisToDataset = iris.reduce((acc, iri) => {
|
|
21
|
+
const dataset = this.catalog.getDatasetByTermIri(iri);
|
|
22
|
+
if (dataset) {
|
|
23
|
+
acc.set(iri, dataset);
|
|
24
|
+
}
|
|
25
|
+
return acc;
|
|
26
|
+
}, new Map());
|
|
27
|
+
const datasetToIris = [...irisToDataset].reduce((datasetMap, [iri, dataset]) => {
|
|
28
|
+
var _a;
|
|
29
|
+
datasetMap.set(dataset, [...((_a = datasetMap.get(dataset)) !== null && _a !== void 0 ? _a : []), iri]);
|
|
30
|
+
return datasetMap;
|
|
31
|
+
}, new Map());
|
|
32
|
+
const lookups = [...datasetToIris].map(([dataset]) => this.queryService.lookup(iris, dataset.distributions[0], timeoutMs));
|
|
33
|
+
const termsPerSource = await Promise.all(lookups);
|
|
34
|
+
const datasetToTerms = termsPerSource.reduce((acc, result) => {
|
|
35
|
+
const dataset = this.catalog.getDatasetByDistributionIri(result.distribution.iri);
|
|
36
|
+
acc.set(dataset, result);
|
|
37
|
+
return acc;
|
|
38
|
+
}, new Map());
|
|
39
|
+
return iris.map(iri => {
|
|
40
|
+
const dataset = irisToDataset.get(iri);
|
|
41
|
+
if (dataset === undefined) {
|
|
42
|
+
return {
|
|
43
|
+
uri: iri,
|
|
44
|
+
distribution: new SourceNotFoundError(iri),
|
|
45
|
+
result: new NotFoundError(iri),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
uri: iri,
|
|
50
|
+
distribution: dataset.distributions[0],
|
|
51
|
+
result: result(datasetToTerms.get(dataset), iri),
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function result(result, iri) {
|
|
57
|
+
var _a;
|
|
58
|
+
if (result instanceof Error) {
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
return ((_a = result.terms.find(term => term.id.value === iri.toString())) !== null && _a !== void 0 ? _a : new NotFoundError(iri));
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=lookup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lookup.js","sourceRoot":"","sources":["../../src/lookup/lookup.ts"],"names":[],"mappings":"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"}
|
package/build/query.d.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { ActorInitSparql } from '@comunica/actor-init-sparql';
|
|
2
|
+
import { Bindings } from '@comunica/bus-query-operation';
|
|
3
|
+
import Pino from 'pino';
|
|
4
|
+
import { Term } from './terms';
|
|
5
|
+
import { QueryMode } from './search/query-mode';
|
|
6
|
+
import { Distribution, IRI } from './catalog';
|
|
7
|
+
export declare type TermsResult = Terms | TimeoutError | ServerError;
|
|
8
|
+
export declare class Terms {
|
|
9
|
+
readonly distribution: Distribution;
|
|
10
|
+
readonly terms: Term[];
|
|
11
|
+
constructor(distribution: Distribution, terms: Term[]);
|
|
12
|
+
}
|
|
13
|
+
export declare class Error {
|
|
14
|
+
readonly distribution: Distribution;
|
|
15
|
+
readonly message: string;
|
|
16
|
+
constructor(distribution: Distribution, message: string);
|
|
17
|
+
}
|
|
18
|
+
export declare class TimeoutError extends Error {
|
|
19
|
+
readonly distribution: Distribution;
|
|
20
|
+
constructor(distribution: Distribution, timeoutMs: number);
|
|
21
|
+
}
|
|
22
|
+
export declare class ServerError extends Error {
|
|
23
|
+
}
|
|
24
|
+
export declare class QueryTermsService {
|
|
25
|
+
private readonly logger;
|
|
26
|
+
private readonly engine;
|
|
27
|
+
constructor(options?: {
|
|
28
|
+
comunica?: ActorInitSparql;
|
|
29
|
+
logger?: Pino.Logger;
|
|
30
|
+
});
|
|
31
|
+
protected getConfig(distribution: Distribution, bindings?: Bindings): any;
|
|
32
|
+
search(searchQuery: string, queryMode: QueryMode, distribution: Distribution, timeoutMs: number): Promise<TermsResult>;
|
|
33
|
+
lookup(iris: IRI[], distribution: Distribution, timeoutMs: number): Promise<TermsResult>;
|
|
34
|
+
run(query: string, distribution: Distribution, timeoutMs: number, bindings?: Bindings): Promise<TermsResult>;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EACL,QAAQ,EAET,MAAM,+BAA+B,CAAC;AAKvC,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,OAAO,EAAC,IAAI,EAAmB,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAC,SAAS,EAAgB,MAAM,qBAAqB,CAAC;AAE7D,OAAO,EAAC,YAAY,EAAE,GAAG,EAAC,MAAM,WAAW,CAAC;AAE5C,oBAAY,WAAW,GAAG,KAAK,GAAG,YAAY,GAAG,WAAW,CAAC;AAE7D,qBAAa,KAAK;IACJ,QAAQ,CAAC,YAAY,EAAE,YAAY;IAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE;gBAAlD,YAAY,EAAE,YAAY,EAAW,KAAK,EAAE,IAAI,EAAE;CACxE;AAED,qBAAa,KAAK;IACJ,QAAQ,CAAC,YAAY,EAAE,YAAY;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM;gBAApD,YAAY,EAAE,YAAY,EAAW,OAAO,EAAE,MAAM;CAC1E;AACD,qBAAa,YAAa,SAAQ,KAAK;IACzB,QAAQ,CAAC,YAAY,EAAE,YAAY;gBAA1B,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM;CAGnE;AACD,qBAAa,WAAY,SAAQ,KAAK;CAAG;AAEzC,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;gBAGvC,OAAO,GAAE;QAAC,QAAQ,CAAC,EAAE,eAAe,CAAC;QAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAA;KAAM;IAOlE,SAAS,CAAC,SAAS,CAAC,YAAY,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,GAAG;IAcnE,MAAM,CACV,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,MAAM;IAkBb,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM;IAWjE,GAAG,CACP,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,QAAQ,GAClB,OAAO,CAAC,WAAW,CAAC;CA2CxB"}
|
package/build/query.js
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { Bindings, } from '@comunica/bus-query-operation';
|
|
2
|
+
import * as Hoek from '@hapi/hoek';
|
|
3
|
+
import Joi from 'joi';
|
|
4
|
+
import factory from '@rdfjs/data-model';
|
|
5
|
+
import { LoggerPino } from './helpers/logger-pino';
|
|
6
|
+
import Pino from 'pino';
|
|
7
|
+
import PrettyMilliseconds from 'pretty-ms';
|
|
8
|
+
import { TermsTransformer } from './terms';
|
|
9
|
+
import { queryVariants } from './search/query-mode';
|
|
10
|
+
import { newEngine } from '@comunica/actor-init-sparql';
|
|
11
|
+
export class Terms {
|
|
12
|
+
constructor(distribution, terms) {
|
|
13
|
+
this.distribution = distribution;
|
|
14
|
+
this.terms = terms;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export class Error {
|
|
18
|
+
constructor(distribution, message) {
|
|
19
|
+
this.distribution = distribution;
|
|
20
|
+
this.message = message;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export class TimeoutError extends Error {
|
|
24
|
+
constructor(distribution, timeoutMs) {
|
|
25
|
+
super(distribution, `Source timed out after ${timeoutMs}ms`);
|
|
26
|
+
this.distribution = distribution;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export class ServerError extends Error {
|
|
30
|
+
}
|
|
31
|
+
export class QueryTermsService {
|
|
32
|
+
constructor(options = {}) {
|
|
33
|
+
this.engine = options.comunica || newEngine();
|
|
34
|
+
this.logger = options.logger || Pino();
|
|
35
|
+
}
|
|
36
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
37
|
+
getConfig(distribution, bindings) {
|
|
38
|
+
const logger = new LoggerPino({ logger: this.logger });
|
|
39
|
+
return {
|
|
40
|
+
log: logger,
|
|
41
|
+
sources: [
|
|
42
|
+
{
|
|
43
|
+
type: 'sparql',
|
|
44
|
+
value: distribution.endpoint.toString(),
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
initialBindings: bindings,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
async search(searchQuery, queryMode, distribution, timeoutMs) {
|
|
51
|
+
return this.run(distribution.searchQuery, distribution, timeoutMs, Bindings([...queryVariants(searchQuery, queryMode)].reduce((record, [k, v]) => {
|
|
52
|
+
record[k] = factory.literal(v);
|
|
53
|
+
return record;
|
|
54
|
+
}, {})));
|
|
55
|
+
}
|
|
56
|
+
async lookup(iris, distribution, timeoutMs) {
|
|
57
|
+
return this.run(distribution.lookupQuery.replace('?uris', iris.map(iri => `<${iri}>`).join(' ')), distribution, timeoutMs);
|
|
58
|
+
}
|
|
59
|
+
async run(query, distribution, timeoutMs, bindings) {
|
|
60
|
+
Joi.attempt(timeoutMs, Joi.number()
|
|
61
|
+
.integer()
|
|
62
|
+
.min(1)
|
|
63
|
+
.max(parseInt(process.env.MAX_QUERY_TIMEOUT) || 10000)
|
|
64
|
+
.default(parseInt(process.env.DEFAULT_QUERY_TIMEOUT) || 5000));
|
|
65
|
+
this.logger.info(`Querying "${distribution.endpoint}" with "${query}"...`);
|
|
66
|
+
const timer = new Hoek.Bench();
|
|
67
|
+
const result = (await this.engine.query(query, this.getConfig(distribution, bindings)));
|
|
68
|
+
return guardTimeout(new Promise(resolve => {
|
|
69
|
+
const termsTransformer = new TermsTransformer();
|
|
70
|
+
result.quadStream.on('error', (error) => {
|
|
71
|
+
this.logger.error(`An error occurred when querying "${distribution.endpoint}": ${error}`);
|
|
72
|
+
resolve(new ServerError(distribution, error.message));
|
|
73
|
+
});
|
|
74
|
+
result.quadStream.on('data', (quad) => {
|
|
75
|
+
termsTransformer.fromQuad(quad);
|
|
76
|
+
});
|
|
77
|
+
result.quadStream.on('end', () => {
|
|
78
|
+
const terms = termsTransformer.asArray().sort(alphabeticallyByLabels);
|
|
79
|
+
this.logger.info(`Found ${terms.length} terms matching "${query}" in "${distribution.endpoint}" in ${PrettyMilliseconds(timer.elapsed())}`);
|
|
80
|
+
resolve(new Terms(distribution, terms));
|
|
81
|
+
});
|
|
82
|
+
}), timeoutMs, new TimeoutError(distribution, timeoutMs));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const alphabeticallyByLabels = (a, b) => {
|
|
86
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
87
|
+
const prefLabelA = (_b = (_a = a.prefLabels[0]) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : '';
|
|
88
|
+
const altLabelA = (_d = (_c = a.altLabels[0]) === null || _c === void 0 ? void 0 : _c.value) !== null && _d !== void 0 ? _d : '';
|
|
89
|
+
const sortLabelA = prefLabelA + altLabelA;
|
|
90
|
+
const prefLabelB = (_f = (_e = b.prefLabels[0]) === null || _e === void 0 ? void 0 : _e.value) !== null && _f !== void 0 ? _f : '';
|
|
91
|
+
const altLabelB = (_h = (_g = b.altLabels[0]) === null || _g === void 0 ? void 0 : _g.value) !== null && _h !== void 0 ? _h : '';
|
|
92
|
+
const sortLabelB = prefLabelB + altLabelB;
|
|
93
|
+
return sortLabelA.localeCompare(sortLabelB);
|
|
94
|
+
};
|
|
95
|
+
function guardTimeout(promise, timeoutMs, timeoutError) {
|
|
96
|
+
return Promise.race([
|
|
97
|
+
promise,
|
|
98
|
+
new Promise(resolve => setTimeout(resolve.bind(null, timeoutError), timeoutMs)),
|
|
99
|
+
]);
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-mode.d.ts","sourceRoot":"","sources":["../../src/search/query-mode.ts"],"names":[],"mappings":"AAAA,oBAAY,SAAS;IACnB,GAAG,QAAQ;IACX,SAAS,cAAc;IACvB,UAAU,eAAe;CAC1B;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,uBAe3D"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export var QueryMode;
|
|
2
|
+
(function (QueryMode) {
|
|
3
|
+
QueryMode["RAW"] = "raw";
|
|
4
|
+
QueryMode["OPTIMIZED"] = "optimized";
|
|
5
|
+
QueryMode["DEPRECATED"] = "deprecated";
|
|
6
|
+
})(QueryMode || (QueryMode = {}));
|
|
7
|
+
export function queryVariants(query, type) {
|
|
8
|
+
switch (type) {
|
|
9
|
+
case QueryMode.RAW:
|
|
10
|
+
return new Map([
|
|
11
|
+
['?query', query],
|
|
12
|
+
['?virtuosoQuery', query],
|
|
13
|
+
]);
|
|
14
|
+
case QueryMode.OPTIMIZED:
|
|
15
|
+
return new Map([
|
|
16
|
+
['?query', stringQuery(query)],
|
|
17
|
+
['?virtuosoQuery', virtuosoQuery(stringQuery(query))],
|
|
18
|
+
]);
|
|
19
|
+
case QueryMode.DEPRECATED:
|
|
20
|
+
return new Map([['?query', query]]);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const stringQuery = (query) => query.toLowerCase().replace(/\s+/g, ' ').trim();
|
|
24
|
+
const virtuosoQuery = (query) => join(quote(filterStopWords(split(escape(query)))));
|
|
25
|
+
const escape = (query) => query.replace(/'/g, "\\'");
|
|
26
|
+
const split = (query) => query.split(/\s+/);
|
|
27
|
+
/**
|
|
28
|
+
* Quote parts that are not boolean operators.
|
|
29
|
+
*/
|
|
30
|
+
const quote = (queryParts) => queryParts.map(part => (isBooleanOperator(part) ? part : `'${part}'`));
|
|
31
|
+
const filterStopWords = (queryParts) => queryParts.filter(part => part !== '&');
|
|
32
|
+
/**
|
|
33
|
+
* Join query parts with boolean AND if they are not yet connected with a boolean.
|
|
34
|
+
*/
|
|
35
|
+
const join = (queryParts) => queryParts.reduce((previousValue, currentValue, currentIndex, array) => {
|
|
36
|
+
const previous = array[currentIndex - 1];
|
|
37
|
+
if (!isBooleanOperator(previous) && !isBooleanOperator(currentValue)) {
|
|
38
|
+
return `${previousValue} AND ${currentValue}`;
|
|
39
|
+
}
|
|
40
|
+
return `${previousValue} ${currentValue}`;
|
|
41
|
+
});
|
|
42
|
+
const isBooleanOperator = (maybeBool) => maybeBool.toLowerCase() === 'and' || maybeBool.toLowerCase() === 'or';
|
|
43
|
+
//# sourceMappingURL=query-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-mode.js","sourceRoot":"","sources":["../../src/search/query-mode.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,SAIX;AAJD,WAAY,SAAS;IACnB,wBAAW,CAAA;IACX,oCAAuB,CAAA;IACvB,sCAAyB,CAAA;AAC3B,CAAC,EAJW,SAAS,KAAT,SAAS,QAIpB;AAED,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,IAAe;IAC1D,QAAQ,IAAI,EAAE;QACZ,KAAK,SAAS,CAAC,GAAG;YAChB,OAAO,IAAI,GAAG,CAAC;gBACb,CAAC,QAAQ,EAAE,KAAK,CAAC;gBACjB,CAAC,gBAAgB,EAAE,KAAK,CAAC;aAC1B,CAAC,CAAC;QACL,KAAK,SAAS,CAAC,SAAS;YACtB,OAAO,IAAI,GAAG,CAAC;gBACb,CAAC,QAAQ,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;gBAC9B,CAAC,gBAAgB,EAAE,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;aACtD,CAAC,CAAC;QACL,KAAK,SAAS,CAAC,UAAU;YACvB,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;KACvC;AACH,CAAC;AAED,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,EAAE,CACpC,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAElD,MAAM,aAAa,GAAG,CAAC,KAAa,EAAE,EAAE,CACtC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAErD,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAE7D,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAEpD;;GAEG;AACH,MAAM,KAAK,GAAG,CAAC,UAAoB,EAAE,EAAE,CACrC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC;AAEzE,MAAM,eAAe,GAAG,CAAC,UAAoB,EAAE,EAAE,CAC/C,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;AAE1C;;GAEG;AACH,MAAM,IAAI,GAAG,CAAC,UAAoB,EAAE,EAAE,CACpC,UAAU,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE;IACrE,MAAM,QAAQ,GAAG,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;IACzC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAAE;QACpE,OAAO,GAAG,aAAa,QAAQ,YAAY,EAAE,CAAC;KAC/C;IAED,OAAO,GAAG,aAAa,IAAI,YAAY,EAAE,CAAC;AAC5C,CAAC,CAAC,CAAC;AAEL,MAAM,iBAAiB,GAAG,CAAC,SAAiB,EAAE,EAAE,CAC9C,SAAS,CAAC,WAAW,EAAE,KAAK,KAAK,IAAI,SAAS,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-test.d.ts","sourceRoot":"","sources":["../src/server-test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAiD,MAAM,SAAS,CAAC;AAKhF,eAAO,MAAM,WAAW,SAAU,MAAM,YAoGpC,CAAC;AAEL,wBAAsB,+BAA+B,CACnD,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC,CAOf"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Catalog, Dataset, IRI, Organization, SparqlDistribution } from './index';
|
|
2
|
+
import { setup } from 'jest-dev-server';
|
|
3
|
+
import { dirname } from 'path';
|
|
4
|
+
import { fileURLToPath } from 'url';
|
|
5
|
+
export const testCatalog = (port) => new Catalog([
|
|
6
|
+
new Dataset(new IRI('https://data.rkd.nl/rkdartists'), 'RKDartists', [new IRI('https://example.com/resources/')], [
|
|
7
|
+
new Organization(new IRI('https://rkd.nl'), 'RKD – Nederlands Instituut voor Kunstgeschiedenis', 'RKD'),
|
|
8
|
+
], [
|
|
9
|
+
new SparqlDistribution(new IRI('https://data.netwerkdigitaalerfgoed.nl/rkd/rkdartists/sparql'), new IRI(`http://localhost:${port}/sparql`), `
|
|
10
|
+
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
|
|
11
|
+
CONSTRUCT {
|
|
12
|
+
?s ?p ?o
|
|
13
|
+
}
|
|
14
|
+
WHERE {
|
|
15
|
+
?s ?p ?o ;
|
|
16
|
+
?labelPredicate ?label .
|
|
17
|
+
VALUES ?labelPredicate { skos:prefLabel skos:altLabel }
|
|
18
|
+
FILTER (regex(?label, ?query, "i"))
|
|
19
|
+
}`, `
|
|
20
|
+
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
|
|
21
|
+
CONSTRUCT {
|
|
22
|
+
?s ?p ?o ;
|
|
23
|
+
skos:broader ?broader_uri ;
|
|
24
|
+
skos:narrower ?narrower_uri ;
|
|
25
|
+
skos:related ?related_uri .
|
|
26
|
+
?broader_uri skos:prefLabel ?broader_prefLabel .
|
|
27
|
+
?narrower_uri skos:prefLabel ?narrower_prefLabel .
|
|
28
|
+
?related_uri skos:prefLabel ?related_prefLabel .
|
|
29
|
+
}
|
|
30
|
+
WHERE {
|
|
31
|
+
?s ?p ?o.
|
|
32
|
+
VALUES ?s { ?uris }
|
|
33
|
+
OPTIONAL {
|
|
34
|
+
?s skos:broader ?broader_uri.
|
|
35
|
+
?broader_uri skos:prefLabel ?broader_prefLabel.
|
|
36
|
+
}
|
|
37
|
+
OPTIONAL {
|
|
38
|
+
?s skos:narrower ?narrower_uri.
|
|
39
|
+
?narrower_uri skos:prefLabel ?narrower_prefLabel.
|
|
40
|
+
}
|
|
41
|
+
OPTIONAL {
|
|
42
|
+
?s skos:related ?related_uri.
|
|
43
|
+
?related_uri skos:prefLabel ?related_prefLabel.
|
|
44
|
+
}
|
|
45
|
+
}`),
|
|
46
|
+
]),
|
|
47
|
+
new Dataset(new IRI('https://data.cultureelerfgoed.nl/term/id/cht'), 'Cultuurhistorische Thesaurus', [new IRI('https://data.cultureelerfgoed.nl/term/id/cht/')], [
|
|
48
|
+
new Organization(new IRI('https://www.cultureelerfgoed.nl'), 'Rijksdienst voor het Cultureel Erfgoed', 'RCE'),
|
|
49
|
+
], [
|
|
50
|
+
new SparqlDistribution(new IRI('https://example.com/distributions/endpoint-error'), new IRI('http://does-not-resolve'), 'CONSTRUCT { ?s ?p ?o } WHERE { ?s ?p ?o }', 'CONSTRUCT { ?s ?p ?o } WHERE { ?s ?p ?o }'),
|
|
51
|
+
]),
|
|
52
|
+
new Dataset(new IRI('http://vocab.getty.edu/aat'), 'Art & Architecture Thesaurus', [new IRI('http://vocab.getty.edu/aat/')], [
|
|
53
|
+
new Organization(new IRI('http://www.getty.edu/research/'), 'Getty Research Institute', 'Getty'),
|
|
54
|
+
], [
|
|
55
|
+
new SparqlDistribution(new IRI('https://example.com/distributions/timeout'), new IRI('https://httpbin.org/delay/3'), 'CONSTRUCT { ?s ?p ?o } WHERE { ?s ?p ?o }', 'CONSTRUCT { ?s ?p ?o } WHERE { ?s ?p ?o }'),
|
|
56
|
+
]),
|
|
57
|
+
]);
|
|
58
|
+
export async function startDistributionSparqlEndpoint(port) {
|
|
59
|
+
await setup({
|
|
60
|
+
command: `npx comunica-sparql-file-http ${dirname(fileURLToPath(import.meta.url))}/../test/fixtures/terms.ttl -p ${port}`,
|
|
61
|
+
port,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=server-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-test.js","sourceRoot":"","sources":["../src/server-test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,kBAAkB,EAAC,MAAM,SAAS,CAAC;AAChF,OAAO,EAAC,KAAK,EAAC,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAC,OAAO,EAAC,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAC,aAAa,EAAC,MAAM,KAAK,CAAC;AAElC,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,EAAE,CAC1C,IAAI,OAAO,CAAC;IACV,IAAI,OAAO,CACT,IAAI,GAAG,CAAC,gCAAgC,CAAC,EACzC,YAAY,EACZ,CAAC,IAAI,GAAG,CAAC,gCAAgC,CAAC,CAAC,EAC3C;QACE,IAAI,YAAY,CACd,IAAI,GAAG,CAAC,gBAAgB,CAAC,EACzB,mDAAmD,EACnD,KAAK,CACN;KACF,EACD;QACE,IAAI,kBAAkB,CACpB,IAAI,GAAG,CACL,8DAA8D,CAC/D,EACD,IAAI,GAAG,CAAC,oBAAoB,IAAI,SAAS,CAAC,EAC1C;;;;;;;;;;YAUE,EACF;;;;;;;;;;;;;;;;;;;;;;;;;;YA0BE,CACH;KACF,CACF;IACD,IAAI,OAAO,CACT,IAAI,GAAG,CAAC,8CAA8C,CAAC,EACvD,8BAA8B,EAC9B,CAAC,IAAI,GAAG,CAAC,+CAA+C,CAAC,CAAC,EAC1D;QACE,IAAI,YAAY,CACd,IAAI,GAAG,CAAC,iCAAiC,CAAC,EAC1C,wCAAwC,EACxC,KAAK,CACN;KACF,EACD;QACE,IAAI,kBAAkB,CACpB,IAAI,GAAG,CAAC,kDAAkD,CAAC,EAC3D,IAAI,GAAG,CAAC,yBAAyB,CAAC,EAClC,2CAA2C,EAC3C,2CAA2C,CAC5C;KACF,CACF;IACD,IAAI,OAAO,CACT,IAAI,GAAG,CAAC,4BAA4B,CAAC,EACrC,8BAA8B,EAC9B,CAAC,IAAI,GAAG,CAAC,6BAA6B,CAAC,CAAC,EACxC;QACE,IAAI,YAAY,CACd,IAAI,GAAG,CAAC,gCAAgC,CAAC,EACzC,0BAA0B,EAC1B,OAAO,CACR;KACF,EACD;QACE,IAAI,kBAAkB,CACpB,IAAI,GAAG,CAAC,2CAA2C,CAAC,EACpD,IAAI,GAAG,CAAC,6BAA6B,CAAC,EACtC,2CAA2C,EAC3C,2CAA2C,CAC5C;KACF,CACF;CACF,CAAC,CAAC;AAEL,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,IAAY;IAEZ,MAAM,KAAK,CAAC;QACV,OAAO,EAAE,iCAAiC,OAAO,CAC/C,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAC/B,kCAAkC,IAAI,EAAE;QACzC,IAAI;KACL,CAAC,CAAC;AACL,CAAC"}
|
package/build/terms.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import * as RDF from 'rdf-js';
|
|
2
|
+
export declare class Term {
|
|
3
|
+
readonly id: RDF.Term;
|
|
4
|
+
readonly type: RDF.Term | undefined;
|
|
5
|
+
readonly prefLabels: RDF.Literal[];
|
|
6
|
+
readonly altLabels: RDF.Literal[];
|
|
7
|
+
readonly hiddenLabels: RDF.Literal[];
|
|
8
|
+
readonly scopeNotes: RDF.Literal[];
|
|
9
|
+
readonly seeAlso: RDF.NamedNode[];
|
|
10
|
+
readonly broaderTerms: RelatedTerm[];
|
|
11
|
+
readonly narrowerTerms: RelatedTerm[];
|
|
12
|
+
readonly relatedTerms: RelatedTerm[];
|
|
13
|
+
constructor(id: RDF.Term, type: RDF.Term | undefined, prefLabels: RDF.Literal[], altLabels: RDF.Literal[], hiddenLabels: RDF.Literal[], scopeNotes: RDF.Literal[], seeAlso: RDF.NamedNode[], broaderTerms: RelatedTerm[], narrowerTerms: RelatedTerm[], relatedTerms: RelatedTerm[]);
|
|
14
|
+
}
|
|
15
|
+
export declare class RelatedTerm {
|
|
16
|
+
readonly id: RDF.Term;
|
|
17
|
+
readonly prefLabels: RDF.Literal[];
|
|
18
|
+
constructor(id: RDF.Term, prefLabels: RDF.Literal[]);
|
|
19
|
+
}
|
|
20
|
+
export declare class TermsTransformer {
|
|
21
|
+
private termsIris;
|
|
22
|
+
private termsMap;
|
|
23
|
+
private readonly predicateToPropertyMap;
|
|
24
|
+
fromQuad(quad: RDF.Quad): void;
|
|
25
|
+
asArray(): Term[];
|
|
26
|
+
/**
|
|
27
|
+
* Map related IRIs to their related terms, making sure to only accept complete related terms.
|
|
28
|
+
*
|
|
29
|
+
* Related terms can be incomplete because of the SPARQL query limit (see
|
|
30
|
+
* https://github.com/netwerk-digitaal-erfgoed/network-of-terms/issues/36).
|
|
31
|
+
*/
|
|
32
|
+
private mapRelatedTerms;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=terms.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terms.d.ts","sourceRoot":"","sources":["../src/terms.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,QAAQ,CAAC;AAE9B,qBAAa,IAAI;IAEb,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI;IACrB,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,GAAG,SAAS;IACnC,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,OAAO,EAAE;IAClC,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,EAAE;IACjC,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC,OAAO,EAAE;IACpC,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,OAAO,EAAE;IAClC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE;IACjC,QAAQ,CAAC,YAAY,EAAE,WAAW,EAAE;IACpC,QAAQ,CAAC,aAAa,EAAE,WAAW,EAAE;IACrC,QAAQ,CAAC,YAAY,EAAE,WAAW,EAAE;gBAT3B,EAAE,EAAE,GAAG,CAAC,IAAI,EACZ,IAAI,EAAE,GAAG,CAAC,IAAI,GAAG,SAAS,EAC1B,UAAU,EAAE,GAAG,CAAC,OAAO,EAAE,EACzB,SAAS,EAAE,GAAG,CAAC,OAAO,EAAE,EACxB,YAAY,EAAE,GAAG,CAAC,OAAO,EAAE,EAC3B,UAAU,EAAE,GAAG,CAAC,OAAO,EAAE,EACzB,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,EACxB,YAAY,EAAE,WAAW,EAAE,EAC3B,aAAa,EAAE,WAAW,EAAE,EAC5B,YAAY,EAAE,WAAW,EAAE;CAEvC;AAED,qBAAa,WAAW;IACV,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI;IAAE,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,OAAO,EAAE;gBAAhD,EAAE,EAAE,GAAG,CAAC,IAAI,EAAW,UAAU,EAAE,GAAG,CAAC,OAAO,EAAE;CACtE;AAeD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,QAAQ,CAA4C;IAC5D,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAiBpC;IAEH,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,GAAG,IAAI;IA6B9B,OAAO,IAAI,IAAI,EAAE;IAqBjB;;;;;OAKG;IACH,OAAO,CAAC,eAAe,CAOd;CACV"}
|
package/build/terms.js
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
export class Term {
|
|
2
|
+
constructor(id, type, prefLabels, altLabels, hiddenLabels, scopeNotes, seeAlso, broaderTerms, narrowerTerms, relatedTerms) {
|
|
3
|
+
this.id = id;
|
|
4
|
+
this.type = type;
|
|
5
|
+
this.prefLabels = prefLabels;
|
|
6
|
+
this.altLabels = altLabels;
|
|
7
|
+
this.hiddenLabels = hiddenLabels;
|
|
8
|
+
this.scopeNotes = scopeNotes;
|
|
9
|
+
this.seeAlso = seeAlso;
|
|
10
|
+
this.broaderTerms = broaderTerms;
|
|
11
|
+
this.narrowerTerms = narrowerTerms;
|
|
12
|
+
this.relatedTerms = relatedTerms;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export class RelatedTerm {
|
|
16
|
+
constructor(id, prefLabels) {
|
|
17
|
+
this.id = id;
|
|
18
|
+
this.prefLabels = prefLabels;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
class SparqlResultTerm {
|
|
22
|
+
constructor(id) {
|
|
23
|
+
this.id = id;
|
|
24
|
+
this.type = undefined;
|
|
25
|
+
this.prefLabels = [];
|
|
26
|
+
this.altLabels = [];
|
|
27
|
+
this.hiddenLabels = [];
|
|
28
|
+
this.scopeNotes = [];
|
|
29
|
+
this.seeAlso = [];
|
|
30
|
+
this.broaderTerms = [];
|
|
31
|
+
this.narrowerTerms = [];
|
|
32
|
+
this.relatedTerms = [];
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export class TermsTransformer {
|
|
36
|
+
constructor() {
|
|
37
|
+
this.termsIris = new Set();
|
|
38
|
+
this.termsMap = new Map();
|
|
39
|
+
this.predicateToPropertyMap = new Map([
|
|
40
|
+
['http://www.w3.org/1999/02/22-rdf-syntax-ns#type', 'type'],
|
|
41
|
+
['http://www.w3.org/2000/01/rdf-schema#seeAlso', 'seeAlso'],
|
|
42
|
+
['http://www.w3.org/2004/02/skos/core#prefLabel', 'prefLabels'],
|
|
43
|
+
['http://www.w3.org/2008/05/skos#prefLabel', 'prefLabels'],
|
|
44
|
+
['http://www.w3.org/2004/02/skos/core#altLabel', 'altLabels'],
|
|
45
|
+
['http://www.w3.org/2008/05/skos#altLabel', 'altLabels'],
|
|
46
|
+
['http://www.w3.org/2004/02/skos/core#hiddenLabel', 'hiddenLabels'],
|
|
47
|
+
['http://www.w3.org/2008/05/skos#hiddenLabel', 'hiddenLabels'],
|
|
48
|
+
['http://www.w3.org/2004/02/skos/core#scopeNote', 'scopeNotes'],
|
|
49
|
+
['http://www.w3.org/2008/05/skos#scopeNote', 'scopeNotes'],
|
|
50
|
+
['http://www.w3.org/2004/02/skos/core#broader', 'broaderTerms'],
|
|
51
|
+
['http://www.w3.org/2008/05/skos#broader', 'broaderTerms'],
|
|
52
|
+
['http://www.w3.org/2004/02/skos/core#narrower', 'narrowerTerms'],
|
|
53
|
+
['http://www.w3.org/2008/05/skos#narrower', 'narrowerTerms'],
|
|
54
|
+
['http://www.w3.org/2004/02/skos/core#related', 'relatedTerms'],
|
|
55
|
+
['http://www.w3.org/2008/05/skos#related', 'relatedTerms'],
|
|
56
|
+
]);
|
|
57
|
+
/**
|
|
58
|
+
* Map related IRIs to their related terms, making sure to only accept complete related terms.
|
|
59
|
+
*
|
|
60
|
+
* Related terms can be incomplete because of the SPARQL query limit (see
|
|
61
|
+
* https://github.com/netwerk-digitaal-erfgoed/network-of-terms/issues/36).
|
|
62
|
+
*/
|
|
63
|
+
this.mapRelatedTerms = (terms) => terms.reduce((acc, iri) => {
|
|
64
|
+
const term = this.termsMap.get(iri.value);
|
|
65
|
+
if (term) {
|
|
66
|
+
acc.push(new RelatedTerm(term.id, term.prefLabels));
|
|
67
|
+
}
|
|
68
|
+
return acc;
|
|
69
|
+
}, []);
|
|
70
|
+
}
|
|
71
|
+
fromQuad(quad) {
|
|
72
|
+
var _a;
|
|
73
|
+
const subject = quad.subject;
|
|
74
|
+
const propertyName = this.predicateToPropertyMap.get(quad.predicate.value);
|
|
75
|
+
const currentTerm = (_a = this.termsMap.get(subject.value)) !== null && _a !== void 0 ? _a : new SparqlResultTerm(subject);
|
|
76
|
+
this.termsMap.set(subject.value, currentTerm);
|
|
77
|
+
// skos:Concepts are the top-level search results, which we track in termsIris.
|
|
78
|
+
if (propertyName === 'type' &&
|
|
79
|
+
(quad.object.value === 'http://www.w3.org/2004/02/skos/core#Concept' ||
|
|
80
|
+
quad.object.value === 'http://www.w3.org/2008/05/skos#Concept')) {
|
|
81
|
+
this.termsIris.add(subject.value);
|
|
82
|
+
}
|
|
83
|
+
if (propertyName !== undefined) {
|
|
84
|
+
const propertyValue = currentTerm[propertyName]; // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
85
|
+
if (Array.isArray(propertyValue)) {
|
|
86
|
+
// Prevent duplicate prefLabel values due to duplicate quads.
|
|
87
|
+
if (!propertyValue.find(value => value.equals(quad.object))) {
|
|
88
|
+
propertyValue.push(quad.object);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
currentTerm[propertyName] = quad.object; // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
asArray() {
|
|
97
|
+
return [...this.termsIris].map(iri => {
|
|
98
|
+
const term = this.termsMap.get(iri);
|
|
99
|
+
return new Term(term.id, term.type, term.prefLabels, term.altLabels, term.hiddenLabels, term.scopeNotes, term.seeAlso, this.mapRelatedTerms(term.broaderTerms).sort(alphabeticallyByPrefLabel), this.mapRelatedTerms(term.narrowerTerms).sort(alphabeticallyByPrefLabel), this.mapRelatedTerms(term.relatedTerms).sort(alphabeticallyByPrefLabel));
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const alphabeticallyByPrefLabel = (a, b) => {
|
|
104
|
+
var _a, _b, _c, _d;
|
|
105
|
+
const prefLabelA = (_b = (_a = a.prefLabels[0]) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : '';
|
|
106
|
+
const prefLabelB = (_d = (_c = b.prefLabels[0]) === null || _c === void 0 ? void 0 : _c.value) !== null && _d !== void 0 ? _d : '';
|
|
107
|
+
return prefLabelA.localeCompare(prefLabelB);
|
|
108
|
+
};
|
|
109
|
+
//# sourceMappingURL=terms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terms.js","sourceRoot":"","sources":["../src/terms.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@netwerk-digitaal-erfgoed/network-of-terms-query",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"publishConfig": {
|
|
6
|
+
"access": "public"
|
|
7
|
+
},
|
|
8
|
+
"main": "build/index.js",
|
|
9
|
+
"types": "build/index.d.ts",
|
|
10
|
+
"scripts": {
|
|
11
|
+
"clean": "rm -rf build/ tsconfig.build.tsbuildinfo",
|
|
12
|
+
"compile": "npm run clean && tsc -b tsconfig.build.json",
|
|
13
|
+
"test": "NODE_OPTIONS=--experimental-vm-modules jest ${1}",
|
|
14
|
+
"posttest": "jest-coverage-thresholds-bumper --silent"
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"build/"
|
|
18
|
+
],
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "git+https://github.com/netwerk-digitaal-erfgoed/network-of-terms.git"
|
|
22
|
+
},
|
|
23
|
+
"author": "",
|
|
24
|
+
"license": "EUPL-1.2",
|
|
25
|
+
"bugs": {
|
|
26
|
+
"url": "https://github.com/netwerk-digitaal-erfgoed/network-of-terms/issues"
|
|
27
|
+
},
|
|
28
|
+
"homepage": "https://github.com/netwerk-digitaal-erfgoed/network-of-terms#readme",
|
|
29
|
+
"keywords": [],
|
|
30
|
+
"description": "Engine for querying sources in the Network of Terms",
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@comunica/actor-init-sparql": "^1.22.3",
|
|
33
|
+
"@comunica/actor-query-operation-sparql-endpoint": "^1.22.2",
|
|
34
|
+
"@comunica/bus-query-operation": "^1.22.0",
|
|
35
|
+
"@comunica/core": "^1.22.0",
|
|
36
|
+
"@hapi/hoek": "^9.2.1",
|
|
37
|
+
"@rdfjs/data-model": "^2.0.0",
|
|
38
|
+
"joi": "^17.6.0",
|
|
39
|
+
"pino": "^7.8.0",
|
|
40
|
+
"pino-pretty": "^7.5.1",
|
|
41
|
+
"pretty-ms": "^7.0.1",
|
|
42
|
+
"rdf-js": "^4.0.2",
|
|
43
|
+
"rdf-parse": "^1.9.1",
|
|
44
|
+
"rdf-store-stream": "^1.3.0"
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@comunica/actor-http-node-fetch": "^1.22.3",
|
|
48
|
+
"@comunica/actor-init-sparql-file": "^1.22.3",
|
|
49
|
+
"@comunica/actor-query-operation-service": "^1.22.3",
|
|
50
|
+
"jest-dev-server": "^6.0.3",
|
|
51
|
+
"ts-jest": "^27.1.3"
|
|
52
|
+
},
|
|
53
|
+
"engines": {
|
|
54
|
+
"node": ">=16.0.0"
|
|
55
|
+
}
|
|
56
|
+
}
|