@comunica/actor-query-source-identify-hypermedia-sparql
Version:
A sparql query-source-identify-hypermedia actor
76 lines • 4.37 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ActorQuerySourceIdentifyHypermediaSparql = void 0;
const bus_query_source_identify_hypermedia_1 = require("@comunica/bus-query-source-identify-hypermedia");
const context_entries_1 = require("@comunica/context-entries");
const core_1 = require("@comunica/core");
const utils_algebra_1 = require("@comunica/utils-algebra");
const utils_bindings_factory_1 = require("@comunica/utils-bindings-factory");
const QuerySourceSparql_1 = require("./QuerySourceSparql");
/**
* A comunica SPARQL Query Source Identify Hypermedia Actor.
*/
class ActorQuerySourceIdentifyHypermediaSparql extends bus_query_source_identify_hypermedia_1.ActorQuerySourceIdentifyHypermedia {
mediatorHttp;
mediatorMergeBindingsContext;
mediatorQuerySerialize;
checkUrlSuffix;
forceHttpGet;
cacheSize;
forceSourceType;
bindMethod;
countTimeout;
cardinalityCountQueries;
cardinalityEstimateConstruction;
forceGetIfUrlLengthBelow;
sparqlServerSoftwarePatterns;
constructor(args) {
super(args, 'sparql');
this.mediatorHttp = args.mediatorHttp;
this.mediatorMergeBindingsContext = args.mediatorMergeBindingsContext;
this.mediatorQuerySerialize = args.mediatorQuerySerialize;
this.checkUrlSuffix = args.checkUrlSuffix;
this.forceHttpGet = args.forceHttpGet;
this.cacheSize = args.cacheSize;
this.forceSourceType = Boolean(args.forceSourceType);
this.bindMethod = args.bindMethod;
this.countTimeout = args.countTimeout;
this.cardinalityCountQueries = args.cardinalityCountQueries;
this.cardinalityEstimateConstruction = args.cardinalityEstimateConstruction;
this.forceGetIfUrlLengthBelow = args.forceGetIfUrlLengthBelow;
this.sparqlServerSoftwarePatterns = (args.sparqlServerSoftwarePatterns ?? []).map(pattern => new RegExp(pattern, 'u'));
}
checkServerSoftware(serverSoftware) {
if (!serverSoftware) {
return false;
}
for (const regex of this.sparqlServerSoftwarePatterns) {
if (regex.test(serverSoftware)) {
return true;
}
}
return false;
}
async testMetadata(action) {
if (!action.forceSourceType && !this.forceSourceType && !action.metadata.sparqlService &&
!(this.checkUrlSuffix && (action.url.endsWith('/sparql') || action.url.endsWith('/sparql/'))) &&
!this.checkServerSoftware(action.metadata.serverSoftware)) {
return (0, core_1.failTest)(`Actor ${this.name} could not detect a SPARQL service description or URL ending on /sparql.`);
}
return (0, core_1.passTest)({ filterFactor: 1 });
}
async run(action) {
this.logInfo(action.context, `Identified ${action.url} as sparql source with service URL: ${action.metadata.sparqlService || action.url}`);
const dataFactory = action.context.getSafe(context_entries_1.KeysInitQuery.dataFactory);
const algebraFactory = new utils_algebra_1.AlgebraFactory(dataFactory);
const isSingularSource = action.context.get(context_entries_1.KeysQueryOperation.querySources)?.length === 1;
const source = new QuerySourceSparql_1.QuerySourceSparql((action.forceSourceType ?? this.forceSourceType) ? action.url : action.metadata.sparqlService || action.url,
// Pass the original URL as backup, as some endpoints misconfigure their endpoint URL in the service description.
action.url, action.context, this.mediatorHttp, this.mediatorQuerySerialize, this.bindMethod, dataFactory, algebraFactory, await utils_bindings_factory_1.BindingsFactory.create(this.mediatorMergeBindingsContext, action.context, dataFactory), this.forceHttpGet, this.cacheSize, this.countTimeout,
// Cardinalities can be infinity when we're querying just a single source.
this.cardinalityCountQueries && !isSingularSource, this.cardinalityEstimateConstruction, this.forceGetIfUrlLengthBelow, Boolean(action.context.get(context_entries_1.KeysInitQuery.parseUnsupportedVersions)), action.metadata);
return { source };
}
}
exports.ActorQuerySourceIdentifyHypermediaSparql = ActorQuerySourceIdentifyHypermediaSparql;
//# sourceMappingURL=ActorQuerySourceIdentifyHypermediaSparql.js.map