@jahed/sparql-engine
Version:
SPARQL query engine for servers and web browsers.
66 lines • 2.4 kB
JavaScript
// 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