UNPKG

@comunica/actor-query-result-serialize-sparql-json

Version:

A sparql-json query-result-serialize actor

102 lines 4.48 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ActorQueryResultSerializeSparqlJson = void 0; const bus_query_result_serialize_1 = require("@comunica/bus-query-result-serialize"); const core_1 = require("@comunica/core"); const asynciterator_1 = require("asynciterator"); const readable_stream_1 = require("readable-stream"); /** * A comunica sparql-results+xml Serialize Actor. */ class ActorQueryResultSerializeSparqlJson extends bus_query_result_serialize_1.ActorQueryResultSerializeFixedMediaTypes { /* eslint-disable max-len */ /** * @param args - * \ @defaultNested {{ * "application/sparql-results+json": 0.8 * }} mediaTypePriorities * \ @defaultNested {{ * "application/sparql-results+json": "http://www.w3.org/ns/formats/SPARQL_Results_JSON" * }} mediaTypeFormats * \ @defaultNested {true} emitMetadata * \ @defaultNested {<default_observer> a <caqrssj:components/ActionObserverHttp.jsonld#ActionObserverHttp>} httpObserver */ constructor(args) { super(args); } /* eslint-enable max-len */ /** * Converts an RDF term to its JSON representation. * @param {RDF.Term} value An RDF term. * @return {any} A JSON object. */ static bindingToJsonBindings(value) { if (value.termType === 'Literal') { const literal = value; const jsonValue = { value: literal.value, type: 'literal' }; const { language, datatype } = literal; if (language) { jsonValue['xml:lang'] = language; } else if (datatype && datatype.value !== 'http://www.w3.org/2001/XMLSchema#string') { jsonValue.datatype = datatype.value; } return jsonValue; } if (value.termType === 'BlankNode') { return { value: value.value, type: 'bnode' }; } if (value.termType === 'Quad') { return { value: { subject: ActorQueryResultSerializeSparqlJson.bindingToJsonBindings(value.subject), predicate: ActorQueryResultSerializeSparqlJson.bindingToJsonBindings(value.predicate), object: ActorQueryResultSerializeSparqlJson.bindingToJsonBindings(value.object), }, type: 'triple', }; } return { value: value.value, type: 'uri' }; } async testHandleChecked(action, _context) { if (!['bindings', 'boolean'].includes(action.type)) { return (0, core_1.failTest)('This actor can only handle bindings streams or booleans.'); } return (0, core_1.passTestVoid)(); } async runHandle(action, _mediaType, _context) { const data = new readable_stream_1.Readable(); // Write head const head = {}; if (action.type === 'bindings') { const metadata = await action.metadata(); if (metadata.variables.length > 0) { head.vars = metadata.variables.map(variable => variable.variable.value); } } data.push(`{"head": ${JSON.stringify(head)},\n`); if (action.type === 'bindings') { const resultStream = action.bindingsStream; data.push('"results": { "bindings": [\n'); let first = true; function* end(cb) { yield cb(); } // Write bindings data.wrap( // JSON SPARQL results spec does not allow unbound variables and blank node bindings (0, asynciterator_1.wrap)(resultStream).map((bindings) => { const res = `${first ? '' : ',\n'}${JSON.stringify(Object.fromEntries([...bindings] .map(([key, value]) => [key.value, ActorQueryResultSerializeSparqlJson.bindingToJsonBindings(value)])))}`; first = false; return res; }).append((0, asynciterator_1.wrap)(end(() => `\n]}${this.emitMetadata ? `,\n"metadata": { "httpRequests": ${this.httpObserver.requests} }` : ''}}\n`)))); } else { data.wrap((0, asynciterator_1.wrap)(action.execute().then(value => [`"boolean":${value}\n}\n`]))); } return { data }; } } exports.ActorQueryResultSerializeSparqlJson = ActorQueryResultSerializeSparqlJson; //# sourceMappingURL=ActorQueryResultSerializeSparqlJson.js.map