UNPKG

@jahed/sparql-engine

Version:

SPARQL query engine for servers and web browsers.

66 lines 2.4 kB
// SPDX-License-Identifier: MIT import { maxBy, meanBy, minBy, sample } from "lodash-es"; import { asJS, createInteger, literalIsNumeric, RDF, termIsLiteral, } from "../../utils/rdf.js"; /** * SPARQL Aggregation operations. * Each operation takes an arguments a SPARQL variable and a row of bindings, i.e., a list of * solutions bindings on which the aggregation must be applied. * Each operations is expected to return a term, as with classic SPARQL operations * @see https://www.w3.org/TR/sparql11-query/#aggregateAlgebra */ export default { count: function (variable, rows) { let count = 0; if (variable.value in rows) { count = rows[variable.value].map((v) => v !== null).length; } return createInteger(count); }, sum: function (variable, rows) { let sum = 0; if (variable.value in rows) { sum = rows[variable.value].reduce((acc, b) => { if (termIsLiteral(b) && literalIsNumeric(b)) { return acc + asJS(b.value, b.datatype.value); } return acc; }, 0); } return createInteger(sum); }, avg: function (variable, rows) { let avg = 0; if (variable.value in rows) { avg = meanBy(rows[variable.value], (term) => { if (termIsLiteral(term) && literalIsNumeric(term)) { return asJS(term.value, term.datatype.value); } }); } return createInteger(avg); }, min: function (variable, rows) { return (minBy(rows[variable.value], (v) => { if (termIsLiteral(v)) { return asJS(v.value, v.datatype.value); } return v.value; }) || createInteger(-1)); }, max: function (variable, rows) { return (maxBy(rows[variable.value], (v) => { if (termIsLiteral(v)) { return asJS(v.value, v.datatype.value); } return v.value; }) || createInteger(-1)); }, group_concat: function (variable, rows, sep = "") { const value = rows[variable.value].map((v) => v.value).join(sep); return RDF.literal(value); }, sample: function (variable, rows) { return sample(rows[variable.value]); }, }; //# sourceMappingURL=sparql-aggregates.js.map